Compare commits

...

18 Commits

Author SHA1 Message Date
Kohsuke Kawaguchi
4e88a0c91b [maven-release-plugin] prepare release github-api-1.67 2015-04-13 18:30:40 -07:00
Kohsuke Kawaguchi
d070f9deb0 TAB -> WS 2015-04-13 18:25:44 -07:00
Kohsuke Kawaguchi
b736e20a74 Added more getHtmlUrl() methods 2015-04-13 18:17:37 -07:00
Kohsuke Kawaguchi
aad20d0a03 Merge pull request #169 from KostyaSha/fixAuthLoop
Throw error for bad creds
2015-04-13 16:55:58 -07:00
Kohsuke Kawaguchi
7ff97348d9 Merge pull request #170 from KostyaSha/coverity
Improvements
2015-04-13 16:55:24 -07:00
Kohsuke Kawaguchi
68dda3a46d Merge pull request #175 2015-04-13 16:47:32 -07:00
Kohsuke Kawaguchi
2cd44f8c33 Added the pair method 2015-04-13 16:47:25 -07:00
Kohsuke Kawaguchi
9775954aff Massaging the PR.
- need to retrieve the object in full to have all the fields properly populated
- documentation fix, as this method points to the root of the forking chain, not just an upstream.
2015-04-13 16:45:38 -07:00
Kohsuke Kawaguchi
1a071b0b54 Returning null instead of throwing an exception (as a matter of taste) 2015-04-13 16:39:20 -07:00
Kohsuke Kawaguchi
8dcea59c74 Fixed javadoc errors 2015-04-13 16:36:14 -07:00
Kohsuke Kawaguchi
f482f77871 Merge pull request #177 from infm/feat/notif
Added getters for the objects notifications refer to
2015-04-13 16:38:22 -07:00
infm
b058c39ee1 Added getters for the objects notifications refer to 2015-04-09 01:21:38 +03:00
Jason Nichols
b926b6c67f Added the source attribute to GHRepository 2015-04-02 14:54:13 -04:00
Kohsuke Kawaguchi
3fb8e5f799 [maven-release-plugin] prepare for next development iteration 2015-03-24 10:26:48 -07:00
Kanstantsin Shautsou
9ebc9c0867 Use FAIL rate-limit handler for tests
Should avoid possible Thread.sleep() for tests execution.
2015-03-23 21:14:42 +03:00
Kanstantsin Shautsou
f1f96713a4 [CID-107552] Unintended regular expression
regex_expected: The . character(s) in the pattern ".md" can match any character, because calls to replaceAll treat the pattern as a regular expression, which might be unexpected.
2015-03-23 02:35:55 +03:00
Kanstantsin Shautsou
fc3b6d2c2e [CID-107535] Missing call to superclass
Similar to other events
2015-03-23 02:23:44 +03:00
Kanstantsin Shautsou
d0d0716b3b Throw error for bad creds 2015-03-23 02:09:23 +03:00
29 changed files with 651 additions and 502 deletions

View File

@@ -7,7 +7,7 @@
</parent> </parent>
<artifactId>github-api</artifactId> <artifactId>github-api</artifactId>
<version>1.66</version> <version>1.67</version>
<name>GitHub API for Java</name> <name>GitHub API for Java</name>
<url>http://github-api.kohsuke.org/</url> <url>http://github-api.kohsuke.org/</url>
<description>GitHub API for Java</description> <description>GitHub API for Java</description>
@@ -16,7 +16,7 @@
<connection>scm:git:git@github.com/kohsuke/${project.artifactId}.git</connection> <connection>scm:git:git@github.com/kohsuke/${project.artifactId}.git</connection>
<developerConnection>scm:git:ssh://git@github.com/kohsuke/${project.artifactId}.git</developerConnection> <developerConnection>scm:git:ssh://git@github.com/kohsuke/${project.artifactId}.git</developerConnection>
<url>http://${project.artifactId}.kohsuke.org/</url> <url>http://${project.artifactId}.kohsuke.org/</url>
<tag>github-api-1.66</tag> <tag>github-api-1.67</tag>
</scm> </scm>
<distributionManagement> <distributionManagement>

View File

@@ -1,6 +1,7 @@
package org.kohsuke.github; package org.kohsuke.github;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
/** /**
* Asset in a release. * Asset in a release.
@@ -60,6 +61,14 @@ public class GHAsset extends GHObject {
return state; return state;
} }
/**
* @deprecated This object has no HTML URL.
*/
@Override
public URL getHtmlUrl() {
return null;
}
public String getBrowserDownloadUrl() { public String getBrowserDownloadUrl() {
return browser_download_url; return browser_download_url;
} }

