Skip to content

Commit 7ffe081

Browse files
committed
Replace taskGraph.afterTask with an operation completion listener in Gradle 6.1+
1 parent af4bf46 commit 7ffe081

File tree

3 files changed

+58
-13
lines changed

3 files changed

+58
-13
lines changed

build.gradle

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import org.gradle.api.internal.classpath.ModuleRegistry
2+
13
buildscript {
24
repositories {
35
maven {
@@ -33,6 +35,10 @@ dependencies {
3335
testCompile "cglib:cglib-nodep:3.2.8"
3436
testImplementation gradleTestKit()
3537
testImplementation("org.junit.jupiter:junit-jupiter:5.7.1")
38+
39+
// work-around for https://github.com/gradle/gradle/issues/16774
40+
testRuntimeOnly(files(project.services.get(ModuleRegistry).getModule('gradle-tooling-api-builders').classpath.asFiles.first()))
41+
testRuntimeOnly('com.google.guava:guava:27.1-android')
3642
}
3743

3844
gradlePlugin {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package net.researchgate.release
2+
3+
import org.gradle.build.event.BuildEventsListenerRegistry
4+
5+
import javax.inject.Inject
6+
7+
interface BuildEventsListenerRegistryProvider {
8+
@Inject
9+
BuildEventsListenerRegistry getBuildEventsListenerRegistry();
10+
}

src/main/groovy/net/researchgate/release/ReleasePlugin.groovy

+42-13
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,19 @@ import org.gradle.api.GradleException
2828
import org.gradle.api.Plugin
2929
import org.gradle.api.Project
3030
import org.gradle.api.Task
31+
import org.gradle.api.model.ObjectFactory
3132
import org.gradle.api.plugins.BasePlugin
33+
import org.gradle.api.provider.ProviderFactory
3234
import org.gradle.api.tasks.GradleBuild
3335
import org.gradle.api.tasks.TaskState
36+
import org.gradle.build.event.BuildEventsListenerRegistry
37+
import org.gradle.tooling.events.OperationCompletionListener
38+
import org.gradle.tooling.events.task.TaskFailureResult
39+
import org.gradle.util.GradleVersion
3440

35-
class ReleasePlugin extends PluginHelper implements Plugin<Project> {
41+
import javax.inject.Inject
3642

43+
abstract class ReleasePlugin extends PluginHelper implements Plugin<Project> {
3744
static final String RELEASE_GROUP = 'Release'
3845

3946
private BaseScmAdapter scmAdapter
@@ -73,7 +80,7 @@ class ReleasePlugin extends PluginHelper implements Plugin<Project> {
7380
"${p}updateVersion" as String,
7481
"${p}commitNewVersion" as String
7582
]
76-
83+
7784
// Gradle 6 workaround (https://github.com/gradle/gradle/issues/12872)
7885
buildName = project.name + "-release"
7986
}
@@ -115,7 +122,7 @@ class ReleasePlugin extends PluginHelper implements Plugin<Project> {
115122
"${p}afterReleaseBuild" as String
116123
].flatten()
117124
}
118-
125+
119126
// Gradle 6 workaround (https://github.com/gradle/gradle/issues/12872)
120127
buildName = project.name + "-release"
121128
}
@@ -157,18 +164,40 @@ class ReleasePlugin extends PluginHelper implements Plugin<Project> {
157164
}
158165
}
159166

160-
project.gradle.taskGraph.afterTask { Task task, TaskState state ->
161-
if (state.failure && task.name == "release") {
162-
try {
163-
createScmAdapter()
164-
} catch (Exception ignored) {}
165-
if (scmAdapter && extension.revertOnFail && project.file(extension.versionPropertyFile)?.exists()) {
166-
log.error('Release process failed, reverting back any changes made by Release Plugin.')
167-
scmAdapter.revert()
168-
} else {
169-
log.error('Release process failed, please remember to revert any uncommitted changes made by the Release Plugin.')
167+
if (GradleVersion.current() < GradleVersion.version('6.1')) {
168+
project.gradle.taskGraph.afterTask { Task task, TaskState state ->
169+
if (state.failure && task.name == 'release') {
170+
revert()
170171
}
171172
}
173+
} else {
174+
objects.newInstance(BuildEventsListenerRegistryProvider)
175+
.buildEventsListenerRegistry
176+
.onTaskCompletion(providers.provider {
177+
{ finishEvent ->
178+
if ((finishEvent.result instanceof TaskFailureResult) && finishEvent.descriptor.taskPath.endsWith(':release')) {
179+
revert()
180+
}
181+
} as OperationCompletionListener
182+
})
183+
}
184+
}
185+
186+
@Inject
187+
abstract protected ObjectFactory getObjects();
188+
189+
@Inject
190+
abstract protected ProviderFactory getProviders();
191+
192+
protected revert() {
193+
try {
194+
createScmAdapter()
195+
} catch (Exception ignored) {}
196+
if (scmAdapter && extension.revertOnFail && project.file(extension.versionPropertyFile)?.exists()) {
197+
log.error('Release process failed, reverting back any changes made by Release Plugin.')
198+
scmAdapter.revert()
199+
} else {
200+
log.error('Release process failed, please remember to revert any uncommitted changes made by the Release Plugin.')
172201
}
173202
}
174203

0 commit comments

Comments
 (0)