From ae0bd2103068a935fe37aadacc9560e5e95498f6 Mon Sep 17 00:00:00 2001 From: Andres Almiray Date: Fri, 30 Jul 2021 01:16:39 +0200 Subject: [PATCH] [sdkman] rework how packager and announcer work together. Resolves #319 --- .../jreleaser/engine/announce/Announcers.java | 4 +- .../main/java/org/jreleaser/model/Sdkman.java | 10 ++++ .../org/jreleaser/model/SdkmanAnnouncer.java | 27 ++++++++-- .../validation/SdkmanAnnouncerValidator.java | 21 ++++---- .../model/validation/SdkmanValidator.java | 13 +++++ .../jreleaser/tools/SdkmanToolProcessor.java | 8 ++- .../java/org/jreleaser/util/Constants.java | 2 + .../gradle/plugin/dsl/SdkmanAnnouncer.groovy | 4 ++ .../internal/dsl/SdkmanAnnouncerImpl.groovy | 14 ++++- .../maven/plugin/SdkmanAnnouncer.java | 25 ++++++++- .../internal/JReleaserModelConverter.java | 1 + .../sdk/sdkman/AbstractSdkmanCommand.java | 6 +++ .../sdk/sdkman/MajorReleaseSdkmanCommand.java | 6 ++- .../sdk/sdkman/MinorReleaseSdkmanCommand.java | 6 ++- .../java/org/jreleaser/sdk/sdkman/Sdkman.java | 30 ++++++----- .../jreleaser/sdk/sdkman/SdkmanAnnouncer.java | 53 +++++++++++++++++++ 16 files changed, 196 insertions(+), 34 deletions(-) diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/announce/Announcers.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/announce/Announcers.java index 9eac77ba..afa2d911 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/announce/Announcers.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/announce/Announcers.java @@ -24,9 +24,9 @@ import org.jreleaser.model.announcer.spi.Announcer; import org.jreleaser.model.announcer.spi.AnnouncerBuilder; import org.jreleaser.model.announcer.spi.AnnouncerBuilderFactory; -import java.util.LinkedHashMap; import java.util.Map; import java.util.ServiceLoader; +import java.util.TreeMap; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -90,7 +90,7 @@ public class Announcers { Announcers.class.getClassLoader()).spliterator(), false) .collect(Collectors.toMap(AnnouncerBuilderFactory::getName, AnnouncerBuilderFactory::getBuilder)); - Map announcers = new LinkedHashMap<>(); + Map announcers = new TreeMap<>(); builders.forEach((name, builder) -> { if (null != model.getAnnounce().findAnnouncer(name)) { announcers.put(name, builder.configureWith(context).build()); diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Sdkman.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Sdkman.java index d00b0855..b0eab943 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Sdkman.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Sdkman.java @@ -44,6 +44,7 @@ public class Sdkman extends AbstractTool implements TimeoutAware { private String consumerToken; private int connectTimeout; private int readTimeout; + private boolean published; public Sdkman() { super(NAME); @@ -58,6 +59,7 @@ public class Sdkman extends AbstractTool implements TimeoutAware { this.consumerToken = sdkman.consumerToken; this.connectTimeout = sdkman.connectTimeout; this.readTimeout = sdkman.readTimeout; + this.published = sdkman.published; } public String getResolvedConsumerKey() { return Env.resolve(SDKMAN_CONSUMER_KEY, consumerKey); @@ -135,6 +137,14 @@ public class Sdkman extends AbstractTool implements TimeoutAware { this.readTimeout = readTimeout; } + public boolean isPublished() { + return published; + } + + public void setPublished(boolean published) { + this.published = published; + } + @Override protected void asMap(boolean full, Map props) { props.put("candidate", candidate); diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/SdkmanAnnouncer.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/SdkmanAnnouncer.java index 0c4b3411..85445eb5 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/SdkmanAnnouncer.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/SdkmanAnnouncer.java @@ -38,7 +38,7 @@ public class SdkmanAnnouncer extends AbstractAnnouncer { private String consumerToken; private String candidate; private String releaseNotesUrl; - private boolean major = true; + private Sdkman.Command command; public SdkmanAnnouncer() { super(NAME); @@ -50,7 +50,7 @@ public class SdkmanAnnouncer extends AbstractAnnouncer { this.consumerToken = sdkman.consumerToken; this.candidate = sdkman.candidate; this.releaseNotesUrl = sdkman.releaseNotesUrl; - this.major = sdkman.major; + this.command = sdkman.command; } @Override @@ -98,12 +98,29 @@ public class SdkmanAnnouncer extends AbstractAnnouncer { this.releaseNotesUrl = releaseNotesUrl; } + public Sdkman.Command getCommand() { + return command; + } + + public void setCommand(Sdkman.Command command) { + this.command = command; + } + + public void setCommand(String str) { + this.command = Sdkman.Command.of(str); + } + + public boolean isCommandSet() { + return command != null; + } + public boolean isMajor() { - return major; + return command == Sdkman.Command.MAJOR; } public void setMajor(boolean major) { - this.major = major; + System.out.println("announce.sdkman.major has been deprecated since 0.6.0 and will be removed in the future. Use announce.sdkman.command instead"); + this.command = major? Sdkman.Command.MAJOR: Sdkman.Command.MINOR; } @Override @@ -112,6 +129,6 @@ public class SdkmanAnnouncer extends AbstractAnnouncer { props.put("consumerToken", isNotBlank(getResolvedConsumerToken()) ? HIDE : UNSET); props.put("candidate", candidate); props.put("releaseNotesUrl", releaseNotesUrl); - props.put("major", major); + props.put("command", command); } } diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/SdkmanAnnouncerValidator.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/SdkmanAnnouncerValidator.java index 0bcfa085..86931b6a 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/SdkmanAnnouncerValidator.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/SdkmanAnnouncerValidator.java @@ -17,7 +17,9 @@ */ package org.jreleaser.model.validation; +import org.jreleaser.model.Active; import org.jreleaser.model.JReleaserContext; +import org.jreleaser.model.Sdkman; import org.jreleaser.model.SdkmanAnnouncer; import org.jreleaser.util.Errors; @@ -31,6 +33,12 @@ import static org.jreleaser.util.StringUtils.isBlank; */ public abstract class SdkmanAnnouncerValidator extends Validator { public static void validateSdkmanAnnouncer(JReleaserContext context, SdkmanAnnouncer sdkman, Errors errors) { + // activate if there are any active distributions with Sdkman packager enabled + context.getModel().getActiveDistributions().stream() + .filter(d -> d.getSdkman().isEnabled()) + .findFirst() + .ifPresent(distribution -> sdkman.setActive(Active.ALWAYS)); + if (!sdkman.resolveEnabled(context.getModel().getProject())) return; if (!context.getModel().getRelease().getGitService().isReleaseSupported()) { sdkman.disable(); @@ -64,15 +72,10 @@ public abstract class SdkmanAnnouncerValidator extends Validator { sdkman.disable(); } - validateTimeout(sdkman); + if (null == sdkman.getCommand()) { + sdkman.setCommand(Sdkman.Command.MAJOR); + } - context.getModel().getActiveDistributions().stream() - .filter(d -> d.getSdkman().isEnabled()) - .findFirst() - .ifPresent(distribution -> { - errors.configuration("announce.sdkman and distribution." + - distribution.getName() + - ".sdkman are mutually exclusive. Please remove one of them."); - }); + validateTimeout(sdkman); } } \ No newline at end of file diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/SdkmanValidator.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/SdkmanValidator.java index 1e5476c8..bfdddea6 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/SdkmanValidator.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/SdkmanValidator.java @@ -33,6 +33,7 @@ import static org.jreleaser.model.Sdkman.SDKMAN_CONSUMER_KEY; import static org.jreleaser.model.Sdkman.SDKMAN_CONSUMER_TOKEN; import static org.jreleaser.model.validation.DistributionsValidator.validateArtifactPlatforms; import static org.jreleaser.model.validation.ExtraPropertiesValidator.mergeExtraProperties; +import static org.jreleaser.util.Constants.MAGIC_SET; import static org.jreleaser.util.StringUtils.isBlank; /** @@ -44,6 +45,10 @@ public abstract class SdkmanValidator extends Validator { JReleaserModel model = context.getModel(); Sdkman parentTool = model.getPackagers().getSdkman(); + boolean toolSet = tool.isActiveSet(); + boolean parentToolSet = parentTool.isActiveSet(); + tool.getExtraProperties().put(MAGIC_SET, toolSet && parentToolSet); + if (!tool.isActiveSet() && parentTool.isActiveSet()) { tool.setActive(parentTool.getActive()); } @@ -103,6 +108,14 @@ public abstract class SdkmanValidator extends Validator { public static void postValidateSdkman(JReleaserContext context, Errors errors) { Map> map = context.getModel().getDistributions().values().stream() + .peek(distribution -> { + if (distribution.getSdkman().getExtraProperties().containsKey(MAGIC_SET)) { + boolean set = (boolean) distribution.getSdkman().getExtraProperties().remove(MAGIC_SET); + if (set) { + context.getModel().getAnnounce().getSdkman().getExtraProperties().put(MAGIC_SET, set); + } + } + }) .filter(d -> d.isEnabled() && d.getSdkman().isEnabled()) .collect(groupingBy(d -> d.getSdkman().getCandidate())); diff --git a/core/jreleaser-tools/src/main/java/org/jreleaser/tools/SdkmanToolProcessor.java b/core/jreleaser-tools/src/main/java/org/jreleaser/tools/SdkmanToolProcessor.java index 4f3a511f..ec8fe10c 100644 --- a/core/jreleaser-tools/src/main/java/org/jreleaser/tools/SdkmanToolProcessor.java +++ b/core/jreleaser-tools/src/main/java/org/jreleaser/tools/SdkmanToolProcessor.java @@ -89,7 +89,7 @@ public class SdkmanToolProcessor extends AbstractToolProcessor { switch (sdkman.getCommand()) { case MAJOR: - context.getLogger().info("Announcing major release of '{}' candidate", candidate); + context.getLogger().info("publishing major release of '{}' candidate", candidate); MajorReleaseSdkmanCommand.builder(context.getLogger()) .connectTimeout(sdkman.getConnectTimeout()) .readTimeout(sdkman.getReadTimeout()) @@ -100,11 +100,12 @@ public class SdkmanToolProcessor extends AbstractToolProcessor { .platforms(platforms) .releaseNotesUrl(releaseNotesUrl) .dryrun(context.isDryrun()) + .skipAnnounce(true) .build() .execute(); break; case MINOR: - context.getLogger().info("Announcing minor release of '{}' candidate", candidate); + context.getLogger().info("publishing minor release of '{}' candidate", candidate); MinorReleaseSdkmanCommand.builder(context.getLogger()) .connectTimeout(sdkman.getConnectTimeout()) .readTimeout(sdkman.getReadTimeout()) @@ -115,10 +116,13 @@ public class SdkmanToolProcessor extends AbstractToolProcessor { .platforms(platforms) .releaseNotesUrl(releaseNotesUrl) .dryrun(context.isDryrun()) + .skipAnnounce(true) .build() .execute(); break; } + + sdkman.setPublished(true); } catch (SdkmanException e) { throw new ToolProcessingException(e); } diff --git a/core/jreleaser-utils/src/main/java/org/jreleaser/util/Constants.java b/core/jreleaser-utils/src/main/java/org/jreleaser/util/Constants.java index 76043345..cce44897 100644 --- a/core/jreleaser-utils/src/main/java/org/jreleaser/util/Constants.java +++ b/core/jreleaser-utils/src/main/java/org/jreleaser/util/Constants.java @@ -25,6 +25,8 @@ public interface Constants { String UNSET = "**unset**"; String HIDE = "************"; + String MAGIC_SET = "__MAGIC_SET__"; + // General String KEY_ZONED_DATE_TIME_NOW = "__ZonedDateTime_now__"; String KEY_TIMESTAMP = "timestamp"; diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/SdkmanAnnouncer.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/SdkmanAnnouncer.groovy index 200cab5c..902a92b9 100644 --- a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/SdkmanAnnouncer.groovy +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/SdkmanAnnouncer.groovy @@ -36,4 +36,8 @@ interface SdkmanAnnouncer extends Announcer { Property getReleaseNotesUrl() Property getMajor() + + Property getCommand() + + void setCommand(String str) } \ No newline at end of file diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/SdkmanAnnouncerImpl.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/SdkmanAnnouncerImpl.groovy index 9a75dab4..7cdbf78c 100644 --- a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/SdkmanAnnouncerImpl.groovy +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/SdkmanAnnouncerImpl.groovy @@ -26,6 +26,8 @@ import org.jreleaser.model.SdkmanAnnouncer import javax.inject.Inject +import static org.jreleaser.util.StringUtils.isNotBlank + /** * * @author Andres Almiray @@ -38,6 +40,7 @@ class SdkmanAnnouncerImpl extends AbstractAnnouncer implements org.jreleaser.gra final Property candidate final Property releaseNotesUrl final Property major + final Property command @Inject SdkmanAnnouncerImpl(ObjectFactory objects) { @@ -49,6 +52,13 @@ class SdkmanAnnouncerImpl extends AbstractAnnouncer implements org.jreleaser.gra major = objects.property(Boolean).convention(Providers.notDefined()) } + @Override + void setCommand(String str) { + if (isNotBlank(str)) { + command.set(org.jreleaser.model.Sdkman.Command.of(str.trim())) + } + } + @Override @Internal boolean isSet() { @@ -57,7 +67,8 @@ class SdkmanAnnouncerImpl extends AbstractAnnouncer implements org.jreleaser.gra consumerToken.present || candidate.present || releaseNotesUrl.present || - major.present + major.present || + command.present } SdkmanAnnouncer toModel() { @@ -67,6 +78,7 @@ class SdkmanAnnouncerImpl extends AbstractAnnouncer implements org.jreleaser.gra if (consumerToken.present) sdkman.consumerToken = consumerToken.get() if (candidate.present) sdkman.candidate = candidate.get() if (releaseNotesUrl.present) sdkman.releaseNotesUrl = releaseNotesUrl.get() + if (command.present) sdkman.command = command.get() sdkman.major = major.getOrElse(true) sdkman } diff --git a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/SdkmanAnnouncer.java b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/SdkmanAnnouncer.java index ee53efbe..68aa2561 100644 --- a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/SdkmanAnnouncer.java +++ b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/SdkmanAnnouncer.java @@ -29,6 +29,7 @@ public class SdkmanAnnouncer extends AbstractAnnouncer { private String candidate; private String releaseNotesUrl; private boolean major = true; + private Sdkman.Command command; void setAll(SdkmanAnnouncer sdkman) { super.setAll(sdkman); @@ -37,6 +38,7 @@ public class SdkmanAnnouncer extends AbstractAnnouncer { this.candidate = sdkman.candidate; this.releaseNotesUrl = sdkman.releaseNotesUrl; this.major = sdkman.major; + this.command = sdkman.command; } public String getConsumerKey() { @@ -79,12 +81,33 @@ public class SdkmanAnnouncer extends AbstractAnnouncer { this.major = major; } + public Sdkman.Command getCommand() { + return command; + } + + public void setCommand(Sdkman.Command command) { + this.command = command; + } + + public void setCommand(String str) { + this.command = Sdkman.Command.of(str); + } + + public String resolveCommand() { + return command != null ? command.name() : null; + } + + public boolean isCommandSet() { + return command != null; + } + @Override public boolean isSet() { return super.isSet() || isNotBlank(consumerKey) || isNotBlank(consumerToken) || isNotBlank(candidate) || - isNotBlank(releaseNotesUrl); + isNotBlank(releaseNotesUrl) || + null != command; } } diff --git a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java index d0064602..580978c0 100644 --- a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java +++ b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java @@ -554,6 +554,7 @@ public final class JReleaserModelConverter { a.setCandidate(sdkman.getCandidate()); a.setReleaseNotesUrl(sdkman.getReleaseNotesUrl()); a.setMajor(sdkman.isMajor()); + a.setCommand(sdkman.resolveCommand()); return a; } diff --git a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/AbstractSdkmanCommand.java b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/AbstractSdkmanCommand.java index 093800ef..b769f7f6 100644 --- a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/AbstractSdkmanCommand.java +++ b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/AbstractSdkmanCommand.java @@ -50,6 +50,7 @@ abstract class AbstractSdkmanCommand implements SdkmanCommand { static class Builder> { protected final JReleaserLogger logger; protected boolean dryrun; + protected boolean skipAnnounce; protected String consumerKey; protected String consumerToken; protected String candidate; @@ -72,6 +73,11 @@ abstract class AbstractSdkmanCommand implements SdkmanCommand { return self(); } + public S skipAnnounce(boolean skipAnnounce) { + this.skipAnnounce = skipAnnounce; + return self(); + } + /** * The SDK consumer key */ diff --git a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/MajorReleaseSdkmanCommand.java b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/MajorReleaseSdkmanCommand.java index 33f27aa8..c9e0c597 100644 --- a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/MajorReleaseSdkmanCommand.java +++ b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/MajorReleaseSdkmanCommand.java @@ -31,6 +31,7 @@ import static org.jreleaser.util.StringUtils.requireNonBlank; * @since 0.1.0 */ public class MajorReleaseSdkmanCommand extends AbstractSdkmanCommand { + private final boolean skipAnnounce; private final String hashtag; private final String releaseNotesUrl; private final Map platforms = new LinkedHashMap<>(); @@ -44,18 +45,20 @@ public class MajorReleaseSdkmanCommand extends AbstractSdkmanCommand { String candidate, String version, boolean dryrun, + boolean skipAnnounce, String hashtag, String releaseNotesUrl, Map platforms) { super(logger, apiHost, connectTimeout, readTimeout, consumerKey, consumerToken, candidate, version, dryrun); this.hashtag = hashtag; + this.skipAnnounce = skipAnnounce; this.releaseNotesUrl = releaseNotesUrl; this.platforms.putAll(platforms); } @Override public void execute() throws SdkmanException { - sdkman.majorRelease(candidate, version, platforms, hashtag, releaseNotesUrl); + sdkman.majorRelease(candidate, version, platforms, hashtag, releaseNotesUrl, skipAnnounce); } public static Builder builder(JReleaserLogger logger) { @@ -149,6 +152,7 @@ public class MajorReleaseSdkmanCommand extends AbstractSdkmanCommand { candidate, version, dryrun, + skipAnnounce, hashtag, releaseNotesUrl, platforms); diff --git a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/MinorReleaseSdkmanCommand.java b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/MinorReleaseSdkmanCommand.java index 9236f63e..145776b6 100644 --- a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/MinorReleaseSdkmanCommand.java +++ b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/MinorReleaseSdkmanCommand.java @@ -31,6 +31,7 @@ import static org.jreleaser.util.StringUtils.requireNonBlank; * @since 0.1.0 */ public class MinorReleaseSdkmanCommand extends AbstractSdkmanCommand { + private final boolean skipAnnounce; private final String hashtag; private final String releaseNotesUrl; private final Map platforms = new LinkedHashMap<>(); @@ -44,10 +45,12 @@ public class MinorReleaseSdkmanCommand extends AbstractSdkmanCommand { String candidate, String version, boolean dryrun, + boolean skipAnnounce, String hashtag, String releaseNotesUrl, Map platforms) { super(logger, apiHost, connectTimeout, readTimeout, consumerKey, consumerToken, candidate, version, dryrun); + this.skipAnnounce = skipAnnounce; this.hashtag = hashtag; this.releaseNotesUrl = releaseNotesUrl; this.platforms.putAll(platforms); @@ -55,7 +58,7 @@ public class MinorReleaseSdkmanCommand extends AbstractSdkmanCommand { @Override public void execute() throws SdkmanException { - sdkman.minorRelease(candidate, version, platforms, hashtag, releaseNotesUrl); + sdkman.minorRelease(candidate, version, platforms, hashtag, releaseNotesUrl, skipAnnounce); } public static Builder builder(JReleaserLogger logger) { @@ -149,6 +152,7 @@ public class MinorReleaseSdkmanCommand extends AbstractSdkmanCommand { candidate, version, dryrun, + skipAnnounce, hashtag, releaseNotesUrl, platforms); diff --git a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/Sdkman.java b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/Sdkman.java index cbe09f4f..ddd50d13 100644 --- a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/Sdkman.java +++ b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/Sdkman.java @@ -127,10 +127,11 @@ public class Sdkman { String version, String url, String hashtag, - String releaseNotesUrl) throws SdkmanException { + String releaseNotesUrl, + boolean skipAnnounce) throws SdkmanException { Map platforms = new LinkedHashMap<>(); platforms.put("UNIVERSAL", url); - majorRelease(candidate, version, platforms, hashtag, releaseNotesUrl); + majorRelease(candidate, version, platforms, hashtag, releaseNotesUrl, skipAnnounce); } public void majorRelease(String candidate, @@ -138,19 +139,21 @@ public class Sdkman { String platform, String url, String hashtag, - String releaseNotesUrl) throws SdkmanException { + String releaseNotesUrl, + boolean skipAnnounce) throws SdkmanException { Map platforms = new LinkedHashMap<>(); platforms.put(platform, url); - majorRelease(candidate, version, platforms, hashtag, releaseNotesUrl); + majorRelease(candidate, version, platforms, hashtag, releaseNotesUrl, skipAnnounce); } public void majorRelease(String candidate, String version, Map platforms, String hashtag, - String releaseNotesUrl) throws SdkmanException { + String releaseNotesUrl, + boolean skipAnnounce) throws SdkmanException { release(candidate, version, platforms); - announce(candidate, version, hashtag, releaseNotesUrl); + if (!skipAnnounce) announce(candidate, version, hashtag, releaseNotesUrl); setDefault(candidate, version); } @@ -158,10 +161,11 @@ public class Sdkman { String version, String url, String hashtag, - String releaseNotesUrl) throws SdkmanException { + String releaseNotesUrl, + boolean skipAnnounce) throws SdkmanException { Map platforms = new LinkedHashMap<>(); platforms.put("UNIVERSAL", url); - minorRelease(candidate, version, platforms, hashtag, releaseNotesUrl); + minorRelease(candidate, version, platforms, hashtag, releaseNotesUrl, skipAnnounce); } public void minorRelease(String candidate, @@ -169,19 +173,21 @@ public class Sdkman { String platform, String url, String hashtag, - String releaseNotesUrl) throws SdkmanException { + String releaseNotesUrl, + boolean skipAnnounce) throws SdkmanException { Map platforms = new LinkedHashMap<>(); platforms.put(platform, url); - minorRelease(candidate, version, platforms, hashtag, releaseNotesUrl); + minorRelease(candidate, version, platforms, hashtag, releaseNotesUrl, skipAnnounce); } public void minorRelease(String candidate, String version, Map platforms, String hashtag, - String releaseNotesUrl) throws SdkmanException { + String releaseNotesUrl, + boolean skipAnnounce) throws SdkmanException { release(candidate, version, platforms); - announce(candidate, version, hashtag, releaseNotesUrl); + if (!skipAnnounce) announce(candidate, version, hashtag, releaseNotesUrl); } private void wrap(Runnable runnable) throws SdkmanException { diff --git a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/SdkmanAnnouncer.java b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/SdkmanAnnouncer.java index 75118b83..877aae7a 100644 --- a/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/SdkmanAnnouncer.java +++ b/sdks/sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/SdkmanAnnouncer.java @@ -20,12 +20,15 @@ package org.jreleaser.sdk.sdkman; import org.jreleaser.model.Artifact; import org.jreleaser.model.Distribution; import org.jreleaser.model.JReleaserContext; +import org.jreleaser.model.Sdkman; import org.jreleaser.model.announcer.spi.AnnounceException; import org.jreleaser.model.announcer.spi.Announcer; import java.util.LinkedHashMap; import java.util.Map; +import java.util.stream.Collectors; +import static org.jreleaser.util.Constants.MAGIC_SET; import static org.jreleaser.util.MustacheUtils.applyTemplate; import static org.jreleaser.util.StringUtils.isBlank; import static org.jreleaser.util.StringUtils.isNotBlank; @@ -54,6 +57,56 @@ public class SdkmanAnnouncer implements Announcer { @Override public void announce() throws AnnounceException { + Map distributions = context.getModel().getActiveDistributions().stream() + .filter(d -> d.getSdkman().isEnabled()) + .filter(d -> d.getSdkman().isPublished()) + .collect(Collectors.toMap(distribution -> { + Sdkman sdkman = distribution.getSdkman(); + return isNotBlank(sdkman.getCandidate()) ? sdkman.getCandidate().trim() : context.getModel().getProject().getName(); + }, distribution -> distribution)); + + Boolean set = (Boolean) context.getModel().getAnnounce().getSdkman().getExtraProperties().remove(MAGIC_SET); + if (distributions.isEmpty() && (set != null && !set)) { + announceProject(); + return; + } + + boolean failures = false; + for (Map.Entry e : distributions.entrySet()) { + String candidate = e.getKey(); + Distribution distribution = e.getValue(); + + Sdkman sdkman = distribution.getSdkman(); + Map props = context.props(); + props.putAll(distribution.props()); + String releaseNotesUrl = applyTemplate(sdkman.getReleaseNotesUrl(), props); + String command = sdkman.getCommand().name().toLowerCase(); + + context.getLogger().info("announcing {} release of '{}' candidate", command, candidate); + try { + AnnounceSdkmanCommand.builder(context.getLogger()) + .connectTimeout(sdkman.getConnectTimeout()) + .readTimeout(sdkman.getReadTimeout()) + .consumerKey(context.isDryrun() ? "**UNDEFINED**" : sdkman.getResolvedConsumerKey()) + .consumerToken(context.isDryrun() ? "**UNDEFINED**" : sdkman.getResolvedConsumerToken()) + .candidate(candidate) + .version(context.getModel().getProject().getVersion()) + .releaseNotesUrl(releaseNotesUrl) + .dryrun(context.isDryrun()) + .build() + .execute(); + } catch (SdkmanException x) { + context.getLogger().warn(x.getMessage().trim()); + failures = true; + } + } + + if (failures) { + throw new AnnounceException("Failed to announce some candidates."); + } + } + + private void announceProject() throws AnnounceException { org.jreleaser.model.SdkmanAnnouncer sdkman = context.getModel().getAnnounce().getSdkman(); Map platforms = new LinkedHashMap<>();