View File

@@ -10,7 +10,7 @@ import java.util.List;
* *
* @author janinko * @author janinko
* @see GitHub#createToken(Collection, String, String) * @see GitHub#createToken(Collection, String, String)
* @see http://developer.github.com/v3/oauth/#create-a-new-authorization * @see <a href="http://developer.github.com/v3/oauth/#create-a-new-authorization">API documentation</a>
*/ */
public class GHAuthorization extends GHObject { public class GHAuthorization extends GHObject {
public static final String USER = "user"; public static final String USER = "user";
@@ -47,11 +47,11 @@ public class GHAuthorization extends GHObject {
return scopes; return scopes;
} }
public String getToken(){ public String getToken() {
return token; return token;
} }
public URL getAppUrl(){ public URL getAppUrl() {
return GitHub.parseURL(app.url); return GitHub.parseURL(app.url);
} }
@@ -59,15 +59,23 @@ public class GHAuthorization extends GHObject {
return app.name; return app.name;
} }
public URL getApiURL(){ public URL getApiURL() {
return GitHub.parseURL(url); return GitHub.parseURL(url);
} }
/**
* @deprecated This object has no HTML URL.
*/
@Override
public URL getHtmlUrl() {
return null;
}
public String getNote() { public String getNote() {
return note; return note;
} }
public URL getNoteUrl(){ public URL getNoteUrl() {
return GitHub.parseURL(note_url); return GitHub.parseURL(note_url);
} }
@@ -77,10 +85,7 @@ public class GHAuthorization extends GHObject {
} }
private static class App {
private static class App{
private String url; private String url;
private String name; private String name;
} }

View File

@@ -32,12 +32,12 @@ public class GHCommit {
private int comment_count; private int comment_count;
@WithBridgeMethods(value=GHAuthor.class,castRequired=true) @WithBridgeMethods(value = GHAuthor.class, castRequired = true)
public GitUser getAuthor() { public GitUser getAuthor() {
return author; return author;
} }
@WithBridgeMethods(value=GHAuthor.class,castRequired=true) @WithBridgeMethods(value = GHAuthor.class, castRequired = true)
public GitUser getCommitter() { public GitUser getCommitter() {
return committer; return committer;
} }
@@ -155,7 +155,6 @@ public class GHCommit {
User author,committer; User author,committer;
public ShortInfo getCommitShortInfo() { public ShortInfo getCommitShortInfo() {
return commit; return commit;
} }

View File

@@ -1,14 +1,15 @@
package org.kohsuke.github; package org.kohsuke.github;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.util.Date; import java.util.Date;
/** /**
* Represents a status of a commit. * Represents a status of a commit.
* *
* @author Kohsuke Kawaguchi * @author Kohsuke Kawaguchi
* @see GHRepository#getCommitStatus(String) * @see GHRepository#getLastCommitStatus(String)
* @see GHCommit#getStatus() * @see GHCommit#getLastStatus()
*/ */
public class GHCommitStatus extends GHObject { public class GHCommitStatus extends GHObject {
String state; String state;
@@ -52,4 +53,12 @@ public class GHCommitStatus extends GHObject {
public String getContext() { public String getContext() {
return context; return context;
} }
/**
* @deprecated This object has no HTML URL.
*/
@Override
public URL getHtmlUrl() {
return null;
}
} }

View File

@@ -50,4 +50,12 @@ public class GHDeployment extends GHObject {
public String getSha(){ public String getSha(){
return sha; return sha;
} }
/**
* @deprecated This object has no HTML URL.
*/
@Override
public URL getHtmlUrl() {
return null;
}
} }

View File

@@ -32,5 +32,11 @@ public class GHDeploymentStatus extends GHObject {
return GHDeploymentState.valueOf(state.toUpperCase()); return GHDeploymentState.valueOf(state.toUpperCase());
} }
/**
* @deprecated This object has no HTML URL.
*/
@Override
public URL getHtmlUrl() {
return null;
}
} }

View File

