[model] distributions should have deterministic artifact order. Fixes #315

This commit is contained in:
Andres Almiray
2021-07-27 23:45:56 +02:00
parent 84efb9e6ff
commit 1bacb20100
3 changed files with 29 additions and 15 deletions

View File

@@ -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<String> getSupportedExtensions() {
Set<String> extensions = super.getSupportedExtensions();
extensions.add(".jar");
Set<String> extensions = new LinkedHashSet<>();
extensions.add(".dmg");
extensions.add(".pkg");
extensions.add(".zip");
extensions.add(".jar");
return extensions;
}

View File

@@ -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<T extends Tool> implements ToolProcessor<T>
}
protected List<Artifact> collectArtifacts(Distribution distribution) {
Set<String> fileExtensions = tool.getSupportedExtensions();
List<String> 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());
}

View File

@@ -96,15 +96,18 @@ public class BrewToolProcessor extends AbstractRepositoryToolProcessor<Brew> {
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<Brew> {
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<Brew> {
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")) &&