diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Gitlab.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Gitlab.java index 21829eeb..8ba05358 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Gitlab.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Gitlab.java @@ -17,6 +17,10 @@ */ package org.jreleaser.model; +import java.util.Map; + +import static org.jreleaser.util.Constants.KEY_IDENTIFIER; + /** * @author Andres Almiray * @since 0.1.0 @@ -36,12 +40,38 @@ public class Gitlab extends GitService { setIssueTrackerUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/-/issues"); } + private String identifier; + void setAll(Gitlab service) { super.setAll(service); + this.identifier = service.identifier; } @Override public String getReverseRepoHost() { return "com.gitlab"; } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + @Override + public Map asMap(boolean full) { + Map map = super.asMap(full); + map.put("identifier", identifier); + return map; + } + + @Override + public Map props(JReleaserModel model) { + Map props = super.props(model); + props.put(KEY_IDENTIFIER, identifier); + + return props; + } } 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 74f9f347..5af2f4e2 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 @@ -70,6 +70,7 @@ public interface Constants { String KEY_REPO_HOST = "repoHost"; String KEY_REPO_OWNER = "repoOwner"; String KEY_REPO_NAME = "repoName"; + String KEY_IDENTIFIER = "identifier"; String KEY_REPO_BRANCH = "repoBranch"; String KEY_TAG_NAME = "tagName"; String KEY_RELEASE_NAME = "releaseName"; diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/Gitlab.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/Gitlab.groovy index 6f24f636..5d0f1a20 100644 --- a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/Gitlab.groovy +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/Gitlab.groovy @@ -18,6 +18,7 @@ package org.jreleaser.gradle.plugin.dsl import groovy.transform.CompileStatic +import org.gradle.api.provider.Property /** * @@ -26,4 +27,6 @@ import groovy.transform.CompileStatic */ @CompileStatic interface Gitlab extends GitService { -} \ No newline at end of file + + Property getIdentifier() +} diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/GitlabImpl.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/GitlabImpl.groovy index 8a6b311d..6e86744f 100644 --- a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/GitlabImpl.groovy +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/GitlabImpl.groovy @@ -36,6 +36,7 @@ class GitlabImpl extends AbstractGitService implements Gitlab { final ChangelogImpl changelog final MilestoneImpl milestone final CommitAuthorImpl commitAuthor + final Property identifier @Inject GitlabImpl(ObjectFactory objects) { @@ -44,6 +45,8 @@ class GitlabImpl extends AbstractGitService implements Gitlab { changelog = objects.newInstance(ChangelogImpl, objects) milestone = objects.newInstance(MilestoneImpl, objects) commitAuthor = objects.newInstance(CommitAuthorImpl, objects) + + identifier = objects.property(String).convention(Providers.notDefined()) } @Override @@ -61,6 +64,7 @@ class GitlabImpl extends AbstractGitService implements Gitlab { if (changelog.isSet()) service.changelog = changelog.toModel() if (milestone.isSet()) service.milestone = milestone.toModel() if (commitAuthor.isSet()) service.commitAuthor = commitAuthor.toModel() + if (identifier.present) service.identifier = identifier.get() service } } diff --git a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/Gitlab.java b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/Gitlab.java index 50b49aa5..dc931973 100644 --- a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/Gitlab.java +++ b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/Gitlab.java @@ -33,7 +33,18 @@ public class Gitlab extends GitService { setIssueTrackerUrlFormat("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/-/issues"); } + private String identifier; + void setAll(Gitlab service) { super.setAll(service); + this.identifier = service.identifier; + } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; } } 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 4a3a062d..4f07cb2a 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 @@ -167,6 +167,7 @@ public final class JReleaserModelConverter { private static org.jreleaser.model.Gitlab convertGitlab(Gitlab gitlab) { if (null == gitlab) return null; org.jreleaser.model.Gitlab g = new org.jreleaser.model.Gitlab(); + g.setIdentifier(gitlab.getIdentifier()); convertGitService(gitlab, g); return g; } @@ -866,4 +867,4 @@ public final class JReleaserModelConverter { p.setWrites(slot.getWrites()); return p; } -} \ No newline at end of file +} diff --git a/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/Gitlab.java b/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/Gitlab.java index 7e73a7bf..2f715ab9 100644 --- a/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/Gitlab.java +++ b/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/Gitlab.java @@ -38,6 +38,7 @@ import org.jreleaser.sdk.gitlab.api.Release; import org.jreleaser.sdk.gitlab.api.User; import org.jreleaser.util.CollectionUtils; import org.jreleaser.util.JReleaserLogger; +import org.jreleaser.util.StringUtils; import java.io.IOException; import java.nio.file.Files; @@ -102,24 +103,14 @@ class Gitlab { .target(GitlabAPI.class, endpoint); } - Project findProject(String projectName) throws RestAPIException { - User u = getCurrentUser(); - - logger.debug("fetching project {} for user {} ({})", projectName, u.getUsername(), u.getId()); - List projects = api.getProject(u.getId(), CollectionUtils.map() - .e("search", projectName)); - - if (projects == null || projects.isEmpty()) { - throw new RestAPIException(404, "Project " + projectName + " does not exist or it's not visible"); - } - - return projects.get(0); + Project findProject(String projectName, String identifier) throws RestAPIException { + return getProject(projectName, identifier); } - Optional findMilestoneByName(String owner, String repo, String milestoneName) throws IOException { - logger.debug("Llookup milestone '{}' on {}/{}", milestoneName, owner, repo); + Optional findMilestoneByName(String owner, String repo, String identifier, String milestoneName) throws IOException { + logger.debug("lookup milestone '{}' on {}/{}", milestoneName, owner, repo); - Project project = getProject(repo); + Project project = getProject(repo, identifier); try { List milestones = api.findMilestoneByTitle(project.getId(), CollectionUtils.map() @@ -140,10 +131,10 @@ class Gitlab { } } - void closeMilestone(String owner, String repo, Milestone milestone) throws IOException { + void closeMilestone(String owner, String repo, String identifier, Milestone milestone) throws IOException { logger.debug("closing milestone '{}' on {}/{}", milestone.getTitle(), owner, repo); - Project project = getProject(repo); + Project project = getProject(repo, identifier); api.updateMilestone(CollectionUtils.map() .e("state_event", "close"), @@ -165,28 +156,37 @@ class Gitlab { return user; } - Project getProject(String projectName) throws RestAPIException { - User u = getCurrentUser(); + Project getProject(String projectName, String identifier) throws RestAPIException { if (null == project) { - logger.debug("fetching project {} for user {} ({})", projectName, u.getUsername(), u.getId()); - List projects = api.getProject(u.getId(), CollectionUtils.map() - .e("search", projectName)); - if (projects == null || projects.isEmpty()) { - throw new RestAPIException(404, "Project " + projectName + " does not exist or it's not visible"); + if (StringUtils.isNotBlank(identifier)) { + logger.debug("fetching project with GitLab id {}", identifier); + project = api.getProject(identifier.trim()); + } else { + User u = getCurrentUser(); + + logger.debug("fetching project {} for user {} ({})", projectName, u.getUsername(), u.getId()); + List projects = api.getProject(u.getId(), CollectionUtils.map() + .e("search", projectName)); + + if (projects == null || projects.isEmpty()) { + throw new RestAPIException(404, "Project " + projectName + " does not exist or it's not visible"); + } + + project = projects.get(0); } - project = projects.get(0); + logger.debug("found {} (ID: {})", project.getNameWithNamespace(), project.getId()); } return project; } - Release findReleaseByTag(String owner, String repoName, String tagName) throws RestAPIException { + Release findReleaseByTag(String owner, String repoName, String identifier, String tagName) throws RestAPIException { logger.debug("fetching release on {}/{} with tag {}", owner, repoName, tagName); - Project project = getProject(repoName); + Project project = getProject(repoName, identifier); try { return api.getRelease(project.getId(), urlEncode(tagName)); @@ -199,36 +199,36 @@ class Gitlab { } } - void deleteTag(String owner, String repoName, String tagName) throws RestAPIException { + void deleteTag(String owner, String repoName, String identifier, String tagName) throws RestAPIException { logger.debug("deleting tag {} from {}/{}", tagName, owner, repoName); - Project project = getProject(repoName); + Project project = getProject(repoName, identifier); api.deleteTag(project.getId(), urlEncode(tagName)); } - void deleteRelease(String owner, String repoName, String tagName) throws RestAPIException { + void deleteRelease(String owner, String repoName, String identifier, String tagName) throws RestAPIException { logger.debug("deleting release {} from {}/{}", tagName, owner, repoName); - Project project = getProject(repoName); + Project project = getProject(repoName, identifier); api.deleteRelease(project.getId(), urlEncode(tagName)); } - void createRelease(String owner, String repoName, Release release) throws RestAPIException { + void createRelease(String owner, String repoName, String identifier, Release release) throws RestAPIException { logger.debug("creating release on {}/{} with tag {}", owner, repoName, release.getTagName()); - Project project = getProject(repoName); + Project project = getProject(repoName, identifier); api.createRelease(release, project.getId()); } - List uploadAssets(String owner, String repoName, List assets) throws IOException, RestAPIException { + List uploadAssets(String owner, String repoName, String identifier, List assets) throws IOException, RestAPIException { logger.debug("uploading assets to {}/{}", owner, repoName); List uploads = new ArrayList<>(); - Project project = getProject(repoName); + Project project = getProject(repoName, identifier); for (Path asset : assets) { if (0 == asset.toFile().length() || !Files.exists(asset)) { @@ -250,10 +250,10 @@ class Gitlab { return uploads; } - void linkAssets(String owner, String repoName, Release release, List uploads) throws IOException, RestAPIException { + void linkAssets(String owner, String repoName, Release release, String identifier, List uploads) throws IOException, RestAPIException { logger.debug("linking assets to {}/{} with tag {}", owner, repoName, release.getTagName()); - Project project = getProject(repoName); + Project project = getProject(repoName, identifier); for (FileUpload upload : uploads) { logger.debug(" - linking {}", upload.getName()); diff --git a/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabReleaser.java b/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabReleaser.java index 8145431b..569c4829 100644 --- a/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabReleaser.java +++ b/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabReleaser.java @@ -63,22 +63,22 @@ public class GitlabReleaser implements Releaser { gitlab.getReadTimeout()); context.getLogger().debug("looking up release with tag {} at repository {}", tagName, gitlab.getCanonicalRepoName()); - Release release = api.findReleaseByTag(gitlab.getOwner(), gitlab.getName(), tagName); + Release release = api.findReleaseByTag(gitlab.getOwner(), gitlab.getName(), gitlab.getIdentifier(), tagName); boolean snapshot = context.getModel().getProject().isSnapshot(); if (null != release) { context.getLogger().debug("release {} exists", tagName); if (gitlab.isOverwrite() || snapshot) { context.getLogger().debug("deleting release {}", tagName); if (!context.isDryrun()) { - api.deleteRelease(gitlab.getOwner(), gitlab.getName(), tagName); + api.deleteRelease(gitlab.getOwner(), gitlab.getName(), gitlab.getIdentifier(), tagName); } context.getLogger().debug("creating release {}", tagName); createRelease(api, tagName, changelog, true); } else if (gitlab.isUpdate()) { context.getLogger().debug("updating release {}", tagName); if (!context.isDryrun()) { - List uploads = api.uploadAssets(gitlab.getOwner(), gitlab.getName(), assets); - api.linkAssets(gitlab.getOwner(), gitlab.getName(), release, uploads); + List uploads = api.uploadAssets(gitlab.getOwner(), gitlab.getName(), gitlab.getIdentifier(), assets); + api.linkAssets(gitlab.getOwner(), gitlab.getName(), release, gitlab.getIdentifier(), uploads); } } else { throw new IllegalStateException("Gitlab release failed because release " + @@ -108,7 +108,7 @@ public class GitlabReleaser implements Releaser { Project project = null; try { - project = api.findProject(repo); + project = api.findProject(repo, gitlab.getIdentifier()); } catch (RestAPIException e) { if (!e.isNotFound()) { throw e; @@ -143,7 +143,7 @@ public class GitlabReleaser implements Releaser { } if (deleteTags) { - deleteTags(api, gitlab.getOwner(), gitlab.getName(), tagName); + deleteTags(api, gitlab.getOwner(), gitlab.getName(), gitlab.getIdentifier(), tagName); } // local tag @@ -152,7 +152,7 @@ public class GitlabReleaser implements Releaser { GitSdk.of(context).tag(tagName, true, context); } - List uploads = api.uploadAssets(gitlab.getOwner(), gitlab.getName(), assets); + List uploads = api.uploadAssets(gitlab.getOwner(), gitlab.getName(), gitlab.getIdentifier(), assets); Release release = new Release(); release.setName(gitlab.getEffectiveReleaseName()); @@ -161,26 +161,28 @@ public class GitlabReleaser implements Releaser { release.setDescription(changelog); // remote tag/release - api.createRelease(gitlab.getOwner(), gitlab.getName(), release); - api.linkAssets(gitlab.getOwner(), gitlab.getName(), release, uploads); + api.createRelease(gitlab.getOwner(), gitlab.getName(), gitlab.getIdentifier(), release); + api.linkAssets(gitlab.getOwner(), gitlab.getName(), release, gitlab.getIdentifier(), uploads); if (gitlab.getMilestone().isClose() && !context.getModel().getProject().isSnapshot()) { Optional milestone = api.findMilestoneByName( gitlab.getOwner(), gitlab.getName(), + gitlab.getIdentifier(), gitlab.getMilestone().getEffectiveName()); if (milestone.isPresent()) { api.closeMilestone(gitlab.getOwner(), - gitlab.getName(), - milestone.get()); + gitlab.getName(), + gitlab.getIdentifier(), + milestone.get()); } } } - private void deleteTags(Gitlab api, String owner, String repo, String tagName) { + private void deleteTags(Gitlab api, String owner, String repo, String identifier, String tagName) { // delete remote tag try { - api.deleteTag(owner, repo, tagName); + api.deleteTag(owner, repo, identifier, tagName); } catch (RestAPIException ignored) { //noop } diff --git a/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/api/GitlabAPI.java b/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/api/GitlabAPI.java index 833f3b82..6f609e4e 100644 --- a/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/api/GitlabAPI.java +++ b/sdks/gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/api/GitlabAPI.java @@ -34,6 +34,10 @@ public interface GitlabAPI { @RequestLine("GET /user") User getCurrentUser(); + @RequestLine("GET /projects/{projectId}") + @Headers("Content-Type: application/json") + Project getProject(@Param("projectId") String projectId); + @RequestLine("GET /users/{userId}/projects") List getProject(@Param("userId") Integer userId, @QueryMap Map queryMap);