diff --git a/src/main/java/org/kohsuke/github/GHCommitSearchBuilder.java b/src/main/java/org/kohsuke/github/GHCommitSearchBuilder.java new file mode 100644 index 000000000..65136dc0a --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHCommitSearchBuilder.java @@ -0,0 +1,137 @@ +package org.kohsuke.github; + +import java.io.IOException; + +import org.apache.commons.lang.StringUtils; + +/** + * Search commits. + * + * @author Marc de Verdelhan + * @see GitHub#searchCommits() + */ +@Preview @Deprecated +public class GHCommitSearchBuilder extends GHSearchBuilder { + /*package*/ GHCommitSearchBuilder(GitHub root) { + super(root,CommitSearchResult.class); + req.withPreview(Previews.CLOAK); + } + + /** + * Search terms. + */ + public GHCommitSearchBuilder q(String term) { + super.q(term); + return this; + } + + public GHCommitSearchBuilder author(String v) { + return q("author:"+v); + } + + public GHCommitSearchBuilder committer(String v) { + return q("committer:"+v); + } + + public GHCommitSearchBuilder authorName(String v) { + return q("author-name:"+v); + } + + public GHCommitSearchBuilder committerName(String v) { + return q("committer-name:"+v); + } + + public GHCommitSearchBuilder authorEmail(String v) { + return q("author-email:"+v); + } + + public GHCommitSearchBuilder committerEmail(String v) { + return q("committer-email:"+v); + } + + public GHCommitSearchBuilder authorDate(String v) { + return q("author-date:"+v); + } + + public GHCommitSearchBuilder committerDate(String v) { + return q("committer-date:"+v); + } + + public GHCommitSearchBuilder merge(boolean merge) { + return q("merge:"+Boolean.valueOf(merge).toString().toLowerCase()); + } + + public GHCommitSearchBuilder hash(String v) { + return q("hash:"+v); + } + + public GHCommitSearchBuilder parent(String v) { + return q("parent:"+v); + } + + public GHCommitSearchBuilder tree(String v) { + return q("tree:"+v); + } + + public GHCommitSearchBuilder is(String v) { + return q("is:"+v); + } + + public GHCommitSearchBuilder user(String v) { + return q("user:"+v); + } + + public GHCommitSearchBuilder org(String v) { + return q("org:"+v); + } + + public GHCommitSearchBuilder repo(String v) { + return q("repo:"+v); + } + + public GHCommitSearchBuilder order(GHDirection v) { + req.with("order",v); + return this; + } + + public GHCommitSearchBuilder sort(Sort sort) { + req.with("sort",sort); + return this; + } + + public enum Sort { AUTHOR_DATE, COMMITTER_DATE } + + private static class CommitSearchResult extends SearchResult { + private GHCommit[] items; + + @Override + /*package*/ GHCommit[] getItems(GitHub root) { + for (GHCommit commit : items) { + String repoName = getRepoName(commit.url); + try { + GHRepository repo = root.getRepository(repoName); + commit.wrapUp(repo); + } catch (IOException ioe) {} + } + return items; + } + } + + /** + * @param commitUrl a commit URL + * @return the repo name ("username/reponame") + */ + private static String getRepoName(String commitUrl) { + if (StringUtils.isBlank(commitUrl)) { + return null; + } + int indexOfUsername = (GitHub.GITHUB_URL + "/repos/").length(); + String[] tokens = commitUrl.substring(indexOfUsername).split("/", 3); + return tokens[0] + '/' + tokens[1]; + } + + @Override + protected String getApiUrl() { + return "/search/commits"; + } +} diff --git a/src/main/java/org/kohsuke/github/GitHub.java b/src/main/java/org/kohsuke/github/GitHub.java index 896fb36c6..49c860e4d 100644 --- a/src/main/java/org/kohsuke/github/GitHub.java +++ b/src/main/java/org/kohsuke/github/GitHub.java @@ -719,6 +719,14 @@ public class GitHub { } } + /** + * Search commits. + */ + @Preview @Deprecated + public GHCommitSearchBuilder searchCommits() { + return new GHCommitSearchBuilder(this); + } + /** * Search issues. */ diff --git a/src/main/java/org/kohsuke/github/Previews.java b/src/main/java/org/kohsuke/github/Previews.java index f95a28b42..3f98c3d4b 100644 --- a/src/main/java/org/kohsuke/github/Previews.java +++ b/src/main/java/org/kohsuke/github/Previews.java @@ -7,4 +7,5 @@ package org.kohsuke.github; static final String LOKI = "application/vnd.github.loki-preview+json"; static final String DRAX = "application/vnd.github.drax-preview+json"; static final String SQUIRREL_GIRL = "application/vnd.github.squirrel-girl-preview"; + static final String CLOAK = "application/vnd.github.cloak-preview"; } diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index a20b2eccf..248bd0ef1 100755 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -685,6 +685,15 @@ public class AppTest extends AbstractGitHubApiTestBase { assertFalse(all.isEmpty()); } + @Test + public void testCommitSearch() throws IOException { + PagedSearchIterable r = gitHub.searchCommits().author("kohsuke").list(); + assertTrue(r.getTotalCount() > 0); + + GHCommit firstCommit = r.iterator().next(); + assertTrue(firstCommit.getFiles().size() > 0); + } + @Test public void testIssueSearch() throws IOException { PagedSearchIterable r = gitHub.searchIssues().mentions("kohsuke").isOpen().list();