Add name templates for clone URLs

This commit is contained in:
Andres Almiray
2021-04-10 01:33:36 +02:00
parent 71f543dde4
commit 383cef1661
32 changed files with 235 additions and 81 deletions

View File

@@ -39,6 +39,10 @@ abstract class AbstractRepositoryTap implements RepositoryTap {
this.basename = basename;
}
public String getBasename() {
return basename;
}
public void setBasename(String basename) {
this.basename = basename;
}

View File

@@ -48,6 +48,7 @@ public abstract class GitService implements Releaser, CommitAuthorProvider, Owne
private String owner;
private String name;
private String repoUrlFormat;
private String repoCloneUrlFormat;
private String commitUrlFormat;
private String downloadUrlFormat;
private String releaseNotesUrlFormat;
@@ -81,6 +82,7 @@ public abstract class GitService implements Releaser, CommitAuthorProvider, Owne
this.owner = service.owner;
this.name = service.name;
this.repoUrlFormat = service.repoUrlFormat;
this.repoCloneUrlFormat = service.repoCloneUrlFormat;
this.commitUrlFormat = service.commitUrlFormat;
this.downloadUrlFormat = service.downloadUrlFormat;
this.releaseNotesUrlFormat = service.releaseNotesUrlFormat;
@@ -156,6 +158,24 @@ public abstract class GitService implements Releaser, CommitAuthorProvider, Owne
return applyTemplate(new StringReader(repoUrlFormat), props(project));
}
public String getResolvedRepoCloneUrl(Project project) {
return applyTemplate(new StringReader(repoCloneUrlFormat), props(project));
}
public String getResolvedRepoUrl(Project project, String repoOwner, String repoName) {
Map<String, Object> props = props(project);
props.put(Constants.KEY_REPO_OWNER, repoOwner);
props.put(Constants.KEY_REPO_NAME, repoName);
return applyTemplate(new StringReader(repoUrlFormat), props);
}
public String getResolvedRepoCloneUrl(Project project, String repoOwner, String repoName) {
Map<String, Object> props = props(project);
props.put(Constants.KEY_REPO_OWNER, repoOwner);
props.put(Constants.KEY_REPO_NAME, repoName);
return applyTemplate(new StringReader(repoCloneUrlFormat), props);
}
public String getResolvedCommitUrl(Project project) {
return applyTemplate(new StringReader(commitUrlFormat), props(project));
}
@@ -225,6 +245,14 @@ public abstract class GitService implements Releaser, CommitAuthorProvider, Owne
this.repoUrlFormat = repoUrlFormat;
}
public String getRepoCloneUrlFormat() {
return repoCloneUrlFormat;
}
public void setRepoCloneUrlFormat(String repoCloneUrlFormat) {
this.repoCloneUrlFormat = repoCloneUrlFormat;
}
public String getCommitUrlFormat() {
return commitUrlFormat;
}
@@ -377,6 +405,7 @@ public abstract class GitService implements Releaser, CommitAuthorProvider, Owne
map.put("username", username);
map.put("token", isNotBlank(getResolvedToken()) ? "************" : "**unset**");
map.put("repoUrlFormat", repoUrlFormat);
map.put("repoCloneUrlFormat", repoCloneUrlFormat);
map.put("commitUrlFormat", commitUrlFormat);
map.put("downloadUrlFormat", downloadUrlFormat);
map.put("releaseNotesUrlFormat", releaseNotesUrlFormat);
@@ -437,6 +466,7 @@ public abstract class GitService implements Releaser, CommitAuthorProvider, Owne
props.put(Constants.KEY_RELEASE_NAME, getEffectiveReleaseName());
props.put(Constants.KEY_MILESTONE_NAME, milestone.getEffectiveName());
props.put(Constants.KEY_REPO_URL, getResolvedRepoUrl(project));
props.put(Constants.KEY_REPO_CLONE_URL, getResolvedRepoCloneUrl(project));
props.put(Constants.KEY_COMMIT_URL, getResolvedCommitUrl(project));
props.put(Constants.KEY_RELEASE_NOTES_URL, getResolvedReleaseNotesUrl(project));
props.put(Constants.KEY_LATEST_RELEASE_URL, getResolvedLatestReleaseUrl(project));

View File

@@ -33,6 +33,7 @@ public class Gitea extends GitService {
public Gitea() {
super(NAME);
setRepoUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}");
setRepoCloneUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}.git");
setCommitUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/commits");
setDownloadUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/download/{{tagName}}/{{artifactFileName}}");
setReleaseNotesUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/tag/{{tagName}}");

View File

@@ -34,6 +34,7 @@ public class Github extends GitService {
super(NAME);
setHost("github.com");
setRepoUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}");
setRepoCloneUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}.git");
setCommitUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/commits");
setDownloadUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/download/{{tagName}}/{{artifactFileName}}");
setReleaseNotesUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/tag/{{tagName}}");

View File

@@ -32,6 +32,7 @@ public class Gitlab extends GitService {
super(NAME);
setHost("gitlab.com");
setRepoUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}");
setRepoCloneUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}.git");
setCommitUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/-/commits");
setDownloadUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/-/releases/{{tagName}}/downloads/{{artifactFileName}}");
setReleaseNotesUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/-/releases/{{tagName}}");

View File

