dweiss commented on code in PR #14824:
URL: https://github.com/apache/lucene/pull/14824#discussion_r2159174610


##########
build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/spotless/ApplyGoogleJavaFormatTask.java:
##########
@@ -0,0 +1,77 @@
+package org.apache.lucene.gradle.plugins.spotless;
+
+import com.google.googlejavaformat.java.FormatterException;
+import org.gradle.api.file.ConfigurableFileCollection;
+import org.gradle.api.file.ProjectLayout;
+import org.gradle.api.tasks.TaskAction;
+import org.gradle.work.DisableCachingByDefault;
+import org.gradle.work.InputChanges;
+import org.gradle.workers.WorkAction;
+import org.gradle.workers.WorkParameters;
+import org.gradle.workers.WorkQueue;
+
+import javax.inject.Inject;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@DisableCachingByDefault
+public abstract class ApplyGoogleJavaFormatTask extends 
ParentGoogleJavaFormatTask {
+    @Inject
+    public ApplyGoogleJavaFormatTask(ProjectLayout layout) {
+        super(layout, "apply");
+    }
+
+    @TaskAction
+    public void formatSources(InputChanges inputChanges) throws IOException {
+        WorkQueue workQueue = getWorkQueue();
+        List<File> sourceFiles = getIncrementalBatch(inputChanges);
+        if (sourceFiles.isEmpty()) {
+            return;
+        }
+
+        getLogger().info("Will apply formatting to {} source {} in this run.",
+                sourceFiles.size(), sourceFiles.size() == 1 ? "file" : 
"files");
+
+        for (var sourceFile : sourceFiles) {
+            workQueue.submit(ApplyGoogleJavaFormatAction.class, params -> {
+                params.getTargetFiles().setFrom(List.of(sourceFile));
+            });
+        }
+
+        Path taskOutput = getOutputChangeListFile().get().getAsFile().toPath();
+        Files.writeString(
+                taskOutput,
+                
sourceFiles.stream().map(File::getPath).collect(Collectors.joining("\n")));
+
+        workQueue.await();
+    }
+
+    public static abstract class ApplyGoogleJavaFormatAction implements 
WorkAction<ApplyGoogleJavaFormatAction.Parameters> {
+        public interface Parameters extends WorkParameters {
+            ConfigurableFileCollection getTargetFiles();
+        }
+
+        @Override
+        public void execute() {
+            var formatter = getFormatter();
+
+            for (File inputFile : getParameters().getTargetFiles().getFiles()) 
{
+                var inputPath = inputFile.toPath();
+                try {
+                    String input = Files.readString(inputPath);
+                    String output = formatter.formatSourceAndFixImports(input);
+
+                    if (!input.equals(output)) {
+                        Files.writeString(inputPath, output);
+                    }

Review Comment:
   @breskeby this is one example where I think gradle build model doesn't shine 
- for this task, the outputs and inputs overlap. It takes input files, formats 
them and writes them back to the same location. I know Ned Twigg (spotless) had 
similar problems. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org
For additional commands, e-mail: issues-h...@lucene.apache.org

Reply via email to