@@ -165,6 +165,7 @@ public abstract class GHEventPayload {
@Override @Override
void wrapUp(GitHub root) { void wrapUp(GitHub root) {
super.wrapUp(root);
if (repository!=null) if (repository!=null)
repository.wrap(root); repository.wrap(root);
} }

View File

@@ -3,6 +3,7 @@ package org.kohsuke.github;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -60,8 +61,8 @@ public class GHGist extends GHObject {
return git_push_url; return git_push_url;
} }
public String getHtmlUrl() { public URL getHtmlUrl() {
return html_url; return GitHub.parseURL(html_url);
} }
public boolean isPublic() { public boolean isPublic() {

View File

@@ -1,6 +1,7 @@
package org.kohsuke.github; package org.kohsuke.github;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
@@ -51,4 +52,12 @@ public class GHHook extends GHObject {
public void delete() throws IOException { 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(repository.root).method("DELETE").to(String.format("/repos/%s/%s/hooks/%d", repository.getOwnerName(), repository.getName(), id));
} }
/**
* @deprecated This object has no HTML URL.
*/
@Override
public URL getHtmlUrl() {
return null;
}
} }

View File

@@ -71,4 +71,12 @@ public class GHIssueComment extends GHObject {
public GHUser getUser() throws IOException { public GHUser getUser() throws IOException {
return owner.root.getUser(user.getLogin()); return owner.root.getUser(user.getLogin());
} }
/**
* @deprecated This object has no HTML URL.
*/
@Override
public URL getHtmlUrl() {
return null;
}
} }

View File

