[jbang] several updates

- rename jbangAliasClassName to jbangScriptName. Fixes #40
- sanitize alias name.
- sanitize script name. Fixes #35
- change default value for alias. Fixes #37
- validate aliases are unique. Fixes #38
This commit is contained in:
Andres Almiray
2021-04-12 17:11:05 +02:00
parent 6d9b8db4b4
commit c6bbbf9703
12 changed files with 61 additions and 19 deletions

View File

@@ -35,6 +35,7 @@ import static org.jreleaser.model.validation.BrewValidator.postValidateBrew;
import static org.jreleaser.model.validation.BrewValidator.validateBrew;
import static org.jreleaser.model.validation.ChocolateyValidator.validateChocolatey;
import static org.jreleaser.model.validation.DockerValidator.validateDocker;
import static org.jreleaser.model.validation.JbangValidator.postValidateJBang;
import static org.jreleaser.model.validation.JbangValidator.validateJbang;
import static org.jreleaser.model.validation.ScoopValidator.validateScoop;
import static org.jreleaser.model.validation.SnapValidator.validateSnap;
@@ -65,6 +66,7 @@ public abstract class DistributionsValidator extends Validator {
}
postValidateBrew(context, errors);
postValidateJBang(context, errors);
}
private static void validateDistribution(JReleaserContext context, Distribution distribution, List<String> errors) {
@@ -150,7 +152,7 @@ public abstract class DistributionsValidator extends Validator {
if (!distribution.getJava().isEnabled()) return true;
if (isBlank(distribution.getJava().getArtifactId())) {
distribution.getJava().setArtifactId(distribution.getName());
distribution.getJava().setArtifactId(project.getJava().getArtifactId());
}
if (isBlank(distribution.getJava().getGroupId())) {
distribution.getJava().setGroupId(project.getJava().getGroupId());

View File

@@ -23,7 +23,10 @@ import org.jreleaser.model.JReleaserModel;
import org.jreleaser.model.Jbang;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.groupingBy;
import static org.jreleaser.model.validation.ExtraPropertiesValidator.mergeExtraProperties;
import static org.jreleaser.model.validation.TemplateValidator.validateTemplate;
import static org.jreleaser.util.Constants.KEY_REVERSE_REPO_HOST;
@@ -52,7 +55,7 @@ public abstract class JbangValidator extends Validator {
mergeExtraProperties(tool, model.getPackagers().getJbang());
if (isBlank(tool.getAlias())) {
tool.setAlias(distribution.getName());
tool.setAlias(distribution.getExecutable());
}
if (isBlank(tool.getCatalog().getName())) {
tool.getCatalog().setName(model.getPackagers().getJbang().getCatalog().getName());
@@ -91,4 +94,17 @@ public abstract class JbangValidator extends Validator {
errors.add("distribution." + distribution.getName() + ".java.mainClass must not be blank, required by jbang");
}
}
public static void postValidateJBang(JReleaserContext context, List<String> errors) {
Map<String, List<Distribution>> map = context.getModel().getDistributions().values().stream()
.filter(d -> d.getJbang().isEnabled())
.collect(groupingBy(d -> d.getJbang().getAlias()));
map.forEach((alias, distributions) -> {
if (distributions.size() > 1) {
errors.add("jbang.alias '" + alias + "' is defined for more than one distribution: " +
distributions.stream().map(Distribution::getName).collect(Collectors.joining(", ")));
}
});
}
}

View File

@@ -1,7 +1,7 @@
{
"aliases": {
"{{jbangAliasName}}": {
"script-ref": "{{jbangAliasClassName}}.java",
"script-ref": "{{jbangScriptName}}.java",
"description": "{{projectDescription}}"
}
}

View File

@@ -3,7 +3,7 @@
//REPOS jitpack
//DEPS {{jbangDistributionGA}}:{{repoBranch}}-SNAPSHOT
public class {{jbangAliasClassName}} {
public class {{jbangScriptName}} {
public static void main(String... args) throws Exception {
{{distributionJavaMainClass}}.main(args);
}

View File

@@ -1,7 +1,7 @@
{
"aliases": {
"{{jbangAliasName}}": {
"script-ref": "{{jbangAliasClassName}}.java",
"script-ref": "{{jbangScriptName}}.java",
"description": "{{projectDescription}}"
}
}

View File

@@ -2,7 +2,7 @@
//JAVA {{distributionJavaVersion}}
//DEPS {{jbangDistributionGA}}:{{projectVersion}}
public class {{jbangAliasClassName}} {
public class {{jbangScriptName}} {
public static void main(String... args) throws Exception {
{{distributionJavaMainClass}}.main(args);
}

View File

@@ -1,7 +1,7 @@
{
"aliases": {
"{{jbangAliasName}}": {
"script-ref": "{{jbangAliasClassName}}.java",
"script-ref": "{{jbangScriptName}}.java",
"description": "{{projectDescription}}"
}
}

View File

@@ -3,7 +3,7 @@
//REPOS jitpack
//DEPS {{jbangDistributionGA}}:{{repoBranch}}-SNAPSHOT
public class {{jbangAliasClassName}} {
public class {{jbangScriptName}} {
public static void main(String... args) throws Exception {
{{distributionJavaMainClass}}.main(args);
}

View File

@@ -1,7 +1,7 @@
{
"aliases": {
"{{jbangAliasName}}": {
"script-ref": "{{jbangAliasClassName}}.java",
"script-ref": "{{jbangScriptName}}.java",
"description": "{{projectDescription}}"
}
}

View File

@@ -2,7 +2,7 @@
//JAVA {{distributionJavaVersion}}
//DEPS {{jbangDistributionGA}}:{{projectVersion}}
public class {{jbangAliasClassName}} {
public class {{jbangScriptName}} {
public static void main(String... args) throws Exception {
{{distributionJavaMainClass}}.main(args);
}

View File

@@ -73,23 +73,24 @@ public class JbangToolProcessor extends AbstractRepositoryToolProcessor<Jbang> {
props.put(Constants.KEY_JBANG_CATALOG_REPO_CLONE_URL,
gitService.getResolvedRepoCloneUrl(project, tool.getCatalog().getOwner(), tool.getCatalog().getName()));
String aliasName = tool.getAlias();
String aliasClassName = aliasName;
String aliasName = sanitizeAlias(tool.getAlias());
String scriptName = aliasName;
if (context.getModel().getProject().isSnapshot()) {
aliasName += "-snapshot";
aliasClassName += "_snapshot";
scriptName += "_snapshot";
}
scriptName = sanitizeScriptName(scriptName);
props.put(Constants.KEY_JBANG_ALIAS_NAME, aliasName);
props.put(Constants.KEY_JBANG_ALIAS_CLASS_NAME, aliasClassName);
props.put(Constants.KEY_JBANG_SCRIPT_NAME, scriptName);
String jbangDistributionGA = (String) tool.getResolvedExtraProperties().get(Constants.KEY_JBANG_DISTRIBUTION_GA);
if (isBlank(jbangDistributionGA)) {
if (context.getModel().getProject().isSnapshot()) {
// if single
// {{reverseRepoHost}}.{{repoOwner}}:{{distributionArtifactId}
// {{reverseRepoHost}}.{{repoOwner}}:{{distributionArtifactId}}
// if multi-project
// {{reverseRepoHost}}.{{repoOwner}}.{{repoName}}:{{distributionArtifactId}
// {{reverseRepoHost}}.{{repoOwner}}.{{repoName}}:{{distributionArtifactId}}
String reverseRepoHost = gitService.getReverseRepoHost();
if (isBlank(reverseRepoHost)) {
@@ -118,15 +119,38 @@ public class JbangToolProcessor extends AbstractRepositoryToolProcessor<Jbang> {
props.put(Constants.KEY_JBANG_DISTRIBUTION_GA, jbangDistributionGA);
}
private String sanitizeAlias(String alias) {
StringBuilder b = new StringBuilder();
for (int i = 0; i < alias.length(); i++) {
char ch = alias.charAt(i);
if (Character.isJavaIdentifierPart(ch) || ch == '-') {
b.append(ch);
}
}
return b.toString();
}
private String sanitizeScriptName(String scriptName) {
scriptName = scriptName.replaceAll("-", "_");
StringBuilder b = new StringBuilder();
for (int i = 0; i < scriptName.length(); i++) {
char ch = scriptName.charAt(i);
if (Character.isJavaIdentifierPart(ch)) {
b.append(ch);
}
}
return b.toString();
}
@Override
protected void writeFile(Project project, Distribution distribution, String content, Map<String, Object> props, String fileName)
throws ToolProcessingException {
fileName = trimTplExtension(fileName);
Path outputDirectory = (Path) props.get(Constants.KEY_PREPARE_DIRECTORY);
String aliasClassName = (String) props.get(Constants.KEY_JBANG_ALIAS_CLASS_NAME);
String scriptName = (String) props.get(Constants.KEY_JBANG_SCRIPT_NAME);
Path outputFile = "jbang.java".equals(fileName) ?
outputDirectory.resolve(aliasClassName.concat(".java")) :
outputDirectory.resolve(scriptName.concat(".java")) :
outputDirectory.resolve(fileName);
writeFile(content, outputFile);

View File

@@ -118,7 +118,7 @@ public interface Constants {
// Jbang
String KEY_JBANG_ALIAS_NAME = "jbangAliasName";
String KEY_JBANG_ALIAS_CLASS_NAME = "jbangAliasClassName";
String KEY_JBANG_SCRIPT_NAME = "jbangScriptName";
String KEY_JBANG_DISTRIBUTION_GA = "jbangDistributionGA";
String KEY_JBANG_CATALOG_REPO_URL = "jbangCatalogRepoUrl";
String KEY_JBANG_CATALOG_REPO_CLONE_URL = "jbangCatalogRepoCloneUrl";