Merge pull request #168 from DennisRippinger/gitlab-faulty-forks

[gitlab] add identifier field
This commit is contained in:
Andres Almiray
2021-05-24 22:22:23 +02:00
committed by GitHub
9 changed files with 108 additions and 52 deletions

View File

@@ -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;
}
}

View File

@@ -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";

View File

@@ -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()
}

View File

@@ -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
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}
}

View File

@@ -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());

View File

@@ -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
}

View File

@@ -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);