mirror of
https://github.com/jlengrand/github-api.git
synced 2026-03-11 00:11:25 +00:00
Compare commits
48 Commits
github-api
...
github-api
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
505bb8f06d | ||
|
|
f8408bd29f | ||
|
|
5f2c84a913 | ||
|
|
3011c99e3f | ||
|
|
ebc97f42ad | ||
|
|
4660c6d363 | ||
|
|
e239ef50ba | ||
|
|
8b4312a880 | ||
|
|
90daf8087e | ||
|
|
dd21bcb34c | ||
|
|
c4113f1ac7 | ||
|
|
efa48acd1d | ||
|
|
15e4d07a6d | ||
|
|
cb2248809c | ||
|
|
eb9551d81b | ||
|
|
87d1256a1b | ||
|
|
dd6179cf25 | ||
|
|
23c56ff887 | ||
|
|
c4eefa6917 | ||
|
|
202cff58f2 | ||
|
|
025806f0fd | ||
|
|
b0c54ef0f1 | ||
|
|
4d7681b1a4 | ||
|
|
340fb3f624 | ||
|
|
a83aad22ca | ||
|
|
5a418dcce6 | ||
|
|
ec5392708f | ||
|
|
901db92b11 | ||
|
|
01b8b10344 | ||
|
|
698d642ec8 | ||
|
|
90d1047fb2 | ||
|
|
b0d1eac477 | ||
|
|
cce02aec3d | ||
|
|
492ff58aa8 | ||
|
|
dd3e73996b | ||
|
|
931ed7adac | ||
|
|
861fd55d06 | ||
|
|
9a4eee4e7d | ||
|
|
ed76cdbddf | ||
|
|
9d91549803 | ||
|
|
a5425a3c71 | ||
|
|
f4b105b10f | ||
|
|
e4de09c55b | ||
|
|
d77be9d382 | ||
|
|
626909addb | ||
|
|
9b750bedef | ||
|
|
b976e0ef4e | ||
|
|
fd434292ad |
29
pom.xml
29
pom.xml
@@ -7,7 +7,7 @@
|
||||
</parent>
|
||||
|
||||
<artifactId>github-api</artifactId>
|
||||
<version>1.68</version>
|
||||
<version>1.69</version>
|
||||
<name>GitHub API for Java</name>
|
||||
<url>http://github-api.kohsuke.org/</url>
|
||||
<description>GitHub API for Java</description>
|
||||
@@ -16,7 +16,7 @@
|
||||
<connection>scm:git:git@github.com/kohsuke/${project.artifactId}.git</connection>
|
||||
<developerConnection>scm:git:ssh://git@github.com/kohsuke/${project.artifactId}.git</developerConnection>
|
||||
<url>http://${project.artifactId}.kohsuke.org/</url>
|
||||
<tag>github-api-1.68</tag>
|
||||
<tag>github-api-1.69</tag>
|
||||
</scm>
|
||||
|
||||
<distributionManagement>
|
||||
@@ -44,6 +44,25 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>findbugs-maven-plugin</artifactId>
|
||||
<version>3.0.1</version>
|
||||
<configuration>
|
||||
<xmlOutput>true</xmlOutput>
|
||||
<findbugsXmlWithMessages>true</findbugsXmlWithMessages>
|
||||
<failOnError>false</failOnError>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>run-findbugs</id>
|
||||
<phase>verify</phase>
|
||||
<goals>
|
||||
<goal>check</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
@@ -109,6 +128,12 @@
|
||||
<version>1.9.5</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.code.findbugs</groupId>
|
||||
<artifactId>annotations</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<repositories>
|
||||
<repository>
|
||||
|
||||
@@ -40,7 +40,8 @@ public class GHBranch {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Branch:" + name + " in " + owner.getUrl();
|
||||
final String url = owner != null ? owner.getUrl().toString() : "unknown";
|
||||
return "Branch:" + name + " in " + url;
|
||||
}
|
||||
|
||||
/*package*/ GHBranch wrap(GHRepository repo) {
|
||||
|
||||
@@ -70,7 +70,8 @@ public class GHCommit {
|
||||
public static class File {
|
||||
String status;
|
||||
int changes,additions,deletions;
|
||||
String raw_url, blob_url, filename, sha, patch;
|
||||
String raw_url, blob_url, sha, patch;
|
||||
String filename, previous_filename;
|
||||
|
||||
/**
|
||||
* Number of lines added + removed.
|
||||
@@ -101,12 +102,19 @@ public class GHCommit {
|
||||
}
|
||||
|
||||
/**
|
||||
* Just the base name and the extension without any directory name.
|
||||
* Full path in the repository.
|
||||
*/
|
||||
public String getFileName() {
|
||||
return filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* Previous path, in case file has moved.
|
||||
*/
|
||||
public String getPreviousFilename() {
|
||||
return previous_filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* The actual change.
|
||||
*/
|
||||
|
||||
@@ -23,12 +23,15 @@ public enum GHEvent {
|
||||
ISSUE_COMMENT,
|
||||
ISSUES,
|
||||
MEMBER,
|
||||
PAGE_BUILD,
|
||||
PUBLIC,
|
||||
PULL_REQUEST,
|
||||
PULL_REQUEST_REVIEW_COMMENT,
|
||||
PUSH,
|
||||
RELEASE,
|
||||
REPOSITORY, // only valid for org hooks
|
||||
STATUS,
|
||||
TEAM_ADD,
|
||||
WATCH
|
||||
WATCH,
|
||||
PING
|
||||
}
|
||||
|
||||
@@ -104,8 +104,12 @@ public abstract class GHEventPayload {
|
||||
@Override
|
||||
void wrapUp(GitHub root) {
|
||||
super.wrapUp(root);
|
||||
repository.wrap(root);
|
||||
issue.wrap(repository);
|
||||
if (repository != null) {
|
||||
repository.wrap(root);
|
||||
issue.wrap(repository);
|
||||
} else {
|
||||
issue.wrap(root);
|
||||
}
|
||||
comment.wrapUp(issue);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,22 +11,12 @@ import java.util.Map;
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GHHook extends GHObject {
|
||||
/**
|
||||
* Repository that the hook belongs to.
|
||||
*/
|
||||
/*package*/ transient GHRepository repository;
|
||||
|
||||
public abstract class GHHook extends GHObject {
|
||||
String name;
|
||||
List<String> events;
|
||||
boolean active;
|
||||
Map<String,String> config;
|
||||
|
||||
/*package*/ GHHook wrap(GHRepository owner) {
|
||||
this.repository = owner;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
@@ -50,7 +40,7 @@ public class GHHook extends GHObject {
|
||||
* Deletes this hook.
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(repository.root).method("DELETE").to(String.format("/repos/%s/%s/hooks/%d", repository.getOwnerName(), repository.getName(), id));
|
||||
new Requester(getRoot()).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -60,4 +50,8 @@ public class GHHook extends GHObject {
|
||||
public URL getHtmlUrl() {
|
||||
return null;
|
||||
}
|
||||
|
||||
abstract GitHub getRoot();
|
||||
|
||||
abstract String getApiRoute();
|
||||
}
|
||||
|
||||
130
src/main/java/org/kohsuke/github/GHHooks.java
Normal file
130
src/main/java/org/kohsuke/github/GHHooks.java
Normal file
@@ -0,0 +1,130 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Utility class for creating and retrieving webhooks; removes duplication between GHOrganization and GHRepository
|
||||
* functionality
|
||||
*/
|
||||
class GHHooks {
|
||||
static abstract class Context {
|
||||
private final GitHub root;
|
||||
|
||||
private Context(GitHub root) {
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
public List<GHHook> getHooks() throws IOException {
|
||||
List<GHHook> list = new ArrayList<GHHook>(Arrays.asList(
|
||||
root.retrieve().to(collection(), collectionClass())));
|
||||
for (GHHook h : list)
|
||||
wrap(h);
|
||||
return list;
|
||||
}
|
||||
|
||||
public GHHook getHook(int id) throws IOException {
|
||||
GHHook hook = root.retrieve().to(collection() + "/" + id, clazz());
|
||||
return wrap(hook);
|
||||
}
|
||||
|
||||
public GHHook createHook(String name, Map<String, String> config, Collection<GHEvent> events, boolean active) throws IOException {
|
||||
List<String> ea = null;
|
||||
if (events!=null) {
|
||||
ea = new ArrayList<String>();
|
||||
for (GHEvent e : events)
|
||||
ea.add(e.name().toLowerCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
GHHook hook = new Requester(root)
|
||||
.with("name", name)
|
||||
.with("active", active)
|
||||
._with("config", config)
|
||||
._with("events", ea)
|
||||
.to(collection(), clazz());
|
||||
|
||||
return wrap(hook);
|
||||
}
|
||||
|
||||
abstract String collection();
|
||||
|
||||
abstract Class<? extends GHHook[]> collectionClass();
|
||||
|
||||
abstract Class<? extends GHHook> clazz();
|
||||
|
||||
abstract GHHook wrap(GHHook hook);
|
||||
}
|
||||
|
||||
private static class RepoContext extends Context {
|
||||
private final GHRepository repository;
|
||||
private final GHUser owner;
|
||||
|
||||
private RepoContext(GHRepository repository, GHUser owner) {
|
||||
super(repository.root);
|
||||
this.repository = repository;
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
@Override
|
||||
String collection() {
|
||||
return String.format("/repos/%s/%s/hooks", owner.getLogin(), repository.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
Class<? extends GHHook[]> collectionClass() {
|
||||
return GHRepoHook[].class;
|
||||
}
|
||||
|
||||
@Override
|
||||
Class<? extends GHHook> clazz() {
|
||||
return GHRepoHook.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
GHHook wrap(GHHook hook) {
|
||||
return ((GHRepoHook)hook).wrap(repository);
|
||||
}
|
||||
}
|
||||
|
||||
private static class OrgContext extends Context {
|
||||
private final GHOrganization organization;
|
||||
|
||||
private OrgContext(GHOrganization organization) {
|
||||
super(organization.root);
|
||||
this.organization = organization;
|
||||
}
|
||||
|
||||
@Override
|
||||
String collection() {
|
||||
return String.format("/orgs/%s/hooks", organization.getLogin());
|
||||
}
|
||||
|
||||
@Override
|
||||
Class<? extends GHHook[]> collectionClass() {
|
||||
return GHOrgHook[].class;
|
||||
}
|
||||
|
||||
@Override
|
||||
Class<? extends GHHook> clazz() {
|
||||
return GHOrgHook.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
GHHook wrap(GHHook hook) {
|
||||
return ((GHOrgHook)hook).wrap(organization);
|
||||
}
|
||||
}
|
||||
|
||||
static Context repoContext(GHRepository repository, GHUser owner) {
|
||||
return new RepoContext(repository, owner);
|
||||
}
|
||||
|
||||
static Context orgContext(GHOrganization organization) {
|
||||
return new OrgContext(organization);
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,8 @@
|
||||
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Collection;
|
||||
@@ -140,9 +142,14 @@ public class GHIssue extends GHObject {
|
||||
|
||||
/**
|
||||
* Updates the issue by adding a comment.
|
||||
*
|
||||
* @return
|
||||
* Newly posted comment.
|
||||
*/
|
||||
public void comment(String message) throws IOException {
|
||||
new Requester(root).with("body",message).to(getIssuesApiRoute() + "/comments");
|
||||
@WithBridgeMethods(void.class)
|
||||
public GHIssueComment comment(String message) throws IOException {
|
||||
GHIssueComment r = new Requester(root).with("body",message).to(getIssuesApiRoute() + "/comments", GHIssueComment.class);
|
||||
return r.wrapUp(this);
|
||||
}
|
||||
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
@@ -176,7 +183,7 @@ public class GHIssue extends GHObject {
|
||||
}
|
||||
|
||||
public void assignTo(GHUser user) throws IOException {
|
||||
editIssue("assignee",user.getLogin());
|
||||
editIssue("assignee", user.getLogin());
|
||||
}
|
||||
|
||||
public void setLabels(String... labels) throws IOException {
|
||||
|
||||
@@ -25,7 +25,6 @@ package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* Comment to the issue
|
||||
@@ -79,4 +78,23 @@ public class GHIssueComment extends GHObject {
|
||||
public URL getHtmlUrl() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the body of the issue comment.
|
||||
*/
|
||||
public void update(String body) throws IOException {
|
||||
new Requester(owner.root).with("body", body).method("PATCH").to(getApiRoute(), GHIssueComment.class);
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this issue comment.
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(owner.root).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
|
||||
private String getApiRoute() {
|
||||
return "/repos/"+owner.getRepository().getOwnerName()+"/"+owner.getRepository().getName()+"/issues/comments/" + id;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -17,6 +16,33 @@ import java.util.TreeMap;
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GHMyself extends GHUser {
|
||||
|
||||
/**
|
||||
* Type of repositories returned during listing.
|
||||
*/
|
||||
public enum RepositoryListFilter {
|
||||
/**
|
||||
* All public and private repositories that current user has access or collaborates to
|
||||
*/
|
||||
ALL,
|
||||
/**
|
||||
* Public and private repositories owned by current user
|
||||
*/
|
||||
OWNER,
|
||||
/**
|
||||
* Public repositories that current user has access or collaborates to
|
||||
*/
|
||||
PUBLIC,
|
||||
/**
|
||||
* Private repositories that current user has access or collaborates to
|
||||
*/
|
||||
PRIVATE,
|
||||
/**
|
||||
* Public and private repositories that current user is a member
|
||||
*/
|
||||
MEMBER;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link #getEmails2()}
|
||||
@@ -109,16 +135,31 @@ public class GHMyself extends GHUser {
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up all the repositories this user owns (public and private) using the specified page size.
|
||||
* List repositories that are accessible to the authenticated user (public and private) using the specified page size.
|
||||
*
|
||||
* This includes repositories owned by the authenticated user, repositories that belong to other users
|
||||
* where the authenticated user is a collaborator, and other organizations' repositories that the authenticated
|
||||
* user has access to through an organization membership.
|
||||
*
|
||||
* @param pageSize size for each page of items returned by GitHub. Maximum page size is 100.
|
||||
*
|
||||
* Unlike {@link #getRepositories()}, this does not wait until all the repositories are returned.
|
||||
*/
|
||||
public PagedIterable<GHRepository> listRepositories(final int pageSize) {
|
||||
return listRepositories(pageSize, RepositoryListFilter.ALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* List repositories of a certain type that are accessible by current authenticated user using the specified page size.
|
||||
*
|
||||
* @param pageSize size for each page of items returned by GitHub. Maximum page size is 100.
|
||||
* @param repoType type of repository returned in the listing
|
||||
*/
|
||||
public PagedIterable<GHRepository> listRepositories(final int pageSize, final RepositoryListFilter repoType) {
|
||||
return new PagedIterable<GHRepository>() {
|
||||
public PagedIterator<GHRepository> iterator() {
|
||||
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/user/repos?per_page=" + pageSize, GHRepository[].class)) {
|
||||
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/user/repos?per_page=" + pageSize +
|
||||
"&type=" + repoType.name().toLowerCase(), GHRepository[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHRepository[] page) {
|
||||
for (GHRepository c : page)
|
||||
|
||||
27
src/main/java/org/kohsuke/github/GHOrgHook.java
Normal file
27
src/main/java/org/kohsuke/github/GHOrgHook.java
Normal file
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* © Copyright 2015 - SourceClear Inc
|
||||
*/
|
||||
|
||||
package org.kohsuke.github;
|
||||
|
||||
class GHOrgHook extends GHHook {
|
||||
/**
|
||||
* Organization that the hook belongs to.
|
||||
*/
|
||||
/*package*/ transient GHOrganization organization;
|
||||
|
||||
/*package*/ GHOrgHook wrap(GHOrganization owner) {
|
||||
this.organization = owner;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
GitHub getRoot() {
|
||||
return organization.root;
|
||||
}
|
||||
|
||||
@Override
|
||||
String getApiRoute() {
|
||||
return String.format("/orgs/%s/hooks/%d", organization.getLogin(), id);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,13 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
@@ -26,7 +29,7 @@ public class GHOrganization extends GHPerson {
|
||||
GHTeam t = getTeams().get(team);
|
||||
if (t==null)
|
||||
throw new IllegalArgumentException("No such team: "+team);
|
||||
return createRepository(name,description,homepage,t,isPublic);
|
||||
return createRepository(name, description, homepage, t, isPublic);
|
||||
}
|
||||
|
||||
public GHRepository createRepository(String name, String description, String homepage, GHTeam team, boolean isPublic) throws IOException {
|
||||
@@ -252,4 +255,39 @@ public class GHOrganization extends GHPerson {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the currently configured hooks.
|
||||
*/
|
||||
public List<GHHook> getHooks() throws IOException {
|
||||
return GHHooks.orgContext(this).getHooks();
|
||||
}
|
||||
|
||||
public GHHook getHook(int id) throws IOException {
|
||||
return GHHooks.orgContext(this).getHook(id);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* See https://api.github.com/hooks for possible names and their configuration scheme.
|
||||
* TODO: produce type-safe binding
|
||||
*
|
||||
* @param name
|
||||
* Type of the hook to be created. See https://api.github.com/hooks for possible names.
|
||||
* @param config
|
||||
* The configuration hash.
|
||||
* @param events
|
||||
* Can be null. Types of events to hook into.
|
||||
*/
|
||||
public GHHook createHook(String name, Map<String,String> config, Collection<GHEvent> events, boolean active) throws IOException {
|
||||
return GHHooks.orgContext(this).createHook(name, config, events, active);
|
||||
}
|
||||
|
||||
public GHHook createWebHook(URL url, Collection<GHEvent> events) throws IOException {
|
||||
return createHook("web", Collections.singletonMap("url", url.toExternalForm()),events,true);
|
||||
}
|
||||
|
||||
public GHHook createWebHook(URL url) throws IOException {
|
||||
return createWebHook(url, null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ public class GHPullRequestReviewComment extends GHObject {
|
||||
}
|
||||
|
||||
protected String getApiRoute() {
|
||||
return "/repos/"+owner.getRepository().getFullName()+"/comments/"+id;
|
||||
return "/repos/"+owner.getRepository().getFullName()+"/pulls/comments/"+id;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -94,6 +94,7 @@ public class GHPullRequestReviewComment extends GHObject {
|
||||
*/
|
||||
public void update(String body) throws IOException {
|
||||
new Requester(owner.root).method("PATCH").with("body", body).to(getApiRoute(),this);
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
23
src/main/java/org/kohsuke/github/GHRepoHook.java
Normal file
23
src/main/java/org/kohsuke/github/GHRepoHook.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
class GHRepoHook extends GHHook {
|
||||
/**
|
||||
* Repository that the hook belongs to.
|
||||
*/
|
||||
/*package*/ transient GHRepository repository;
|
||||
|
||||
/*package*/ GHRepoHook wrap(GHRepository owner) {
|
||||
this.repository = owner;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
GitHub getRoot() {
|
||||
return repository.root;
|
||||
}
|
||||
|
||||
@Override
|
||||
String getApiRoute() {
|
||||
return String.format("/repos/%s/%s/hooks/%d", repository.getOwnerName(), repository.getName(), id);
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@ import static java.util.Arrays.asList;
|
||||
|
||||
/**
|
||||
* A repository on GitHub.
|
||||
*
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
@@ -57,14 +57,14 @@ public class GHRepository extends GHObject {
|
||||
private int watchers,forks,open_issues,size,network_count,subscribers_count;
|
||||
private String pushed_at;
|
||||
private Map<Integer,GHMilestone> milestones = new HashMap<Integer, GHMilestone>();
|
||||
|
||||
|
||||
private String default_branch,language;
|
||||
private Map<String,GHCommit> commits = new HashMap<String, GHCommit>();
|
||||
|
||||
private GHRepoPermission permissions;
|
||||
|
||||
private GHRepository source, parent;
|
||||
|
||||
|
||||
public GHDeploymentBuilder createDeployment(String ref) {
|
||||
return new GHDeploymentBuilder(this,ref);
|
||||
}
|
||||
@@ -164,7 +164,7 @@ public class GHRepository extends GHObject {
|
||||
public URL getHtmlUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Short repository name without the owner. For example 'jenkins' in case of http://github.com/jenkinsci/jenkins
|
||||
*/
|
||||
@@ -321,6 +321,10 @@ public class GHRepository extends GHObject {
|
||||
return fork;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of all forks of this repository.
|
||||
* This not only counts direct forks, but also forks of forks, and so on.
|
||||
*/
|
||||
public int getForks() {
|
||||
return forks;
|
||||
}
|
||||
@@ -364,6 +368,14 @@ public class GHRepository extends GHObject {
|
||||
* @return
|
||||
* This field is null until the user explicitly configures the master branch.
|
||||
*/
|
||||
public String getDefaultBranch() {
|
||||
return default_branch;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Renamed to {@link #getDefaultBranch()}
|
||||
*/
|
||||
public String getMasterBranch() {
|
||||
return default_branch;
|
||||
}
|
||||
@@ -494,6 +506,10 @@ public class GHRepository extends GHObject {
|
||||
edit("homepage",value);
|
||||
}
|
||||
|
||||
public void setDefaultBranch(String value) throws IOException {
|
||||
edit("default_branch", value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this repository.
|
||||
*/
|
||||
@@ -505,6 +521,43 @@ public class GHRepository extends GHObject {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort orders for listing forks
|
||||
*/
|
||||
public static enum ForkSort { NEWEST, OLDEST, STARGAZERS }
|
||||
|
||||
/**
|
||||
* Lists all the direct forks of this repository, sorted by
|
||||
* github api default, currently {@link ForkSort#NEWEST ForkSort.NEWEST}.
|
||||
*/
|
||||
public PagedIterable<GHRepository> listForks() {
|
||||
return listForks(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all the direct forks of this repository, sorted by the given sort order.
|
||||
* @param sort the sort order. If null, defaults to github api default,
|
||||
* currently {@link ForkSort#NEWEST ForkSort.NEWEST}.
|
||||
*/
|
||||
public PagedIterable<GHRepository> listForks(final ForkSort sort) {
|
||||
return new PagedIterable<GHRepository>() {
|
||||
public PagedIterator<GHRepository> iterator() {
|
||||
String sortParam = "";
|
||||
if (sort != null) {
|
||||
sortParam = "?sort=" + sort.toString().toLowerCase(Locale.ENGLISH);
|
||||
}
|
||||
return new PagedIterator<GHRepository>(root.retrieve().asIterator(getApiTailUrl("forks" + sortParam), GHRepository[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHRepository[] page) {
|
||||
for (GHRepository c : page) {
|
||||
c.wrap(root);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Forks this repository as your repository.
|
||||
*
|
||||
@@ -597,15 +650,11 @@ public class GHRepository extends GHObject {
|
||||
* Retrieves the currently configured hooks.
|
||||
*/
|
||||
public List<GHHook> getHooks() throws IOException {
|
||||
List<GHHook> list = new ArrayList<GHHook>(Arrays.asList(
|
||||
root.retrieve().to(getApiTailUrl("hooks"), GHHook[].class)));
|
||||
for (GHHook h : list)
|
||||
h.wrap(this);
|
||||
return list;
|
||||
return GHHooks.repoContext(this, owner).getHooks();
|
||||
}
|
||||
|
||||
public GHHook getHook(int id) throws IOException {
|
||||
return root.retrieve().to(getApiTailUrl("hooks/" + id), GHHook.class).wrap(this);
|
||||
return GHHooks.repoContext(this, owner).getHook(id);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -649,7 +698,7 @@ public class GHRepository extends GHObject {
|
||||
}
|
||||
/**
|
||||
* Retrive a ref of the given type for the current GitHub repository.
|
||||
*
|
||||
*
|
||||
* @param refName
|
||||
* eg: heads/branch
|
||||
* @return refs matching the request type
|
||||
@@ -662,7 +711,7 @@ public class GHRepository extends GHObject {
|
||||
}
|
||||
/**
|
||||
* Retrive a tree of the given type for the current GitHub repository.
|
||||
*
|
||||
*
|
||||
* @param sha - sha number or branch name ex: "master"
|
||||
* @return refs matching the request type
|
||||
* @throws IOException
|
||||
@@ -673,11 +722,11 @@ public class GHRepository extends GHObject {
|
||||
String url = String.format("/repos/%s/%s/git/trees/%s", owner.login, name, sha);
|
||||
return root.retrieve().to(url, GHTree.class).wrap(root);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieves the tree for the current GitHub repository, recursively as described in here:
|
||||
* https://developer.github.com/v3/git/trees/#get-a-tree-recursively
|
||||
*
|
||||
*
|
||||
* @param sha - sha number or branch name ex: "master"
|
||||
* @param recursive use 1
|
||||
* @throws IOException
|
||||
@@ -774,7 +823,7 @@ public class GHRepository extends GHObject {
|
||||
* @param description
|
||||
* Optional short description.
|
||||
* @param context
|
||||
* Optinal commit status context.
|
||||
* Optinal commit status context.
|
||||
*/
|
||||
public GHCommitStatus createCommitStatus(String sha1, GHCommitState state, String targetUrl, String description, String context) throws IOException {
|
||||
return new Requester(root)
|
||||
@@ -784,7 +833,7 @@ public class GHRepository extends GHObject {
|
||||
.with("context", context)
|
||||
.to(String.format("/repos/%s/%s/statuses/%s",owner.login,this.name,sha1),GHCommitStatus.class).wrapUp(root);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @see #createCommitStatus(String, GHCommitState,String,String,String)
|
||||
*/
|
||||
@@ -858,10 +907,10 @@ public class GHRepository extends GHObject {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* See https://api.github.com/hooks for possible names and their configuration scheme.
|
||||
* TODO: produce type-safe binding
|
||||
*
|
||||
*
|
||||
* @param name
|
||||
* Type of the hook to be created. See https://api.github.com/hooks for possible names.
|
||||
* @param config
|
||||
@@ -870,21 +919,9 @@ public class GHRepository extends GHObject {
|
||||
* Can be null. Types of events to hook into.
|
||||
*/
|
||||
public GHHook createHook(String name, Map<String,String> config, Collection<GHEvent> events, boolean active) throws IOException {
|
||||
List<String> ea = null;
|
||||
if (events!=null) {
|
||||
ea = new ArrayList<String>();
|
||||
for (GHEvent e : events)
|
||||
ea.add(e.name().toLowerCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
return new Requester(root)
|
||||
.with("name", name)
|
||||
.with("active", active)
|
||||
._with("config", config)
|
||||
._with("events",ea)
|
||||
.to(String.format("/repos/%s/%s/hooks",owner.login,this.name),GHHook.class).wrap(this);
|
||||
return GHHooks.repoContext(this, owner).createHook(name, config, events, active);
|
||||
}
|
||||
|
||||
|
||||
public GHHook createWebHook(URL url, Collection<GHEvent> events) throws IOException {
|
||||
return createHook("web",Collections.singletonMap("url",url.toExternalForm()),events,true);
|
||||
}
|
||||
@@ -909,8 +946,8 @@ public class GHRepository extends GHObject {
|
||||
/**
|
||||
* Returns a set that represents the post-commit hook URLs.
|
||||
* The returned set is live, and changes made to them are reflected to GitHub.
|
||||
*
|
||||
* @deprecated
|
||||
*
|
||||
* @deprecated
|
||||
* Use {@link #getHooks()} and {@link #createHook(String, Map, Collection, boolean)}
|
||||
*/
|
||||
public Set<URL> getPostCommitHooks() {
|
||||
@@ -1098,19 +1135,19 @@ public class GHRepository extends GHObject {
|
||||
return new Requester(root)
|
||||
.with("title", title).with("description", description).method("POST").to(getApiTailUrl("milestones"), GHMilestone.class).wrap(this);
|
||||
}
|
||||
|
||||
|
||||
public GHDeployKey addDeployKey(String title,String key) throws IOException {
|
||||
return new Requester(root)
|
||||
.with("title", title).with("key", key).method("POST").to(getApiTailUrl("keys"), GHDeployKey.class).wrap(this);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public List<GHDeployKey> getDeployKeys() throws IOException{
|
||||
List<GHDeployKey> list = new ArrayList<GHDeployKey>(Arrays.asList(
|
||||
root.retrieve().to(getApiTailUrl("keys"), GHDeployKey[].class)));
|
||||
for (GHDeployKey h : list)
|
||||
h.wrap(this);
|
||||
return list;
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1119,7 +1156,7 @@ public class GHRepository extends GHObject {
|
||||
* @return
|
||||
* {@link GHRepository} that points to the root repository where this repository is forked
|
||||
* (indirectly or directly) from. Otherwise null.
|
||||
* @see #getParent()
|
||||
* @see #getParent()
|
||||
*/
|
||||
public GHRepository getSource() throws IOException {
|
||||
if (source == null) return null;
|
||||
@@ -1136,7 +1173,7 @@ public class GHRepository extends GHObject {
|
||||
* @return
|
||||
* {@link GHRepository} that points to the repository where this repository is forked
|
||||
* directly from. Otherwise null.
|
||||
* @see #getSource()
|
||||
* @see #getSource()
|
||||
*/
|
||||
public GHRepository getParent() throws IOException {
|
||||
if (parent == null) return null;
|
||||
@@ -1144,7 +1181,7 @@ public class GHRepository extends GHObject {
|
||||
parent = root.getRepository(parent.getFullName());
|
||||
return parent;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Subscribes to this repository to get notifications.
|
||||
*/
|
||||
@@ -1162,7 +1199,7 @@ public class GHRepository extends GHObject {
|
||||
*/
|
||||
public GHSubscription getSubscription() throws IOException {
|
||||
try {
|
||||
return new Requester(root).to(getApiTailUrl("subscription"), GHSubscription.class).wrapUp(this);
|
||||
return root.retrieve().to(getApiTailUrl("subscription"), GHSubscription.class).wrapUp(this);
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
|
||||
@@ -248,6 +249,7 @@ public class GitHub {
|
||||
// see issue #78
|
||||
GHRateLimit r = new GHRateLimit();
|
||||
r.limit = r.remaining = 1000000;
|
||||
r.reset = new Date(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1));
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@ import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
import static org.kohsuke.github.GitHub.*;
|
||||
|
||||
/**
|
||||
@@ -61,6 +62,8 @@ import static org.kohsuke.github.GitHub.*;
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
class Requester {
|
||||
private static final List<String> METHODS_WITHOUT_BODY = asList("GET", "DELETE");
|
||||
|
||||
private final GitHub root;
|
||||
private final List<Entry> args = new ArrayList<Entry>();
|
||||
private final Map<String,String> headers = new LinkedHashMap<String, String>();
|
||||
@@ -208,7 +211,7 @@ class Requester {
|
||||
|
||||
private <T> T _to(String tailApiUrl, Class<T> type, T instance) throws IOException {
|
||||
while (true) {// loop while API rate limit is hit
|
||||
if (method.equals("GET") && !args.isEmpty()) {
|
||||
if (METHODS_WITHOUT_BODY.contains(method) && !args.isEmpty()) {
|
||||
StringBuilder qs=new StringBuilder();
|
||||
for (Entry arg : args) {
|
||||
qs.append(qs.length()==0 ? '?' : '&');
|
||||
@@ -287,7 +290,7 @@ class Requester {
|
||||
* Set up the request parameters or POST payload.
|
||||
*/
|
||||
private void buildRequest() throws IOException {
|
||||
if (!method.equals("GET")) {
|
||||
if (isMethodWithBody()) {
|
||||
uc.setDoOutput(true);
|
||||
uc.setRequestProperty("Content-type", contentType);
|
||||
|
||||
@@ -311,6 +314,10 @@ class Requester {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isMethodWithBody() {
|
||||
return !METHODS_WITHOUT_BODY.contains(method);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads pagenated resources.
|
||||
*
|
||||
|
||||
@@ -351,7 +351,7 @@ public class AppTest extends AbstractGitHubApiTestBase {
|
||||
sha1.add(c.getSHA1());
|
||||
}
|
||||
assertEquals("1cccddb22e305397151b2b7b87b4b47d74ca337b",sha1.get(0));
|
||||
assertEquals(29,sha1.size());
|
||||
assertEquals(29, sha1.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -618,7 +618,7 @@ public class AppTest extends AbstractGitHubApiTestBase {
|
||||
|
||||
@Test
|
||||
public void testAddDeployKey() throws IOException {
|
||||
GHRepository myRepository = Iterables.get(gitHub.getMyself().getRepositories().values(),0);
|
||||
GHRepository myRepository = getTestRepository();
|
||||
final GHDeployKey newDeployKey = myRepository.addDeployKey("test", "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUt0RAycC5cS42JKh6SecfFZBR1RrF+2hYMctz4mk74/arBE+wFb7fnSHGzdGKX2h5CFOWODifRCJVhB7hlVxodxe+QkQQYAEL/x1WVCJnGgTGQGOrhOMj95V3UE5pQKhsKD608C+u5tSofcWXLToP1/wZ7U4/AHjqYi08OLsWToHCax55TZkvdt2jo0hbIoYU+XI9Q8Uv4ONDN1oabiOdgeKi8+crvHAuvNleiBhWVBzFh8KdfzaH5uNdw7ihhFjEd1vzqACsjCINCjdMfzl6jD9ExuWuE92nZJnucls2cEoNC6k2aPmrZDg9hA32FXVpyseY+bDUWFU6LO2LG6PB kohsuke@atlas");
|
||||
try {
|
||||
assertNotNull(newDeployKey.getId());
|
||||
@@ -636,7 +636,7 @@ public class AppTest extends AbstractGitHubApiTestBase {
|
||||
|
||||
@Test
|
||||
public void testCommitStatusContext() throws IOException {
|
||||
GHRepository myRepository = Iterables.get(gitHub.getMyself().getRepositories().values(), 0);
|
||||
GHRepository myRepository = getTestRepository();
|
||||
GHRef masterRef = myRepository.getRef("heads/master");
|
||||
GHCommitStatus commitStatus = myRepository.createCommitStatus(masterRef.getObject().getSha(), GHCommitState.SUCCESS, "http://www.example.com", "test", "test/context");
|
||||
assertEquals("test/context", commitStatus.getContext());
|
||||
|
||||
@@ -1,34 +1,40 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.notNullValue;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* Unit test for {@link GitHub}.
|
||||
*/
|
||||
public class GitHubTest extends TestCase {
|
||||
|
||||
public class GitHubTest {
|
||||
@Test
|
||||
public void testGitHubServerWithHttp() throws Exception {
|
||||
GitHub hub = GitHub.connectToEnterprise("http://enterprise.kohsuke.org/api/v3", "bogus","bogus");
|
||||
assertEquals("http://enterprise.kohsuke.org/api/v3/test", hub.getApiURL("/test").toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGitHubServerWithHttps() throws Exception {
|
||||
GitHub hub = GitHub.connectToEnterprise("https://enterprise.kohsuke.org/api/v3", "bogus","bogus");
|
||||
assertEquals("https://enterprise.kohsuke.org/api/v3/test", hub.getApiURL("/test").toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGitHubServerWithoutServer() throws Exception {
|
||||
GitHub hub = GitHub.connectUsingPassword("kohsuke", "bogus");
|
||||
assertEquals("https://api.github.com/test", hub.getApiURL("/test").toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGitHubBuilderFromEnvironment() throws IOException {
|
||||
|
||||
Map<String, String>props = new HashMap<String, String>();
|
||||
@@ -86,7 +92,7 @@ public class GitHubTest extends TestCase {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGitHubBuilderFromCustomEnvironment() throws IOException {
|
||||
Map<String, String> props = new HashMap<String, String>();
|
||||
|
||||
@@ -105,4 +111,12 @@ public class GitHubTest extends TestCase {
|
||||
assertEquals("bogusEndpoint", builder.endpoint);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGitHubEnterpriseDoesNotHaveRateLimit() throws IOException {
|
||||
GitHub github = spy(new GitHubBuilder().build());
|
||||
when(github.retrieve()).thenThrow(FileNotFoundException.class);
|
||||
|
||||
GHRateLimit rateLimit = github.getRateLimit();
|
||||
assertThat(rateLimit.getResetDate(), notNullValue());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
@@ -18,7 +19,38 @@ public class PullRequestTest extends AbstractGitHubApiTestBase {
|
||||
assertEquals(name, p.getTitle());
|
||||
}
|
||||
|
||||
@Test // Requires push access to the test repo to pass
|
||||
@Test
|
||||
public void createPullRequestComment() throws Exception {
|
||||
String name = rnd.next();
|
||||
GHPullRequest p = getRepository().createPullRequest(name, "stable", "master", "## test");
|
||||
p.comment("Some comment");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPullRequestReviewComments() throws Exception {
|
||||
String name = rnd.next();
|
||||
GHPullRequest p = getRepository().createPullRequest(name, "stable", "master", "## test");
|
||||
System.out.println(p.getUrl());
|
||||
assertTrue(p.listReviewComments().asList().isEmpty());
|
||||
p.createReviewComment("Sample review comment", p.getHead().getSha(), "cli/pom.xml", 5);
|
||||
List<GHPullRequestReviewComment> comments = p.listReviewComments().asList();
|
||||
assertEquals(1, comments.size());
|
||||
GHPullRequestReviewComment comment = comments.get(0);
|
||||
assertEquals("Sample review comment", comment.getBody());
|
||||
|
||||
comment.update("Updated review comment");
|
||||
comments = p.listReviewComments().asList();
|
||||
assertEquals(1, comments.size());
|
||||
comment = comments.get(0);
|
||||
assertEquals("Updated review comment", comment.getBody());
|
||||
|
||||
comment.delete();
|
||||
comments = p.listReviewComments().asList();
|
||||
assertTrue(comments.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
// Requires push access to the test repo to pass
|
||||
public void setLabels() throws Exception {
|
||||
GHPullRequest p = getRepository().createPullRequest(rnd.next(), "stable", "master", "## test");
|
||||
String label = rnd.next();
|
||||
@@ -29,7 +61,8 @@ public class PullRequestTest extends AbstractGitHubApiTestBase {
|
||||
assertEquals(label, labels.iterator().next().getName());
|
||||
}
|
||||
|
||||
@Test // Requires push access to the test repo to pass
|
||||
@Test
|
||||
// Requires push access to the test repo to pass
|
||||
public void setAssignee() throws Exception {
|
||||
GHPullRequest p = getRepository().createPullRequest(rnd.next(), "stable", "master", "## test");
|
||||
GHMyself user = gitHub.getMyself();
|
||||
@@ -49,7 +82,7 @@ public class PullRequestTest extends AbstractGitHubApiTestBase {
|
||||
PagedIterable<GHPullRequest> ghPullRequests = getRepository().listPullRequests(GHIssueState.OPEN);
|
||||
for (GHPullRequest pr : ghPullRequests) {
|
||||
assertNotNull(pr.getUser().root);
|
||||
assertFalse(pr.getMergeable());
|
||||
pr.getMergeable();
|
||||
assertNotNull(pr.getUser().root);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user