Skip to content

Commit 86c70ec

Browse files
authored
Merge pull request #7011 from chrisrueger/fix-gradle-release-for-sonatype
Fix Sonatype Release: Handle last bundle release in Gradle BndPlugin
2 parents 8ac0af5 + 86e4fe3 commit 86c70ec

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

gradle-plugins/biz.aQute.bnd.gradle/src/main/java/aQute/bnd/gradle/BndPlugin.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import aQute.bnd.build.Container;
3131
import aQute.bnd.build.Container.TYPE;
32+
import aQute.bnd.build.Project.ReleaseParameter;
3233
import aQute.bnd.build.Workspace;
3334
import aQute.bnd.exceptions.Exceptions;
3435
import aQute.bnd.exporter.executable.ExecutableJarExporter;
@@ -55,7 +56,6 @@
5556
import org.gradle.api.file.FileCollection;
5657
import org.gradle.api.file.ProjectLayout;
5758
import org.gradle.api.file.SourceDirectorySet;
58-
import org.gradle.api.internal.plugins.DslObject;
5959
import org.gradle.api.logging.Logger;
6060
import org.gradle.api.model.ObjectFactory;
6161
import org.gradle.api.plugins.BasePluginExtension;
@@ -590,19 +590,44 @@ public void execute(Task tt) {
590590
t.dependsOn(getDependents(JavaBasePlugin.BUILD_DEPENDENTS_TASK_NAME));
591591
});
592592

593+
Provider<ReleaseCounterService> releaseCounter =
594+
project.getGradle().getSharedServices().registerIfAbsent(
595+
"bndReleaseCounter",
596+
ReleaseCounterService.class,
597+
spec -> { /* no params */ }
598+
);
599+
593600
TaskProvider<Task> release = tasks.register("release", t -> {
594601
t.setDescription("Release this project to the release repository.");
595602
t.setGroup(PublishingPlugin.PUBLISH_TASK_GROUP);
596-
t.setEnabled(!bndProject.isNoBundles() && !bndProject.getProperty(Constants.RELEASEREPO, "unset")
597-
.isEmpty());
603+
604+
boolean enabled = !bndProject.isNoBundles() && !bndProject.getProperty(Constants.RELEASEREPO, "unset")
605+
.isEmpty();
606+
t.setEnabled(enabled);
598607
t.getInputs()
599608
.files(jar)
600609
.withPropertyName(jar.getName());
610+
611+
// IMPORTANT: only register tasks that can actually run
612+
if (enabled) {
613+
// configuration-time registration is what makes the counter correct
614+
releaseCounter.get().registerReleaseTask();
615+
}
616+
601617
t.doLast("release", new Action<>() {
602618
@Override
603619
public void execute(Task tt) {
604620
try {
605-
bndProject.release();
621+
622+
boolean isLastBundle = releaseCounter.get().isLastReleaseTask();
623+
if (!isLastBundle) {
624+
bndProject.release();
625+
} else {
626+
// releasing last bundle in workspace (special
627+
// case for sonatype release)
628+
logger.info("Last release bundle {}", jar.getName());
629+
bndProject.release(new ReleaseParameter(null, false, true));
630+
}
606631
} catch (Exception e) {
607632
throw new GradleException(
608633
String.format("Project %s failed to release", bndProject.getName()), e);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package aQute.bnd.gradle;
2+
3+
import java.util.concurrent.atomic.AtomicInteger;
4+
5+
import org.gradle.api.services.BuildService;
6+
import org.gradle.api.services.BuildServiceParameters;
7+
8+
public abstract class ReleaseCounterService
9+
implements BuildService<BuildServiceParameters.None>, AutoCloseable {
10+
11+
private final AtomicInteger remaining = new AtomicInteger(0);
12+
13+
/** Call during configuration for each enabled release task */
14+
public void registerReleaseTask() {
15+
remaining.incrementAndGet();
16+
}
17+
18+
/**
19+
* Call during execution by each release task.
20+
* Returns true exactly once: for the last release task that runs.
21+
*/
22+
public boolean isLastReleaseTask() {
23+
return remaining.decrementAndGet() == 0;
24+
}
25+
26+
@Override
27+
public void close() {
28+
// nothing
29+
}
30+
}

0 commit comments

Comments
 (0)