diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/IdeHook.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/IdeHook.java deleted file mode 100644 index 8d24e2230e..0000000000 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/IdeHook.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2016-2021 DiffPlug - * - * 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. - */ -package com.diffplug.gradle.spotless; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; - -import com.diffplug.common.base.Errors; -import com.diffplug.common.io.ByteStreams; -import com.diffplug.spotless.Formatter; -import com.diffplug.spotless.PaddedCell; - -class IdeHook { - final static String PROPERTY = "spotlessIdeHook"; - final static String USE_STD_IN = "spotlessIdeHookUseStdIn"; - final static String USE_STD_OUT = "spotlessIdeHookUseStdOut"; - - private static void dumpIsClean() { - System.err.println("IS CLEAN"); - } - - static void performHook(SpotlessTaskImpl spotlessTask) { - String path = (String) spotlessTask.getProject().property(PROPERTY); - File file = new File(path); - if (!file.isAbsolute()) { - System.err.println("Argument passed to " + PROPERTY + " must be an absolute path"); - return; - } - if (spotlessTask.getTarget().contains(file)) { - GitRatchetGradle ratchet = spotlessTask.getRatchet(); - try (Formatter formatter = spotlessTask.buildFormatter()) { - if (ratchet != null) { - if (ratchet.isClean(spotlessTask.getProjectDir().get().getAsFile(), spotlessTask.getRootTreeSha(), file)) { - dumpIsClean(); - return; - } - } - byte[] bytes; - if (spotlessTask.getProject().hasProperty(USE_STD_IN)) { - bytes = ByteStreams.toByteArray(System.in); - } else { - bytes = Files.readAllBytes(file.toPath()); - } - PaddedCell.DirtyState dirty = PaddedCell.calculateDirtyState(formatter, file, bytes); - if (dirty.isClean()) { - dumpIsClean(); - } else if (dirty.didNotConverge()) { - System.err.println("DID NOT CONVERGE"); - System.err.println("Run 'spotlessDiagnose' for details https://github.com/diffplug/spotless/blob/main/PADDEDCELL.md"); - } else { - System.err.println("IS DIRTY"); - if (spotlessTask.getProject().hasProperty(USE_STD_OUT)) { - dirty.writeCanonicalTo(System.out); - } else { - dirty.writeCanonicalTo(file); - } - } - } catch (IOException e) { - e.printStackTrace(System.err); - throw Errors.asRuntime(e); - } finally { - System.err.close(); - System.out.close(); - } - } - } -} diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java index 96474ffc4b..7fc3e4e0ef 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java @@ -25,6 +25,8 @@ public class SpotlessExtensionImpl extends SpotlessExtension { final TaskProvider rootCheckTask, rootApplyTask, rootDiagnoseTask; + final static String PROPERTY = "spotlessIdeHook"; + public SpotlessExtensionImpl(Project project) { super(project); rootCheckTask = project.getTasks().register(EXTENSION + CHECK, task -> { @@ -48,7 +50,6 @@ public SpotlessExtensionImpl(Project project) { @Override protected void createFormatTasks(String name, FormatExtension formatExtension) { - boolean isIdeHook = project.hasProperty(IdeHook.PROPERTY); TaskContainer tasks = project.getTasks(); // create the SpotlessTask @@ -56,9 +57,10 @@ protected void createFormatTasks(String name, FormatExtension formatExtension) { TaskProvider spotlessTask = tasks.register(taskName, SpotlessTaskImpl.class, task -> { task.init(getRegisterDependenciesTask().getTaskService()); task.setGroup(TASK_GROUP); - task.setEnabled(!isIdeHook); // clean removes the SpotlessCache, so we have to run after clean task.mustRunAfter(BasePlugin.CLEAN_TASK_NAME); + task.getSpotlessIdeHook().set((String) project.findProperty(PROPERTY)); + task.getProjectDir().set(project.getProjectDir()); }); project.afterEvaluate(unused -> { spotlessTask.configure(task -> { @@ -75,23 +77,16 @@ protected void createFormatTasks(String name, FormatExtension formatExtension) { TaskProvider applyTask = tasks.register(taskName + APPLY, SpotlessApply.class, task -> { task.init(spotlessTask.get()); task.setGroup(TASK_GROUP); - task.setEnabled(!isIdeHook); task.dependsOn(spotlessTask); }); rootApplyTask.configure(task -> { task.dependsOn(applyTask); - - if (isIdeHook) { - // the rootApplyTask is no longer just a marker task, now it does a bit of work itself - task.doLast(unused -> IdeHook.performHook(spotlessTask.get())); - } }); TaskProvider checkTask = tasks.register(taskName + CHECK, SpotlessCheck.class, task -> { SpotlessTaskImpl source = spotlessTask.get(); task.setGroup(TASK_GROUP); task.init(source); - task.setEnabled(!isIdeHook); task.dependsOn(source); // if the user runs both, make sure that apply happens first, diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessTaskImpl.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessTaskImpl.java index 04951a4577..0ef68560e5 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessTaskImpl.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessTaskImpl.java @@ -27,9 +27,12 @@ import org.gradle.api.GradleException; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.FileSystemOperations; +import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.CacheableTask; +import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.TaskAction; import org.gradle.work.ChangeType; import org.gradle.work.FileChange; @@ -46,11 +49,14 @@ public abstract class SpotlessTaskImpl extends SpotlessTask { @Internal abstract DirectoryProperty getProjectDir(); + @Optional + @Input + public abstract Property getSpotlessIdeHook(); + void init(Provider service) { taskServiceProvider = service; SpotlessTaskService.usesServiceTolerateTestFailure(this, service); getTaskService().set(service); - getProjectDir().set(getProject().getProjectDir()); } // this field is stupid, but we need it, see https://github.com/diffplug/spotless/issues/1260 @@ -82,11 +88,13 @@ public void performAction(InputChanges inputs) throws Exception { GitRatchetGradle ratchet = getRatchet(); for (FileChange fileChange : inputs.getFileChanges(target)) { File input = fileChange.getFile(); - if (fileChange.getChangeType() == ChangeType.REMOVED) { - deletePreviousResult(input); - } else { - if (input.isFile()) { - processInputFile(ratchet, formatter, input); + if (!getSpotlessIdeHook().isPresent() || input.equals(new File(getSpotlessIdeHook().get()))) { + if (fileChange.getChangeType() == ChangeType.REMOVED) { + deletePreviousResult(input); + } else { + if (input.isFile()) { + processInputFile(ratchet, formatter, input); + } } } }