@@ -217,6 +217,7 @@ public class JReleaserModel implements Domain {
props.put(Constants.KEY_REVERSE_REPO_HOST, service.getReverseRepoHost());
props.put(Constants.KEY_CANONICAL_REPO_NAME, service.getCanonicalRepoName());
props.put(Constants.KEY_REPO_URL, service.getResolvedRepoUrl(project));
props.put(Constants.KEY_REPO_CLONE_URL, service.getResolvedRepoCloneUrl(project));
props.put(Constants.KEY_COMMIT_URL, service.getResolvedCommitUrl(project));
props.put(Constants.KEY_RELEASE_NOTES_URL, service.getResolvedReleaseNotesUrl(project));
props.put(Constants.KEY_LATEST_RELEASE_URL, service.getResolvedLatestReleaseUrl(project));

View File

@@ -23,6 +23,6 @@ package org.jreleaser.model;
*/
public class ScoopBucket extends AbstractRepositoryTap {
public ScoopBucket() {
super("scoop-bucket");
super("scoop");
}
}

View File

@@ -23,6 +23,8 @@ import org.jreleaser.model.Packagers;
import java.util.List;
import static org.jreleaser.util.StringUtils.isBlank;
/**
* @author Andres Almiray
* @since 0.1.0
@@ -46,6 +48,11 @@ public abstract class PackagersValidator extends Validator {
validateCommitAuthor(packagers.getScoop(), model.getRelease().getGitService());
validateOwner(packagers.getScoop().getBucket(), model.getRelease().getGitService());
if (isBlank(packagers.getScoop().getBucket().getName())) {
packagers.getScoop().getBucket().setName("scoop-" + model.getRelease().getGitService().getOwner());
}
packagers.getScoop().getBucket().setBasename("scoop-" + model.getRelease().getGitService().getOwner());
validateCommitAuthor(packagers.getSnap(), model.getRelease().getGitService());
validateOwner(packagers.getSnap().getSnap(), model.getRelease().getGitService());
}

View File

@@ -63,9 +63,10 @@ public abstract class ScoopValidator extends Validator {
}
if (isBlank(tool.getBucket().getName())) {
tool.getBucket().setName("scoop-bucket");
tool.getBucket().setName(model.getPackagers().getScoop().getBucket().getName());
}
tool.getBucket().setBasename("scoop-bucket");
tool.getBucket().setBasename(model.getPackagers().getScoop().getBucket().getBasename());
if (isBlank(tool.getBucket().getUsername())) {
tool.getBucket().setUsername(model.getPackagers().getScoop().getBucket().getUsername());
}

View File

@@ -17,7 +17,7 @@ $ brew install <formula>
Invoke the following command if the formula is *not* hosted at GitHub
```sh
brew tap {{repoOwner}}/homebrew-tap <git-clone-url>
brew tap {{repoOwner}}/homebrew-tap {{tapRepoCloneUrl}}
brew install <formula>
```

View File

@@ -0,0 +1,17 @@
# Scoop Manifests
## How do I install these tools?
1. Install [scoop](https://github.com/lukesampson/scoop).
2. Add this bucket to scoop:
```
scoop bucket add {{repoOwner}} {{scoopBucketRepoCloneUrl}}
```
3. Install tools via `scoop install`:
```
scoop install <toolName>
```

View File

@@ -17,7 +17,7 @@ $ brew install <formula>
Invoke the following command if the formula is *not* hosted at GitHub
```sh
brew tap {{repoOwner}}/homebrew-tap <git-clone-url>
brew tap {{repoOwner}}/homebrew-tap {{tapRepoCloneUrl}}
brew install <formula>
```

View File

@@ -0,0 +1,17 @@
# Scoop Manifests
## How do I install these tools?
1. Install [scoop](https://github.com/lukesampson/scoop).
2. Add this bucket to scoop:
```
scoop bucket add {{repoOwner}} {{scoopBucketRepoCloneUrl}}
```
3. Install tools via `scoop install`:
```
scoop install <toolName>
```

View File

@@ -19,6 +19,7 @@ package org.jreleaser.tools;
import org.jreleaser.model.Brew;
import org.jreleaser.model.Distribution;
import org.jreleaser.model.GitService;
import org.jreleaser.model.JReleaserContext;
import org.jreleaser.model.Project;
import org.jreleaser.model.tool.spi.ToolProcessingException;
@@ -47,8 +48,16 @@ public class BrewToolProcessor extends AbstractRepositoryToolProcessor<Brew> {
@Override
protected void fillToolProperties(Map<String, Object> props, Distribution distribution) throws ToolProcessingException {
Project project = context.getModel().getProject();
GitService gitService = context.getModel().getRelease().getGitService();
props.put(Constants.KEY_HOMEBREW_TAP_REPO_URL,
gitService.getResolvedRepoUrl(project, tool.getTap().getOwner(), tool.getTap().getName()));
props.put(Constants.KEY_HOMEBREW_TAP_REPO_CLONE_URL,
gitService.getResolvedRepoCloneUrl(project, tool.getTap().getOwner(), tool.getTap().getName()));
if (distribution.getType() == Distribution.DistributionType.JAVA_BINARY) {
getTool().addDependency("openjdk@"+ props.get(Constants.KEY_DISTRIBUTION_JAVA_VERSION));
getTool().addDependency("openjdk@" + props.get(Constants.KEY_DISTRIBUTION_JAVA_VERSION));
}
props.put(Constants.KEY_BREW_DEPENDENCIES, getTool().getDependenciesAsList()

View File

@@ -19,6 +19,7 @@ package org.jreleaser.tools;
import org.jreleaser.model.Chocolatey;
import org.jreleaser.model.Distribution;
import org.jreleaser.model.GitService;
import org.jreleaser.model.JReleaserContext;
import org.jreleaser.model.Project;
import org.jreleaser.model.releaser.spi.Releaser;
@@ -74,6 +75,14 @@ public class ChocolateyToolProcessor extends AbstractRepositoryToolProcessor<Cho
@Override
protected void fillToolProperties(Map<String, Object> props, Distribution distribution) throws ToolProcessingException {
Project project = context.getModel().getProject();
GitService gitService = context.getModel().getRelease().getGitService();
props.put(Constants.KEY_CHOCOLATEY_BUCKET_REPO_URL,
gitService.getResolvedRepoUrl(project, tool.getBucket().getOwner(), tool.getBucket().getName()));
props.put(Constants.KEY_CHOCOLATEY_BUCKET_REPO_CLONE_URL,
gitService.getResolvedRepoCloneUrl(project, tool.getBucket().getOwner(), tool.getBucket().getName()));
props.put(Constants.KEY_CHOCOLATEY_USERNAME, getTool().getUsername());
}

View File

@@ -20,6 +20,7 @@ package org.jreleaser.tools;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jreleaser.model.Distribution;
import org.jreleaser.model.GitService;
import org.jreleaser.model.JReleaserContext;
import org.jreleaser.model.Jbang;
import org.jreleaser.model.Project;
@@ -64,6 +65,14 @@ public class JbangToolProcessor extends AbstractRepositoryToolProcessor<Jbang> {
@Override
protected void fillToolProperties(Map<String, Object> props, Distribution distribution) throws ToolProcessingException {
Project project = context.getModel().getProject();
GitService gitService = context.getModel().getRelease().getGitService();
props.put(Constants.KEY_JBANG_CATALOG_REPO_URL,
gitService.getResolvedRepoUrl(project, tool.getCatalog().getOwner(), tool.getCatalog().getName()));
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;
if (context.getModel().getProject().isSnapshot()) {
@@ -82,17 +91,17 @@ public class JbangToolProcessor extends AbstractRepositoryToolProcessor<Jbang> {
// if multi-project
// {{reverseRepoHost}}.{{repoOwner}}.{{repoName}}:{{distributionArtifactId}
String reverseRepoHost = context.getModel().getRelease().getGitService().getReverseRepoHost();
String reverseRepoHost = gitService.getReverseRepoHost();
if (isBlank(reverseRepoHost)) {
reverseRepoHost = (String) tool.getExtraProperties().get(KEY_REVERSE_REPO_HOST);
reverseRepoHost = tool.getExtraProperties().get(KEY_REVERSE_REPO_HOST);
}
StringBuilder b = new StringBuilder(reverseRepoHost)
.append(".")
.append(context.getModel().getRelease().getGitService().getOwner());
.append(gitService.getOwner());
if (distribution.getJava().isMultiProject()) {
b.append(".")
.append(context.getModel().getRelease().getGitService().getName());
.append(gitService.getName());
}
b.append(":")
.append(distribution.getJava().getArtifactId());

View File

@@ -18,13 +18,13 @@
package org.jreleaser.tools;
import org.jreleaser.model.Distribution;
import org.jreleaser.model.GitService;
import org.jreleaser.model.JReleaserContext;
import org.jreleaser.model.Project;
import org.jreleaser.model.Scoop;
import org.jreleaser.model.tool.spi.ToolProcessingException;
import org.jreleaser.util.Constants;
import java.io.IOException;
import java.io.StringReader;
import java.nio.file.Path;
import java.util.LinkedHashMap;
@@ -48,13 +48,16 @@ public class ScoopToolProcessor extends AbstractRepositoryToolProcessor<Scoop> {
return true;
}
@Override
protected void prepareWorkingCopy(Map<String, Object> props, Path directory, Distribution distribution) throws IOException {
super.prepareWorkingCopy(props, directory.resolve(distribution.getName()), distribution);
}
@Override
protected void fillToolProperties(Map<String, Object> props, Distribution distribution) throws ToolProcessingException {
Project project = context.getModel().getProject();
GitService gitService = context.getModel().getRelease().getGitService();
props.put(Constants.KEY_SCOOP_BUCKET_REPO_URL,
gitService.getResolvedRepoUrl(project, tool.getBucket().getOwner(), tool.getBucket().getName()));
props.put(Constants.KEY_SCOOP_BUCKET_REPO_CLONE_URL,
gitService.getResolvedRepoCloneUrl(project, tool.getBucket().getOwner(), tool.getBucket().getName()));
props.put(Constants.KEY_SCOOP_CHECKVER_URL, resolveCheckverUrl(props));
props.put(Constants.KEY_SCOOP_AUTOUPDATE_URL, resolveAutoupdateUrl(props));
}
@@ -80,8 +83,12 @@ public class ScoopToolProcessor extends AbstractRepositoryToolProcessor<Scoop> {
@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);
Path outputFile = outputDirectory.resolve(trimTplExtension(fileName));
Path outputFile = "manifest.json".equals(fileName) ?
outputDirectory.resolve("bucket").resolve(distribution.getExecutable().concat(".json")) :
outputDirectory.resolve(fileName);
writeFile(content, outputFile);
}

View File

@@ -18,6 +18,7 @@
package org.jreleaser.tools;
import org.jreleaser.model.Distribution;
import org.jreleaser.model.GitService;
import org.jreleaser.model.JReleaserContext;
import org.jreleaser.model.Project;
import org.jreleaser.model.Snap;
@@ -81,6 +82,14 @@ public class SnapToolProcessor extends AbstractRepositoryToolProcessor<Snap> {
@Override
protected void fillToolProperties(Map<String, Object> props, Distribution distribution) throws ToolProcessingException {
Project project = context.getModel().getProject();
GitService gitService = context.getModel().getRelease().getGitService();
props.put(Constants.KEY_SNAP_REPO_URL,
gitService.getResolvedRepoUrl(project, tool.getSnap().getOwner(), tool.getSnap().getName()));
props.put(Constants.KEY_SNAP_REPO_CLONE_URL,
gitService.getResolvedRepoCloneUrl(project, tool.getSnap().getOwner(), tool.getSnap().getName()));
props.put(Constants.KEY_SNAP_BASE, getTool().getBase());
props.put(Constants.KEY_SNAP_GRADE, getTool().getGrade());
props.put(Constants.KEY_SNAP_CONFINEMENT, getTool().getConfinement());

View File

@@ -61,6 +61,7 @@ public interface Constants {
String KEY_MILESTONE_NAME = "milestoneName";
String KEY_CANONICAL_REPO_NAME = "repoCanonicalName";
String KEY_REPO_URL = "repoUrl";
String KEY_REPO_CLONE_URL = "repoCloneUrl";
String KEY_COMMIT_URL = "commitsUrl";
String KEY_RELEASE_NOTES_URL = "releaseNotesUrl";
String KEY_LATEST_RELEASE_URL = "latestReleaseUrl";
@@ -86,6 +87,8 @@ public interface Constants {
// Brew
String KEY_BREW_DEPENDENCIES = "brewDependencies";
String KEY_HOMEBREW_TAP_REPO_URL = "brewTapRepoUrl";
String KEY_HOMEBREW_TAP_REPO_CLONE_URL = "brewTapRepoCloneUrl";
// Docker
String KEY_DOCKER_BASE_IMAGE = "dockerBaseImage";
@@ -94,14 +97,20 @@ public interface Constants {
// Scoop
String KEY_SCOOP_CHECKVER_URL = "scoopCheckverUrl";
String KEY_SCOOP_AUTOUPDATE_URL = "scoopAutoupdateUrl";
String KEY_SCOOP_BUCKET_REPO_URL = "scoopBucketRepoUrl";
String KEY_SCOOP_BUCKET_REPO_CLONE_URL = "scoopBucketRepoCloneUrl";
// Chocolatey
String KEY_CHOCOLATEY_USERNAME = "chocolateyUsername";
String KEY_CHOCOLATEY_BUCKET_REPO_URL = "chocolateyBucketRepoUrl";
String KEY_CHOCOLATEY_BUCKET_REPO_CLONE_URL = "chocolateyBucketRepoCloneUrl";
// Jbang
String KEY_JBANG_ALIAS_NAME = "jbangAliasName";
String KEY_JBANG_ALIAS_CLASS_NAME = "jbangAliasClassName";
String KEY_JBANG_DISTRIBUTION_GA = "jbangDistributionGA";
String KEY_JBANG_CATALOG_REPO_URL = "jbangCatalogRepoUrl";
String KEY_JBANG_CATALOG_REPO_CLONE_URL = "jbangCatalogRepoCloneUrl";
// Snap
String KEY_SNAP_BASE = "snapBase";
@@ -115,6 +124,8 @@ public interface Constants {
String KEY_SNAP_LOCAL_PLUGS = "snapLocalPlugs";
String KEY_SNAP_HAS_LOCAL_SLOTS = "snapHasLocalSlots";
String KEY_SNAP_LOCAL_SLOTS = "snapLocalSlots";
String KEY_SNAP_REPO_URL = "snapRepoUrl";
String KEY_SNAP_REPO_CLONE_URL = "snapRepoCloneUrl";
// ToolProcessor
String KEY_CHECKSUM_DIRECTORY = "__CHECKSUM_DIRECTORY__";

View File

@@ -36,6 +36,8 @@ interface GitService extends Releaser {
Property<String> getRepoUrlFormat()
Property<String> getRepoCloneUrlFormat()
Property<String> getCommitUrlFormat()
Property<String> getDownloadUrlFormat()

View File

@@ -42,6 +42,7 @@ abstract class AbstractGitService implements GitService {
final Property<String> owner
final Property<String> name
final Property<String> repoUrlFormat
final Property<String> repoCloneUrlFormat
final Property<String> commitUrlFormat
final Property<String> downloadUrlFormat
final Property<String> releaseNotesUrlFormat
@@ -64,6 +65,7 @@ abstract class AbstractGitService implements GitService {
owner = objects.property(String).convention(Providers.notDefined())
name = objects.property(String).convention(Providers.notDefined())
repoUrlFormat = objects.property(String).convention(Providers.notDefined())
repoCloneUrlFormat = objects.property(String).convention(Providers.notDefined())
commitUrlFormat = objects.property(String).convention(Providers.notDefined())
downloadUrlFormat = objects.property(String).convention(Providers.notDefined())
releaseNotesUrlFormat = objects.property(String).convention(Providers.notDefined())
@@ -88,6 +90,7 @@ abstract class AbstractGitService implements GitService {
owner.present ||
name.present ||
repoUrlFormat.present ||
repoCloneUrlFormat.present ||
commitUrlFormat.present ||
downloadUrlFormat.present ||
releaseNotesUrlFormat.present ||
@@ -125,6 +128,7 @@ abstract class AbstractGitService implements GitService {
if (owner.present) service.owner = owner.get()
if (name.present) service.name = name.get()
if (repoUrlFormat.present) service.repoUrlFormat = repoUrlFormat.get()
if (repoCloneUrlFormat.present) service.repoCloneUrlFormat = repoCloneUrlFormat.get()
if (commitUrlFormat.present) service.commitUrlFormat = commitUrlFormat.get()
if (downloadUrlFormat.present) service.downloadUrlFormat = downloadUrlFormat.get()
if (releaseNotesUrlFormat.present) service.releaseNotesUrlFormat = releaseNotesUrlFormat.get()

View File

@@ -30,6 +30,7 @@ public abstract class GitService implements Releaser {
private String owner;
private String name;
private String repoUrlFormat;
private String repoCloneUrlFormat;
private String commitUrlFormat;
private String downloadUrlFormat;
private String releaseNotesUrlFormat;
@@ -51,6 +52,7 @@ public abstract class GitService implements Releaser {
this.owner = service.owner;
this.name = service.name;
this.repoUrlFormat = service.repoUrlFormat;
this.repoCloneUrlFormat = service.repoCloneUrlFormat;
this.commitUrlFormat = service.commitUrlFormat;
this.downloadUrlFormat = service.downloadUrlFormat;
this.releaseNotesUrlFormat = service.releaseNotesUrlFormat;
@@ -117,6 +119,14 @@ public abstract class GitService implements Releaser {
this.repoUrlFormat = repoUrlFormat;
}
public String getRepoCloneUrlFormat() {
return repoCloneUrlFormat;
}
public void setRepoCloneUrlFormat(String repoCloneUrlFormat) {
this.repoCloneUrlFormat = repoCloneUrlFormat;
}
public String getCommitUrlFormat() {
return commitUrlFormat;
}

View File

@@ -29,6 +29,7 @@ public class Gitea extends GitService {
public Gitea() {
setHost("try.gitea.io");
setRepoUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}");
setRepoCloneUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}.git");
setCommitUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/commits");
setDownloadUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/download/v{{projectVersion}}/{{artifactFileName}}");
setReleaseNotesUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/tag/v{{projectVersion}}");

View File

@@ -29,6 +29,7 @@ public class Github extends GitService {
public Github() {
setHost("github.com");
setRepoUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}");
setRepoCloneUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}.git");
setCommitUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/commits");
setDownloadUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/download/v{{projectVersion}}/{{artifactFileName}}");
setReleaseNotesUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/tag/v{{projectVersion}}");

View File

@@ -27,6 +27,7 @@ public class Gitlab extends GitService {
public Gitlab() {
setHost("gitlab.com");
setRepoUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}");
setRepoCloneUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}.git");
setCommitUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/-/commits");
setDownloadUrlFormat("\"https://{{repoHost}}/{{repoOwner}}/{{repoName}}/-/archive/v{{projectVersion}}/{{artifactFileName}}");
setReleaseNotesUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/-/releases/v{{projectVersion}}");

View File

@@ -165,6 +165,7 @@ public final class JReleaserModelConverter {
s.setOwner(service.getOwner());
s.setName(service.getName());
s.setRepoUrlFormat(service.getRepoUrlFormat());
s.setRepoCloneUrlFormat(service.getRepoCloneUrlFormat());
s.setCommitUrlFormat(service.getCommitUrlFormat());
s.setDownloadUrlFormat(service.getDownloadUrlFormat());
s.setReleaseNotesUrlFormat(service.getReleaseNotesUrlFormat());

View File

@@ -92,7 +92,7 @@ class Gitea {
}
GtRepository findRepository(String owner, String repo) {
logger.debug("Lookup repository {}/{}", owner, repo);
logger.debug("lookup repository {}/{}", owner, repo);
try {
return api.getRepository(owner, repo);
} catch (GiteaAPIException e) {
@@ -105,7 +105,7 @@ class Gitea {
}
Optional<GtMilestone> findMilestoneByName(String owner, String repo, String milestoneName) {
logger.debug("Lookup milestone '{}' on {}/{}", milestoneName, owner, repo);
logger.debug("lookup milestone '{}' on {}/{}", milestoneName, owner, repo);
try {
GtMilestone milestone = api.findMilestoneByTitle(owner, repo, milestoneName);
@@ -125,14 +125,14 @@ class Gitea {
}
void closeMilestone(String owner, String repo, GtMilestone milestone) throws IOException {
logger.debug("Closing milestone '{}' on {}/{}", milestone.getTitle(), owner, repo);
logger.debug("closing milestone '{}' on {}/{}", milestone.getTitle(), owner, repo);
api.updateMilestone(CollectionUtils.<String, Object>map()
.e("state", "closed"), owner, repo, milestone.getId());
}
GtRepository createRepository(String owner, String repo) {
logger.debug("Creating repository {}/{}", owner, repo);
logger.debug("creating repository {}/{}", owner, repo);
Map<String, Object> params = CollectionUtils.<String, Object>map()
.e("name", repo)
@@ -159,7 +159,7 @@ class Gitea {
}
GtRelease findReleaseByTag(String owner, String repo, String tagName) {
logger.debug("Fetching release on {}/{} with tag {}", owner, repo, tagName);
logger.debug("fetching release on {}/{} with tag {}", owner, repo, tagName);
try {
return api.getReleaseByTagName(owner, repo, tagName);
@@ -173,7 +173,7 @@ class Gitea {
}
void deleteRelease(String owner, String repo, String tagName, Integer id) throws GiteaAPIException {
logger.debug("Deleting release {} from {}/{} ({})", tagName, owner, repo, id);
logger.debug("deleting release {} from {}/{} ({})", tagName, owner, repo, id);
try {
api.deleteRelease(owner, repo, id);
@@ -188,13 +188,13 @@ class Gitea {
}
void deleteTag(String owner, String repo, String tagName) throws GiteaAPIException {
logger.debug("Deleting tag {} from {}/{}", tagName, owner, repo);
logger.debug("deleting tag {} from {}/{}", tagName, owner, repo);
api.deleteTag(owner, repo, tagName);
}
GtRelease createRelease(String owner, String repo, GtRelease release) throws GiteaAPIException {
logger.debug("Creating release on {}/{} with tag {}", owner, repo, release.getTagName());
logger.debug("creating release on {}/{} with tag {}", owner, repo, release.getTagName());
return api.createRelease(release, owner, repo);
}
@@ -206,11 +206,11 @@ class Gitea {
continue;
}
logger.info(" - Uploading {}", asset.getFileName().toString());
logger.info(" - uploading {}", asset.getFileName().toString());
try {
api.uploadAsset(owner, repo, release.getId(), toFormData(asset));
} catch (GiteaAPIException e) {
logger.error(" x Failed to upload {}", asset.getFileName());
logger.error(" x failed to upload {}", asset.getFileName());
throw e;
}
}

View File

@@ -57,19 +57,19 @@ public class GiteaReleaser implements Releaser {
Gitea api = new Gitea(context.getLogger(), gitea.getApiEndpoint(), gitea.getResolvedToken());
context.getLogger().debug("Looking up release with tag {} at repository {}", tagName, gitea.getCanonicalRepoName());
context.getLogger().debug("looking up release with tag {} at repository {}", tagName, gitea.getCanonicalRepoName());
GtRelease release = api.findReleaseByTag(gitea.getOwner(), gitea.getName(), tagName);
if (null != release) {
context.getLogger().debug("Release {} exists", tagName);
context.getLogger().debug("release {} exists", tagName);
if (gitea.isOverwrite()) {
context.getLogger().debug("Deleting release {}", tagName);
context.getLogger().debug("deleting release {}", tagName);
if (!context.isDryrun()) {
api.deleteRelease(gitea.getOwner(), gitea.getName(), tagName, release.getId());
}
context.getLogger().debug("Creating release {}", tagName);
context.getLogger().debug("creating release {}", tagName);
createRelease(api, tagName, changelog, context.getModel().getProject().isSnapshot());
} else if (gitea.isAllowUploadToExisting()) {
context.getLogger().debug("Updating release {}", tagName);
context.getLogger().debug("updating release {}", tagName);
if (!context.isDryrun()) {
api.uploadAssets(gitea.getOwner(), gitea.getName(), release, assets);
}
@@ -78,8 +78,8 @@ public class GiteaReleaser implements Releaser {
tagName + " already exists. overwrite = false; allowUploadToExisting = false");
}
} else {
context.getLogger().debug("Release {} does not exist", tagName);
context.getLogger().debug("Creating release {}", tagName);
context.getLogger().debug("release {} does not exist", tagName);
context.getLogger().debug("creating release {}", tagName);
createRelease(api, tagName, changelog, context.getModel().getProject().isSnapshot());
}
} catch (IOException | IllegalStateException e) {
@@ -90,7 +90,7 @@ public class GiteaReleaser implements Releaser {
@Override
public Repository maybeCreateRepository(String owner, String repo, String password) throws IOException {
org.jreleaser.model.Gitea gitea = context.getModel().getRelease().getGitea();
context.getLogger().debug("Looking up {}/{}", owner, repo);
context.getLogger().debug("looking up {}/{}", owner, repo);
Gitea api = new Gitea(context.getLogger(), gitea.getApiEndpoint(), password);
GtRepository repository = api.findRepository(owner, repo);
@@ -115,7 +115,7 @@ public class GiteaReleaser implements Releaser {
continue;
}
context.getLogger().debug(" - Uploading asset {}", asset.getFileName().toString());
context.getLogger().info(" - uploading {}", asset.getFileName().toString());
}
return;
}
@@ -126,7 +126,7 @@ public class GiteaReleaser implements Releaser {
// local tag
if (deleteTags || !gitea.isSkipTagging()) {
context.getLogger().debug("Tagging local repository with {}", tagName);
context.getLogger().debug("tagging local repository with {}", tagName);
GitSdk.of(context).tag(tagName, true);
}

View File

@@ -74,7 +74,7 @@ class Github {
}
GHRepository findRepository(String owner, String repo) throws IOException {
logger.debug("Lookup repository {}/{}", owner, repo);
logger.debug("lookup repository {}/{}", owner, repo);
try {
return github.getRepository(owner + "/" + repo);
} catch (GHFileNotFoundException e) {
@@ -84,7 +84,7 @@ class Github {
}
GHRepository createRepository(String owner, String repo) throws IOException {
logger.debug("Creating repository {}/{}", owner, repo);
logger.debug("creating repository {}/{}", owner, repo);
GHOrganization organization = resolveOrganization(owner);
if (null != organization) {
@@ -97,7 +97,7 @@ class Github {
}
Optional<GHMilestone> findMilestoneByName(String owner, String repo, String milestoneName) throws IOException {
logger.debug("Lookup milestone '{}' on {}/{}", milestoneName, owner, repo);
logger.debug("lookup milestone '{}' on {}/{}", milestoneName, owner, repo);
GHRepository repository = findRepository(owner, repo);
PagedIterable<GHMilestone> milestones = repository.listMilestones(GHIssueState.OPEN);
@@ -107,26 +107,26 @@ class Github {
}
void closeMilestone(String owner, String repo, GHMilestone milestone) throws IOException {
logger.debug("Closing milestone '{}' on {}/{}", milestone.getTitle(), owner, repo);
logger.debug("closing milestone '{}' on {}/{}", milestone.getTitle(), owner, repo);
milestone.close();
}
GHRelease findReleaseByTag(String repo, String tagName) throws IOException {
logger.debug("Fetching release on {} with tag {}", repo, tagName);
logger.debug("fetching release on {} with tag {}", repo, tagName);
return github.getRepository(repo)
.getReleaseByTagName(tagName);
}
void deleteTag(String repo, String tagName) throws IOException {
logger.debug("Deleting tag {} from {}", tagName, repo);
logger.debug("deleting tag {} from {}", tagName, repo);
github.getRepository(repo)
.getRef(REFS_TAGS + tagName)
.delete();
}
GHReleaseBuilder createRelease(String repo, String tagName) throws IOException {
logger.debug("Creating release on {} with tag {}", repo, tagName);
logger.debug("creating release on {} with tag {}", repo, tagName);
return github.getRepository(repo)
.createRelease(tagName);
}
@@ -138,10 +138,10 @@ class Github {
continue;
}
logger.info(" - Uploading {}", asset.getFileName().toString());
logger.info(" - uploading {}", asset.getFileName().toString());
GHAsset ghasset = release.uploadAsset(asset.toFile(), MediaType.parse(tika.detect(asset)).toString());
if (!"uploaded".equalsIgnoreCase(ghasset.getState())) {
logger.warn(" x Failed to upload {}", asset.getFileName());
logger.warn(" x failed to upload {}", asset.getFileName());
}
}
}

View File

@@ -56,27 +56,27 @@ public class GithubReleaser implements Releaser {
Github api = new Github(context.getLogger(), github.getApiEndpoint(), github.getResolvedToken());
context.getLogger().debug("Looking up release with tag {} at repository {}", tagName, github.getCanonicalRepoName());
context.getLogger().debug("looking up release with tag {} at repository {}", tagName, github.getCanonicalRepoName());
GHRelease release = api.findReleaseByTag(github.getCanonicalRepoName(), tagName);
if (null != release) {
context.getLogger().debug("Release {} exists", tagName);
context.getLogger().debug("release {} exists", tagName);
if (github.isOverwrite()) {
context.getLogger().debug("Deleting release {}", tagName);
context.getLogger().debug("deleting release {}", tagName);
if (!context.isDryrun()) {
release.delete();
}
context.getLogger().debug("Creating release {}", tagName);
context.getLogger().debug("creating release {}", tagName);
createRelease(api, tagName, changelog, context.getModel().getProject().isSnapshot());
} else if (github.isAllowUploadToExisting()) {
context.getLogger().debug("Updating release {}", tagName);
context.getLogger().debug("updating release {}", tagName);
if (!context.isDryrun()) api.uploadAssets(release, assets);
} else {
throw new IllegalStateException("Github release failed because release " +
tagName + " already exists. overwrite = false; allowUploadToExisting = false");
}
} else {
context.getLogger().debug("Release {} does not exist", tagName);
context.getLogger().debug("Creating release {}", tagName);
context.getLogger().debug("release {} does not exist", tagName);
context.getLogger().debug("creating release {}", tagName);
createRelease(api, tagName, changelog, context.getModel().getProject().isSnapshot());
}
} catch (IOException | IllegalStateException e) {
@@ -87,7 +87,7 @@ public class GithubReleaser implements Releaser {
@Override
public Repository maybeCreateRepository(String owner, String repo, String password) throws IOException {
org.jreleaser.model.Github github = context.getModel().getRelease().getGithub();
context.getLogger().debug("Looking up {}/{}", owner, repo);
context.getLogger().debug("looking up {}/{}", owner, repo);
Github api = new Github(context.getLogger(), github.getApiEndpoint(), password);
GHRepository repository = api.findRepository(owner, repo);
@@ -112,7 +112,7 @@ public class GithubReleaser implements Releaser {
continue;
}
context.getLogger().debug(" - Uploading asset {}", asset.getFileName().toString());
context.getLogger().info(" - uploading {}", asset.getFileName().toString());
}
return;
}
@@ -123,7 +123,7 @@ public class GithubReleaser implements Releaser {
// local tag
if (deleteTags || !github.isSkipTagging()) {
context.getLogger().debug("Tagging local repository with {}", tagName);
context.getLogger().debug("tagging local repository with {}", tagName);
GitSdk.of(context).tag(tagName, true);
}

View File

@@ -105,7 +105,7 @@ class Gitlab {
Project findProject(String projectName) throws GitlabAPIException {
User u = getCurrentUser();
logger.debug("Fetching project {} for user {} ({})", projectName, u.getUsername(), u.getId());
logger.debug("fetching project {} for user {} ({})", projectName, u.getUsername(), u.getId());
List<Project> projects = api.getProject(u.getId(), CollectionUtils.<String, Object>map()
.e("search", projectName));
@@ -117,7 +117,7 @@ class Gitlab {
}
Optional<Milestone> findMilestoneByName(String owner, String repo, String milestoneName) throws IOException {
logger.debug("Lookup milestone '{}' on {}/{}", milestoneName, owner, repo);
logger.debug("Llookup milestone '{}' on {}/{}", milestoneName, owner, repo);
Project project = getProject(repo);
@@ -141,7 +141,7 @@ class Gitlab {
}
void closeMilestone(String owner, String repo, Milestone milestone) throws IOException {
logger.debug("Closing milestone '{}' on {}/{}", milestone.getTitle(), owner, repo);
logger.debug("closing milestone '{}' on {}/{}", milestone.getTitle(), owner, repo);
Project project = getProject(repo);
@@ -151,14 +151,14 @@ class Gitlab {
}
Project createProject(String owner, String repo) throws IOException {
logger.debug("Creating project {}/{}", owner, repo);
logger.debug("creating project {}/{}", owner, repo);
return api.createProject(repo, "public");
}
User getCurrentUser() throws GitlabAPIException {
if (null == user) {
logger.debug("Fetching current user");
logger.debug("fetching current user");
user = api.getCurrentUser();
}
@@ -169,7 +169,7 @@ class Gitlab {
User u = getCurrentUser();
if (null == project) {
logger.debug("Fetching project {} for user {} ({})", projectName, u.getUsername(), u.getId());
logger.debug("fetching project {} for user {} ({})", projectName, u.getUsername(), u.getId());
List<Project> projects = api.getProject(u.getId(), CollectionUtils.<String, Object>map()
.e("search", projectName));
@@ -184,7 +184,7 @@ class Gitlab {
}
Release findReleaseByTag(String owner, String repoName, String tagName) throws GitlabAPIException {
logger.debug("Fetching release on {}/{} with tag {}", owner, repoName, tagName);
logger.debug("fetching release on {}/{} with tag {}", owner, repoName, tagName);
Project project = getProject(repoName);
@@ -200,7 +200,7 @@ class Gitlab {
}
void deleteTag(String owner, String repoName, String tagName) throws GitlabAPIException {
logger.debug("Deleting tag {} from {}/{}", tagName, owner, repoName);
logger.debug("deleting tag {} from {}/{}", tagName, owner, repoName);
Project project = getProject(repoName);
@@ -208,7 +208,7 @@ class Gitlab {
}
void deleteRelease(String owner, String repoName, String tagName) throws GitlabAPIException {
logger.debug("Deleting release {} from {}/{}", tagName, owner, repoName);
logger.debug("deleting release {} from {}/{}", tagName, owner, repoName);
Project project = getProject(repoName);
@@ -216,7 +216,7 @@ class Gitlab {
}
void createRelease(String owner, String repoName, Release release) throws GitlabAPIException {
logger.debug("Creating release on {}/{} with tag {}", owner, repoName, release.getTagName());
logger.debug("creating release on {}/{} with tag {}", owner, repoName, release.getTagName());
Project project = getProject(repoName);
@@ -224,7 +224,7 @@ class Gitlab {
}
List<FileUpload> uploadAssets(String owner, String repoName, List<Path> assets) throws IOException, GitlabAPIException {
logger.debug("Uploading assets to {}/{}", owner, repoName);
logger.debug("uploading assets to {}/{}", owner, repoName);
List<FileUpload> uploads = new ArrayList<>();
@@ -236,7 +236,7 @@ class Gitlab {
continue;
}
logger.info(" - Uploading {}", asset.getFileName().toString());
logger.info(" - uploading {}", asset.getFileName().toString());
try {
FileUpload upload = api.uploadFile(project.getId(), toFormData(asset));
upload.setName(asset.getFileName().toString());
@@ -251,16 +251,16 @@ class Gitlab {
}
void linkAssets(String owner, String repoName, Release release, List<FileUpload> uploads) throws IOException, GitlabAPIException {
logger.debug("Linking assets to {}/{} with tag {}", owner, repoName, release.getTagName());
logger.debug("linking assets to {}/{} with tag {}", owner, repoName, release.getTagName());
Project project = getProject(repoName);
for (FileUpload upload : uploads) {
logger.debug(" - Linking {}", upload.getName());
logger.debug(" - linking {}", upload.getName());
try {
api.linkAsset(upload.toLinkRequest(apiHost), project.getId(), release.getTagName());
} catch (GitlabAPIException e) {
logger.error(" x Failed to link {}", upload.getName());
logger.error(" x failed to link {}", upload.getName());
throw e;
}
}

View File

@@ -58,19 +58,19 @@ public class GitlabReleaser implements Releaser {
Gitlab api = new Gitlab(context.getLogger(), gitlab.getApiEndpoint(), gitlab.getResolvedToken());
context.getLogger().debug("Looking up release with tag {} at repository {}", tagName, gitlab.getCanonicalRepoName());
context.getLogger().debug("looking up release with tag {} at repository {}", tagName, gitlab.getCanonicalRepoName());
Release release = api.findReleaseByTag(gitlab.getOwner(), gitlab.getName(), tagName);
if (null != release) {
context.getLogger().debug("Release {} exists", tagName);
context.getLogger().debug("release {} exists", tagName);
if (gitlab.isOverwrite()) {
context.getLogger().debug("Deleting release {}", tagName);
context.getLogger().debug("deleting release {}", tagName);
if (!context.isDryrun()) {
api.deleteRelease(gitlab.getOwner(), gitlab.getName(), tagName);
}
context.getLogger().debug("Creating release {}", tagName);
context.getLogger().debug("creating release {}", tagName);
createRelease(api, tagName, changelog, context.getModel().getProject().isSnapshot());
} else if (gitlab.isAllowUploadToExisting()) {
context.getLogger().debug("Updating release {}", tagName);
context.getLogger().debug("updating release {}", tagName);
if (!context.isDryrun()) {
List<FileUpload> uploads = api.uploadAssets(gitlab.getOwner(), gitlab.getName(), assets);
api.linkAssets(gitlab.getOwner(), gitlab.getName(), release, uploads);
@@ -80,8 +80,8 @@ public class GitlabReleaser implements Releaser {
tagName + " already exists. overwrite = false; allowUploadToExisting = false");
}
} else {
context.getLogger().debug("Release {} does not exist", tagName);
context.getLogger().debug("Creating release {}", tagName);
context.getLogger().debug("release {} does not exist", tagName);
context.getLogger().debug("creating release {}", tagName);
createRelease(api, tagName, changelog, context.getModel().getProject().isSnapshot());
}
} catch (IOException | IllegalStateException e) {
@@ -92,7 +92,7 @@ public class GitlabReleaser implements Releaser {
@Override
public Repository maybeCreateRepository(String owner, String repo, String password) throws IOException {
org.jreleaser.model.Gitlab gitlab = context.getModel().getRelease().getGitlab();
context.getLogger().debug("Looking up {}/{}", owner, repo);
context.getLogger().debug("looking up {}/{}", owner, repo);
Gitlab api = new Gitlab(context.getLogger(), gitlab.getApiEndpoint(), password);
Project project = null;
@@ -126,7 +126,7 @@ public class GitlabReleaser implements Releaser {
continue;
}
context.getLogger().debug(" - Uploading asset {}", asset.getFileName().toString());
context.getLogger().info(" - uploading {}", asset.getFileName().toString());
}
return;
}
@@ -137,7 +137,7 @@ public class GitlabReleaser implements Releaser {
// local tag
if (deleteTags || !gitlab.isSkipTagging()) {
context.getLogger().debug("Tagging local repository with {}", tagName);
context.getLogger().debug("tagging local repository with {}", tagName);
GitSdk.of(context).tag(tagName, true);
}