Commit a10f2b25 authored by Thomas Ehardt's avatar Thomas Ehardt

Resolves timols/java-gitlab-api/issues/33

There is a bug in the REST API for Gitlab when retrieving commits with
pagination (https://gitlab.com/gitlab-org/gitlab-ce/issues/759). This
commit is a workaround for that - when we are retrieving commits, we
assume that the second page is numbered 1 instead of 2.

To make this not cause problems if/when the Gitlab CE project fixes the
REST API, equals() is overridden in GitlabCommit to prevent duplicate
entries.
parent 2061da69
...@@ -582,9 +582,8 @@ public class GitlabAPI { ...@@ -582,9 +582,8 @@ public class GitlabAPI {
// gets all commits for a project // gets all commits for a project
public List<GitlabCommit> getAllCommits(String projectId) throws IOException { public List<GitlabCommit> getAllCommits(String projectId) throws IOException {
String tailUrl = GitlabProject.URL + "/" + sanitizeProjectId(projectId) + "/repository/commits"; String tailUrl = GitlabProject.URL + "/" + sanitizeProjectId(projectId) + "/repository" + GitlabCommit.URL;
GitlabCommit[] commits = retrieve().to(tailUrl, GitlabCommit[].class); return retrieve().getAll(tailUrl, GitlabCommit[].class);
return Arrays.asList(commits);
} }
// List commit diffs for a project ID and commit hash // List commit diffs for a project ID and commit hash
......
...@@ -28,6 +28,7 @@ import javax.net.ssl.X509TrustManager; ...@@ -28,6 +28,7 @@ import javax.net.ssl.X509TrustManager;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.gitlab.api.GitlabAPI; import org.gitlab.api.GitlabAPI;
import org.gitlab.api.models.GitlabCommit;
/** /**
* Gitlab HTTP Requestor * Gitlab HTTP Requestor
...@@ -235,9 +236,16 @@ public class GitlabHTTPRequestor { ...@@ -235,9 +236,16 @@ public class GitlabHTTPRequestor {
Integer page = Integer.parseInt(matcher.group(2)) + 1; Integer page = Integer.parseInt(matcher.group(2)) + 1;
_url = new URL(matcher.replaceAll(matcher.group(1) + "page=" + page)); _url = new URL(matcher.replaceAll(matcher.group(1) + "page=" + page));
} else { } else {
// Since the page query was not present, its safe to assume that we just if (GitlabCommit[].class == type) {
// currently used the first page, so we can default to page 2 // there is a bug in the Gitlab CE API
_url = new URL(url + "&page=2"); // (https://gitlab.com/gitlab-org/gitlab-ce/issues/759)
// that starts pagination with page=0 for commits
_url = new URL(url + "&page=1");
} else {
// Since the page query was not present, its safe to assume that we just
// currently used the first page, so we can default to page 2
_url = new URL(url + "&page=2");
}
} }
} }
}; };
......
...@@ -96,4 +96,17 @@ public class GitlabCommit { ...@@ -96,4 +96,17 @@ public class GitlabCommit {
public void setParentIds(List<String> parentIds) { public void setParentIds(List<String> parentIds) {
_parentIds = parentIds; _parentIds = parentIds;
} }
@Override
public boolean equals(Object obj) {
// we say that two commit objects are equal iff they have the same ID
// this prevents us from having to do clever workarounds for
// https://gitlab.com/gitlab-org/gitlab-ce/issues/759
try {
GitlabCommit commitObj = (GitlabCommit) obj;
return (this.getId().compareTo(commitObj.getId()) == 0);
} catch (ClassCastException e) {
return false;
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment