mirror of
https://github.com/jlengrand/github-api.git
synced 2026-03-11 08:21:23 +00:00
Compare commits
18 Commits
github-api
...
github-api
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dafb50d6a9 | ||
|
|
13c59b6618 | ||
|
|
8f95c4f179 | ||
|
|
9fd34aec7f | ||
|
|
17c7a3e7c5 | ||
|
|
40a8c110bf | ||
|
|
c9cd0a4d1f | ||
|
|
45eae77f8f | ||
|
|
926202900c | ||
|
|
21aa669503 | ||
|
|
dee28e7a7a | ||
|
|
c8f46a3666 | ||
|
|
ba7fe10a08 | ||
|
|
9e9db72878 | ||
|
|
69a87e2ab7 | ||
|
|
8ec2686e72 | ||
|
|
d034ca4d1f | ||
|
|
61cf71fd67 |
2
pom.xml
2
pom.xml
@@ -7,7 +7,7 @@
|
||||
</parent>
|
||||
|
||||
<artifactId>github-api</artifactId>
|
||||
<version>1.27</version>
|
||||
<version>1.30</version>
|
||||
<name>GitHub API for Java</name>
|
||||
<url>http://github-api.kohsuke.org/</url>
|
||||
<description>GitHub API for Java</description>
|
||||
|
||||
@@ -45,7 +45,7 @@ public class GHOrganization extends GHPerson {
|
||||
GHTeam[] teams = root.retrieveWithAuth("/orgs/" + login + "/teams", GHTeam[].class);
|
||||
Map<String,GHTeam> r = new TreeMap<String, GHTeam>();
|
||||
for (GHTeam t : teams) {
|
||||
r.put(t.getName(),t);
|
||||
r.put(t.getName(),t.wrapUp(this));
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -22,9 +22,6 @@ public abstract class GHPerson {
|
||||
protected int id;
|
||||
protected String gravatar_id; // appears in V3 as well but presumably subsumed by avatar_url?
|
||||
|
||||
// V2
|
||||
protected int public_gist_count,public_repo_count,followers_count,following_count;
|
||||
|
||||
// V3
|
||||
protected String avatar_url,html_url;
|
||||
protected int followers,following,public_repos,public_gists;
|
||||
@@ -163,15 +160,15 @@ public abstract class GHPerson {
|
||||
}
|
||||
|
||||
public int getPublicGistCount() {
|
||||
return Math.max(public_gist_count,public_gists);
|
||||
return public_gists;
|
||||
}
|
||||
|
||||
public int getPublicRepoCount() {
|
||||
return Math.max(public_repo_count,public_repos);
|
||||
return public_repos;
|
||||
}
|
||||
|
||||
public int getFollowingCount() {
|
||||
return Math.max(following_count,following);
|
||||
return following;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -182,7 +179,7 @@ public abstract class GHPerson {
|
||||
}
|
||||
|
||||
public int getFollowersCount() {
|
||||
return Math.max(followers_count,followers);
|
||||
return followers;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlPage;
|
||||
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.net.URL;
|
||||
import java.util.AbstractSet;
|
||||
import java.util.ArrayList;
|
||||
@@ -269,8 +270,11 @@ public class GHRepository {
|
||||
}
|
||||
|
||||
private void edit(String key, String value) throws IOException {
|
||||
new Poster(root).withCredential().with(key,value)
|
||||
.to("/repos/" + owner.login + "/" + name,null,"PATCH");
|
||||
Poster poster = new Poster(root).withCredential();
|
||||
if (!key.equals("name"))
|
||||
poster.with("name", name); // even when we don't change the name, we need to send it in
|
||||
poster.with(key, value)
|
||||
.to("/repos/" + owner.login + "/" + name, null, "PATCH");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -310,12 +314,7 @@ public class GHRepository {
|
||||
* Deletes this repository.
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
throw new UnsupportedOperationException(); // doesn't appear to be available in V3
|
||||
// Poster poster = new Poster(root).withCredential();
|
||||
// String url = "/repos/delete/" + owner.login +"/"+name;
|
||||
//
|
||||
// DeleteToken token = poster.to(url, DeleteToken.class);
|
||||
// poster.with("delete_token", token.delete_token).to(url);
|
||||
new Poster(root).withCredential().to("/repos/" + owner.login +"/"+name, null, "DELETE");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -336,7 +335,18 @@ public class GHRepository {
|
||||
*/
|
||||
public GHRepository forkTo(GHOrganization org) throws IOException {
|
||||
new Poster(root).withCredential().to(String.format("/repos/%s/%s/forks?org=%s",owner.login,name,org.getLogin()));
|
||||
return org.getRepository(name);
|
||||
|
||||
// this API is asynchronous. we need to wait for a bit
|
||||
for (int i=0; i<10; i++) {
|
||||
GHRepository r = org.getRepository(name);
|
||||
if (r!=null) return r;
|
||||
try {
|
||||
Thread.sleep(3000);
|
||||
} catch (InterruptedException e) {
|
||||
throw (IOException)new InterruptedIOException().initCause(e);
|
||||
}
|
||||
}
|
||||
throw new IOException(this+" was forked into "+org.getLogin()+" but can't find the new repository");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -348,12 +358,28 @@ public class GHRepository {
|
||||
|
||||
/**
|
||||
* Retrieves all the pull requests of a particular state.
|
||||
*
|
||||
* @see #listPullRequests(GHIssueState)
|
||||
*/
|
||||
public List<GHPullRequest> getPullRequests(GHIssueState state) throws IOException {
|
||||
GHPullRequest[] r = root.retrieveWithAuth("/repos/" + owner.login + '/' + name + "/pulls?state=" + state.name().toLowerCase(Locale.ENGLISH), GHPullRequest[].class);
|
||||
for (GHPullRequest p : r)
|
||||
p.wrapUp(this);
|
||||
return new ArrayList<GHPullRequest>(Arrays.asList(r));
|
||||
return listPullRequests(state).asList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all the pull requests of a particular state.
|
||||
*/
|
||||
public PagedIterable<GHPullRequest> listPullRequests(final GHIssueState state) {
|
||||
return new PagedIterable<GHPullRequest>() {
|
||||
public PagedIterator<GHPullRequest> iterator() {
|
||||
return new PagedIterator<GHPullRequest>(root.retrievePaged(String.format("/repos/%s/%s/pulls?state=%s", owner.login,name,state.name().toLowerCase(Locale.ENGLISH)), GHPullRequest[].class, false)) {
|
||||
@Override
|
||||
protected void wrapUp(GHPullRequest[] page) {
|
||||
for (GHPullRequest pr : page)
|
||||
pr.wrap(GHRepository.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -285,12 +285,12 @@ public class GitHub {
|
||||
uc.setRequestProperty("Authorization", "Basic " + encodedAuthorization);
|
||||
|
||||
uc.setRequestMethod(method);
|
||||
uc.setRequestProperty("Accept-Encoding", "gzip");
|
||||
if (method.equals("PUT")) {
|
||||
uc.setDoOutput(true);
|
||||
uc.setRequestProperty("Content-Length","0");
|
||||
uc.getOutputStream().close();
|
||||
}
|
||||
uc.setRequestProperty("Accept-Encoding", "gzip");
|
||||
return uc;
|
||||
}
|
||||
|
||||
@@ -415,11 +415,18 @@ public class GitHub {
|
||||
return getUser(tokens[0]).getRepository(tokens[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns a shallowly populated organizations.
|
||||
*
|
||||
* To retrieve full organization details, you need to call {@link #getOrganization(String)}
|
||||
* TODO: make this automatic.
|
||||
*/
|
||||
public Map<String, GHOrganization> getMyOrganizations() throws IOException {
|
||||
GHOrganization[] orgs = retrieveWithAuth("/user/orgs", GHOrganization[].class);
|
||||
Map<String, GHOrganization> r = new HashMap<String, GHOrganization>();
|
||||
for (GHOrganization o : orgs) {
|
||||
r.put(o.name,o.wrapUp(this));
|
||||
// don't put 'o' into orgs because they are shallow
|
||||
r.put(o.getLogin(),o.wrapUp(this));
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,24 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* {@link Iterable} that returns {@link PagedIterator}
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public interface PagedIterable<T> extends Iterable<T> {
|
||||
PagedIterator<T> iterator();
|
||||
public abstract class PagedIterable<T> implements Iterable<T> {
|
||||
public abstract PagedIterator<T> iterator();
|
||||
|
||||
/**
|
||||
* Eagerly walk {@link Iterable} and return the result in a list.
|
||||
*/
|
||||
public List<T> asList() {
|
||||
List<T> r = new ArrayList<T>();
|
||||
for(PagedIterator<T> i = iterator(); i.hasNext();) {
|
||||
r.addAll(i.nextPage());
|
||||
}
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,11 +14,13 @@ import org.kohsuke.github.GHKey;
|
||||
import org.kohsuke.github.GHMyself;
|
||||
import org.kohsuke.github.GHOrganization;
|
||||
import org.kohsuke.github.GHOrganization.Permission;
|
||||
import org.kohsuke.github.GHPullRequest;
|
||||
import org.kohsuke.github.GHRepository;
|
||||
import org.kohsuke.github.GHTeam;
|
||||
import org.kohsuke.github.GHUser;
|
||||
import org.kohsuke.github.GitHub;
|
||||
import org.kohsuke.github.PagedIterable;
|
||||
import org.kohsuke.github.PagedIterator;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
@@ -31,6 +33,16 @@ import java.util.List;
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class AppTest extends TestCase {
|
||||
public void testRepoCRUD() throws Exception {
|
||||
GitHub hub = GitHub.connect();
|
||||
GHRepository r = hub.createRepository("github-api-test", "a test repository", "http://github-api.kohsuke.org/", true);
|
||||
r.enableIssueTracker(false);
|
||||
r.enableDownloads(false);
|
||||
r.enableWiki(false);
|
||||
r.renameTo("github-api-test2");
|
||||
hub.getMyself().getRepository("github-api-test2").delete();
|
||||
}
|
||||
|
||||
public void testCredentialValid() throws IOException {
|
||||
assertTrue(GitHub.connect().isCredentialValid());
|
||||
assertFalse(GitHub.connect("totally","bogus").isCredentialValid());
|
||||
@@ -40,6 +52,12 @@ public class AppTest extends TestCase {
|
||||
System.out.println(GitHub.connect().getRateLimit());
|
||||
}
|
||||
|
||||
public void testMyOrganizations() throws IOException {
|
||||
Map<String, GHOrganization> org = GitHub.connect().getMyOrganizations();
|
||||
assertFalse(org.keySet().contains(null));
|
||||
System.out.println(org);
|
||||
}
|
||||
|
||||
public void testFetchPullRequest() throws Exception {
|
||||
GitHub gh = GitHub.connect();
|
||||
GHRepository r = gh.getOrganization("jenkinsci").getRepository("jenkins");
|
||||
@@ -48,6 +66,16 @@ public class AppTest extends TestCase {
|
||||
r.getPullRequests(GHIssueState.OPEN);
|
||||
}
|
||||
|
||||
public void testFetchPullRequestAsList() throws Exception {
|
||||
GitHub gh = GitHub.connect();
|
||||
GHRepository r = gh.getOrganization("symfony").getRepository("symfony-docs");
|
||||
assertEquals("master", r.getMasterBranch());
|
||||
PagedIterable<GHPullRequest> i = r.listPullRequests(GHIssueState.CLOSED);
|
||||
List<GHPullRequest> prs = i.asList();
|
||||
assertNotNull(prs);
|
||||
assertTrue(prs.size() > 0);
|
||||
}
|
||||
|
||||
public void testRepoPermissions() throws Exception {
|
||||
GitHub gh = GitHub.connect();
|
||||
GHRepository r = gh.getOrganization("jenkinsci").getRepository("jenkins");
|
||||
@@ -247,11 +275,6 @@ public class AppTest extends TestCase {
|
||||
gitHub.getUser("kohsuke").getRepository("test").renameTo("test2");
|
||||
}
|
||||
|
||||
private void tryOrgFork(GitHub gitHub) throws IOException {
|
||||
GHOrganization o = gitHub.getOrganization("HudsonLabs");
|
||||
System.out.println(gitHub.getUser("rtyler").getRepository("memcache-ada").forkTo(o).getUrl());
|
||||
}
|
||||
|
||||
private void tryTeamCreation(GitHub gitHub) throws IOException {
|
||||
GHOrganization o = gitHub.getOrganization("HudsonLabs");
|
||||
GHTeam t = o.createTeam("auto team", Permission.PUSH);
|
||||
|
||||
Reference in New Issue
Block a user