@@ -1,6 +1,7 @@
package org.kohsuke.github; package org.kohsuke.github;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
@@ -14,7 +15,7 @@ public class GHMilestone extends GHObject {
GHRepository owner; GHRepository owner;
GHUser creator; GHUser creator;
private String state, due_on, title, description; private String state, due_on, title, description, html_url;
private int closed_issues, open_issues, number; private int closed_issues, open_issues, number;
public GitHub getRoot() { public GitHub getRoot() {
@@ -54,6 +55,10 @@ public class GHMilestone extends GHObject {
return number; return number;
} }
public URL getHtmlUrl() {
return GitHub.parseURL(html_url);
}
public GHMilestoneState getState() { public GHMilestoneState getState() {
return Enum.valueOf(GHMilestoneState.class, state.toUpperCase(Locale.ENGLISH)); return Enum.valueOf(GHMilestoneState.class, state.toUpperCase(Locale.ENGLISH));
} }

View File

@@ -38,6 +38,12 @@ public abstract class GHObject {
return GitHub.parseURL(url); return GitHub.parseURL(url);
} }
/**
* URL of this object for humans, which renders some HTML.
*/
@WithBridgeMethods(value=String.class, adapterMethod="urlToString")
public abstract URL getHtmlUrl();
/** /**
* When was this resource last updated? * When was this resource last updated?
*/ */

View File

@@ -2,6 +2,7 @@ package org.kohsuke.github;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
@@ -214,8 +215,9 @@ public abstract class GHPerson extends GHObject {
return blog; return blog;
} }
public String getHtmlUrl() { @Override
return html_url; public URL getHtmlUrl() {
return GitHub.parseURL(html_url);
} }
/** /**

View File

@@ -66,9 +66,9 @@ public class GHPullRequest extends GHIssue {
} }
GHPullRequest wrapUp(GitHub root) { GHPullRequest wrapUp(GitHub root) {
if (owner!=null) owner.wrap(root); if (owner != null) owner.wrap(root);
if (base!=null) base.wrapUp(root); if (base != null) base.wrapUp(root);
if (head!=null) head.wrapUp(root); if (head != null) head.wrapUp(root);
if (merged_by != null) merged_by.wrapUp(root); if (merged_by != null) merged_by.wrapUp(root);
return this; return this;
} }
@@ -142,7 +142,7 @@ public class GHPullRequest extends GHIssue {
return null; return null;
} }
// //
// details that are only available via get with ID // details that are only available via get with ID
// //
// //

View File

@@ -3,6 +3,7 @@ package org.kohsuke.github;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@@ -44,8 +45,8 @@ public class GHRelease extends GHObject {
return draft; return draft;
} }
public String getHtmlUrl() { public URL getHtmlUrl() {
return html_url; return GitHub.parseURL(html_url);
} }
public String getName() { public String getName() {

View File

@@ -63,6 +63,8 @@ public class GHRepository extends GHObject {
private GHRepoPermission permissions; private GHRepoPermission permissions;
private GHRepository source, parent;
public GHDeploymentBuilder createDeployment(String ref) { public GHDeploymentBuilder createDeployment(String ref) {
return new GHDeploymentBuilder(this,ref); return new GHDeploymentBuilder(this,ref);
} }
@@ -159,6 +161,10 @@ public class GHRepository extends GHObject {
return ssh_url; return ssh_url;
} }
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 * Short repository name without the owner. For example 'jenkins' in case of http://github.com/jenkinsci/jenkins
*/ */
@@ -353,7 +359,7 @@ public class GHRepository extends GHObject {
} }
/** /**
* Returns the primary branch you'll configure in the "Admin > Options" config page. * Returns the primary branch you'll configure in the "Admin &gt; Options" config page.
* *
* @return * @return
* This field is null until the user explicitly configures the master branch. * This field is null until the user explicitly configures the master branch.
@@ -780,7 +786,7 @@ public class GHRepository extends GHObject {
} }
/** /**
* @see {@link #createCommitStatus(String, GHCommitState,String,String,String) createCommitStatus} * @see #createCommitStatus(String, GHCommitState,String,String,String)
*/ */
public GHCommitStatus createCommitStatus(String sha1, GHCommitState state, String targetUrl, String description) throws IOException { public GHCommitStatus createCommitStatus(String sha1, GHCommitState state, String targetUrl, String description) throws IOException {
return createCommitStatus(sha1, state, targetUrl, description,null); return createCommitStatus(sha1, state, targetUrl, description,null);
@@ -1107,6 +1113,38 @@ public class GHRepository extends GHObject {
return list; return list;
} }
/**
* Forked repositories have a 'source' attribute that specifies the ultimate source of the forking chain.
*
* @return
* {@link GHRepository} that points to the root repository where this repository is forked
* (indirectly or directly) from. Otherwise null.
* @see #getParent()
*/
public GHRepository getSource() throws IOException {
if (source == null) return null;
if (source.root == null)
source = root.getRepository(source.getFullName());
return source;
}
/**
* Forked repositories have a 'parent' attribute that specifies the repository this repository
* is directly forked from. If we keep traversing {@link #getParent()} until it returns null, that
* is {@link #getSource()}.
*
* @return
* {@link GHRepository} that points to the repository where this repository is forked
* directly from. Otherwise null.
* @see #getSource()
*/
public GHRepository getParent() throws IOException {
if (parent == null) return null;
if (parent.root == null)
parent = root.getRepository(parent.getFullName());
return parent;
}
/** /**
* Subscribes to this repository to get notifications. * Subscribes to this repository to get notifications.
*/ */

View File

@@ -2,6 +2,7 @@ package org.kohsuke.github;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.util.Date; import java.util.Date;
/** /**
@@ -37,6 +38,14 @@ public class GHThread extends GHObject {
return GitHub.parseDate(last_read_at); return GitHub.parseDate(last_read_at);
} }
/**
* @deprecated This object has no HTML URL.
*/
@Override
public URL getHtmlUrl() {
return null;
}
public String getReason() { public String getReason() {
return reason; return reason;
} }
@@ -59,6 +68,41 @@ public class GHThread extends GHObject {
return subject.type; return subject.type;
} }
/**
* If this thread is about an issue, return that issue.
*
* @return null if this thread is not about an issue.
*/
public GHIssue getBoundIssue() throws IOException {
if (!"Issue".equals(subject.type) && "PullRequest".equals(subject.type))
return null;
return repository.getIssue(
Integer.parseInt(subject.url.substring(subject.url.lastIndexOf('/') + 1)));
}
/**
* If this thread is about a pull request, return that pull request.
*
* @return null if this thread is not about a pull request.
*/
public GHPullRequest getBoundPullRequest() throws IOException {
if (!"PullRequest".equals(subject.type))
return null;
return repository.getPullRequest(
Integer.parseInt(subject.url.substring(subject.url.lastIndexOf('/') + 1)));
}
/**
* If this thread is about a commit, return that commit.
*
* @return null if this thread is not about a commit.
*/
public GHCommit getBoundCommit() throws IOException {
if (!"Commit".equals(subject.type))
return null;
return repository.getCommit(subject.url.substring(subject.url.lastIndexOf('/') + 1));
}
/*package*/ GHThread wrap(GitHub root) { /*package*/ GHThread wrap(GitHub root) {
this.root = root; this.root = root;
if (this.repository!=null) if (this.repository!=null)

View File

@@ -60,7 +60,7 @@ import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
* <p> * <p>
* This library aims to be safe for use by multiple threads concurrently, although * This library aims to be safe for use by multiple threads concurrently, although
* the library itself makes no attempt to control/serialize potentially conflicting * the library itself makes no attempt to control/serialize potentially conflicting
* operations to GitHub, such as updating & deleting a repository at the same time. * operations to GitHub, such as updating &amp; deleting a repository at the same time.
* *
* @author Kohsuke Kawaguchi * @author Kohsuke Kawaguchi
*/ */

View File

@@ -479,6 +479,9 @@ class Requester {
* Handle API error by either throwing it or by returning normally to retry. * Handle API error by either throwing it or by returning normally to retry.
*/ */
/*package*/ void handleApiError(IOException e) throws IOException { /*package*/ void handleApiError(IOException e) throws IOException {
if (uc.getResponseCode() == 401) // Unauthorized == bad creds
throw e;
if ("0".equals(uc.getHeaderField("X-RateLimit-Remaining"))) { if ("0".equals(uc.getHeaderField("X-RateLimit-Remaining"))) {
root.rateLimitHandler.onError(e,uc); root.rateLimitHandler.onError(e,uc);
} }

View File

@@ -19,9 +19,9 @@ public abstract class AbstractGitHubApiTestBase extends Assert {
if (f.exists()) { if (f.exists()) {
// use the non-standard credential preferentially, so that developers of this library do not have // use the non-standard credential preferentially, so that developers of this library do not have
// to clutter their event stream. // to clutter their event stream.
gitHub = GitHubBuilder.fromPropertyFile(f.getPath()).build(); gitHub = GitHubBuilder.fromPropertyFile(f.getPath()).withRateLimitHandler(RateLimitHandler.FAIL).build();
} else { } else {
gitHub = GitHub.connect(); gitHub = GitHubBuilder.fromCredentials().withRateLimitHandler(RateLimitHandler.FAIL).build();
} }
} }

View File

@@ -674,7 +674,7 @@ public class AppTest extends AbstractGitHubApiTestBase {
GHTree masterTree = gitHub.getRepository("kohsuke/github-api").getTree("master"); GHTree masterTree = gitHub.getRepository("kohsuke/github-api").getTree("master");
boolean foundReadme = false; boolean foundReadme = false;
for(GHTreeEntry e : masterTree.getTree()){ for(GHTreeEntry e : masterTree.getTree()){
if("readme".equalsIgnoreCase(e.getPath().replaceAll(".md", ""))){ if("readme".equalsIgnoreCase(e.getPath().replaceAll("\\.md", ""))){
foundReadme = true; foundReadme = true;
break; break;
} }

View File

@@ -55,8 +55,7 @@ public class GitHubTest extends TestCase {
* Its used to wire in values for the github credentials to test that the GitHubBuilder works properly to resolve them. * Its used to wire in values for the github credentials to test that the GitHubBuilder works properly to resolve them.
*/ */
private void setupEnvironment(Map<String, String> newenv) { private void setupEnvironment(Map<String, String> newenv) {
try try {
{
Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment");
Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment"); Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment");
theEnvironmentField.setAccessible(true); theEnvironmentField.setAccessible(true);
@@ -66,14 +65,12 @@ public class GitHubTest extends TestCase {
theCaseInsensitiveEnvironmentField.setAccessible(true); theCaseInsensitiveEnvironmentField.setAccessible(true);
Map<String, String> cienv = (Map<String, String>) theCaseInsensitiveEnvironmentField.get(null); Map<String, String> cienv = (Map<String, String>) theCaseInsensitiveEnvironmentField.get(null);
cienv.putAll(newenv); cienv.putAll(newenv);
} } catch (NoSuchFieldException e) {
catch (NoSuchFieldException e)
{
try { try {
Class[] classes = Collections.class.getDeclaredClasses(); Class[] classes = Collections.class.getDeclaredClasses();
Map<String, String> env = System.getenv(); Map<String, String> env = System.getenv();
for(Class cl : classes) { for (Class cl : classes) {
if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) { if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
Field field = cl.getDeclaredField("m"); Field field = cl.getDeclaredField("m");
field.setAccessible(true); field.setAccessible(true);
Object obj = field.get(env); Object obj = field.get(env);
@@ -88,12 +85,10 @@ public class GitHubTest extends TestCase {
} catch (Exception e1) { } catch (Exception e1) {
e1.printStackTrace(); e1.printStackTrace();
} }
} }
public void testGitHubBuilderFromCustomEnvironment() throws IOException { public void testGitHubBuilderFromCustomEnvironment() throws IOException {
Map<String, String> props = new HashMap<String, String>();
Map<String, String>props = new HashMap<String, String>();
props.put("customLogin", "bogusLogin"); props.put("customLogin", "bogusLogin");
props.put("customOauth", "bogusOauth"); props.put("customOauth", "bogusOauth");