mirror of
https://github.com/jlengrand/jreleaser.git
synced 2026-03-10 08:31:24 +00:00
Merge pull request #168 from DennisRippinger/gitlab-faulty-forks
[gitlab] add identifier field
This commit is contained in:
@@ -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<String, Object> asMap(boolean full) {
|
||||
Map<String, Object> map = super.asMap(full);
|
||||
map.put("identifier", identifier);
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> props(JReleaserModel model) {
|
||||
Map<String, Object> props = super.props(model);
|
||||
props.put(KEY_IDENTIFIER, identifier);
|
||||
|
||||
return props;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 {
|
||||
}
|
||||
|
||||
Property<String> getIdentifier()
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@ class GitlabImpl extends AbstractGitService implements Gitlab {
|
||||
final ChangelogImpl changelog
|
||||
final MilestoneImpl milestone
|
||||
final CommitAuthorImpl commitAuthor
|
||||
final Property<String> 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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Project> projects = api.getProject(u.getId(), CollectionUtils.<String, Object>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<Milestone> findMilestoneByName(String owner, String repo, String milestoneName) throws IOException {
|
||||
logger.debug("Llookup milestone '{}' on {}/{}", milestoneName, owner, repo);
|
||||
Optional<Milestone> 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<Milestone> milestones = api.findMilestoneByTitle(project.getId(), CollectionUtils.<String, Object>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.<String, Object>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<Project> projects = api.getProject(u.getId(), CollectionUtils.<String, Object>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<Project> projects = api.getProject(u.getId(), CollectionUtils.<String, Object>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<FileUpload> uploadAssets(String owner, String repoName, List<Path> assets) throws IOException, RestAPIException {
|
||||
List<FileUpload> uploadAssets(String owner, String repoName, String identifier, List<Path> assets) throws IOException, RestAPIException {
|
||||
logger.debug("uploading assets to {}/{}", owner, repoName);
|
||||
|
||||
List<FileUpload> 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<FileUpload> uploads) throws IOException, RestAPIException {
|
||||
void linkAssets(String owner, String repoName, Release release, String identifier, List<FileUpload> 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());
|
||||
|
||||
@@ -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<FileUpload> uploads = api.uploadAssets(gitlab.getOwner(), gitlab.getName(), assets);
|
||||
api.linkAssets(gitlab.getOwner(), gitlab.getName(), release, uploads);
|
||||
List<FileUpload> 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<FileUpload> uploads = api.uploadAssets(gitlab.getOwner(), gitlab.getName(), assets);
|
||||
List<FileUpload> 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> 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
|
||||
}
|
||||
|
||||
@@ -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<Project> getProject(@Param("userId") Integer userId, @QueryMap Map<String, Object> queryMap);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user