From 4b6981c2e7e60a510d5881e33f850aafa5bad25d Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 09:53:29 -0800 Subject: [PATCH] Added issue-search capability --- src/main/java/org/kohsuke/github/GHIssue.java | 11 ++- .../kohsuke/github/GHIssueSearchBuilder.java | 76 +++++++++++++++++++ src/main/java/org/kohsuke/github/GitHub.java | 8 ++ .../java/org/kohsuke/github/Requester.java | 13 ++++ 4 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java diff --git a/src/main/java/org/kohsuke/github/GHIssue.java b/src/main/java/org/kohsuke/github/GHIssue.java index b66483f83..53db997ad 100644 --- a/src/main/java/org/kohsuke/github/GHIssue.java +++ b/src/main/java/org/kohsuke/github/GHIssue.java @@ -37,6 +37,9 @@ import java.util.Locale; * * @author Eric Maupin * @author Kohsuke Kawaguchi + * @see GHRepository#getIssue(int) + * @see GitHub#searchIssues() + * @see GHIssueSearchBuilder */ public class GHIssue extends GHObject { GitHub root; @@ -76,8 +79,12 @@ public class GHIssue extends GHObject { /*package*/ GHIssue wrap(GHRepository owner) { this.owner = owner; - this.root = owner.root; - if(milestone != null) milestone.wrap(owner); + if(milestone != null) milestone.wrap(owner); + return wrap(owner.root); + } + + /*package*/ GHIssue wrap(GitHub root) { + this.root = root; if(assignee != null) assignee.wrapUp(root); if(user != null) user.wrapUp(root); if(closed_by != null) closed_by.wrapUp(root); diff --git a/src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java b/src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java new file mode 100644 index 000000000..ab65631bd --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java @@ -0,0 +1,76 @@ +package org.kohsuke.github; + +import org.apache.commons.lang.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * Search issues. + * + * @author Kohsuke Kawaguchi + * @see GitHub#searchIssues() + */ +public class GHIssueSearchBuilder { + private final GitHub root; + private final Requester req; + private final List terms = new ArrayList(); + + /*package*/ GHIssueSearchBuilder(GitHub root) { + this.root = root; + req = root.retrieve(); + } + + /** + * Search terms. + */ + public GHIssueSearchBuilder q(String term) { + terms.add(term); + return this; + } + + public GHIssueSearchBuilder mentions(GHUser u) { + return mentions(u.getLogin()); + } + + public GHIssueSearchBuilder mentions(String login) { + return q("mentions:"+login); + } + + public GHIssueSearchBuilder isOpen() { + return q("is:open"); + } + + public GHIssueSearchBuilder isClosed() { + return q("is:closed"); + } + + public GHIssueSearchBuilder isMerged() { + return q("is:merged"); + } + + public GHIssueSearchBuilder sort(Sort sort) { + req.with("sort",sort.toString().toLowerCase(Locale.ENGLISH)); + return this; + } + + public enum Sort { COMMENTS, CREATED, UPDATED } + + /** + * Lists up the issues with the criteria built so far. + */ + public PagedIterable list() { + return new PagedIterable() { + public PagedIterator iterator() { + req.set("q", StringUtils.join(terms," ")); + return new PagedIterator(req.asIterator("/search/issues", GHIssue[].class)) { + protected void wrapUp(GHIssue[] page) { + for (GHIssue c : page) + c.wrap(root); + } + }; + } + }; + } +} diff --git a/src/main/java/org/kohsuke/github/GitHub.java b/src/main/java/org/kohsuke/github/GitHub.java index 66b6ffe1d..9b893040e 100644 --- a/src/main/java/org/kohsuke/github/GitHub.java +++ b/src/main/java/org/kohsuke/github/GitHub.java @@ -424,6 +424,14 @@ public class GitHub { } } + /** + * Search issues. + */ + public GHIssueSearchBuilder searchIssues() { + return new GHIssueSearchBuilder(this); + } + + /*package*/ static URL parseURL(String s) { try { return s==null ? null : new URL(s); diff --git a/src/main/java/org/kohsuke/github/Requester.java b/src/main/java/org/kohsuke/github/Requester.java index c15485d30..e2b0362a4 100644 --- a/src/main/java/org/kohsuke/github/Requester.java +++ b/src/main/java/org/kohsuke/github/Requester.java @@ -134,6 +134,19 @@ class Requester { return this; } + /** + * Unlike {@link #with(String, String)}, overrides the existing value + */ + public Requester set(String key, Object value) { + for (Entry e : args) { + if (e.key.equals(key)) { + e.value = value; + return this; + } + } + return _with(key,value); + } + public Requester method(String method) { this.method = method; return this;