|
29 | 29 |
|
30 | 30 | import aQute.bnd.build.Container; |
31 | 31 | import aQute.bnd.build.Container.TYPE; |
| 32 | +import aQute.bnd.build.Project.ReleaseParameter; |
32 | 33 | import aQute.bnd.build.Workspace; |
33 | 34 | import aQute.bnd.exceptions.Exceptions; |
34 | 35 | import aQute.bnd.exporter.executable.ExecutableJarExporter; |
|
55 | 56 | import org.gradle.api.file.FileCollection; |
56 | 57 | import org.gradle.api.file.ProjectLayout; |
57 | 58 | import org.gradle.api.file.SourceDirectorySet; |
58 | | -import org.gradle.api.internal.plugins.DslObject; |
59 | 59 | import org.gradle.api.logging.Logger; |
60 | 60 | import org.gradle.api.model.ObjectFactory; |
61 | 61 | import org.gradle.api.plugins.BasePluginExtension; |
@@ -590,19 +590,44 @@ public void execute(Task tt) { |
590 | 590 | t.dependsOn(getDependents(JavaBasePlugin.BUILD_DEPENDENTS_TASK_NAME)); |
591 | 591 | }); |
592 | 592 |
|
| 593 | + Provider<ReleaseCounterService> releaseCounter = |
| 594 | + project.getGradle().getSharedServices().registerIfAbsent( |
| 595 | + "bndReleaseCounter", |
| 596 | + ReleaseCounterService.class, |
| 597 | + spec -> { /* no params */ } |
| 598 | + ); |
| 599 | + |
593 | 600 | TaskProvider<Task> release = tasks.register("release", t -> { |
594 | 601 | t.setDescription("Release this project to the release repository."); |
595 | 602 | 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); |
598 | 607 | t.getInputs() |
599 | 608 | .files(jar) |
600 | 609 | .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 | + |
601 | 617 | t.doLast("release", new Action<>() { |
602 | 618 | @Override |
603 | 619 | public void execute(Task tt) { |
604 | 620 | 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 | + } |
606 | 631 | } catch (Exception e) { |
607 | 632 | throw new GradleException( |
608 | 633 | String.format("Project %s failed to release", bndProject.getName()), e); |
|
0 commit comments