From 1bacb201005a75bec7af1f28eeaf4a95c07aa5e2 Mon Sep 17 00:00:00 2001 From: Andres Almiray Date: Tue, 27 Jul 2021 23:45:56 +0200 Subject: [PATCH] [model] distributions should have deterministic artifact order. Fixes #315 --- .../main/java/org/jreleaser/model/Brew.java | 6 +++-- .../tools/AbstractToolProcessor.java | 11 ++++++-- .../jreleaser/tools/BrewToolProcessor.java | 27 +++++++++++-------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Brew.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Brew.java index 2756f68f..708b08be 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Brew.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Brew.java @@ -20,6 +20,7 @@ package org.jreleaser.model; import org.jreleaser.util.PlatformUtils; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -196,10 +197,11 @@ public class Brew extends AbstractRepositoryTool { @Override public Set getSupportedExtensions() { - Set extensions = super.getSupportedExtensions(); - extensions.add(".jar"); + Set extensions = new LinkedHashSet<>(); extensions.add(".dmg"); extensions.add(".pkg"); + extensions.add(".zip"); + extensions.add(".jar"); return extensions; } diff --git a/core/jreleaser-tools/src/main/java/org/jreleaser/tools/AbstractToolProcessor.java b/core/jreleaser-tools/src/main/java/org/jreleaser/tools/AbstractToolProcessor.java index 0342741f..f4908003 100644 --- a/core/jreleaser-tools/src/main/java/org/jreleaser/tools/AbstractToolProcessor.java +++ b/core/jreleaser-tools/src/main/java/org/jreleaser/tools/AbstractToolProcessor.java @@ -26,6 +26,7 @@ import org.jreleaser.model.tool.spi.ToolProcessor; import org.jreleaser.util.Algorithm; import org.jreleaser.util.Constants; import org.jreleaser.util.FileUtils; +import org.jreleaser.util.StringUtils; import org.zeroturnaround.exec.ProcessExecutor; import org.zeroturnaround.exec.ProcessInitException; @@ -33,12 +34,12 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -290,11 +291,17 @@ abstract class AbstractToolProcessor implements ToolProcessor } protected List collectArtifacts(Distribution distribution) { - Set fileExtensions = tool.getSupportedExtensions(); + List fileExtensions = new ArrayList<>(tool.getSupportedExtensions()); + return distribution.getArtifacts().stream() .filter(Artifact::isActive) .filter(artifact -> fileExtensions.stream().anyMatch(ext -> artifact.getPath().endsWith(ext))) .filter(artifact -> tool.supportsPlatform(artifact.getPlatform())) + // sort by platform, then by extension + .sorted(Artifact.comparatorByPlatform().thenComparingInt(artifact -> { + String ext = "." + StringUtils.getFilenameExtension(artifact.getPath()); + return fileExtensions.indexOf(ext); + })) .collect(Collectors.toList()); } diff --git a/core/jreleaser-tools/src/main/java/org/jreleaser/tools/BrewToolProcessor.java b/core/jreleaser-tools/src/main/java/org/jreleaser/tools/BrewToolProcessor.java index 2a3ecfa4..77201f07 100644 --- a/core/jreleaser-tools/src/main/java/org/jreleaser/tools/BrewToolProcessor.java +++ b/core/jreleaser-tools/src/main/java/org/jreleaser/tools/BrewToolProcessor.java @@ -96,15 +96,18 @@ public class BrewToolProcessor extends AbstractRepositoryToolProcessor { Cask cask = tool.getCask(); if (cask.isEnabled()) { + boolean hasPkg = isNotBlank(cask.getPkgName()); + boolean hasApp = isNotBlank(cask.getAppName()); + props.put(Constants.KEY_BREW_CASK_NAME, cask.getResolvedCaskName(props)); props.put(Constants.KEY_BREW_CASK_DISPLAY_NAME, cask.getResolvedDisplayName(props)); props.put(Constants.KEY_BREW_CASK_HAS_UNINSTALL, !cask.getUninstallItems().isEmpty()); - props.put(Constants.KEY_BREW_CASK_HAS_PKG, isNotBlank(cask.getPkgName())); - if (isNotBlank(cask.getPkgName())) { + props.put(Constants.KEY_BREW_CASK_HAS_PKG, hasPkg); + if (hasPkg) { props.put(Constants.KEY_BREW_CASK_PKG, cask.getResolvedPkgName(props)); } - props.put(Constants.KEY_BREW_CASK_HAS_APP, isNotBlank(cask.getAppName())); - if (isNotBlank(cask.getAppName())) { + props.put(Constants.KEY_BREW_CASK_HAS_APP, hasApp); + if (hasApp) { props.put(Constants.KEY_BREW_CASK_APP, cask.getResolvedAppName(props)); } props.put(Constants.KEY_BREW_CASK_UNINSTALL, cask.getUninstallItems()); @@ -114,12 +117,14 @@ public class BrewToolProcessor extends AbstractRepositoryToolProcessor { props.put(Constants.KEY_BREW_CASK_HAS_APPCAST, isNotBlank(appcast)); props.put(Constants.KEY_BREW_CASK_APPCAST, appcast); - for (Artifact artifact : distribution.getArtifacts()) { - if (!artifact.isActive()) continue; - if (artifact.getPath().endsWith(".zip") && !isTrue(artifact.getExtraProperties().get("skipBrew"))) { - props.put(Constants.KEY_DISTRIBUTION_URL, resolveArtifactUrl(props, artifact)); - props.put(Constants.KEY_BREW_CASK_HAS_BINARY, true); - break; + if (!hasApp && !hasPkg) { + for (Artifact artifact : distribution.getArtifacts()) { + if (!artifact.isActive()) continue; + if (artifact.getPath().endsWith(".zip") && !isTrue(artifact.getExtraProperties().get("skipBrew"))) { + props.put(Constants.KEY_DISTRIBUTION_URL, resolveArtifactUrl(props, artifact)); + props.put(Constants.KEY_BREW_CASK_HAS_BINARY, true); + break; + } } } } else if (tool.isMultiPlatform()) { @@ -153,7 +158,7 @@ public class BrewToolProcessor extends AbstractRepositoryToolProcessor { if (multiPlatforms.isEmpty()) { throw new ToolProcessingException("There are no matching multi-platform binaries."); } - props.put(Constants.KEY_BREW_MULTIPLATFORM, passThrough(String.join(System.lineSeparator()+" ", multiPlatforms))); + props.put(Constants.KEY_BREW_MULTIPLATFORM, passThrough(String.join(System.lineSeparator() + " ", multiPlatforms))); } else if ((distribution.getType() == Distribution.DistributionType.JAVA_BINARY || distribution.getType() == Distribution.DistributionType.SINGLE_JAR) && !isTrue(tool.getExtraProperties().get("javaSkip")) &&