/* * Copyright (c) 2016, 2017, 2018, 2019 FabricMC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.Files; import java.util.HashSet; import java.io.IOException; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * A script to only enable subprojects that you are working on. * * Usage: * - Run "java gradle/Focus.java fabric-networking-api-v1" to focus on fabric-networking-api-v1 * - Run "java gradle/Focus.java fabric-networking-api-v1 fabric-sound-api-v1" to focus on fabric-networking-api-v1 and fabric-sound-api-v1 * - Run "java gradle/Focus.java" to reset focus * * After running the script, refresh the Gradle project in your IDE. */ public class Focus { // Matches the content of moduleDependencies and testDependencies private static final Pattern OUTER_PATTERN = Pattern.compile("(?:moduleDependencies|testDependencies)\\s*\\(.*?\\[\\s*([\\s\\S]*?)\\s*\\]\\s*\\)\n"); // Matches the dependency string private static final Pattern INNER_PATTERN = Pattern.compile("['\\\"]([^'\\\"]+)['\\\"]"); public static void main(String[] args) throws IOException { Path path = Paths.get("focus.txt"); if (args.length == 0) { Files.deleteIfExists(path); System.out.println("Reset focus"); return; } Set dependencies = new HashSet<>(); for (String arg : args) { readDependencies(arg, dependencies); } // All modules depend on fabric-gametest-api-v1 and fabric-registry-sync-v0 readDependencies("fabric-gametest-api-v1", dependencies); readDependencies("fabric-registry-sync-v0", dependencies); System.out.println("Focusing on:\n" + String.join("\n", dependencies)); Files.writeString(path, String.join("\n", dependencies)); } private static void readDependencies(String project, Set dependencies) throws IOException { if (dependencies.contains(project)) { return; } dependencies.add(project); Path buildGradlePath = Paths.get(project, "build.gradle"); if (Files.notExists(buildGradlePath)) { throw new RuntimeException("Project not found: " + project); } String content = Files.readString(buildGradlePath); Matcher outerMatcher = OUTER_PATTERN.matcher(content); while (outerMatcher.find()) { String outerMatch = outerMatcher.group(1); Matcher innerMatcher = INNER_PATTERN.matcher(outerMatch); while (innerMatcher.find()) { String dependency = innerMatcher.group(1).replace(":", ""); readDependencies(dependency, dependencies); } } } }