From d1e8dc9bd115354b41a4396c7c1e5542ef4ced62 Mon Sep 17 00:00:00 2001 From: Andrew Oberstar Date: Wed, 9 Feb 2022 17:46:26 -0600 Subject: [PATCH 1/3] Upgrade build to Gradle 7.4 --- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 10 +- gradlew.bat | 178 +++++++++++------------ 3 files changed, 95 insertions(+), 95 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e6e589..41dfb87 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index c53aefa..1b6c787 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright � 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,10 +32,10 @@ # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions �$var�, �${var}�, �${var:-default}�, �${var+SET}�, -# �${var#prefix}�, �${var%suffix}�, and �$( cmd )�; -# * compound commands having a testable exit status, especially �case�; -# * various built-in commands including �command�, �set�, and �ulimit�. +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # diff --git a/gradlew.bat b/gradlew.bat index 107acd3..ac1b06f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,89 +1,89 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From a36c2e509cb982b1c58fe3cfa65cdc4b2436c601 Mon Sep 17 00:00:00 2001 From: Andrew Oberstar Date: Wed, 9 Feb 2022 18:01:31 -0600 Subject: [PATCH 2/3] Upgrade to Grgit 5 Fixes #60 Fixes #70 Fixes #79 Fixes #85 --- build.gradle.kts | 19 +-- gradle.lockfile | 9 +- .../gradle/git/publish/BaseCompatTest.groovy | 1 - .../git/publish/GitPublishExtension.java | 17 +-- .../gradle/git/publish/GitPublishPlugin.java | 77 ++++++------ .../git/publish/tasks/GitPublishCommit.java | 22 ++-- .../git/publish/tasks/GitPublishPush.java | 28 ++--- .../git/publish/tasks/GitPublishReset.java | 117 +++++++----------- stutter.lockfile | 3 +- 9 files changed, 126 insertions(+), 167 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index cd7ea31..0f7a1a7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,19 +19,20 @@ mavenCentral { developerName.set("Andrew Oberstar") developerEmail.set("ajoberstar@gmail.com") githubOwner.set("ajoberstar") - githubRepository.set("reckon") + githubRepository.set("gradle-git-publish") } java { toolchain { - languageVersion.set(JavaLanguageVersion.of(8)) + languageVersion.set(JavaLanguageVersion.of(11)) } } dependencies { // grgit - api("org.ajoberstar.grgit:grgit-core:[4.0,5.0[") - compatTestImplementation("org.ajoberstar.grgit:grgit-core:[4.0,5.0[") + api("org.ajoberstar.grgit:grgit-core:[5.0,6.0[") + api("org.ajoberstar.grgit:grgit-gradle:[5.0,6.0[") + compatTestImplementation("org.ajoberstar.grgit:grgit-core:[5.0,6.0[") // testing compatTestImplementation(gradleTestKit()) @@ -49,20 +50,12 @@ tasks.withType { } stutter { - val java8 by matrices.creating { - javaToolchain { - languageVersion.set(JavaLanguageVersion.of(8)) - } - gradleVersions { - compatibleRange("5.0") - } - } val java11 by matrices.creating { javaToolchain { languageVersion.set(JavaLanguageVersion.of(11)) } gradleVersions { - compatibleRange("5.0") + compatibleRange("7.0") } } val java17 by matrices.creating { diff --git a/gradle.lockfile b/gradle.lockfile index 02b9845..d5ba7df 100644 --- a/gradle.lockfile +++ b/gradle.lockfile @@ -2,13 +2,14 @@ # Manual edits can break the build and are not advised. # This file is expected to be part of source control. cglib:cglib-nodep:3.3.0=compatTestCompileClasspath,compatTestRuntimeClasspath -com.googlecode.javaewah:JavaEWAH:1.1.12=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.googlecode.javaewah:JavaEWAH:1.1.13=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy:1.11.0=compatTestCompileClasspath,compatTestRuntimeClasspath -org.ajoberstar.grgit:grgit-core:4.1.1=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.ajoberstar.grgit:grgit-core:5.0.0-rc.7=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.ajoberstar.grgit:grgit-gradle:5.0.0-rc.7=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.apiguardian:apiguardian-api:1.1.0=compatTestCompileClasspath,compatTestRuntimeClasspath org.assertj:assertj-core:3.16.1=compatTestCompileClasspath,compatTestRuntimeClasspath -org.codehaus.groovy:groovy:3.0.8=compatTestCompileClasspath,compatTestRuntimeClasspath -org.eclipse.jgit:org.eclipse.jgit:5.13.0.202109080827-r=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy:3.0.9=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jgit:org.eclipse.jgit:6.0.0.202111291000-r=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.hamcrest:hamcrest:2.2=compatTestCompileClasspath,compatTestRuntimeClasspath org.jetbrains:annotations:20.1.0=compatTestCompileClasspath,compatTestRuntimeClasspath org.junit.platform:junit-platform-commons:1.7.2=compatTestCompileClasspath,compatTestRuntimeClasspath diff --git a/src/compatTest/groovy/org/ajoberstar/gradle/git/publish/BaseCompatTest.groovy b/src/compatTest/groovy/org/ajoberstar/gradle/git/publish/BaseCompatTest.groovy index f12df25..79398b6 100644 --- a/src/compatTest/groovy/org/ajoberstar/gradle/git/publish/BaseCompatTest.groovy +++ b/src/compatTest/groovy/org/ajoberstar/gradle/git/publish/BaseCompatTest.groovy @@ -318,7 +318,6 @@ gitPublish { then: result.task(':gitPublishPush').outcome == TaskOutcome.SUCCESS remote.log().size() == 2 - working.branch.list()*.name == ['gh-pages'] } def 'when no git publish tasks are run, build completes successfully'() { diff --git a/src/main/java/org/ajoberstar/gradle/git/publish/GitPublishExtension.java b/src/main/java/org/ajoberstar/gradle/git/publish/GitPublishExtension.java index bd9dd02..5be0fb3 100644 --- a/src/main/java/org/ajoberstar/gradle/git/publish/GitPublishExtension.java +++ b/src/main/java/org/ajoberstar/gradle/git/publish/GitPublishExtension.java @@ -1,10 +1,12 @@ package org.ajoberstar.gradle.git.publish; +import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.file.CopySpec; import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.tasks.util.PatternFilterable; import org.gradle.api.tasks.util.PatternSet; @@ -19,13 +21,14 @@ public class GitPublishExtension { private final CopySpec contents; private final PatternFilterable preserve; - public GitPublishExtension(Project project) { - this.repoDir = project.getObjects().directoryProperty(); - this.repoUri = project.getObjects().property(String.class); - this.referenceRepoUri = project.getObjects().property(String.class); - this.branch = project.getObjects().property(String.class); - this.commitMessage = project.getObjects().property(String.class); - this.sign = project.getObjects().property(Boolean.class); + @Inject + public GitPublishExtension(Project project, ObjectFactory objectFactory) { + this.repoDir = objectFactory.directoryProperty(); + this.repoUri = objectFactory.property(String.class); + this.referenceRepoUri = objectFactory.property(String.class); + this.branch = objectFactory.property(String.class); + this.commitMessage = objectFactory.property(String.class); + this.sign = objectFactory.property(Boolean.class); this.contents = project.copySpec(); this.preserve = new PatternSet(); diff --git a/src/main/java/org/ajoberstar/gradle/git/publish/GitPublishPlugin.java b/src/main/java/org/ajoberstar/gradle/git/publish/GitPublishPlugin.java index 04ab80a..9ee1973 100644 --- a/src/main/java/org/ajoberstar/gradle/git/publish/GitPublishPlugin.java +++ b/src/main/java/org/ajoberstar/gradle/git/publish/GitPublishPlugin.java @@ -1,16 +1,16 @@ package org.ajoberstar.gradle.git.publish; -import java.util.Optional; - import org.ajoberstar.gradle.git.publish.tasks.GitPublishCommit; import org.ajoberstar.gradle.git.publish.tasks.GitPublishPush; import org.ajoberstar.gradle.git.publish.tasks.GitPublishReset; import org.ajoberstar.grgit.Grgit; +import org.ajoberstar.grgit.gradle.GrgitService; +import org.ajoberstar.grgit.gradle.GrgitServiceExtension; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.Task; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.Copy; +import org.gradle.api.tasks.TaskProvider; public class GitPublishPlugin implements Plugin { static final String RESET_TASK = "gitPublishReset"; @@ -20,43 +20,46 @@ public class GitPublishPlugin implements Plugin { @Override public void apply(Project project) { - GitPublishExtension extension = project.getExtensions().create("gitPublish", GitPublishExtension.class, project); - - extension.getCommitMessage().set("Generated by gradle-git-publish."); + var extension = project.getExtensions().create("gitPublish", GitPublishExtension.class, project); + configureExtensionDefaults(project, extension); - // if using the grgit plugin, default to the repo's origin - project.getPluginManager().withPlugin("org.ajoberstar.grgit", plugin -> { - // TODO should this be based on tracking branch instead of assuming origin? - Optional.ofNullable((Grgit) project.findProperty("grgit")).ifPresent(grgit -> { - extension.getRepoUri().set(getOriginUri(grgit)); - extension.getReferenceRepoUri().set(grgit.getRepository().getRootDir().toURI().toString()); + var grgitService = project.getGradle().getSharedServices().registerIfAbsent("git-publish-grgit", GrgitService.class, spec -> { + spec.parameters(parameters -> { + parameters.getDirectory().set(extension.getRepoDir()); + parameters.getInitIfNotExists().set(true); }); + spec.getMaxParallelUsages().set(1); }); - extension.getRepoDir().set(project.getLayout().getBuildDirectory().dir("gitPublish")); + var reset = createResetTask(project, extension, grgitService); + var copy = createCopyTask(project, extension); + var commit = createCommitTask(project, extension, grgitService); + var push = createPushTask(project, extension, grgitService); - GitPublishReset reset = createResetTask(project, extension); - Task copy = createCopyTask(project, extension); - Task commit = createCommitTask(project, extension, reset.getGrgit()); - Task push = createPushTask(project, extension, reset.getGrgit()); - push.dependsOn(commit); - commit.dependsOn(copy); - copy.dependsOn(reset); + push.configure(t -> t.dependsOn(commit)); + commit.configure(t -> t.dependsOn(copy)); + copy.configure(t -> t.dependsOn(reset)); + } - // always close the repo at the end of the build - project.getGradle().buildFinished(result -> { - project.getLogger().info("Closing Git publish repo: {}", extension.getRepoDir().get()); - if (reset.getGrgit().isPresent()) { - reset.getGrgit().get().close(); - } + private void configureExtensionDefaults(Project project, GitPublishExtension extension) { + extension.getCommitMessage().set("Generated by gradle-git-publish."); + + // if using the grgit-service plugin, default to the repo's origin + project.getPluginManager().withPlugin("org.ajoberstar.grgit.service", plugin -> { + var grgitExt = project.getExtensions().getByType(GrgitServiceExtension.class); + // TODO should this be based on tracking branch instead of assuming origin? + extension.getRepoUri().set(grgitExt.getService().map(service -> getOriginUri(service.getGrgit()))); + extension.getReferenceRepoUri().set(grgitExt.getService().map(service -> service.getGrgit().getRepository().getRootDir().toURI().toString())); }); + + extension.getRepoDir().set(project.getLayout().getBuildDirectory().dir("gitPublish")); } - private GitPublishReset createResetTask(Project project, GitPublishExtension extension) { - return project.getTasks().create(RESET_TASK, GitPublishReset.class, task -> { + private TaskProvider createResetTask(Project project, GitPublishExtension extension, Provider grgitService) { + return project.getTasks().register(RESET_TASK, GitPublishReset.class, task -> { task.setGroup("publishing"); task.setDescription("Prepares a git repo for new content to be generated."); - task.getRepoDirectory().set(extension.getRepoDir()); + task.getGrgitService().set(grgitService); task.getRepoUri().set(extension.getRepoUri()); task.getReferenceRepoUri().set(extension.getReferenceRepoUri()); task.getBranch().set(extension.getBranch()); @@ -64,8 +67,8 @@ private GitPublishReset createResetTask(Project project, GitPublishExtension ext }); } - private Copy createCopyTask(Project project, GitPublishExtension extension) { - return project.getTasks().create(COPY_TASK, Copy.class, task -> { + private TaskProvider createCopyTask(Project project, GitPublishExtension extension) { + return project.getTasks().register(COPY_TASK, Copy.class, task -> { task.setGroup("publishing"); task.setDescription("Copy contents to be published to git."); task.with(extension.getContents()); @@ -73,21 +76,21 @@ private Copy createCopyTask(Project project, GitPublishExtension extension) { }); } - private GitPublishCommit createCommitTask(Project project, GitPublishExtension extension, Provider grgitProvider) { - return project.getTasks().create(COMMIT_TASK, GitPublishCommit.class, task -> { + private TaskProvider createCommitTask(Project project, GitPublishExtension extension, Provider grgitService) { + return project.getTasks().register(COMMIT_TASK, GitPublishCommit.class, task -> { task.setGroup("publishing"); task.setDescription("Commits changes to be published to git."); - task.getGrgit().set(grgitProvider); + task.getGrgitService().set(grgitService); task.getMessage().set(extension.getCommitMessage()); task.getSign().set(extension.getSign()); }); } - private GitPublishPush createPushTask(Project project, GitPublishExtension extension, Provider grgitProvider) { - return project.getTasks().create(PUSH_TASK, GitPublishPush.class, task -> { + private TaskProvider createPushTask(Project project, GitPublishExtension extension, Provider grgitService) { + return project.getTasks().register(PUSH_TASK, GitPublishPush.class, task -> { task.setGroup("publishing"); task.setDescription("Pushes changes to git."); - task.getGrgit().set(grgitProvider); + task.getGrgitService().set(grgitService); task.getBranch().set(extension.getBranch()); }); } diff --git a/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishCommit.java b/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishCommit.java index cecb07a..44a5071 100644 --- a/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishCommit.java +++ b/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishCommit.java @@ -6,30 +6,28 @@ import javax.inject.Inject; -import org.ajoberstar.grgit.Grgit; +import org.ajoberstar.grgit.gradle.GrgitService; import org.gradle.api.DefaultTask; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.tasks.*; +@UntrackedTask(because = "Git tracks the state") public class GitPublishCommit extends DefaultTask { - private final Property grgit; + private final Property grgitService; private final Property message; private final Property sign; @Inject public GitPublishCommit(ObjectFactory objectFactory) { - this.grgit = objectFactory.property(Grgit.class); + this.grgitService = objectFactory.property(GrgitService.class); this.message = objectFactory.property(String.class); this.sign = objectFactory.property(Boolean.class); - - // always consider this task out of date - this.getOutputs().upToDateWhen(t -> false); } @Internal - public Property getGrgit() { - return grgit; + public Property getGrgitService() { + return grgitService; } @Input @@ -43,14 +41,9 @@ public Property getSign() { return sign; } - @OutputDirectory - public File getRepoDirectory() { - return getGrgit().get().getRepository().getRootDir(); - } - @TaskAction public void commit() { - Grgit git = getGrgit().get(); + var git = getGrgitService().get().getGrgit(); git.add(op -> { op.setPatterns(Stream.of(".").collect(Collectors.toSet())); }); @@ -68,5 +61,4 @@ public void commit() { setDidWork(true); } } - } diff --git a/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishPush.java b/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishPush.java index c198af0..f7799c9 100644 --- a/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishPush.java +++ b/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishPush.java @@ -5,29 +5,26 @@ import javax.inject.Inject; -import org.ajoberstar.grgit.BranchStatus; -import org.ajoberstar.grgit.Grgit; +import org.ajoberstar.grgit.gradle.GrgitService; import org.gradle.api.DefaultTask; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.tasks.*; +@UntrackedTask(because = "Git tracks the state") public class GitPublishPush extends DefaultTask { - private final Property grgit; + private final Property grgitService; private final Property branch; @Inject public GitPublishPush(ObjectFactory objectFactory) { - this.grgit = objectFactory.property(Grgit.class); + this.grgitService = objectFactory.property(GrgitService.class); this.branch = objectFactory.property(String.class); - // always consider this task out of date - this.getOutputs().upToDateWhen(t -> false); - this.onlyIf(t -> { try { - Grgit git = getGrgit().get(); - BranchStatus status = git.getBranch().status(op -> { + var git = getGrgitService().get().getGrgit(); + var status = git.getBranch().status(op -> { op.setName(getBranch().get()); }); return status.getAheadCount() > 0; @@ -39,8 +36,8 @@ public GitPublishPush(ObjectFactory objectFactory) { } @Internal - public Property getGrgit() { - return grgit; + public Property getGrgitService() { + return grgitService; } @Input @@ -48,15 +45,10 @@ public Property getBranch() { return branch; } - @OutputDirectory - public File getRepoDirectory() { - return getGrgit().get().getRepository().getRootDir(); - } - @TaskAction public void push() { - Grgit git = getGrgit().get(); - String pubBranch = getBranch().get(); + var git = getGrgitService().get().getGrgit(); + var pubBranch = getBranch().get(); git.push(op -> { op.setRefsOrSpecs(Arrays.asList(String.format("refs/heads/%s:refs/heads/%s", pubBranch, pubBranch))); }); diff --git a/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishReset.java b/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishReset.java index baa92fa..da9a757 100644 --- a/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishReset.java +++ b/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishReset.java @@ -14,6 +14,8 @@ import org.ajoberstar.grgit.Grgit; import org.ajoberstar.grgit.Ref; +import org.ajoberstar.grgit.gradle.GrgitService; +import org.eclipse.jgit.transport.RemoteConfig; import org.eclipse.jgit.transport.URIish; import org.gradle.api.DefaultTask; import org.gradle.api.file.DirectoryProperty; @@ -23,15 +25,12 @@ import org.gradle.api.file.ProjectLayout; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.Internal; -import org.gradle.api.tasks.OutputDirectory; -import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.*; import org.gradle.api.tasks.util.PatternFilterable; +@UntrackedTask(because = "Git tracks the state") public class GitPublishReset extends DefaultTask { - private final Property grgit; - private final DirectoryProperty repoDirectory; + private final Property grgitService; private final Property repoUri; private final Property referenceRepoUri; private final Property branch; @@ -39,19 +38,15 @@ public class GitPublishReset extends DefaultTask { @Inject public GitPublishReset(ProjectLayout layout, ObjectFactory objectFactory) { - this.grgit = objectFactory.property(Grgit.class); - this.repoDirectory = getProject().getObjects().directoryProperty(); + this.grgitService = objectFactory.property(GrgitService.class); this.repoUri = objectFactory.property(String.class); this.referenceRepoUri = objectFactory.property(String.class); this.branch = objectFactory.property(String.class); - - // always consider this task out of date - this.getOutputs().upToDateWhen(t -> false); } @Internal - public Property getGrgit() { - return grgit; + public Property getGrgitService() { + return grgitService; } @Internal @@ -59,11 +54,6 @@ public Property getReferenceRepoUri() { return referenceRepoUri; } - @OutputDirectory - public DirectoryProperty getRepoDirectory() { - return repoDirectory; - } - @Input public Property getRepoUri() { return repoUri; @@ -84,11 +74,39 @@ public void setPreserve(PatternFilterable preserve) { } @TaskAction - public void reset() { - Grgit git = findExistingRepo().orElseGet(() -> freshRepo()); - grgit.set(git); + public void reset() throws IOException { + var git = grgitService.get().getGrgit(); - String pubBranch = getBranch().get(); + if (!isRemoteUriMatch(git, "origin", repoUri.get())) { + git.getRemote().remove(op -> { + op.setName("origin"); + }); + git.getRemote().add(op -> { + op.setName("origin"); + op.setUrl(repoUri.get()); + }); + } + + if (referenceRepoUri.isPresent() && !isRemoteUriMatch(git, "reference", referenceRepoUri.get())) { + git.getRemote().remove(op -> { + op.setName("reference"); + }); + + git.getRemote().add(op -> { + op.setName("reference"); + op.setUrl(referenceRepoUri.get()); + }); + } + + var pubBranch = getBranch().get(); + + if (!pubBranch.equals(git.getBranch().current().getName())) { + // create a new orphan branch + git.checkout(op -> { + op.setBranch(pubBranch); + op.setOrphan(true); + }); + } if (referenceRepoUri.isPresent()) { Map referenceBranches = git.lsremote(op -> { @@ -142,12 +160,6 @@ public void reset() { op.setCommit("origin/" + pubBranch); op.setMode("hard"); }); - } else { - // create a new orphan branch - git.checkout(op -> { - op.setBranch(pubBranch); - op.setOrphan(true); - }); } // clean up unwanted files @@ -177,55 +189,20 @@ public void visitFile(FileVisitDetails fileVisitDetails) { }); } - private Optional findExistingRepo() { - try { - return Optional.of(Grgit.open(op -> op.setDir(repoDirectory.get().getAsFile()))) - .filter(repo -> { - boolean valid = isRemoteUriMatch(repo, "origin", repoUri.get()) - && (!referenceRepoUri.isPresent() || isRemoteUriMatch(repo, "reference", referenceRepoUri.get())) - && branch.get().equals(repo.getBranch().current().getName()); - if (!valid) { - repo.close(); - } - return valid; - }); - } catch (Exception e) { - // missing, invalid, or corrupt repo - getProject().getLogger().debug("Failed to find existing Git publish repository.", e); - return Optional.empty(); - } - } - - private Grgit freshRepo() { - getProject().delete(repoDirectory.get().getAsFile()); - - Grgit repo = Grgit.init(op -> { - op.setDir(repoDirectory.get().getAsFile()); - }); - repo.getRemote().add(op -> { - op.setName("origin"); - op.setUrl(repoUri.get()); - }); - if (referenceRepoUri.isPresent()) { - repo.getRemote().add(op -> { - op.setName("reference"); - op.setUrl(referenceRepoUri.get()); - }); - } - return repo; - } - private boolean isRemoteUriMatch(Grgit grgit, String remoteName, String remoteUri) { try { - String currentRemoteUri = grgit.getRemote().list().stream() + var maybeCurrentRemoteUri = grgit.getRemote().list().stream() .filter(remote -> remote.getName().equals(remoteName)) .map(remote -> remote.getUrl()) - .findAny() - .orElse(null); + .findAny(); // need to use the URIish to normalize them and ensure we support all Git compatible URI-ishs (URL // is too limiting) - return new URIish(remoteUri).equals(new URIish(currentRemoteUri)); + if (maybeCurrentRemoteUri.isPresent()) { + return new URIish(remoteUri).equals(new URIish(maybeCurrentRemoteUri.get())); + } else { + return false; + } } catch (URISyntaxException e) { throw new RuntimeException("Invalid URI.", e); } diff --git a/stutter.lockfile b/stutter.lockfile index 30b32ae..a38e46b 100644 --- a/stutter.lockfile +++ b/stutter.lockfile @@ -1,4 +1,3 @@ # DO NOT MODIFY: Generated by Stutter plugin. -java11=5.0,5.6.4,6.0.1,6.9.2,7.0.2,7.4 +java11=7.0.2,7.4 java17=7.3.3,7.4 -java8=5.0,5.6.4,6.0.1,6.9.2,7.0.2,7.4 From 0f1917eb6fdc311eb58e0648a47ff4f2c94ba798 Mon Sep 17 00:00:00 2001 From: Andrew Oberstar Date: Wed, 9 Feb 2022 20:55:47 -0600 Subject: [PATCH 3/3] Support configuration cache Fixes #93 --- .../gradle/git/publish/BaseCompatTest.groovy | 4 ++-- .../git/publish/tasks/GitPublishReset.java | 20 ++++++++----------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/compatTest/groovy/org/ajoberstar/gradle/git/publish/BaseCompatTest.groovy b/src/compatTest/groovy/org/ajoberstar/gradle/git/publish/BaseCompatTest.groovy index 79398b6..c36aea0 100644 --- a/src/compatTest/groovy/org/ajoberstar/gradle/git/publish/BaseCompatTest.groovy +++ b/src/compatTest/groovy/org/ajoberstar/gradle/git/publish/BaseCompatTest.groovy @@ -421,11 +421,11 @@ gitPublish { result.task(':gitPublishPush').outcome == TaskOutcome.SUCCESS } - private BuildResult build(String... args = ['gitPublishPush', '--stacktrace', '--info']) { + private BuildResult build(String... args = ['gitPublishPush', '--stacktrace', '--info', '--configuration-cache']) { return runner(args).build() } - private BuildResult buildAndFail(String... args = ['gitPublishPush', '--stacktrace', '--info']) { + private BuildResult buildAndFail(String... args = ['gitPublishPush', '--stacktrace', '--info', '--configuration-cache']) { return runner(args).buildAndFail() } diff --git a/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishReset.java b/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishReset.java index da9a757..ea27655 100644 --- a/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishReset.java +++ b/src/main/java/org/ajoberstar/gradle/git/publish/tasks/GitPublishReset.java @@ -6,7 +6,6 @@ import java.nio.file.Files; import java.util.Arrays; import java.util.Map; -import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -15,14 +14,9 @@ import org.ajoberstar.grgit.Grgit; import org.ajoberstar.grgit.Ref; import org.ajoberstar.grgit.gradle.GrgitService; -import org.eclipse.jgit.transport.RemoteConfig; import org.eclipse.jgit.transport.URIish; import org.gradle.api.DefaultTask; -import org.gradle.api.file.DirectoryProperty; -import org.gradle.api.file.FileTree; -import org.gradle.api.file.FileVisitDetails; -import org.gradle.api.file.FileVisitor; -import org.gradle.api.file.ProjectLayout; +import org.gradle.api.file.*; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.tasks.*; @@ -35,13 +29,15 @@ public class GitPublishReset extends DefaultTask { private final Property referenceRepoUri; private final Property branch; private PatternFilterable preserve; + private final ObjectFactory objectFactory; @Inject - public GitPublishReset(ProjectLayout layout, ObjectFactory objectFactory) { + public GitPublishReset(ObjectFactory objectFactory) { this.grgitService = objectFactory.property(GrgitService.class); this.repoUri = objectFactory.property(String.class); this.referenceRepoUri = objectFactory.property(String.class); this.branch = objectFactory.property(String.class); + this.objectFactory = objectFactory; } @Internal @@ -162,10 +158,10 @@ public void reset() throws IOException { }); } - // clean up unwanted files - FileTree repoTree = getProject().fileTree(git.getRepository().getRootDir()); - FileTree preservedTree = repoTree.matching(getPreserve()); - FileTree unwantedTree = repoTree.minus(preservedTree).getAsFileTree(); + var repoTree = objectFactory.fileTree(); + repoTree.from(git.getRepository().getRootDir()); + var preservedTree = repoTree.matching(getPreserve()); + var unwantedTree = repoTree.minus(preservedTree).getAsFileTree(); unwantedTree.visit(new FileVisitor() { @Override public void visitDir(FileVisitDetails fileVisitDetails) {