mirror of
https://github.com/jlengrand/github-api.git
synced 2026-03-11 00:11:25 +00:00
Compare commits
104 Commits
github-api
...
github-api
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7d048e0b9 | ||
|
|
b3d79622e6 | ||
|
|
7e7ae79477 | ||
|
|
5910988314 | ||
|
|
8c4b1ef74a | ||
|
|
7d4f1941e7 | ||
|
|
eedefcdbbb | ||
|
|
bdb5e82abc | ||
|
|
ff766a46c8 | ||
|
|
0a40dc5939 | ||
|
|
71862d76d3 | ||
|
|
7a35cc3d17 | ||
|
|
7a4870c977 | ||
|
|
d4d2792498 | ||
|
|
a969509283 | ||
|
|
82fa340c07 | ||
|
|
d44cd4a827 | ||
|
|
a8dbe65e30 | ||
|
|
d2ce7c11ac | ||
|
|
d02af5ccb0 | ||
|
|
9a5467dcac | ||
|
|
2af4f61882 | ||
|
|
cbd06eef96 | ||
|
|
392dc2a040 | ||
|
|
da11702f68 | ||
|
|
f262bf7cdb | ||
|
|
78ab5ad156 | ||
|
|
6af796fc3b | ||
|
|
c174be37b3 | ||
|
|
18aa067c44 | ||
|
|
8d50b338f4 | ||
|
|
37d7cfaaf2 | ||
|
|
d3564a9a4f | ||
|
|
39d6dd9916 | ||
|
|
0152ebf062 | ||
|
|
757b9b2118 | ||
|
|
f6a01551fd | ||
|
|
1f619f3801 | ||
|
|
fd436cf5b2 | ||
|
|
7e05ce38cf | ||
|
|
7d1e977ffe | ||
|
|
6c2ce83b45 | ||
|
|
d5ba0eebcb | ||
|
|
432585cb75 | ||
|
|
e41a341ce6 | ||
|
|
6aad80904a | ||
|
|
20e796cef4 | ||
|
|
a3b126282d | ||
|
|
5f597379b5 | ||
|
|
9d8460bb81 | ||
|
|
8943af9840 | ||
|
|
d23c718036 | ||
|
|
834c84c9ea | ||
|
|
adc436a3f5 | ||
|
|
e325bf7771 | ||
|
|
feabd07a21 | ||
|
|
e138c6fd61 | ||
|
|
d32299fde5 | ||
|
|
3d7d780e8f | ||
|
|
9f49854033 | ||
|
|
1fe820d463 | ||
|
|
4a78690fde | ||
|
|
3dcaf5a9de | ||
|
|
ff788852d6 | ||
|
|
5ae062719e | ||
|
|
421c0a11fb | ||
|
|
6ae586aeb7 | ||
|
|
7036423084 | ||
|
|
2f118a9cbe | ||
|
|
2c50255b21 | ||
|
|
8cb7210c46 | ||
|
|
ad0a24ad2f | ||
|
|
df6c951830 | ||
|
|
5da2caa616 | ||
|
|
a3fe95d1e4 | ||
|
|
38e61c121b | ||
|
|
03e9623073 | ||
|
|
93a1657e1e | ||
|
|
91d67fb72f | ||
|
|
d8cc1f885c | ||
|
|
c1f999d896 | ||
|
|
efc4d0f59b | ||
|
|
cf55d670b9 | ||
|
|
8567c5e6a1 | ||
|
|
331084fefd | ||
|
|
62bf691ac1 | ||
|
|
09b41d4665 | ||
|
|
71645240e9 | ||
|
|
603468823d | ||
|
|
01f464cc69 | ||
|
|
57ac6e982f | ||
|
|
319d2d1efe | ||
|
|
37de3a4122 | ||
|
|
bb3a49264d | ||
|
|
9cecce74fa | ||
|
|
f9cf2878ef | ||
|
|
9c80b7cf54 | ||
|
|
1ecad7031f | ||
|
|
c85d6107ec | ||
|
|
7b7445b601 | ||
|
|
1ab474673d | ||
|
|
dbf92e7f20 | ||
|
|
6c42db2508 | ||
|
|
c9a42178e8 |
29
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
29
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
10
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
10
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# Description
|
||||
** Describe your change here**
|
||||
|
||||
# Before submitting a PR:
|
||||
We love getting PRs, but we hate asking people for the same basic changes every time.
|
||||
|
||||
- [ ] Push your changes to a branch other than `master`. Create your PR from that branch.
|
||||
- [ ] Add JavaDocs and other comments
|
||||
- [ ] Write tests that run and pass in CI. See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to capture snapshot data.
|
||||
- [ ] Run `mvn install site` locally. This may reformat your code, commit those changes. If this command doesn't succeed, your change will not pass CI.
|
||||
2
.github/workflows/maven-build.yml
vendored
2
.github/workflows/maven-build.yml
vendored
@@ -19,4 +19,4 @@ jobs:
|
||||
- name: Maven Download all dependencies
|
||||
run: mvn -B org.apache.maven.plugins:maven-dependency-plugin:3.1.1:go-offline
|
||||
- name: Maven Build
|
||||
run: mvn -B install site --file pom.xml
|
||||
run: mvn -B install site -P ci --file pom.xml
|
||||
|
||||
1174
CHANGELOG.md
Normal file
1174
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,7 @@
|
||||
Java API for GitHub
|
||||
# Java API for GitHub
|
||||
|
||||
[](https://mvnrepository.com/artifact/org.kohsuke/github-api)
|
||||
[](https://gitter.im/github-api/github-api?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
|
||||
See https://github-api.kohsuke.org/ for more details
|
||||
|
||||
146
pom.xml
146
pom.xml
@@ -8,7 +8,7 @@
|
||||
</parent>
|
||||
|
||||
<artifactId>github-api</artifactId>
|
||||
<version>1.99</version>
|
||||
<version>1.100</version>
|
||||
<name>GitHub API for Java</name>
|
||||
<url>https://github-api.kohsuke.org/</url>
|
||||
<description>GitHub API for Java</description>
|
||||
@@ -17,7 +17,7 @@
|
||||
<connection>scm:git:git@github.com/github-api/${project.artifactId}.git</connection>
|
||||
<developerConnection>scm:git:ssh://git@github.com/github-api/${project.artifactId}.git</developerConnection>
|
||||
<url>https://${project.artifactId}.kohsuke.org/</url>
|
||||
<tag>github-api-1.99</tag>
|
||||
<tag>github-api-1.100</tag>
|
||||
</scm>
|
||||
|
||||
<distributionManagement>
|
||||
@@ -33,8 +33,10 @@
|
||||
<spotbugs.version>3.1.12</spotbugs.version>
|
||||
<spotbugs-maven-plugin.failOnError>true</spotbugs-maven-plugin.failOnError>
|
||||
<hamcrest.version>2.2</hamcrest.version>
|
||||
<okhttp3.version>3.12.3</okhttp3.version>
|
||||
<okhttp3.version>4.2.2</okhttp3.version>
|
||||
<okio.version>2.4.1</okio.version>
|
||||
<formatter-maven-plugin.goal>format</formatter-maven-plugin.goal>
|
||||
<impsort-maven-plugin.goal>sort</impsort-maven-plugin.goal>
|
||||
<jacoco.coverage.target.class>.80</jacoco.coverage.target.class>
|
||||
<jacoco.coverage.target.method>0.20</jacoco.coverage.target.method>
|
||||
<jacoco.coverage.target.line>0.50</jacoco.coverage.target.line>
|
||||
@@ -78,6 +80,7 @@
|
||||
<version>3.1.1</version>
|
||||
<configuration>
|
||||
<source>8</source>
|
||||
<failOnWarnings>true</failOnWarnings>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
@@ -152,17 +155,49 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>com.infradna.tool</groupId>
|
||||
<artifactId>bridge-method-injector</artifactId>
|
||||
<version>1.18</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>process</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<plugin>
|
||||
<groupId>com.infradna.tool</groupId>
|
||||
<artifactId>bridge-method-injector</artifactId>
|
||||
<version>1.18</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>process</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>net.revelc.code.formatter</groupId>
|
||||
<artifactId>formatter-maven-plugin</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>${formatter-maven-plugin.goal}</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<configFile>src/main/resources/eclipse/formatter.xml</configFile>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>net.revelc.code</groupId>
|
||||
<artifactId>impsort-maven-plugin</artifactId>
|
||||
<version>1.3.2</version>
|
||||
<configuration>
|
||||
<groups>*,java.,javax.</groups>
|
||||
<removeUnused>true</removeUnused>
|
||||
<staticAfter>true</staticAfter>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>${impsort-maven-plugin.goal}</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>com.github.spotbugs</groupId>
|
||||
@@ -243,7 +278,7 @@
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.10.0</version>
|
||||
<version>2.10.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
@@ -280,10 +315,12 @@
|
||||
<version>${okhttp3.version}</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<!-- This is the last version of okhttp3 that support UrlConnection -->
|
||||
<!-- The class using this has been deprecated, this dependency can be remove when that class is. -->
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp-urlconnection</artifactId>
|
||||
<version>${okhttp3.version}</version>
|
||||
<version>3.12.3</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -336,6 +373,15 @@
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>ci</id>
|
||||
<properties>
|
||||
<formatter-maven-plugin.goal>validate</formatter-maven-plugin.goal>
|
||||
<impsort-maven-plugin.goal>check</impsort-maven-plugin.goal>
|
||||
</properties>
|
||||
<build>
|
||||
</build>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>jacoco</id>
|
||||
<activation>
|
||||
@@ -379,44 +425,44 @@
|
||||
<limits>
|
||||
<!-- These limits can be overridden, in the form of `0.50` for -->
|
||||
<!-- 50%, as necessary. Using a property just puts it in one spot. -->
|
||||
<!--
|
||||
<limit>
|
||||
<counter>LINE</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>${jacoco.coverage.target.lines}</minimum>
|
||||
</limit>
|
||||
-->
|
||||
<!--
|
||||
<limit>
|
||||
<counter>BRANCH</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>${jacoco.coverage.target.other}</minimum>
|
||||
</limit>
|
||||
-->
|
||||
<!--
|
||||
<limit>
|
||||
<counter>INSTRUCTION</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>${jacoco.coverage.target.other}</minimum>
|
||||
</limit>
|
||||
-->
|
||||
<!--
|
||||
<limit>
|
||||
<counter>COMPLEXITY</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>${jacoco.coverage.target.other}</minimum>
|
||||
</limit>
|
||||
-->
|
||||
<!--
|
||||
<limit>
|
||||
<counter>LINE</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>${jacoco.coverage.target.lines}</minimum>
|
||||
</limit>
|
||||
-->
|
||||
<!--
|
||||
<limit>
|
||||
<counter>BRANCH</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>${jacoco.coverage.target.other}</minimum>
|
||||
</limit>
|
||||
-->
|
||||
<!--
|
||||
<limit>
|
||||
<counter>INSTRUCTION</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>${jacoco.coverage.target.other}</minimum>
|
||||
</limit>
|
||||
-->
|
||||
<!--
|
||||
<limit>
|
||||
<counter>COMPLEXITY</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>${jacoco.coverage.target.other}</minimum>
|
||||
</limit>
|
||||
-->
|
||||
<limit>
|
||||
<counter>METHOD</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>${jacoco.coverage.target.method}</minimum>
|
||||
</limit>
|
||||
<!-- <limit>-->
|
||||
<!-- <counter>CLASS</counter>-->
|
||||
<!-- <value>COVEREDRATIO</value>-->
|
||||
<!-- <minimum>${jacoco.coverage.target.class}</minimum>-->
|
||||
<!-- </limit>-->
|
||||
<!-- <limit>-->
|
||||
<!-- <counter>CLASS</counter>-->
|
||||
<!-- <value>COVEREDRATIO</value>-->
|
||||
<!-- <minimum>${jacoco.coverage.target.class}</minimum>-->
|
||||
<!-- </limit>-->
|
||||
</limits>
|
||||
<excludes>
|
||||
<exclude>org.kohsuke.github.extras.okhttp3.ObsoleteUrlFactory.**</exclude>
|
||||
@@ -434,7 +480,7 @@
|
||||
</build>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>release</id>
|
||||
<id>release</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.net.HttpURLConnection;
|
||||
* Pluggable strategy to determine what to do when the API abuse limit is hit.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GitHubBuilder#withAbuseLimitHandler(AbuseLimitHandler)
|
||||
* @see GitHubBuilder#withAbuseLimitHandler(AbuseLimitHandler) GitHubBuilder#withAbuseLimitHandler(AbuseLimitHandler)
|
||||
* @see <a href="https://developer.github.com/v3/#abuse-rate-limits">documentation</a>
|
||||
* @see RateLimitHandler
|
||||
*/
|
||||
@@ -17,17 +17,18 @@ public abstract class AbuseLimitHandler {
|
||||
* Called when the library encounters HTTP error indicating that the API abuse limit is reached.
|
||||
*
|
||||
* <p>
|
||||
* Any exception thrown from this method will cause the request to fail, and the caller of github-api
|
||||
* will receive an exception. If this method returns normally, another request will be attempted.
|
||||
* For that to make sense, the implementation needs to wait for some time.
|
||||
* Any exception thrown from this method will cause the request to fail, and the caller of github-api will receive
|
||||
* an exception. If this method returns normally, another request will be attempted. For that to make sense, the
|
||||
* implementation needs to wait for some time.
|
||||
*
|
||||
* @see <a href="https://developer.github.com/v3/#abuse-rate-limits">API documentation from GitHub</a>
|
||||
* @param e
|
||||
* Exception from Java I/O layer. If you decide to fail the processing, you can throw
|
||||
* this exception (or wrap this exception into another exception and throw it).
|
||||
* Exception from Java I/O layer. If you decide to fail the processing, you can throw this exception (or
|
||||
* wrap this exception into another exception and throw it).
|
||||
* @param uc
|
||||
* Connection that resulted in an error. Useful for accessing other response headers.
|
||||
* Connection that resulted in an error. Useful for accessing other response headers.
|
||||
* @throws IOException
|
||||
* on failure
|
||||
* @see <a href="https://developer.github.com/v3/#abuse-rate-limits">API documentation from GitHub</a>
|
||||
*/
|
||||
public abstract void onError(IOException e, HttpURLConnection uc) throws IOException;
|
||||
|
||||
@@ -40,15 +41,16 @@ public abstract class AbuseLimitHandler {
|
||||
try {
|
||||
Thread.sleep(parseWaitTime(uc));
|
||||
} catch (InterruptedException ex) {
|
||||
throw (InterruptedIOException)new InterruptedIOException().initCause(e);
|
||||
throw (InterruptedIOException) new InterruptedIOException().initCause(e);
|
||||
}
|
||||
}
|
||||
|
||||
private long parseWaitTime(HttpURLConnection uc) {
|
||||
String v = uc.getHeaderField("Retry-After");
|
||||
if (v==null) return 60 * 1000; // can't tell, return 1 min
|
||||
if (v == null)
|
||||
return 60 * 1000; // can't tell, return 1 min
|
||||
|
||||
return Math.max(1000, Long.parseLong(v)*1000);
|
||||
return Math.max(1000, Long.parseLong(v) * 1000);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -58,7 +60,7 @@ public abstract class AbuseLimitHandler {
|
||||
public static final AbuseLimitHandler FAIL = new AbuseLimitHandler() {
|
||||
@Override
|
||||
public void onError(IOException e, HttpURLConnection uc) throws IOException {
|
||||
throw (IOException)new IOException("Abuse limit reached").initCause(e);
|
||||
throw (IOException) new IOException("Abuse limit reached").initCause(e);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
@SuppressFBWarnings(value = "UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD",
|
||||
@SuppressFBWarnings(value = "UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD",
|
||||
justification = "Being constructed by JSON deserialization")
|
||||
class DeleteToken {
|
||||
public String delete_token;
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.List;
|
||||
@@ -13,70 +11,130 @@ import static org.kohsuke.github.Previews.MACHINE_MAN;
|
||||
* A Github App.
|
||||
*
|
||||
* @author Paulo Miguel Almeida
|
||||
*
|
||||
* @see GitHub#getApp()
|
||||
* @see GitHub#getApp() GitHub#getApp()
|
||||
*/
|
||||
|
||||
public class GHApp extends GHObject {
|
||||
|
||||
private GitHub root;
|
||||
private GHUser owner;
|
||||
private String name;
|
||||
private String description;
|
||||
@JsonProperty("external_url")
|
||||
private String externalUrl;
|
||||
private Map<String,String> permissions;
|
||||
private Map<String, String> permissions;
|
||||
private List<GHEvent> events;
|
||||
@JsonProperty("installations_count")
|
||||
private long installationsCount;
|
||||
@JsonProperty("html_url")
|
||||
private String htmlUrl;
|
||||
|
||||
|
||||
/**
|
||||
* Gets owner.
|
||||
*
|
||||
* @return the owner
|
||||
*/
|
||||
public GHUser getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets owner.
|
||||
*
|
||||
* @param owner
|
||||
* the owner
|
||||
*/
|
||||
public void setOwner(GHUser owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets name.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
*/
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets description.
|
||||
*
|
||||
* @return the description
|
||||
*/
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets description.
|
||||
*
|
||||
* @param description
|
||||
* the description
|
||||
*/
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets external url.
|
||||
*
|
||||
* @return the external url
|
||||
*/
|
||||
public String getExternalUrl() {
|
||||
return externalUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets external url.
|
||||
*
|
||||
* @param externalUrl
|
||||
* the external url
|
||||
*/
|
||||
public void setExternalUrl(String externalUrl) {
|
||||
this.externalUrl = externalUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets events.
|
||||
*
|
||||
* @return the events
|
||||
*/
|
||||
public List<GHEvent> getEvents() {
|
||||
return events;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets events.
|
||||
*
|
||||
* @param events
|
||||
* the events
|
||||
*/
|
||||
public void setEvents(List<GHEvent> events) {
|
||||
this.events = events;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets installations count.
|
||||
*
|
||||
* @return the installations count
|
||||
*/
|
||||
public long getInstallationsCount() {
|
||||
return installationsCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets installations count.
|
||||
*
|
||||
* @param installationsCount
|
||||
* the installations count
|
||||
*/
|
||||
public void setInstallationsCount(long installationsCount) {
|
||||
this.installationsCount = installationsCount;
|
||||
}
|
||||
@@ -85,88 +143,132 @@ public class GHApp extends GHObject {
|
||||
return GitHub.parseURL(htmlUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets permissions.
|
||||
*
|
||||
* @return the permissions
|
||||
*/
|
||||
public Map<String, String> getPermissions() {
|
||||
return permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets permissions.
|
||||
*
|
||||
* @param permissions
|
||||
* the permissions
|
||||
*/
|
||||
public void setPermissions(Map<String, String> permissions) {
|
||||
this.permissions = permissions;
|
||||
}
|
||||
|
||||
/*package*/ GHApp wrapUp(GitHub root) {
|
||||
GHApp wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtains all the installations associated with this app.
|
||||
*
|
||||
* <p>
|
||||
* You must use a JWT to access this endpoint.
|
||||
*
|
||||
* @see <a href="https://developer.github.com/v3/apps/#list-installations">List installations</a>
|
||||
* @return a list of App installations
|
||||
* @see <a href="https://developer.github.com/v3/apps/#list-installations">List installations</a>
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public PagedIterable<GHAppInstallation> listInstallations() {
|
||||
return root.retrieve().withPreview(MACHINE_MAN)
|
||||
.asPagedIterable(
|
||||
"/app/installations",
|
||||
GHAppInstallation[].class,
|
||||
item -> item.wrapUp(root) );
|
||||
return root.retrieve()
|
||||
.withPreview(MACHINE_MAN)
|
||||
.asPagedIterable("/app/installations", GHAppInstallation[].class, item -> item.wrapUp(root));
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain an installation associated with this app
|
||||
* @param id - Installation Id
|
||||
*
|
||||
* Obtain an installation associated with this app.
|
||||
* <p>
|
||||
* You must use a JWT to access this endpoint.
|
||||
*
|
||||
* @param id
|
||||
* Installation Id
|
||||
* @return a GHAppInstallation
|
||||
* @throws IOException
|
||||
* on error
|
||||
* @see <a href="https://developer.github.com/v3/apps/#get-an-installation">Get an installation</a>
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHAppInstallation getInstallationById(long id) throws IOException {
|
||||
return root.retrieve().withPreview(MACHINE_MAN).to(String.format("/app/installations/%d", id), GHAppInstallation.class).wrapUp(root);
|
||||
return root.retrieve()
|
||||
.withPreview(MACHINE_MAN)
|
||||
.to(String.format("/app/installations/%d", id), GHAppInstallation.class)
|
||||
.wrapUp(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain an organization installation associated with this app
|
||||
* @param name - Organization name
|
||||
*
|
||||
* Obtain an organization installation associated with this app.
|
||||
* <p>
|
||||
* You must use a JWT to access this endpoint.
|
||||
*
|
||||
* @see <a href="https://developer.github.com/v3/apps/#get-an-organization-installation">Get an organization installation</a>
|
||||
* @param name
|
||||
* Organization name
|
||||
* @return a GHAppInstallation
|
||||
* @throws IOException
|
||||
* on error
|
||||
* @see <a href="https://developer.github.com/v3/apps/#get-an-organization-installation">Get an organization
|
||||
* installation</a>
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHAppInstallation getInstallationByOrganization(String name) throws IOException {
|
||||
return root.retrieve().withPreview(MACHINE_MAN).to(String.format("/orgs/%s/installation", name), GHAppInstallation.class).wrapUp(root);
|
||||
return root.retrieve()
|
||||
.withPreview(MACHINE_MAN)
|
||||
.to(String.format("/orgs/%s/installation", name), GHAppInstallation.class)
|
||||
.wrapUp(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain an repository installation associated with this app
|
||||
* @param ownerName - Organization or user name
|
||||
* @param repositoryName - Repository name
|
||||
*
|
||||
* Obtain an repository installation associated with this app.
|
||||
* <p>
|
||||
* You must use a JWT to access this endpoint.
|
||||
*
|
||||
* @see <a href="https://developer.github.com/v3/apps/#get-a-repository-installation">Get a repository installation</a>
|
||||
* @param ownerName
|
||||
* Organization or user name
|
||||
* @param repositoryName
|
||||
* Repository name
|
||||
* @return a GHAppInstallation
|
||||
* @throws IOException
|
||||
* on error
|
||||
* @see <a href="https://developer.github.com/v3/apps/#get-a-repository-installation">Get a repository
|
||||
* installation</a>
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHAppInstallation getInstallationByRepository(String ownerName, String repositoryName) throws IOException {
|
||||
return root.retrieve().withPreview(MACHINE_MAN).to(String.format("/repos/%s/%s/installation", ownerName, repositoryName), GHAppInstallation.class).wrapUp(root);
|
||||
return root.retrieve()
|
||||
.withPreview(MACHINE_MAN)
|
||||
.to(String.format("/repos/%s/%s/installation", ownerName, repositoryName), GHAppInstallation.class)
|
||||
.wrapUp(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain a user installation associated with this app
|
||||
* @param name - user name
|
||||
*
|
||||
* Obtain a user installation associated with this app.
|
||||
* <p>
|
||||
* You must use a JWT to access this endpoint.
|
||||
*
|
||||
* @param name
|
||||
* user name
|
||||
* @return a GHAppInstallation
|
||||
* @throws IOException
|
||||
* on error
|
||||
* @see <a href="https://developer.github.com/v3/apps/#get-a-user-installation">Get a user installation</a>
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHAppInstallation getInstallationByUser(String name) throws IOException {
|
||||
return root.retrieve().withPreview(MACHINE_MAN).to(String.format("/users/%s/installation", name), GHAppInstallation.class).wrapUp(root);
|
||||
return root.retrieve()
|
||||
.withPreview(MACHINE_MAN)
|
||||
.to(String.format("/users/%s/installation", name), GHAppInstallation.class)
|
||||
.wrapUp(root);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -10,20 +11,20 @@ import static org.kohsuke.github.Previews.MACHINE_MAN;
|
||||
* Creates a access token for a GitHub App Installation
|
||||
*
|
||||
* @author Paulo Miguel Almeida
|
||||
*
|
||||
* @see GHAppInstallation#createToken(Map)
|
||||
* @see GHAppInstallation#createToken(Map) GHAppInstallation#createToken(Map)
|
||||
*/
|
||||
public class GHAppCreateTokenBuilder {
|
||||
private final GitHub root;
|
||||
protected final Requester builder;
|
||||
private final String apiUrlTail;
|
||||
|
||||
@Preview @Deprecated
|
||||
/*package*/ GHAppCreateTokenBuilder(GitHub root, String apiUrlTail, Map<String, GHPermissionType> permissions) {
|
||||
@Preview
|
||||
@Deprecated
|
||||
GHAppCreateTokenBuilder(GitHub root, String apiUrlTail, Map<String, GHPermissionType> permissions) {
|
||||
this.root = root;
|
||||
this.apiUrlTail = apiUrlTail;
|
||||
this.builder = new Requester(root);
|
||||
this.builder.withPermissions("permissions",permissions);
|
||||
withPermissions(builder, permissions);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -31,23 +32,41 @@ public class GHAppCreateTokenBuilder {
|
||||
* the access to specific repositories, you can provide the repository_ids when creating the token. When you omit
|
||||
* repository_ids, the response does not contain neither the repositories nor the permissions key.
|
||||
*
|
||||
* @param repositoryIds - Array containing the repositories Ids
|
||||
*
|
||||
* @param repositoryIds
|
||||
* Array containing the repositories Ids
|
||||
* @return a GHAppCreateTokenBuilder
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHAppCreateTokenBuilder repositoryIds(List<Long> repositoryIds) {
|
||||
this.builder.with("repository_ids",repositoryIds);
|
||||
this.builder.with("repository_ids", repositoryIds);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an app token with all the parameters.
|
||||
*
|
||||
* <p>
|
||||
* You must use a JWT to access this endpoint.
|
||||
*
|
||||
* @return a GHAppInstallationToken
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHAppInstallationToken create() throws IOException {
|
||||
return builder.method("POST").withPreview(MACHINE_MAN).to(apiUrlTail, GHAppInstallationToken.class).wrapUp(root);
|
||||
return builder.method("POST")
|
||||
.withPreview(MACHINE_MAN)
|
||||
.to(apiUrlTail, GHAppInstallationToken.class)
|
||||
.wrapUp(root);
|
||||
}
|
||||
|
||||
private static Requester withPermissions(Requester builder, Map<String, GHPermissionType> value) {
|
||||
Map<String, String> retMap = new HashMap<String, String>();
|
||||
for (Map.Entry<String, GHPermissionType> entry : value.entrySet()) {
|
||||
retMap.put(entry.getKey(), Requester.transformEnum(entry.getValue()));
|
||||
}
|
||||
return builder.with("permissions", retMap);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -13,14 +13,12 @@ import static org.kohsuke.github.Previews.GAMBIT;
|
||||
* A Github App Installation.
|
||||
*
|
||||
* @author Paulo Miguel Almeida
|
||||
*
|
||||
* @see GHApp#listInstallations()
|
||||
* @see GHApp#getInstallationById(long)
|
||||
* @see GHApp#getInstallationByOrganization(String)
|
||||
* @see GHApp#getInstallationByRepository(String, String)
|
||||
* @see GHApp#getInstallationByUser(String)
|
||||
* @see GHApp#listInstallations() GHApp#listInstallations()
|
||||
* @see GHApp#getInstallationById(long) GHApp#getInstallationById(long)
|
||||
* @see GHApp#getInstallationByOrganization(String) GHApp#getInstallationByOrganization(String)
|
||||
* @see GHApp#getInstallationByRepository(String, String) GHApp#getInstallationByRepository(String, String)
|
||||
* @see GHApp#getInstallationByUser(String) GHApp#getInstallationByUser(String)
|
||||
*/
|
||||
|
||||
public class GHAppInstallation extends GHObject {
|
||||
private GitHub root;
|
||||
private GHUser account;
|
||||
@@ -47,121 +45,249 @@ public class GHAppInstallation extends GHObject {
|
||||
return GitHub.parseURL(htmlUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets root.
|
||||
*
|
||||
* @param root
|
||||
* the root
|
||||
*/
|
||||
public void setRoot(GitHub root) {
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets account.
|
||||
*
|
||||
* @return the account
|
||||
*/
|
||||
public GHUser getAccount() {
|
||||
return account;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets account.
|
||||
*
|
||||
* @param account
|
||||
* the account
|
||||
*/
|
||||
public void setAccount(GHUser account) {
|
||||
this.account = account;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets access token url.
|
||||
*
|
||||
* @return the access token url
|
||||
*/
|
||||
public String getAccessTokenUrl() {
|
||||
return accessTokenUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets access token url.
|
||||
*
|
||||
* @param accessTokenUrl
|
||||
* the access token url
|
||||
*/
|
||||
public void setAccessTokenUrl(String accessTokenUrl) {
|
||||
this.accessTokenUrl = accessTokenUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets repositories url.
|
||||
*
|
||||
* @return the repositories url
|
||||
*/
|
||||
public String getRepositoriesUrl() {
|
||||
return repositoriesUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets repositories url.
|
||||
*
|
||||
* @param repositoriesUrl
|
||||
* the repositories url
|
||||
*/
|
||||
public void setRepositoriesUrl(String repositoriesUrl) {
|
||||
this.repositoriesUrl = repositoriesUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets app id.
|
||||
*
|
||||
* @return the app id
|
||||
*/
|
||||
public long getAppId() {
|
||||
return appId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets app id.
|
||||
*
|
||||
* @param appId
|
||||
* the app id
|
||||
*/
|
||||
public void setAppId(long appId) {
|
||||
this.appId = appId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets target id.
|
||||
*
|
||||
* @return the target id
|
||||
*/
|
||||
public long getTargetId() {
|
||||
return targetId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets target id.
|
||||
*
|
||||
* @param targetId
|
||||
* the target id
|
||||
*/
|
||||
public void setTargetId(long targetId) {
|
||||
this.targetId = targetId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets target type.
|
||||
*
|
||||
* @return the target type
|
||||
*/
|
||||
public GHTargetType getTargetType() {
|
||||
return targetType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets target type.
|
||||
*
|
||||
* @param targetType
|
||||
* the target type
|
||||
*/
|
||||
public void setTargetType(GHTargetType targetType) {
|
||||
this.targetType = targetType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets permissions.
|
||||
*
|
||||
* @return the permissions
|
||||
*/
|
||||
public Map<String, GHPermissionType> getPermissions() {
|
||||
return permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets permissions.
|
||||
*
|
||||
* @param permissions
|
||||
* the permissions
|
||||
*/
|
||||
public void setPermissions(Map<String, GHPermissionType> permissions) {
|
||||
this.permissions = permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets events.
|
||||
*
|
||||
* @return the events
|
||||
*/
|
||||
public List<GHEvent> getEvents() {
|
||||
return events;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets events.
|
||||
*
|
||||
* @param events
|
||||
* the events
|
||||
*/
|
||||
public void setEvents(List<GHEvent> events) {
|
||||
this.events = events;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets single file name.
|
||||
*
|
||||
* @return the single file name
|
||||
*/
|
||||
public String getSingleFileName() {
|
||||
return singleFileName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets single file name.
|
||||
*
|
||||
* @param singleFileName
|
||||
* the single file name
|
||||
*/
|
||||
public void setSingleFileName(String singleFileName) {
|
||||
this.singleFileName = singleFileName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets repository selection.
|
||||
*
|
||||
* @return the repository selection
|
||||
*/
|
||||
public GHRepositorySelection getRepositorySelection() {
|
||||
return repositorySelection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets repository selection.
|
||||
*
|
||||
* @param repositorySelection
|
||||
* the repository selection
|
||||
*/
|
||||
public void setRepositorySelection(GHRepositorySelection repositorySelection) {
|
||||
this.repositorySelection = repositorySelection;
|
||||
}
|
||||
|
||||
/*package*/ GHAppInstallation wrapUp(GitHub root) {
|
||||
GHAppInstallation wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a Github App installation
|
||||
*
|
||||
* <p>
|
||||
* You must use a JWT to access this endpoint.
|
||||
*
|
||||
* @throws IOException
|
||||
* on error
|
||||
* @see <a href="https://developer.github.com/v3/apps/#delete-an-installation">Delete an installation</a>
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public void deleteInstallation() throws IOException {
|
||||
root.retrieve().method("DELETE").withPreview(GAMBIT).to(String.format("/app/installations/%d", id));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Starts a builder that creates a new App Installation Token.
|
||||
*
|
||||
* <p>
|
||||
* You use the returned builder to set various properties, then call {@link GHAppCreateTokenBuilder#create()}
|
||||
* to finally create an access token.
|
||||
* You use the returned builder to set various properties, then call {@link GHAppCreateTokenBuilder#create()} to
|
||||
* finally create an access token.
|
||||
*
|
||||
* @param permissions
|
||||
* map of permissions for the created token
|
||||
* @return a GHAppCreateTokenBuilder on error
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
public GHAppCreateTokenBuilder createToken(Map<String,GHPermissionType> permissions){
|
||||
return new GHAppCreateTokenBuilder(root,String.format("/app/installations/%d/access_tokens", id), permissions);
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHAppCreateTokenBuilder createToken(Map<String, GHPermissionType> permissions) {
|
||||
return new GHAppCreateTokenBuilder(root, String.format("/app/installations/%d/access_tokens", id), permissions);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
|
||||
@@ -13,10 +12,8 @@ import java.util.Map;
|
||||
* A Github App Installation Token.
|
||||
*
|
||||
* @author Paulo Miguel Almeida
|
||||
*
|
||||
* @see GHAppInstallation#createToken(Map)
|
||||
* @see GHAppInstallation#createToken(Map) GHAppInstallation#createToken(Map)
|
||||
*/
|
||||
|
||||
public class GHAppInstallationToken {
|
||||
private GitHub root;
|
||||
|
||||
@@ -24,53 +21,111 @@ public class GHAppInstallationToken {
|
||||
protected String expires_at;
|
||||
private Map<String, String> permissions;
|
||||
private List<GHRepository> repositories;
|
||||
@JsonProperty("repository_selection")
|
||||
private GHRepositorySelection repositorySelection;
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets root.
|
||||
*
|
||||
* @param root
|
||||
* the root
|
||||
*/
|
||||
public void setRoot(GitHub root) {
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets permissions.
|
||||
*
|
||||
* @return the permissions
|
||||
*/
|
||||
public Map<String, String> getPermissions() {
|
||||
return permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets permissions.
|
||||
*
|
||||
* @param permissions
|
||||
* the permissions
|
||||
*/
|
||||
public void setPermissions(Map<String, String> permissions) {
|
||||
this.permissions = permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets token.
|
||||
*
|
||||
* @return the token
|
||||
*/
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets token.
|
||||
*
|
||||
* @param token
|
||||
* the token
|
||||
*/
|
||||
public void setToken(String token) {
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets repositories.
|
||||
*
|
||||
* @return the repositories
|
||||
*/
|
||||
public List<GHRepository> getRepositories() {
|
||||
return repositories;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets repositories.
|
||||
*
|
||||
* @param repositories
|
||||
* the repositories
|
||||
*/
|
||||
public void setRepositories(List<GHRepository> repositories) {
|
||||
this.repositories = repositories;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets repository selection.
|
||||
*
|
||||
* @return the repository selection
|
||||
*/
|
||||
public GHRepositorySelection getRepositorySelection() {
|
||||
return repositorySelection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets repository selection.
|
||||
*
|
||||
* @param repositorySelection
|
||||
* the repository selection
|
||||
*/
|
||||
public void setRepositorySelection(GHRepositorySelection repositorySelection) {
|
||||
this.repositorySelection = repositorySelection;
|
||||
}
|
||||
|
||||
/**
|
||||
* When was this tokens expires?
|
||||
* Gets expires at.
|
||||
*
|
||||
* @return date when this token expires
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
@WithBridgeMethods(value=String.class, adapterMethod="expiresAtStr")
|
||||
@WithBridgeMethods(value = String.class, adapterMethod = "expiresAtStr")
|
||||
public Date getExpiresAt() throws IOException {
|
||||
return GitHub.parseDate(expires_at);
|
||||
}
|
||||
@@ -80,7 +135,7 @@ public class GHAppInstallationToken {
|
||||
return expires_at;
|
||||
}
|
||||
|
||||
/*package*/ GHAppInstallationToken wrapUp(GitHub root) {
|
||||
GHAppInstallationToken wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import java.net.URL;
|
||||
/**
|
||||
* Asset in a release.
|
||||
*
|
||||
* @see GHRelease#getAssets()
|
||||
* @see GHRelease#getAssets() GHRelease#getAssets()
|
||||
*/
|
||||
public class GHAsset extends GHObject {
|
||||
GitHub root;
|
||||
@@ -19,44 +19,100 @@ public class GHAsset extends GHObject {
|
||||
private long download_count;
|
||||
private String browser_download_url;
|
||||
|
||||
/**
|
||||
* Gets content type.
|
||||
*
|
||||
* @return the content type
|
||||
*/
|
||||
public String getContentType() {
|
||||
return content_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets content type.
|
||||
*
|
||||
* @param contentType
|
||||
* the content type
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setContentType(String contentType) throws IOException {
|
||||
edit("content_type", contentType);
|
||||
this.content_type = contentType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets download count.
|
||||
*
|
||||
* @return the download count
|
||||
*/
|
||||
public long getDownloadCount() {
|
||||
return download_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets label.
|
||||
*
|
||||
* @return the label
|
||||
*/
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets label.
|
||||
*
|
||||
* @param label
|
||||
* the label
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setLabel(String label) throws IOException {
|
||||
edit("label", label);
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets owner.
|
||||
*
|
||||
* @return the owner
|
||||
*/
|
||||
public GHRepository getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets size.
|
||||
*
|
||||
* @return the size
|
||||
*/
|
||||
public long getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets state.
|
||||
*
|
||||
* @return the state
|
||||
*/
|
||||
public String getState() {
|
||||
return state;
|
||||
}
|
||||
@@ -69,19 +125,29 @@ public class GHAsset extends GHObject {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets browser download url.
|
||||
*
|
||||
* @return the browser download url
|
||||
*/
|
||||
public String getBrowserDownloadUrl() {
|
||||
return browser_download_url;
|
||||
}
|
||||
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
new Requester(root)._with(key, value).method("PATCH").to(getApiRoute());
|
||||
new Requester(root).with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
|
||||
|
||||
private String getApiRoute() {
|
||||
return "/repos/" + owner.getOwnerName() + "/" + owner.getName() + "/releases/assets/" + id;
|
||||
}
|
||||
@@ -92,6 +158,15 @@ public class GHAsset extends GHObject {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap gh asset [ ].
|
||||
*
|
||||
* @param assets
|
||||
* the assets
|
||||
* @param release
|
||||
* the release
|
||||
* @return the gh asset [ ]
|
||||
*/
|
||||
public static GHAsset[] wrap(GHAsset[] assets, GHRelease release) {
|
||||
for (GHAsset aTo : assets) {
|
||||
aTo.wrap(release);
|
||||
|
||||
@@ -10,7 +10,7 @@ import java.util.List;
|
||||
* Generated OAuth token
|
||||
*
|
||||
* @author janinko
|
||||
* @see GitHub#createToken(Collection, String, String)
|
||||
* @see GitHub#createToken(Collection, String, String) GitHub#createToken(Collection, String, String)
|
||||
* @see <a href="http://developer.github.com/v3/oauth/#create-a-new-authorization">API documentation</a>
|
||||
*/
|
||||
public class GHAuthorization extends GHObject {
|
||||
@@ -42,39 +42,78 @@ public class GHAuthorization extends GHObject {
|
||||
private String note;
|
||||
private String note_url;
|
||||
private String fingerprint;
|
||||
//TODO add some user class for https://developer.github.com/v3/oauth_authorizations/#check-an-authorization ?
|
||||
//private GHUser user;
|
||||
// TODO add some user class for https://developer.github.com/v3/oauth_authorizations/#check-an-authorization ?
|
||||
// private GHUser user;
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets scopes.
|
||||
*
|
||||
* @return the scopes
|
||||
*/
|
||||
public List<String> getScopes() {
|
||||
return scopes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets token.
|
||||
*
|
||||
* @return the token
|
||||
*/
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets token last eight.
|
||||
*
|
||||
* @return the token last eight
|
||||
*/
|
||||
public String getTokenLastEight() {
|
||||
return token_last_eight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets hashed token.
|
||||
*
|
||||
* @return the hashed token
|
||||
*/
|
||||
public String getHashedToken() {
|
||||
return hashed_token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets app url.
|
||||
*
|
||||
* @return the app url
|
||||
*/
|
||||
public URL getAppUrl() {
|
||||
return GitHub.parseURL(app.url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets app name.
|
||||
*
|
||||
* @return the app name
|
||||
*/
|
||||
public String getAppName() {
|
||||
return app.name;
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = "NM_CONFUSING",
|
||||
justification = "It's a part of the library API, cannot be changed")
|
||||
/**
|
||||
* Gets api url.
|
||||
*
|
||||
* @return the api url
|
||||
*/
|
||||
@SuppressFBWarnings(value = "NM_CONFUSING", justification = "It's a part of the library API, cannot be changed")
|
||||
public URL getApiURL() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
@@ -87,25 +126,40 @@ public class GHAuthorization extends GHObject {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets note.
|
||||
*
|
||||
* @return the note
|
||||
*/
|
||||
public String getNote() {
|
||||
return note;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets note url.
|
||||
*
|
||||
* @return the note url
|
||||
*/
|
||||
public URL getNoteUrl() {
|
||||
return GitHub.parseURL(note_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets fingerprint.
|
||||
*
|
||||
* @return the fingerprint
|
||||
*/
|
||||
public String getFingerprint() {
|
||||
return fingerprint;
|
||||
}
|
||||
|
||||
/*package*/ GHAuthorization wrap(GitHub root) {
|
||||
GHAuthorization wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD"},
|
||||
justification = "JSON API")
|
||||
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
private static class App {
|
||||
private String url;
|
||||
private String name;
|
||||
|
||||
@@ -8,10 +8,12 @@ import java.io.UnsupportedEncodingException;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* The type GHBlob.
|
||||
*
|
||||
* @author Kanstantsin Shautsou
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHTreeEntry#asBlob()
|
||||
* @see GHRepository#getBlob(String)
|
||||
* @see GHTreeEntry#asBlob() GHTreeEntry#asBlob()
|
||||
* @see GHRepository#getBlob(String) GHRepository#getBlob(String)
|
||||
* @see <a href="https://developer.github.com/v3/git/blobs/#get-a-blob">Get a blob</a>
|
||||
*/
|
||||
public class GHBlob {
|
||||
@@ -19,46 +21,64 @@ public class GHBlob {
|
||||
private long size;
|
||||
|
||||
/**
|
||||
* API URL of this blob.
|
||||
* Gets url.
|
||||
*
|
||||
* @return API URL of this blob.
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sha.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of bytes in this blob.
|
||||
* Gets size.
|
||||
*
|
||||
* @return Number of bytes in this blob.
|
||||
*/
|
||||
public long getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets encoding.
|
||||
*
|
||||
* @return the encoding
|
||||
*/
|
||||
public String getEncoding() {
|
||||
return encoding;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encoded content. You probably want {@link #read()}
|
||||
* Gets content.
|
||||
*
|
||||
* @return Encoded content. You probably want {@link #read()}
|
||||
*/
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the actual bytes of the blob.
|
||||
* Read input stream.
|
||||
*
|
||||
* @return the actual bytes of the blob.
|
||||
*/
|
||||
public InputStream read() {
|
||||
if (encoding.equals("base64")) {
|
||||
try {
|
||||
return new Base64InputStream(new ByteArrayInputStream(content.getBytes("US-ASCII")), false);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new AssertionError(e); // US-ASCII is mandatory
|
||||
throw new AssertionError(e); // US-ASCII is mandatory
|
||||
}
|
||||
}
|
||||
|
||||
throw new UnsupportedOperationException("Unrecognized encoding: "+encoding);
|
||||
throw new UnsupportedOperationException("Unrecognized encoding: " + encoding);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,8 +5,7 @@ import org.apache.commons.codec.binary.Base64;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Builder pattern for creating a new blob.
|
||||
* Based on https://developer.github.com/v3/git/blobs/#create-a-blob
|
||||
* Builder pattern for creating a new blob. Based on https://developer.github.com/v3/git/blobs/#create-a-blob
|
||||
*/
|
||||
public class GHBlobBuilder {
|
||||
private final GHRepository repo;
|
||||
@@ -19,6 +18,10 @@ public class GHBlobBuilder {
|
||||
|
||||
/**
|
||||
* Configures a blob with the specified text {@code content}.
|
||||
*
|
||||
* @param content
|
||||
* string text of the blob
|
||||
* @return a GHBlobBuilder
|
||||
*/
|
||||
public GHBlobBuilder textContent(String content) {
|
||||
req.with("content", content);
|
||||
@@ -28,6 +31,10 @@ public class GHBlobBuilder {
|
||||
|
||||
/**
|
||||
* Configures a blob with the specified binary {@code content}.
|
||||
*
|
||||
* @param content
|
||||
* byte array of the blob
|
||||
* @return a GHBlobBuilder
|
||||
*/
|
||||
public GHBlobBuilder binaryContent(byte[] content) {
|
||||
String base64Content = Base64.encodeBase64String(content);
|
||||
@@ -42,6 +49,10 @@ public class GHBlobBuilder {
|
||||
|
||||
/**
|
||||
* Creates a blob based on the parameters specified thus far.
|
||||
*
|
||||
* @return a GHBlob
|
||||
* @throws IOException
|
||||
* if the blob cannot be created.
|
||||
*/
|
||||
public GHBlob create() throws IOException {
|
||||
return req.method("POST").to(getApiTail(), GHBlob.class);
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.kohsuke.github.Previews.*;
|
||||
|
||||
@@ -14,8 +16,10 @@ import static org.kohsuke.github.Previews.*;
|
||||
*
|
||||
* @author Yusuke Kokubo
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD", "URF_UNREAD_FIELD"}, justification = "JSON API")
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"URF_UNREAD_FIELD" },
|
||||
justification = "JSON API")
|
||||
public class GHBranch {
|
||||
private GitHub root;
|
||||
private GHRepository owner;
|
||||
@@ -26,7 +30,15 @@ public class GHBranch {
|
||||
private boolean protection;
|
||||
private String protection_url;
|
||||
|
||||
@JsonCreator
|
||||
GHBranch(@JsonProperty(value = "name", required = true) String name) throws Exception {
|
||||
Objects.requireNonNull(name);
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* The type Commit.
|
||||
*/
|
||||
public static class Commit {
|
||||
String sha;
|
||||
|
||||
@@ -34,43 +46,70 @@ public class GHBranch {
|
||||
String url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Repository that this branch is in.
|
||||
* Gets owner.
|
||||
*
|
||||
* @return the repository that this branch is in.
|
||||
*/
|
||||
public GHRepository getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the push to this branch is restricted via branch protection.
|
||||
* Is protected boolean.
|
||||
*
|
||||
* @return true if the push to this branch is restricted via branch protection.
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public boolean isProtected() {
|
||||
return protection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns API URL that deals with the protection of this branch.
|
||||
* Gets protection url.
|
||||
*
|
||||
* @return API URL that deals with the protection of this branch.
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public URL getProtectionUrl() {
|
||||
return GitHub.parseURL(protection_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets protection.
|
||||
*
|
||||
* @return the protection
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHBranchProtection getProtection() throws IOException {
|
||||
return root.retrieve().to(protection_url, GHBranchProtection.class).wrap(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* The commit that this branch currently points to.
|
||||
* Gets sha 1.
|
||||
*
|
||||
* @return The SHA1 of the commit that this branch currently points to.
|
||||
*/
|
||||
public String getSHA1() {
|
||||
return commit.sha;
|
||||
@@ -78,6 +117,9 @@ public class GHBranch {
|
||||
|
||||
/**
|
||||
* Disables branch protection and allows anyone with push access to push changes.
|
||||
*
|
||||
* @throws IOException
|
||||
* if disabling protection fails
|
||||
*/
|
||||
public void disableProtection() throws IOException {
|
||||
new Requester(root).method("DELETE").to(protection_url);
|
||||
@@ -86,32 +128,43 @@ public class GHBranch {
|
||||
/**
|
||||
* Enables branch protection to control what commit statuses are required to push.
|
||||
*
|
||||
* @see GHCommitStatus#getContext()
|
||||
* @return GHBranchProtectionBuilder for enabling protection
|
||||
* @see GHCommitStatus#getContext() GHCommitStatus#getContext()
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHBranchProtectionBuilder enableProtection() {
|
||||
return new GHBranchProtectionBuilder(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable protection.
|
||||
*
|
||||
* @param level
|
||||
* the level
|
||||
* @param contexts
|
||||
* the contexts
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
// backward compatibility with previous signature
|
||||
@Deprecated
|
||||
public void enableProtection(EnforcementLevel level, Collection<String> contexts) throws IOException {
|
||||
switch (level) {
|
||||
case OFF:
|
||||
disableProtection();
|
||||
break;
|
||||
case NON_ADMINS:
|
||||
case EVERYONE:
|
||||
enableProtection()
|
||||
.addRequiredChecks(contexts)
|
||||
.includeAdmins(level==EnforcementLevel.EVERYONE)
|
||||
.enable();
|
||||
break;
|
||||
case OFF :
|
||||
disableProtection();
|
||||
break;
|
||||
case NON_ADMINS :
|
||||
case EVERYONE :
|
||||
enableProtection().addRequiredChecks(contexts)
|
||||
.includeAdmins(level == EnforcementLevel.EVERYONE)
|
||||
.enable();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
String getApiRoute() {
|
||||
return owner.getApiTailUrl("/branches/"+name);
|
||||
return owner.getApiTailUrl("/branches/" + name);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -120,7 +173,7 @@ public class GHBranch {
|
||||
return "Branch:" + name + " in " + url;
|
||||
}
|
||||
|
||||
/*package*/ GHBranch wrap(GHRepository repo) {
|
||||
GHBranch wrap(GHRepository repo) {
|
||||
this.owner = repo;
|
||||
this.root = repo.root;
|
||||
return this;
|
||||
|
||||
@@ -3,17 +3,22 @@ package org.kohsuke.github;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
|
||||
import static org.kohsuke.github.Previews.ZZZAX;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"URF_UNREAD_FIELD"}, justification = "JSON API")
|
||||
import static org.kohsuke.github.Previews.ZZZAX;
|
||||
|
||||
/**
|
||||
* The type GHBranchProtection.
|
||||
*/
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"URF_UNREAD_FIELD" },
|
||||
justification = "JSON API")
|
||||
public class GHBranchProtection {
|
||||
private static final String REQUIRE_SIGNATURES_URI = "/required_signatures";
|
||||
|
||||
@JsonProperty("enforce_admins")
|
||||
@JsonProperty
|
||||
private EnforceAdmins enforceAdmins;
|
||||
|
||||
private GitHub root;
|
||||
@@ -21,7 +26,7 @@ public class GHBranchProtection {
|
||||
@JsonProperty("required_pull_request_reviews")
|
||||
private RequiredReviews requiredReviews;
|
||||
|
||||
@JsonProperty("required_status_checks")
|
||||
@JsonProperty
|
||||
private RequiredStatusChecks requiredStatusChecks;
|
||||
|
||||
@JsonProperty
|
||||
@@ -30,40 +35,84 @@ public class GHBranchProtection {
|
||||
@JsonProperty
|
||||
private String url;
|
||||
|
||||
@Preview @Deprecated
|
||||
/**
|
||||
* Enabled signed commits.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
@Preview
|
||||
@Deprecated
|
||||
public void enabledSignedCommits() throws IOException {
|
||||
requester().method("POST")
|
||||
.to(url + REQUIRE_SIGNATURES_URI, RequiredSignatures.class);
|
||||
requester().method("POST").to(url + REQUIRE_SIGNATURES_URI, RequiredSignatures.class);
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
/**
|
||||
* Disable signed commits.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
@Preview
|
||||
@Deprecated
|
||||
public void disableSignedCommits() throws IOException {
|
||||
requester().method("DELETE")
|
||||
.to(url + REQUIRE_SIGNATURES_URI);
|
||||
requester().method("DELETE").to(url + REQUIRE_SIGNATURES_URI);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets enforce admins.
|
||||
*
|
||||
* @return the enforce admins
|
||||
*/
|
||||
public EnforceAdmins getEnforceAdmins() {
|
||||
return enforceAdmins;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets required reviews.
|
||||
*
|
||||
* @return the required reviews
|
||||
*/
|
||||
public RequiredReviews getRequiredReviews() {
|
||||
return requiredReviews;
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
/**
|
||||
* Gets required signatures.
|
||||
*
|
||||
* @return the required signatures
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
@Preview
|
||||
@Deprecated
|
||||
public boolean getRequiredSignatures() throws IOException {
|
||||
return requester().method("GET")
|
||||
.to(url + REQUIRE_SIGNATURES_URI, RequiredSignatures.class).enabled;
|
||||
return requester().method("GET").to(url + REQUIRE_SIGNATURES_URI, RequiredSignatures.class).enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets required status checks.
|
||||
*
|
||||
* @return the required status checks
|
||||
*/
|
||||
public RequiredStatusChecks getRequiredStatusChecks() {
|
||||
return requiredStatusChecks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets restrictions.
|
||||
*
|
||||
* @return the restrictions
|
||||
*/
|
||||
public Restrictions getRestrictions() {
|
||||
return restrictions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
@@ -77,6 +126,9 @@ public class GHBranchProtection {
|
||||
return new Requester(root).withPreview(ZZZAX);
|
||||
}
|
||||
|
||||
/**
|
||||
* The type EnforceAdmins.
|
||||
*/
|
||||
public static class EnforceAdmins {
|
||||
@JsonProperty
|
||||
private boolean enabled;
|
||||
@@ -84,23 +136,34 @@ public class GHBranchProtection {
|
||||
@JsonProperty
|
||||
private String url;
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is enabled boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type RequiredReviews.
|
||||
*/
|
||||
public static class RequiredReviews {
|
||||
@JsonProperty("dismissal_restrictions")
|
||||
private Restrictions dismissalRestriction;
|
||||
|
||||
@JsonProperty("dismiss_stale_reviews")
|
||||
private boolean dismissStaleReviews;
|
||||
|
||||
@JsonProperty("require_code_owner_reviews")
|
||||
private boolean requireCodeOwnerReviews;
|
||||
|
||||
@JsonProperty("required_approving_review_count")
|
||||
@@ -109,22 +172,47 @@ public class GHBranchProtection {
|
||||
@JsonProperty
|
||||
private String url;
|
||||
|
||||
/**
|
||||
* Gets dismissal restrictions.
|
||||
*
|
||||
* @return the dismissal restrictions
|
||||
*/
|
||||
public Restrictions getDismissalRestrictions() {
|
||||
return dismissalRestriction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is dismiss stale reviews boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isDismissStaleReviews() {
|
||||
return dismissStaleReviews;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is require code owner reviews boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isRequireCodeOwnerReviews() {
|
||||
return requireCodeOwnerReviews;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets required reviewers.
|
||||
*
|
||||
* @return the required reviewers
|
||||
*/
|
||||
public int getRequiredReviewers() {
|
||||
return requiredReviewers;
|
||||
}
|
||||
@@ -137,15 +225,28 @@ public class GHBranchProtection {
|
||||
@JsonProperty
|
||||
private String url;
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is enabled boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type RequiredStatusChecks.
|
||||
*/
|
||||
public static class RequiredStatusChecks {
|
||||
@JsonProperty
|
||||
private Collection<String> contexts;
|
||||
@@ -156,24 +257,41 @@ public class GHBranchProtection {
|
||||
@JsonProperty
|
||||
private String url;
|
||||
|
||||
/**
|
||||
* Gets contexts.
|
||||
*
|
||||
* @return the contexts
|
||||
*/
|
||||
public Collection<String> getContexts() {
|
||||
return contexts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is requires branch up to date boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isRequiresBranchUpToDate() {
|
||||
return strict;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type Restrictions.
|
||||
*/
|
||||
public static class Restrictions {
|
||||
@JsonProperty
|
||||
private Collection<GHTeam> teams;
|
||||
|
||||
@JsonProperty("teams_url")
|
||||
private String teamsUrl;
|
||||
|
||||
@JsonProperty
|
||||
@@ -182,25 +300,49 @@ public class GHBranchProtection {
|
||||
@JsonProperty
|
||||
private Collection<GHUser> users;
|
||||
|
||||
@JsonProperty("users_url")
|
||||
private String usersUrl;
|
||||
|
||||
/**
|
||||
* Gets teams.
|
||||
*
|
||||
* @return the teams
|
||||
*/
|
||||
public Collection<GHTeam> getTeams() {
|
||||
return teams;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets teams url.
|
||||
*
|
||||
* @return the teams url
|
||||
*/
|
||||
public String getTeamsUrl() {
|
||||
return teamsUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets users.
|
||||
*
|
||||
* @return the users
|
||||
*/
|
||||
public Collection<GHUser> getUsers() {
|
||||
return users;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets users url.
|
||||
*
|
||||
* @return the users url
|
||||
*/
|
||||
public String getUsersUrl() {
|
||||
return usersUrl;
|
||||
}
|
||||
|
||||
@@ -17,10 +17,12 @@ import static org.kohsuke.github.Previews.*;
|
||||
/**
|
||||
* Builder to configure the branch protection settings.
|
||||
*
|
||||
* @see GHBranch#enableProtection()
|
||||
* @see GHBranch#enableProtection() GHBranch#enableProtection()
|
||||
*/
|
||||
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"URF_UNREAD_FIELD" }, justification = "JSON API")
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"URF_UNREAD_FIELD" },
|
||||
justification = "JSON API")
|
||||
public class GHBranchProtectionBuilder {
|
||||
private final GHBranch branch;
|
||||
|
||||
@@ -33,25 +35,58 @@ public class GHBranchProtectionBuilder {
|
||||
this.branch = branch;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add required checks gh branch protection builder.
|
||||
*
|
||||
* @param checks
|
||||
* the checks
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder addRequiredChecks(Collection<String> checks) {
|
||||
getStatusChecks().contexts.addAll(checks);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add required checks gh branch protection builder.
|
||||
*
|
||||
* @param checks
|
||||
* the checks
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder addRequiredChecks(String... checks) {
|
||||
addRequiredChecks(Arrays.asList(checks));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dismiss stale reviews gh branch protection builder.
|
||||
*
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder dismissStaleReviews() {
|
||||
return dismissStaleReviews(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dismiss stale reviews gh branch protection builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder dismissStaleReviews(boolean v) {
|
||||
getPrReviews().put("dismiss_stale_reviews", v);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable gh branch protection.
|
||||
*
|
||||
* @return the gh branch protection
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHBranchProtection enable() throws IOException {
|
||||
return requester().method("PUT")
|
||||
.withNullable("required_status_checks", statusChecks)
|
||||
@@ -62,43 +97,96 @@ public class GHBranchProtectionBuilder {
|
||||
.wrap(branch);
|
||||
}
|
||||
|
||||
/**
|
||||
* Include admins gh branch protection builder.
|
||||
*
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder includeAdmins() {
|
||||
return includeAdmins(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Include admins gh branch protection builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder includeAdmins(boolean v) {
|
||||
enforceAdmins = v;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Required reviewers gh branch protection builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder requiredReviewers(int v) {
|
||||
getPrReviews().put("required_approving_review_count", v);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Require branch is up to date gh branch protection builder.
|
||||
*
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder requireBranchIsUpToDate() {
|
||||
return requireBranchIsUpToDate(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Require branch is up to date gh branch protection builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder requireBranchIsUpToDate(boolean v) {
|
||||
getStatusChecks().strict = v;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Require code own reviews gh branch protection builder.
|
||||
*
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder requireCodeOwnReviews() {
|
||||
return requireCodeOwnReviews(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Require code own reviews gh branch protection builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder requireCodeOwnReviews(boolean v) {
|
||||
getPrReviews().put("require_code_owner_reviews", v);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Require reviews gh branch protection builder.
|
||||
*
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder requireReviews() {
|
||||
getPrReviews();
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restrict review dismissals gh branch protection builder.
|
||||
*
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder restrictReviewDismissals() {
|
||||
getPrReviews();
|
||||
|
||||
@@ -109,11 +197,23 @@ public class GHBranchProtectionBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restrict push access gh branch protection builder.
|
||||
*
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder restrictPushAccess() {
|
||||
getRestrictions();
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Team push access gh branch protection builder.
|
||||
*
|
||||
* @param teams
|
||||
* the teams
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder teamPushAccess(Collection<GHTeam> teams) {
|
||||
for (GHTeam team : teams) {
|
||||
teamPushAccess(team);
|
||||
@@ -121,6 +221,13 @@ public class GHBranchProtectionBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Team push access gh branch protection builder.
|
||||
*
|
||||
* @param teams
|
||||
* the teams
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder teamPushAccess(GHTeam... teams) {
|
||||
for (GHTeam team : teams) {
|
||||
getRestrictions().teams.add(team.getSlug());
|
||||
@@ -128,6 +235,13 @@ public class GHBranchProtectionBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Team review dismissals gh branch protection builder.
|
||||
*
|
||||
* @param teams
|
||||
* the teams
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder teamReviewDismissals(Collection<GHTeam> teams) {
|
||||
for (GHTeam team : teams) {
|
||||
teamReviewDismissals(team);
|
||||
@@ -135,6 +249,13 @@ public class GHBranchProtectionBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Team review dismissals gh branch protection builder.
|
||||
*
|
||||
* @param teams
|
||||
* the teams
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder teamReviewDismissals(GHTeam... teams) {
|
||||
for (GHTeam team : teams) {
|
||||
addReviewRestriction(team.getSlug(), true);
|
||||
@@ -142,13 +263,27 @@ public class GHBranchProtectionBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* User push access gh branch protection builder.
|
||||
*
|
||||
* @param users
|
||||
* the users
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder userPushAccess(Collection<GHUser> users) {
|
||||
for (GHUser user : users) {
|
||||
userPushAccess(user);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* User push access gh branch protection builder.
|
||||
*
|
||||
* @param users
|
||||
* the users
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder userPushAccess(GHUser... users) {
|
||||
for (GHUser user : users) {
|
||||
getRestrictions().users.add(user.getLogin());
|
||||
@@ -156,6 +291,13 @@ public class GHBranchProtectionBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* User review dismissals gh branch protection builder.
|
||||
*
|
||||
* @param users
|
||||
* the users
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder userReviewDismissals(Collection<GHUser> users) {
|
||||
for (GHUser team : users) {
|
||||
userReviewDismissals(team);
|
||||
@@ -163,6 +305,13 @@ public class GHBranchProtectionBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* User review dismissals gh branch protection builder.
|
||||
*
|
||||
* @param users
|
||||
* the users
|
||||
* @return the gh branch protection builder
|
||||
*/
|
||||
public GHBranchProtectionBuilder userReviewDismissals(GHUser... users) {
|
||||
for (GHUser user : users) {
|
||||
addReviewRestriction(user.getLogin(), false);
|
||||
@@ -173,7 +322,7 @@ public class GHBranchProtectionBuilder {
|
||||
private void addReviewRestriction(String restriction, boolean isTeam) {
|
||||
restrictReviewDismissals();
|
||||
Restrictions restrictions = (Restrictions) prReviews.get("dismissal_restrictions");
|
||||
|
||||
|
||||
if (isTeam) {
|
||||
restrictions.teams.add(restriction);
|
||||
} else {
|
||||
|
||||
@@ -15,27 +15,28 @@ import java.util.List;
|
||||
* A commit in a repository.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#getCommit(String)
|
||||
* @see GHCommitComment#getCommit()
|
||||
* @see GHRepository#getCommit(String) GHRepository#getCommit(String)
|
||||
* @see GHCommitComment#getCommit() GHCommitComment#getCommit()
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"NP_UNWRITTEN_FIELD", "UWF_UNWRITTEN_FIELD"},
|
||||
justification = "JSON API")
|
||||
@SuppressFBWarnings(value = { "NP_UNWRITTEN_FIELD", "UWF_UNWRITTEN_FIELD" }, justification = "JSON API")
|
||||
public class GHCommit {
|
||||
private GHRepository owner;
|
||||
|
||||
|
||||
private ShortInfo commit;
|
||||
|
||||
/**
|
||||
* Short summary of this commit.
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD", "UWF_UNWRITTEN_FIELD"}, justification = "JSON API")
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"UWF_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
public static class ShortInfo {
|
||||
private GHAuthor author;
|
||||
private GHAuthor committer;
|
||||
|
||||
|
||||
private String message;
|
||||
|
||||
|
||||
private int comment_count;
|
||||
|
||||
static class Tree {
|
||||
@@ -44,88 +45,129 @@ public class GHCommit {
|
||||
|
||||
private Tree tree;
|
||||
|
||||
/**
|
||||
* Gets author.
|
||||
*
|
||||
* @return the author
|
||||
*/
|
||||
@WithBridgeMethods(value = GHAuthor.class, castRequired = true)
|
||||
public GitUser getAuthor() {
|
||||
return author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets authored date.
|
||||
*
|
||||
* @return the authored date
|
||||
*/
|
||||
public Date getAuthoredDate() {
|
||||
return GitHub.parseDate(author.date);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets committer.
|
||||
*
|
||||
* @return the committer
|
||||
*/
|
||||
@WithBridgeMethods(value = GHAuthor.class, castRequired = true)
|
||||
public GitUser getCommitter() {
|
||||
return committer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets commit date.
|
||||
*
|
||||
* @return the commit date
|
||||
*/
|
||||
public Date getCommitDate() {
|
||||
return GitHub.parseDate(committer.date);
|
||||
}
|
||||
|
||||
/**
|
||||
* Commit message.
|
||||
* Gets message.
|
||||
*
|
||||
* @return Commit message.
|
||||
*/
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets comment count.
|
||||
*
|
||||
* @return the comment count
|
||||
*/
|
||||
public int getCommentCount() {
|
||||
return comment_count;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type GHAuthor.
|
||||
*
|
||||
* @deprecated Use {@link GitUser} instead.
|
||||
*/
|
||||
public static class GHAuthor extends GitUser {
|
||||
private String date;
|
||||
}
|
||||
|
||||
/**
|
||||
* The type Stats.
|
||||
*/
|
||||
public static class Stats {
|
||||
int total,additions,deletions;
|
||||
int total, additions, deletions;
|
||||
}
|
||||
|
||||
/**
|
||||
* A file that was modified.
|
||||
*/
|
||||
@SuppressFBWarnings(value = "UWF_UNWRITTEN_FIELD",
|
||||
justification = "It's being initilized by JSON deserialization")
|
||||
@SuppressFBWarnings(value = "UWF_UNWRITTEN_FIELD", justification = "It's being initilized by JSON deserialization")
|
||||
public static class File {
|
||||
String status;
|
||||
int changes,additions,deletions;
|
||||
int changes, additions, deletions;
|
||||
String raw_url, blob_url, sha, patch;
|
||||
String filename, previous_filename;
|
||||
|
||||
/**
|
||||
* Number of lines added + removed.
|
||||
* Gets lines changed.
|
||||
*
|
||||
* @return Number of lines added + removed.
|
||||
*/
|
||||
public int getLinesChanged() {
|
||||
return changes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of lines added.
|
||||
* Gets lines added.
|
||||
*
|
||||
* @return Number of lines added.
|
||||
*/
|
||||
public int getLinesAdded() {
|
||||
return additions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of lines removed.
|
||||
* Gets lines deleted.
|
||||
*
|
||||
* @return Number of lines removed.
|
||||
*/
|
||||
public int getLinesDeleted() {
|
||||
return deletions;
|
||||
}
|
||||
|
||||
/**
|
||||
* "modified", "added", or "removed"
|
||||
* Gets status.
|
||||
*
|
||||
* @return "modified", "added", or "removed"
|
||||
*/
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Full path in the repository.
|
||||
* Gets file name.
|
||||
*
|
||||
* @return Full path in the repository.
|
||||
*/
|
||||
@SuppressFBWarnings(value = "NM_CONFUSING",
|
||||
justification = "It's a part of the library's API and cannot be renamed")
|
||||
@@ -134,81 +176,108 @@ public class GHCommit {
|
||||
}
|
||||
|
||||
/**
|
||||
* Previous path, in case file has moved.
|
||||
* Gets previous filename.
|
||||
*
|
||||
* @return Previous path, in case file has moved.
|
||||
*/
|
||||
public String getPreviousFilename() {
|
||||
return previous_filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* The actual change.
|
||||
* Gets patch.
|
||||
*
|
||||
* @return The actual change.
|
||||
*/
|
||||
public String getPatch() {
|
||||
return patch;
|
||||
}
|
||||
|
||||
/**
|
||||
* URL like 'https://raw.github.com/jenkinsci/jenkins/4eb17c197dfdcf8ef7ff87eb160f24f6a20b7f0e/core/pom.xml'
|
||||
* that resolves to the actual content of the file.
|
||||
* Gets raw url.
|
||||
*
|
||||
* @return URL like
|
||||
* 'https://raw.github.com/jenkinsci/jenkins/4eb17c197dfdcf8ef7ff87eb160f24f6a20b7f0e/core/pom.xml' that
|
||||
* resolves to the actual content of the file.
|
||||
*/
|
||||
public URL getRawUrl() {
|
||||
return GitHub.parseURL(raw_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* URL like 'https://github.com/jenkinsci/jenkins/blob/1182e2ebb1734d0653142bd422ad33c21437f7cf/core/pom.xml'
|
||||
* that resolves to the HTML page that describes this file.
|
||||
* Gets blob url.
|
||||
*
|
||||
* @return URL like
|
||||
* 'https://github.com/jenkinsci/jenkins/blob/1182e2ebb1734d0653142bd422ad33c21437f7cf/core/pom.xml'
|
||||
* that resolves to the HTML page that describes this file.
|
||||
*/
|
||||
public URL getBlobUrl() {
|
||||
return GitHub.parseURL(blob_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* [0-9a-f]{40} SHA1 checksum.
|
||||
* Gets sha.
|
||||
*
|
||||
* @return [0 -9a-f]{40} SHA1 checksum.
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type Parent.
|
||||
*/
|
||||
public static class Parent {
|
||||
@SuppressFBWarnings(value = "UUF_UNUSED_FIELD", justification = "We don't provide it in API now")
|
||||
String url;
|
||||
String url;
|
||||
String sha;
|
||||
}
|
||||
|
||||
static class User {
|
||||
// TODO: what if someone who doesn't have an account on GitHub makes a commit?
|
||||
@SuppressFBWarnings(value = "UUF_UNUSED_FIELD", justification = "We don't provide it in API now")
|
||||
String url,avatar_url,gravatar_id;
|
||||
String url, avatar_url, gravatar_id;
|
||||
@SuppressFBWarnings(value = "UUF_UNUSED_FIELD", justification = "We don't provide it in API now")
|
||||
int id;
|
||||
|
||||
|
||||
String login;
|
||||
}
|
||||
|
||||
String url,html_url,sha;
|
||||
String url, html_url, sha;
|
||||
List<File> files;
|
||||
Stats stats;
|
||||
List<Parent> parents;
|
||||
User author,committer;
|
||||
|
||||
User author, committer;
|
||||
|
||||
/**
|
||||
* Gets commit short info.
|
||||
*
|
||||
* @return the commit short info
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public ShortInfo getCommitShortInfo() throws IOException {
|
||||
if (commit==null)
|
||||
if (commit == null)
|
||||
populate();
|
||||
return commit;
|
||||
}
|
||||
|
||||
/**
|
||||
* The repository that contains the commit.
|
||||
* Gets owner.
|
||||
*
|
||||
* @return the repository that contains the commit.
|
||||
*/
|
||||
public GHRepository getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of lines added + removed.
|
||||
* Gets lines changed.
|
||||
*
|
||||
* @return the number of lines added + removed.
|
||||
* @throws IOException
|
||||
* if the field was not populated and refresh fails
|
||||
*/
|
||||
public int getLinesChanged() throws IOException {
|
||||
populate();
|
||||
@@ -216,7 +285,11 @@ public class GHCommit {
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of lines added.
|
||||
* Gets lines added.
|
||||
*
|
||||
* @return Number of lines added.
|
||||
* @throws IOException
|
||||
* if the field was not populated and refresh fails
|
||||
*/
|
||||
public int getLinesAdded() throws IOException {
|
||||
populate();
|
||||
@@ -224,7 +297,11 @@ public class GHCommit {
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of lines removed.
|
||||
* Gets lines deleted.
|
||||
*
|
||||
* @return Number of lines removed.
|
||||
* @throws IOException
|
||||
* if the field was not populated and refresh fails
|
||||
*/
|
||||
public int getLinesDeleted() throws IOException {
|
||||
populate();
|
||||
@@ -232,21 +309,30 @@ public class GHCommit {
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this method to walk the tree
|
||||
* Use this method to walk the tree.
|
||||
*
|
||||
* @return a GHTree to walk
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
public GHTree getTree() throws IOException {
|
||||
return owner.getTree(getCommitShortInfo().tree.sha);
|
||||
}
|
||||
|
||||
/**
|
||||
* URL of this commit like "https://github.com/kohsuke/sandbox-ant/commit/8ae38db0ea5837313ab5f39d43a6f73de3bd9000"
|
||||
* Gets html url.
|
||||
*
|
||||
* @return URL of this commit like
|
||||
* "https://github.com/kohsuke/sandbox-ant/commit/8ae38db0ea5837313ab5f39d43a6f73de3bd9000"
|
||||
*/
|
||||
public URL getHtmlUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* [0-9a-f]{40} SHA1 checksum.
|
||||
* Gets sha 1.
|
||||
*
|
||||
* @return [0 -9a-f]{40} SHA1 checksum.
|
||||
*/
|
||||
public String getSHA1() {
|
||||
return sha;
|
||||
@@ -255,19 +341,23 @@ public class GHCommit {
|
||||
/**
|
||||
* List of files changed/added/removed in this commit.
|
||||
*
|
||||
* @return
|
||||
* Can be empty but never null.
|
||||
* @return Can be empty but never null.
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
public List<File> getFiles() throws IOException {
|
||||
populate();
|
||||
return files!=null ? Collections.unmodifiableList(files) : Collections.<File>emptyList();
|
||||
return files != null ? Collections.unmodifiableList(files) : Collections.<File>emptyList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the SHA1 of parent commit objects.
|
||||
* Gets parent sha 1 s.
|
||||
*
|
||||
* @return SHA1 of parent commit objects.
|
||||
*/
|
||||
public List<String> getParentSHA1s() {
|
||||
if (parents==null) return Collections.emptyList();
|
||||
if (parents == null)
|
||||
return Collections.emptyList();
|
||||
return new AbstractList<String>() {
|
||||
@Override
|
||||
public String get(int index) {
|
||||
@@ -283,6 +373,10 @@ public class GHCommit {
|
||||
|
||||
/**
|
||||
* Resolves the parent commit objects and return them.
|
||||
*
|
||||
* @return parent commit objects
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
public List<GHCommit> getParents() throws IOException {
|
||||
List<GHCommit> r = new ArrayList<GHCommit>();
|
||||
@@ -291,19 +385,35 @@ public class GHCommit {
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets author.
|
||||
*
|
||||
* @return the author
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getAuthor() throws IOException {
|
||||
return resolveUser(author);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the date the change was authored on.
|
||||
*
|
||||
* @return the date the change was authored on.
|
||||
* @throws IOException if the information was not already fetched and an attempt at fetching the information failed.
|
||||
* @throws IOException
|
||||
* if the information was not already fetched and an attempt at fetching the information failed.
|
||||
*/
|
||||
public Date getAuthoredDate() throws IOException {
|
||||
return getCommitShortInfo().getAuthoredDate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets committer.
|
||||
*
|
||||
* @return the committer
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getCommitter() throws IOException {
|
||||
return resolveUser(committer);
|
||||
}
|
||||
@@ -312,56 +422,89 @@ public class GHCommit {
|
||||
* Gets the date the change was committed on.
|
||||
*
|
||||
* @return the date the change was committed on.
|
||||
* @throws IOException if the information was not already fetched and an attempt at fetching the information failed.
|
||||
* @throws IOException
|
||||
* if the information was not already fetched and an attempt at fetching the information failed.
|
||||
*/
|
||||
public Date getCommitDate() throws IOException {
|
||||
return getCommitShortInfo().getCommitDate();
|
||||
}
|
||||
|
||||
private GHUser resolveUser(User author) throws IOException {
|
||||
if (author==null || author.login==null) return null;
|
||||
if (author == null || author.login == null)
|
||||
return null;
|
||||
return owner.root.getUser(author.login);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up all the commit comments in this repository.
|
||||
* List comments paged iterable.
|
||||
*
|
||||
* @return {@link PagedIterable} with all the commit comments in this repository.
|
||||
*/
|
||||
public PagedIterable<GHCommitComment> listComments() {
|
||||
return owner.root.retrieve()
|
||||
.asPagedIterable(
|
||||
String.format("/repos/%s/%s/commits/%s/comments", owner.getOwnerName(), owner.getName(), sha),
|
||||
GHCommitComment[].class,
|
||||
item -> item.wrap(owner) );
|
||||
.asPagedIterable(
|
||||
String.format("/repos/%s/%s/commits/%s/comments", owner.getOwnerName(), owner.getName(), sha),
|
||||
GHCommitComment[].class,
|
||||
item -> item.wrap(owner));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a commit comment.
|
||||
*
|
||||
* <p>
|
||||
* I'm not sure how path/line/position parameters interact with each other.
|
||||
*
|
||||
* @param body
|
||||
* body of the comment
|
||||
* @param path
|
||||
* path of file being commented on
|
||||
* @param line
|
||||
* target line for comment
|
||||
* @param position
|
||||
* position on line
|
||||
* @return created GHCommitComment
|
||||
* @throws IOException
|
||||
* if comment is not created
|
||||
*/
|
||||
public GHCommitComment createComment(String body, String path, Integer line, Integer position) throws IOException {
|
||||
GHCommitComment r = new Requester(owner.root)
|
||||
.with("body",body)
|
||||
.with("path",path)
|
||||
.with("line",line)
|
||||
.with("position",position)
|
||||
.to(String.format("/repos/%s/%s/commits/%s/comments",owner.getOwnerName(),owner.getName(),sha),GHCommitComment.class);
|
||||
GHCommitComment r = new Requester(owner.root).with("body", body)
|
||||
.with("path", path)
|
||||
.with("line", line)
|
||||
.with("position", position)
|
||||
.to(String.format("/repos/%s/%s/commits/%s/comments", owner.getOwnerName(), owner.getName(), sha),
|
||||
GHCommitComment.class);
|
||||
return r.wrap(owner);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create comment gh commit comment.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @return the gh commit comment
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHCommitComment createComment(String body) throws IOException {
|
||||
return createComment(body, null, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the status of this commit, newer ones first.
|
||||
* List statuses paged iterable.
|
||||
*
|
||||
* @return status of this commit, newer ones first.
|
||||
* @throws IOException
|
||||
* if statuses cannot be read
|
||||
*/
|
||||
public PagedIterable<GHCommitStatus> listStatuses() throws IOException {
|
||||
return owner.listCommitStatuses(sha);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last status of this commit, which is what gets shown in the UI.
|
||||
* Gets last status.
|
||||
*
|
||||
* @return the last status of this commit, which is what gets shown in the UI.
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
public GHCommitStatus getLastStatus() throws IOException {
|
||||
return owner.getLastCommitStatus(sha);
|
||||
@@ -369,9 +512,12 @@ public class GHCommit {
|
||||
|
||||
/**
|
||||
* Some of the fields are not always filled in when this object is retrieved as a part of another API call.
|
||||
*
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
void populate() throws IOException {
|
||||
if (files==null && stats==null)
|
||||
if (files == null && stats == null)
|
||||
owner.root.retrieve().to(owner.getApiTailUrl("commits/" + sha), this);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,8 +9,7 @@ import java.util.List;
|
||||
import java.util.TimeZone;
|
||||
|
||||
/**
|
||||
* Builder pattern for creating a new commit.
|
||||
* Based on https://developer.github.com/v3/git/commits/#create-a-commit
|
||||
* Builder pattern for creating a new commit. Based on https://developer.github.com/v3/git/commits/#create-a-commit
|
||||
*/
|
||||
public class GHCommitBuilder {
|
||||
private final GHRepository repo;
|
||||
@@ -39,7 +38,11 @@ public class GHCommitBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param message the commit message
|
||||
* Message gh commit builder.
|
||||
*
|
||||
* @param message
|
||||
* the commit message
|
||||
* @return the gh commit builder
|
||||
*/
|
||||
public GHCommitBuilder message(String message) {
|
||||
req.with("message", message);
|
||||
@@ -47,7 +50,11 @@ public class GHCommitBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param tree the SHA of the tree object this commit points to
|
||||
* Tree gh commit builder.
|
||||
*
|
||||
* @param tree
|
||||
* the SHA of the tree object this commit points to
|
||||
* @return the gh commit builder
|
||||
*/
|
||||
public GHCommitBuilder tree(String tree) {
|
||||
req.with("tree", tree);
|
||||
@@ -55,7 +62,11 @@ public class GHCommitBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param parent the SHA of a parent commit.
|
||||
* Parent gh commit builder.
|
||||
*
|
||||
* @param parent
|
||||
* the SHA of a parent commit.
|
||||
* @return the gh commit builder
|
||||
*/
|
||||
public GHCommitBuilder parent(String parent) {
|
||||
parents.add(parent);
|
||||
@@ -64,17 +75,33 @@ public class GHCommitBuilder {
|
||||
|
||||
/**
|
||||
* Configures the author of this commit.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @param email
|
||||
* the email
|
||||
* @param date
|
||||
* the date
|
||||
* @return the gh commit builder
|
||||
*/
|
||||
public GHCommitBuilder author(String name, String email, Date date) {
|
||||
req._with("author", new UserInfo(name, email, date));
|
||||
req.with("author", new UserInfo(name, email, date));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures the committer of this commit.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @param email
|
||||
* the email
|
||||
* @param date
|
||||
* the date
|
||||
* @return the gh commit builder
|
||||
*/
|
||||
public GHCommitBuilder committer(String name, String email, Date date) {
|
||||
req._with("committer", new UserInfo(name, email, date));
|
||||
req.with("committer", new UserInfo(name, email, date));
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -84,9 +111,13 @@ public class GHCommitBuilder {
|
||||
|
||||
/**
|
||||
* Creates a blob based on the parameters specified thus far.
|
||||
*
|
||||
* @return the gh commit
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHCommit create() throws IOException {
|
||||
req._with("parents", parents);
|
||||
req.with("parents", parents);
|
||||
return req.method("POST").to(getApiTail(), GHCommit.class).wrapUp(repo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,61 +11,83 @@ import static org.kohsuke.github.Previews.*;
|
||||
* A comment attached to a commit (or a specific line in a specific file of a commit.)
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#listCommitComments()
|
||||
* @see GHCommit#listComments()
|
||||
* @see GHCommit#createComment(String, String, Integer, Integer)
|
||||
* @see GHRepository#listCommitComments() GHRepository#listCommitComments()
|
||||
* @see GHCommit#listComments() GHCommit#listComments()
|
||||
* @see GHCommit#createComment(String, String, Integer, Integer) GHCommit#createComment(String, String, Integer,
|
||||
* Integer)
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD"}, justification = "JSON API")
|
||||
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
public class GHCommitComment extends GHObject implements Reactable {
|
||||
private GHRepository owner;
|
||||
|
||||
String body, html_url, commit_id;
|
||||
Integer line;
|
||||
String path;
|
||||
GHUser user; // not fully populated. beware.
|
||||
GHUser user; // not fully populated. beware.
|
||||
|
||||
/**
|
||||
* Gets owner.
|
||||
*
|
||||
* @return the owner
|
||||
*/
|
||||
public GHRepository getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* URL like 'https://github.com/kohsuke/sandbox-ant/commit/8ae38db0ea5837313ab5f39d43a6f73de3bd9000#commitcomment-1252827' to
|
||||
* URL like
|
||||
* 'https://github.com/kohsuke/sandbox-ant/commit/8ae38db0ea5837313ab5f39d43a6f73de3bd9000#commitcomment-1252827' to
|
||||
* show this commit comment in a browser.
|
||||
*/
|
||||
public URL getHtmlUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sha 1.
|
||||
*
|
||||
* @return the sha 1
|
||||
*/
|
||||
public String getSHA1() {
|
||||
return commit_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Commit comment in the GitHub flavored markdown format.
|
||||
*
|
||||
* @return the body
|
||||
*/
|
||||
public String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
/**
|
||||
* A commit comment can be on a specific line of a specific file, if so, this field points to a file.
|
||||
* Otherwise null.
|
||||
* A commit comment can be on a specific line of a specific file, if so, this field points to a file. Otherwise
|
||||
* null.
|
||||
*
|
||||
* @return the path
|
||||
*/
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* A commit comment can be on a specific line of a specific file, if so, this field points to the line number in the file.
|
||||
* Otherwise -1.
|
||||
* A commit comment can be on a specific line of a specific file, if so, this field points to the line number in the
|
||||
* file. Otherwise -1.
|
||||
*
|
||||
* @return the line
|
||||
*/
|
||||
public int getLine() {
|
||||
return line!=null ? line : -1;
|
||||
return line != null ? line : -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the user who put this comment.
|
||||
*
|
||||
* @return the user
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getUser() throws IOException {
|
||||
return owner == null || owner.root.isOffline() ? user : owner.root.getUser(user.login);
|
||||
@@ -73,6 +95,10 @@ public class GHCommitComment extends GHObject implements Reactable {
|
||||
|
||||
/**
|
||||
* Gets the commit to which this comment is associated with.
|
||||
*
|
||||
* @return the commit
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHCommit getCommit() throws IOException {
|
||||
return getOwner().getCommit(getSHA1());
|
||||
@@ -80,43 +106,48 @@ public class GHCommitComment extends GHObject implements Reactable {
|
||||
|
||||
/**
|
||||
* Updates the body of the commit message.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void update(String body) throws IOException {
|
||||
new Requester(owner.root)
|
||||
.with("body", body)
|
||||
.method("PATCH").to(getApiTail(), GHCommitComment.class);
|
||||
new Requester(owner.root).with("body", body).method("PATCH").to(getApiTail(), GHCommitComment.class);
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHReaction createReaction(ReactionContent content) throws IOException {
|
||||
return new Requester(owner.root)
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
return new Requester(owner.root).withPreview(SQUIRREL_GIRL)
|
||||
.with("content", content.getContent())
|
||||
.to(getApiTail()+"/reactions", GHReaction.class).wrap(owner.root);
|
||||
.to(getApiTail() + "/reactions", GHReaction.class)
|
||||
.wrap(owner.root);
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public PagedIterable<GHReaction> listReactions() {
|
||||
return owner.root.retrieve().withPreview(SQUIRREL_GIRL)
|
||||
.asPagedIterable(
|
||||
getApiTail()+"/reactions",
|
||||
GHReaction[].class,
|
||||
item -> item.wrap(owner.root) );
|
||||
return owner.root.retrieve()
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
.asPagedIterable(getApiTail() + "/reactions", GHReaction[].class, item -> item.wrap(owner.root));
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this comment.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(owner.root).method("DELETE").to(getApiTail());
|
||||
}
|
||||
|
||||
private String getApiTail() {
|
||||
return String.format("/repos/%s/%s/comments/%s",owner.getOwnerName(),owner.getName(),id);
|
||||
return String.format("/repos/%s/%s/comments/%s", owner.getOwnerName(), owner.getName(), id);
|
||||
}
|
||||
|
||||
|
||||
GHCommitComment wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
if (owner.root.isOffline()) {
|
||||
|
||||
@@ -36,16 +36,22 @@ public class GHCommitPointer {
|
||||
private GHRepository repo;
|
||||
|
||||
/**
|
||||
* This points to the user who owns
|
||||
* the {@link #getRepository()}.
|
||||
* This points to the user who owns the {@link #getRepository()}.
|
||||
*
|
||||
* @return the user
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getUser() throws IOException {
|
||||
if (user != null) return user.root.intern(user);
|
||||
if (user != null)
|
||||
return user.root.intern(user);
|
||||
return user;
|
||||
}
|
||||
|
||||
/**
|
||||
* The repository that contains the commit.
|
||||
*
|
||||
* @return the repository
|
||||
*/
|
||||
public GHRepository getRepository() {
|
||||
return repo;
|
||||
@@ -53,6 +59,8 @@ public class GHCommitPointer {
|
||||
|
||||
/**
|
||||
* Named ref to the commit. This appears to be a "short ref" that doesn't include "refs/heads/" portion.
|
||||
*
|
||||
* @return the ref
|
||||
*/
|
||||
public String getRef() {
|
||||
return ref;
|
||||
@@ -60,6 +68,8 @@ public class GHCommitPointer {
|
||||
|
||||
/**
|
||||
* SHA1 of the commit.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
@@ -67,6 +77,8 @@ public class GHCommitPointer {
|
||||
|
||||
/**
|
||||
* String that looks like "USERNAME:REF".
|
||||
*
|
||||
* @return the label
|
||||
*/
|
||||
public String getLabel() {
|
||||
return label;
|
||||
@@ -74,13 +86,19 @@ public class GHCommitPointer {
|
||||
|
||||
/**
|
||||
* Obtains the commit that this pointer is referring to.
|
||||
*
|
||||
* @return the commit
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHCommit getCommit() throws IOException {
|
||||
return getRepository().getCommit(getSha());
|
||||
}
|
||||
|
||||
void wrapUp(GitHub root) {
|
||||
if (user!=null) user.root = root;
|
||||
if (repo!=null) repo.wrap(root);
|
||||
if (user != null)
|
||||
user.root = root;
|
||||
if (repo != null)
|
||||
repo.wrap(root);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,57 +16,83 @@ import java.util.Date;
|
||||
* </pre>
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#queryCommits()
|
||||
*/
|
||||
* @see GHRepository#queryCommits() GHRepository#queryCommits()
|
||||
*/
|
||||
public class GHCommitQueryBuilder {
|
||||
private final Requester req;
|
||||
private final GHRepository repo;
|
||||
|
||||
/*package*/ GHCommitQueryBuilder(GHRepository repo) {
|
||||
GHCommitQueryBuilder(GHRepository repo) {
|
||||
this.repo = repo;
|
||||
this.req = repo.root.retrieve(); // requester to build up
|
||||
this.req = repo.root.retrieve(); // requester to build up
|
||||
}
|
||||
|
||||
/**
|
||||
* GItHub login or email address by which to filter by commit author.
|
||||
*
|
||||
* @param author
|
||||
* the author
|
||||
* @return the gh commit query builder
|
||||
*/
|
||||
public GHCommitQueryBuilder author(String author) {
|
||||
req.with("author",author);
|
||||
req.with("author", author);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only commits containing this file path will be returned.
|
||||
*
|
||||
* @param path
|
||||
* the path
|
||||
* @return the gh commit query builder
|
||||
*/
|
||||
public GHCommitQueryBuilder path(String path) {
|
||||
req.with("path",path);
|
||||
req.with("path", path);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies the SHA1 commit / tag / branch / etc to start listing commits from.
|
||||
*
|
||||
* @param ref
|
||||
* the ref
|
||||
* @return the gh commit query builder
|
||||
*/
|
||||
public GHCommitQueryBuilder from(String ref) {
|
||||
req.with("sha",ref);
|
||||
req.with("sha", ref);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Page size gh commit query builder.
|
||||
*
|
||||
* @param pageSize
|
||||
* the page size
|
||||
* @return the gh commit query builder
|
||||
*/
|
||||
public GHCommitQueryBuilder pageSize(int pageSize) {
|
||||
req.with("per_page",pageSize);
|
||||
req.with("per_page", pageSize);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only commits after this date will be returned
|
||||
*
|
||||
* @param dt
|
||||
* the dt
|
||||
* @return the gh commit query builder
|
||||
*/
|
||||
public GHCommitQueryBuilder since(Date dt) {
|
||||
req.with("since",GitHub.printDate(dt));
|
||||
req.with("since", GitHub.printDate(dt));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only commits after this date will be returned
|
||||
*
|
||||
* @param timestamp
|
||||
* the timestamp
|
||||
* @return the gh commit query builder
|
||||
*/
|
||||
public GHCommitQueryBuilder since(long timestamp) {
|
||||
return since(new Date(timestamp));
|
||||
@@ -74,14 +100,22 @@ public class GHCommitQueryBuilder {
|
||||
|
||||
/**
|
||||
* Only commits before this date will be returned
|
||||
*
|
||||
* @param dt
|
||||
* the dt
|
||||
* @return the gh commit query builder
|
||||
*/
|
||||
public GHCommitQueryBuilder until(Date dt) {
|
||||
req.with("until",GitHub.printDate(dt));
|
||||
req.with("until", GitHub.printDate(dt));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only commits before this date will be returned
|
||||
*
|
||||
* @param timestamp
|
||||
* the timestamp
|
||||
* @return the gh commit query builder
|
||||
*/
|
||||
public GHCommitQueryBuilder until(long timestamp) {
|
||||
return until(new Date(timestamp));
|
||||
@@ -89,12 +123,10 @@ public class GHCommitQueryBuilder {
|
||||
|
||||
/**
|
||||
* Lists up the commits with the criteria built so far.
|
||||
*
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHCommit> list() {
|
||||
return req
|
||||
.asPagedIterable(
|
||||
repo.getApiTailUrl("commits"),
|
||||
GHCommit[].class,
|
||||
item -> item.wrapUp(repo) );
|
||||
return req.asPagedIterable(repo.getApiTailUrl("commits"), GHCommit[].class, item -> item.wrapUp(repo));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,12 +8,13 @@ import java.io.IOException;
|
||||
* Search commits.
|
||||
*
|
||||
* @author Marc de Verdelhan
|
||||
* @see GitHub#searchCommits()
|
||||
* @see GitHub#searchCommits() GitHub#searchCommits()
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public class GHCommitSearchBuilder extends GHSearchBuilder<GHCommit> {
|
||||
/*package*/ GHCommitSearchBuilder(GitHub root) {
|
||||
super(root,CommitSearchResult.class);
|
||||
GHCommitSearchBuilder(GitHub root) {
|
||||
super(root, CommitSearchResult.class);
|
||||
req.withPreview(Previews.CLOAK);
|
||||
}
|
||||
|
||||
@@ -25,100 +26,233 @@ public class GHCommitSearchBuilder extends GHSearchBuilder<GHCommit> {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Author gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder author(String v) {
|
||||
return q("author:"+v);
|
||||
return q("author:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Committer gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder committer(String v) {
|
||||
return q("committer:"+v);
|
||||
return q("committer:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Author name gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder authorName(String v) {
|
||||
return q("author-name:"+v);
|
||||
return q("author-name:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Committer name gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder committerName(String v) {
|
||||
return q("committer-name:"+v);
|
||||
return q("committer-name:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Author email gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder authorEmail(String v) {
|
||||
return q("author-email:"+v);
|
||||
return q("author-email:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Committer email gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder committerEmail(String v) {
|
||||
return q("committer-email:"+v);
|
||||
return q("committer-email:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Author date gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder authorDate(String v) {
|
||||
return q("author-date:"+v);
|
||||
return q("author-date:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Committer date gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder committerDate(String v) {
|
||||
return q("committer-date:"+v);
|
||||
return q("committer-date:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge gh commit search builder.
|
||||
*
|
||||
* @param merge
|
||||
* the merge
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder merge(boolean merge) {
|
||||
return q("merge:"+Boolean.valueOf(merge).toString().toLowerCase());
|
||||
return q("merge:" + Boolean.valueOf(merge).toString().toLowerCase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Hash gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder hash(String v) {
|
||||
return q("hash:"+v);
|
||||
return q("hash:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parent gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder parent(String v) {
|
||||
return q("parent:"+v);
|
||||
return q("parent:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tree gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder tree(String v) {
|
||||
return q("tree:"+v);
|
||||
return q("tree:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder is(String v) {
|
||||
return q("is:"+v);
|
||||
return q("is:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* User gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder user(String v) {
|
||||
return q("user:"+v);
|
||||
return q("user:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Org gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder org(String v) {
|
||||
return q("org:"+v);
|
||||
return q("org:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Repo gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder repo(String v) {
|
||||
return q("repo:"+v);
|
||||
return q("repo:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Order gh commit search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder order(GHDirection v) {
|
||||
req.with("order",v);
|
||||
req.with("order", v);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort gh commit search builder.
|
||||
*
|
||||
* @param sort
|
||||
* the sort
|
||||
* @return the gh commit search builder
|
||||
*/
|
||||
public GHCommitSearchBuilder sort(Sort sort) {
|
||||
req.with("sort",sort);
|
||||
req.with("sort", sort);
|
||||
return this;
|
||||
}
|
||||
|
||||
public enum Sort { AUTHOR_DATE, COMMITTER_DATE }
|
||||
/**
|
||||
* The enum Sort.
|
||||
*/
|
||||
public enum Sort {
|
||||
AUTHOR_DATE, COMMITTER_DATE
|
||||
}
|
||||
|
||||
private static class CommitSearchResult extends SearchResult<GHCommit> {
|
||||
private GHCommit[] items;
|
||||
|
||||
@Override
|
||||
/*package*/ GHCommit[] getItems(GitHub root) {
|
||||
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) {}
|
||||
} catch (IOException ioe) {
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param commitUrl a commit URL
|
||||
* @param commitUrl
|
||||
* a commit URL
|
||||
* @return the repo name ("username/reponame")
|
||||
*/
|
||||
private static String getRepoName(String commitUrl) {
|
||||
|
||||
@@ -7,49 +7,75 @@ import java.net.URL;
|
||||
* Represents a status of a commit.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#getLastCommitStatus(String)
|
||||
* @see GHCommit#getLastStatus()
|
||||
* @see GHRepository#createCommitStatus(String, GHCommitState, String, String)
|
||||
* @see GHRepository#getLastCommitStatus(String) GHRepository#getLastCommitStatus(String)
|
||||
* @see GHCommit#getLastStatus() GHCommit#getLastStatus()
|
||||
* @see GHRepository#createCommitStatus(String, GHCommitState, String, String) GHRepository#createCommitStatus(String,
|
||||
* GHCommitState, String, String)
|
||||
*/
|
||||
public class GHCommitStatus extends GHObject {
|
||||
String state;
|
||||
String target_url,description;
|
||||
String target_url, description;
|
||||
String context;
|
||||
GHUser creator;
|
||||
|
||||
private GitHub root;
|
||||
|
||||
/*package*/ GHCommitStatus wrapUp(GitHub root) {
|
||||
if (creator!=null) creator.wrapUp(root);
|
||||
GHCommitStatus wrapUp(GitHub root) {
|
||||
if (creator != null)
|
||||
creator.wrapUp(root);
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets state.
|
||||
*
|
||||
* @return the state
|
||||
*/
|
||||
public GHCommitState getState() {
|
||||
for (GHCommitState s : GHCommitState.values()) {
|
||||
if (s.name().equalsIgnoreCase(state))
|
||||
return s;
|
||||
}
|
||||
throw new IllegalStateException("Unexpected state: "+state);
|
||||
throw new IllegalStateException("Unexpected state: " + state);
|
||||
}
|
||||
|
||||
/**
|
||||
* The URL that this status is linked to.
|
||||
*
|
||||
* <p>
|
||||
* This is the URL specified when creating a commit status.
|
||||
*
|
||||
* @return the target url
|
||||
*/
|
||||
public String getTargetUrl() {
|
||||
return target_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets description.
|
||||
*
|
||||
* @return the description
|
||||
*/
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets creator.
|
||||
*
|
||||
* @return the creator
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getCreator() throws IOException {
|
||||
return root.intern(creator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets context.
|
||||
*
|
||||
* @return the context
|
||||
*/
|
||||
public String getContext() {
|
||||
return context;
|
||||
}
|
||||
|
||||
@@ -21,52 +21,108 @@ public class GHCompare {
|
||||
|
||||
private GHRepository owner;
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets html url.
|
||||
*
|
||||
* @return the html url
|
||||
*/
|
||||
public URL getHtmlUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets permalink url.
|
||||
*
|
||||
* @return the permalink url
|
||||
*/
|
||||
public URL getPermalinkUrl() {
|
||||
return GitHub.parseURL(permalink_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets diff url.
|
||||
*
|
||||
* @return the diff url
|
||||
*/
|
||||
public URL getDiffUrl() {
|
||||
return GitHub.parseURL(diff_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets patch url.
|
||||
*
|
||||
* @return the patch url
|
||||
*/
|
||||
public URL getPatchUrl() {
|
||||
return GitHub.parseURL(patch_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets status.
|
||||
*
|
||||
* @return the status
|
||||
*/
|
||||
public Status getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets ahead by.
|
||||
*
|
||||
* @return the ahead by
|
||||
*/
|
||||
public int getAheadBy() {
|
||||
return ahead_by;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets behind by.
|
||||
*
|
||||
* @return the behind by
|
||||
*/
|
||||
public int getBehindBy() {
|
||||
return behind_by;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets total commits.
|
||||
*
|
||||
* @return the total commits
|
||||
*/
|
||||
public int getTotalCommits() {
|
||||
return total_commits;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets base commit.
|
||||
*
|
||||
* @return the base commit
|
||||
*/
|
||||
public Commit getBaseCommit() {
|
||||
return base_commit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets merge base commit.
|
||||
*
|
||||
* @return the merge base commit
|
||||
*/
|
||||
public Commit getMergeBaseCommit() {
|
||||
return merge_base_commit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an array of commits.
|
||||
*
|
||||
* @return A copy of the array being stored in the class.
|
||||
*/
|
||||
public Commit[] getCommits() {
|
||||
@@ -74,9 +130,10 @@ public class GHCompare {
|
||||
System.arraycopy(commits, 0, newValue, 0, commits.length);
|
||||
return newValue;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets an array of commits.
|
||||
*
|
||||
* @return A copy of the array being stored in the class.
|
||||
*/
|
||||
public GHCommit.File[] getFiles() {
|
||||
@@ -85,6 +142,13 @@ public class GHCompare {
|
||||
return newValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap gh compare.
|
||||
*
|
||||
* @param owner
|
||||
* the owner
|
||||
* @return the gh compare
|
||||
*/
|
||||
public GHCompare wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
for (Commit commit : commits) {
|
||||
@@ -96,71 +160,126 @@ public class GHCompare {
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare commits had a child commit element with additional details we want to capture.
|
||||
* This extenstion of GHCommit provides that.
|
||||
* Compare commits had a child commit element with additional details we want to capture. This extenstion of
|
||||
* GHCommit provides that.
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD"},
|
||||
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
public static class Commit extends GHCommit {
|
||||
|
||||
private InnerCommit commit;
|
||||
|
||||
/**
|
||||
* Gets commit.
|
||||
*
|
||||
* @return the commit
|
||||
*/
|
||||
public InnerCommit getCommit() {
|
||||
return commit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The type InnerCommit.
|
||||
*/
|
||||
public static class InnerCommit {
|
||||
private String url, sha, message;
|
||||
private User author, committer;
|
||||
private Tree tree;
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sha.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets message.
|
||||
*
|
||||
* @return the message
|
||||
*/
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
@WithBridgeMethods(value=User.class,castRequired=true)
|
||||
/**
|
||||
* Gets author.
|
||||
*
|
||||
* @return the author
|
||||
*/
|
||||
@WithBridgeMethods(value = User.class, castRequired = true)
|
||||
public GitUser getAuthor() {
|
||||
return author;
|
||||
}
|
||||
|
||||
@WithBridgeMethods(value=User.class,castRequired=true)
|
||||
/**
|
||||
* Gets committer.
|
||||
*
|
||||
* @return the committer
|
||||
*/
|
||||
@WithBridgeMethods(value = User.class, castRequired = true)
|
||||
public GitUser getCommitter() {
|
||||
return committer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets tree.
|
||||
*
|
||||
* @return the tree
|
||||
*/
|
||||
public Tree getTree() {
|
||||
return tree;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type Tree.
|
||||
*/
|
||||
public static class Tree {
|
||||
private String url, sha;
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sha.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type User.
|
||||
*
|
||||
* @deprecated use {@link GitUser} instead.
|
||||
*/
|
||||
public static class User extends GitUser {
|
||||
}
|
||||
|
||||
/**
|
||||
* The enum Status.
|
||||
*/
|
||||
public static enum Status {
|
||||
behind, ahead, identical, diverged
|
||||
}
|
||||
|
||||
@@ -13,13 +13,13 @@ import java.io.UnsupportedEncodingException;
|
||||
* A Content of a repository.
|
||||
*
|
||||
* @author Alexandre COLLIGNON
|
||||
* @see GHRepository#getFileContent(String)
|
||||
* @see GHRepository#getFileContent(String) GHRepository#getFileContent(String)
|
||||
*/
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
@SuppressWarnings({ "UnusedDeclaration" })
|
||||
public class GHContent implements Refreshable {
|
||||
/*
|
||||
In normal use of this class, repository field is set via wrap(),
|
||||
but in the code search API, there's a nested 'repository' field that gets populated from JSON.
|
||||
* In normal use of this class, repository field is set via wrap(), but in the code search API, there's a nested
|
||||
* 'repository' field that gets populated from JSON.
|
||||
*/
|
||||
private GHRepository repository;
|
||||
|
||||
@@ -33,34 +33,69 @@ public class GHContent implements Refreshable {
|
||||
private String path;
|
||||
private String content;
|
||||
private String url; // this is the API url
|
||||
private String git_url; // this is the Blob url
|
||||
private String html_url; // this is the UI
|
||||
private String git_url; // this is the Blob url
|
||||
private String html_url; // this is the UI
|
||||
private String download_url;
|
||||
|
||||
/**
|
||||
* Gets owner.
|
||||
*
|
||||
* @return the owner
|
||||
*/
|
||||
public GHRepository getOwner() {
|
||||
return repository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets type.
|
||||
*
|
||||
* @return the type
|
||||
*/
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets encoding.
|
||||
*
|
||||
* @return the encoding
|
||||
*/
|
||||
public String getEncoding() {
|
||||
return encoding;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets size.
|
||||
*
|
||||
* @return the size
|
||||
*/
|
||||
public long getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sha.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets path.
|
||||
*
|
||||
* @return the path
|
||||
*/
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
@@ -69,12 +104,13 @@ public class GHContent implements Refreshable {
|
||||
* Retrieve the decoded content that is stored at this location.
|
||||
*
|
||||
* <p>
|
||||
* Due to the nature of GitHub's API, you're not guaranteed that
|
||||
* the content will already be populated, so this may trigger
|
||||
* network activity, and can throw an IOException.
|
||||
* Due to the nature of GitHub's API, you're not guaranteed that the content will already be populated, so this may
|
||||
* trigger network activity, and can throw an IOException.
|
||||
*
|
||||
* @deprecated
|
||||
* Use {@link #read()}
|
||||
* @return the content
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated Use {@link #read()}
|
||||
*/
|
||||
@SuppressFBWarnings("DM_DEFAULT_ENCODING")
|
||||
public String getContent() throws IOException {
|
||||
@@ -85,26 +121,42 @@ public class GHContent implements Refreshable {
|
||||
* Retrieve the base64-encoded content that is stored at this location.
|
||||
*
|
||||
* <p>
|
||||
* Due to the nature of GitHub's API, you're not guaranteed that
|
||||
* the content will already be populated, so this may trigger
|
||||
* network activity, and can throw an IOException.
|
||||
* Due to the nature of GitHub's API, you're not guaranteed that the content will already be populated, so this may
|
||||
* trigger network activity, and can throw an IOException.
|
||||
*
|
||||
* @deprecated
|
||||
* Use {@link #read()}
|
||||
* @return the encoded content
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated Use {@link #read()}
|
||||
*/
|
||||
public String getEncodedContent() throws IOException {
|
||||
refresh(content);
|
||||
return content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets git url.
|
||||
*
|
||||
* @return the git url
|
||||
*/
|
||||
public String getGitUrl() {
|
||||
return git_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets html url.
|
||||
*
|
||||
* @return the html url
|
||||
*/
|
||||
public String getHtmlUrl() {
|
||||
return html_url;
|
||||
}
|
||||
@@ -114,6 +166,10 @@ public class GHContent implements Refreshable {
|
||||
*/
|
||||
/**
|
||||
* Retrieves the actual bytes of the blob.
|
||||
*
|
||||
* @return the input stream
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public InputStream read() throws IOException {
|
||||
refresh(content);
|
||||
@@ -121,33 +177,50 @@ public class GHContent implements Refreshable {
|
||||
try {
|
||||
return new Base64InputStream(new ByteArrayInputStream(content.getBytes("US-ASCII")), false);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new AssertionError(e); // US-ASCII is mandatory
|
||||
throw new AssertionError(e); // US-ASCII is mandatory
|
||||
}
|
||||
}
|
||||
|
||||
throw new UnsupportedOperationException("Unrecognized encoding: "+encoding);
|
||||
throw new UnsupportedOperationException("Unrecognized encoding: " + encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* URL to retrieve the raw content of the file. Null if this is a directory.
|
||||
*
|
||||
* @return the download url
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getDownloadUrl() throws IOException {
|
||||
refresh(download_url);
|
||||
return download_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is file boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isFile() {
|
||||
return "file".equals(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is directory boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isDirectory() {
|
||||
return "dir".equals(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fully populate the data by retrieving missing data.
|
||||
*
|
||||
* <p>
|
||||
* Depending on the original API call where this object is created, it may not contain everything.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
protected synchronized void populate() throws IOException {
|
||||
root.retrieve().to(url, this);
|
||||
@@ -155,47 +228,95 @@ public class GHContent implements Refreshable {
|
||||
|
||||
/**
|
||||
* List immediate children of this directory.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHContent> listDirectoryContent() throws IOException {
|
||||
if (!isDirectory())
|
||||
throw new IllegalStateException(path+" is not a directory");
|
||||
throw new IllegalStateException(path + " is not a directory");
|
||||
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
url,
|
||||
GHContent[].class,
|
||||
item -> item.wrap(repository) );
|
||||
return root.retrieve().asPagedIterable(url, GHContent[].class, item -> item.wrap(repository));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update gh content update response.
|
||||
*
|
||||
* @param newContent
|
||||
* the new content
|
||||
* @param commitMessage
|
||||
* the commit message
|
||||
* @return the gh content update response
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
@SuppressFBWarnings("DM_DEFAULT_ENCODING")
|
||||
public GHContentUpdateResponse update(String newContent, String commitMessage) throws IOException {
|
||||
return update(newContent.getBytes(), commitMessage, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update gh content update response.
|
||||
*
|
||||
* @param newContent
|
||||
* the new content
|
||||
* @param commitMessage
|
||||
* the commit message
|
||||
* @param branch
|
||||
* the branch
|
||||
* @return the gh content update response
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
@SuppressFBWarnings("DM_DEFAULT_ENCODING")
|
||||
public GHContentUpdateResponse update(String newContent, String commitMessage, String branch) throws IOException {
|
||||
return update(newContent.getBytes(), commitMessage, branch);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update gh content update response.
|
||||
*
|
||||
* @param newContentBytes
|
||||
* the new content bytes
|
||||
* @param commitMessage
|
||||
* the commit message
|
||||
* @return the gh content update response
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHContentUpdateResponse update(byte[] newContentBytes, String commitMessage) throws IOException {
|
||||
return update(newContentBytes, commitMessage, null);
|
||||
}
|
||||
|
||||
public GHContentUpdateResponse update(byte[] newContentBytes, String commitMessage, String branch) throws IOException {
|
||||
/**
|
||||
* Update gh content update response.
|
||||
*
|
||||
* @param newContentBytes
|
||||
* the new content bytes
|
||||
* @param commitMessage
|
||||
* the commit message
|
||||
* @param branch
|
||||
* the branch
|
||||
* @return the gh content update response
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHContentUpdateResponse update(byte[] newContentBytes, String commitMessage, String branch)
|
||||
throws IOException {
|
||||
String encodedContent = Base64.encodeBase64String(newContentBytes);
|
||||
|
||||
Requester requester = new Requester(root)
|
||||
.with("path", path)
|
||||
.with("message", commitMessage)
|
||||
.with("sha", sha)
|
||||
.with("content", encodedContent)
|
||||
.method("PUT");
|
||||
Requester requester = new Requester(root).with("path", path)
|
||||
.with("message", commitMessage)
|
||||
.with("sha", sha)
|
||||
.with("content", encodedContent)
|
||||
.method("PUT");
|
||||
|
||||
if (branch != null) {
|
||||
requester.with("branch", branch);
|
||||
}
|
||||
|
||||
GHContentUpdateResponse response = requester.to(getApiRoute(), GHContentUpdateResponse.class);
|
||||
GHContentUpdateResponse response = requester.to(getApiRoute(repository, path), GHContentUpdateResponse.class);
|
||||
|
||||
response.getContent().wrap(repository);
|
||||
response.getCommit().wrapUp(repository);
|
||||
@@ -204,29 +325,48 @@ public class GHContent implements Refreshable {
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete gh content update response.
|
||||
*
|
||||
* @param message
|
||||
* the message
|
||||
* @return the gh content update response
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHContentUpdateResponse delete(String message) throws IOException {
|
||||
return delete(message, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete gh content update response.
|
||||
*
|
||||
* @param commitMessage
|
||||
* the commit message
|
||||
* @param branch
|
||||
* the branch
|
||||
* @return the gh content update response
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHContentUpdateResponse delete(String commitMessage, String branch) throws IOException {
|
||||
Requester requester = new Requester(root)
|
||||
.with("path", path)
|
||||
.with("message", commitMessage)
|
||||
.with("sha", sha)
|
||||
.method("DELETE");
|
||||
Requester requester = new Requester(root).with("path", path)
|
||||
.with("message", commitMessage)
|
||||
.with("sha", sha)
|
||||
.method("DELETE");
|
||||
|
||||
if (branch != null) {
|
||||
requester.with("branch", branch);
|
||||
}
|
||||
|
||||
GHContentUpdateResponse response = requester.to(getApiRoute(), GHContentUpdateResponse.class);
|
||||
GHContentUpdateResponse response = requester.to(getApiRoute(repository, path), GHContentUpdateResponse.class);
|
||||
|
||||
response.getCommit().wrapUp(repository);
|
||||
return response;
|
||||
}
|
||||
|
||||
private String getApiRoute() {
|
||||
return "/repos/" + repository.getOwnerName() + "/" + repository.getName() + "/contents/" + path;
|
||||
static String getApiRoute(GHRepository repository, String path) {
|
||||
return repository.getApiTailUrl("contents/" + path);
|
||||
}
|
||||
|
||||
GHContent wrap(GHRepository owner) {
|
||||
@@ -234,14 +374,23 @@ public class GHContent implements Refreshable {
|
||||
this.root = owner.root;
|
||||
return this;
|
||||
}
|
||||
|
||||
GHContent wrap(GitHub root) {
|
||||
this.root = root;
|
||||
if (repository!=null)
|
||||
if (repository != null)
|
||||
repository.wrap(root);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Wrap gh content [ ].
|
||||
*
|
||||
* @param contents
|
||||
* the contents
|
||||
* @param repository
|
||||
* the repository
|
||||
* @return the gh content [ ]
|
||||
*/
|
||||
public static GHContent[] wrap(GHContent[] contents, GHRepository repository) {
|
||||
for (GHContent unwrappedContent : contents) {
|
||||
unwrappedContent.wrap(repository);
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.io.UnsupportedEncodingException;
|
||||
* Call various methods to build up parameters, then call {@link #commit()} to make the change effective.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#createContent()
|
||||
* @see GHRepository#createContent() GHRepository#createContent()
|
||||
*/
|
||||
public final class GHContentBuilder {
|
||||
private final GHRepository repo;
|
||||
@@ -24,31 +24,62 @@ public final class GHContentBuilder {
|
||||
this.req = new Requester(repo.root).method("PUT");
|
||||
}
|
||||
|
||||
/**
|
||||
* Path gh content builder.
|
||||
*
|
||||
* @param path
|
||||
* the path
|
||||
* @return the gh content builder
|
||||
*/
|
||||
public GHContentBuilder path(String path) {
|
||||
this.path = path;
|
||||
req.with("path",path);
|
||||
req.with("path", path);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Branch gh content builder.
|
||||
*
|
||||
* @param branch
|
||||
* the branch
|
||||
* @return the gh content builder
|
||||
*/
|
||||
public GHContentBuilder branch(String branch) {
|
||||
req.with("branch", branch);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used when updating (but not creating a new content) to specify
|
||||
* Thetblob SHA of the file being replaced.
|
||||
* Used when updating (but not creating a new content) to specify Thetblob SHA of the file being replaced.
|
||||
*
|
||||
* @param sha
|
||||
* the sha
|
||||
* @return the gh content builder
|
||||
*/
|
||||
public GHContentBuilder sha(String sha) {
|
||||
req.with("sha", sha);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Content gh content builder.
|
||||
*
|
||||
* @param content
|
||||
* the content
|
||||
* @return the gh content builder
|
||||
*/
|
||||
public GHContentBuilder content(byte[] content) {
|
||||
req.with("content", Base64.encodeBase64String(content));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Content gh content builder.
|
||||
*
|
||||
* @param content
|
||||
* the content
|
||||
* @return the gh content builder
|
||||
*/
|
||||
public GHContentBuilder content(String content) {
|
||||
try {
|
||||
return content(content.getBytes("UTF-8"));
|
||||
@@ -57,6 +88,13 @@ public final class GHContentBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Message gh content builder.
|
||||
*
|
||||
* @param commitMessage
|
||||
* the commit message
|
||||
* @return the gh content builder
|
||||
*/
|
||||
public GHContentBuilder message(String commitMessage) {
|
||||
req.with("message", commitMessage);
|
||||
return this;
|
||||
@@ -64,9 +102,13 @@ public final class GHContentBuilder {
|
||||
|
||||
/**
|
||||
* Commits a new content.
|
||||
*
|
||||
* @return the gh content update response
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHContentUpdateResponse commit() throws IOException {
|
||||
GHContentUpdateResponse response = req.to(repo.getApiTailUrl("contents/" + path), GHContentUpdateResponse.class);
|
||||
GHContentUpdateResponse response = req.to(GHContent.getApiRoute(repo, path), GHContentUpdateResponse.class);
|
||||
|
||||
response.getContent().wrap(repo);
|
||||
response.getCommit().wrapUp(repo);
|
||||
|
||||
@@ -4,11 +4,11 @@ package org.kohsuke.github;
|
||||
* Search code for {@link GHContent}.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GitHub#searchContent()
|
||||
* @see GitHub#searchContent() GitHub#searchContent()
|
||||
*/
|
||||
public class GHContentSearchBuilder extends GHSearchBuilder<GHContent> {
|
||||
/*package*/ GHContentSearchBuilder(GitHub root) {
|
||||
super(root,ContentSearchResult.class);
|
||||
GHContentSearchBuilder(GitHub root) {
|
||||
super(root, ContentSearchResult.class);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -19,48 +19,110 @@ public class GHContentSearchBuilder extends GHSearchBuilder<GHContent> {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* In gh content search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh content search builder
|
||||
*/
|
||||
public GHContentSearchBuilder in(String v) {
|
||||
return q("in:"+v);
|
||||
return q("in:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Language gh content search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh content search builder
|
||||
*/
|
||||
public GHContentSearchBuilder language(String v) {
|
||||
return q("language:"+v);
|
||||
return q("language:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fork gh content search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh content search builder
|
||||
*/
|
||||
public GHContentSearchBuilder fork(String v) {
|
||||
return q("fork:"+v);
|
||||
return q("fork:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Size gh content search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh content search builder
|
||||
*/
|
||||
public GHContentSearchBuilder size(String v) {
|
||||
return q("size:"+v);
|
||||
return q("size:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Path gh content search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh content search builder
|
||||
*/
|
||||
public GHContentSearchBuilder path(String v) {
|
||||
return q("path:"+v);
|
||||
return q("path:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filename gh content search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh content search builder
|
||||
*/
|
||||
public GHContentSearchBuilder filename(String v) {
|
||||
return q("filename:"+v);
|
||||
return q("filename:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extension gh content search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh content search builder
|
||||
*/
|
||||
public GHContentSearchBuilder extension(String v) {
|
||||
return q("extension:"+v);
|
||||
return q("extension:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* User gh content search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh content search builder
|
||||
*/
|
||||
public GHContentSearchBuilder user(String v) {
|
||||
return q("user:"+v);
|
||||
return q("user:" + v);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Repo gh content search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh content search builder
|
||||
*/
|
||||
public GHContentSearchBuilder repo(String v) {
|
||||
return q("repo:"+v);
|
||||
return q("repo:" + v);
|
||||
}
|
||||
|
||||
private static class ContentSearchResult extends SearchResult<GHContent> {
|
||||
private GHContent[] items;
|
||||
|
||||
@Override
|
||||
/*package*/ GHContent[] getItems(GitHub root) {
|
||||
GHContent[] getItems(GitHub root) {
|
||||
for (GHContent item : items)
|
||||
item.wrap(root);
|
||||
return items;
|
||||
|
||||
@@ -1,17 +1,26 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
* The response that is returned when updating
|
||||
* repository content.
|
||||
**/
|
||||
* The response that is returned when updating repository content.
|
||||
*/
|
||||
public class GHContentUpdateResponse {
|
||||
private GHContent content;
|
||||
private GHCommit commit;
|
||||
|
||||
/**
|
||||
* Gets content.
|
||||
*
|
||||
* @return the content
|
||||
*/
|
||||
public GHContent getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets commit.
|
||||
*
|
||||
* @return the commit
|
||||
*/
|
||||
public GHCommit getCommit() {
|
||||
return commit;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ class GHContentWithLicense extends GHContent {
|
||||
@Override
|
||||
GHContentWithLicense wrap(GHRepository owner) {
|
||||
super.wrap(owner);
|
||||
if (license!=null)
|
||||
if (license != null)
|
||||
license.wrap(owner.root);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -13,123 +13,187 @@ public class GHCreateRepositoryBuilder {
|
||||
protected final Requester builder;
|
||||
private final String apiUrlTail;
|
||||
|
||||
/*package*/ GHCreateRepositoryBuilder(GitHub root, String apiUrlTail, String name) {
|
||||
GHCreateRepositoryBuilder(GitHub root, String apiUrlTail, String name) {
|
||||
this.root = root;
|
||||
this.apiUrlTail = apiUrlTail;
|
||||
this.builder = new Requester(root);
|
||||
this.builder.with("name",name);
|
||||
this.builder.with("name", name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Description for repository
|
||||
*
|
||||
* @param description
|
||||
* description of repository
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder description(String description) {
|
||||
this.builder.with("description",description);
|
||||
this.builder.with("description", description);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Homepage for repository
|
||||
*
|
||||
* @param homepage
|
||||
* homepage of repository
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder homepage(URL homepage) {
|
||||
return homepage(homepage.toExternalForm());
|
||||
}
|
||||
|
||||
/**
|
||||
* Homepage for repository
|
||||
*
|
||||
* @param homepage
|
||||
* homepage of repository
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder homepage(String homepage) {
|
||||
this.builder.with("homepage",homepage);
|
||||
this.builder.with("homepage", homepage);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a private repository
|
||||
*
|
||||
* @param enabled
|
||||
* private if true
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder private_(boolean b) {
|
||||
this.builder.with("private",b);
|
||||
public GHCreateRepositoryBuilder private_(boolean enabled) {
|
||||
this.builder.with("private", enabled);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables issue tracker
|
||||
*
|
||||
* @param enabled
|
||||
* true if enabled
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder issues(boolean b) {
|
||||
this.builder.with("has_issues",b);
|
||||
public GHCreateRepositoryBuilder issues(boolean enabled) {
|
||||
this.builder.with("has_issues", enabled);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables wiki
|
||||
*
|
||||
* @param enabled
|
||||
* true if enabled
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder wiki(boolean b) {
|
||||
this.builder.with("has_wiki",b);
|
||||
public GHCreateRepositoryBuilder wiki(boolean enabled) {
|
||||
this.builder.with("has_wiki", enabled);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables downloads
|
||||
*
|
||||
* @param enabled
|
||||
* true if enabled
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder downloads(boolean b) {
|
||||
this.builder.with("has_downloads",b);
|
||||
public GHCreateRepositoryBuilder downloads(boolean enabled) {
|
||||
this.builder.with("has_downloads", enabled);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* If true, create an initial commit with empty README.
|
||||
*
|
||||
* @param enabled
|
||||
* true if enabled
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder autoInit(boolean b) {
|
||||
this.builder.with("auto_init",b);
|
||||
public GHCreateRepositoryBuilder autoInit(boolean enabled) {
|
||||
this.builder.with("auto_init", enabled);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow or disallow squash-merging pull requests.
|
||||
*
|
||||
* @param enabled
|
||||
* true if enabled
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder allowSquashMerge(boolean b) {
|
||||
this.builder.with("allow_squash_merge",b);
|
||||
public GHCreateRepositoryBuilder allowSquashMerge(boolean enabled) {
|
||||
this.builder.with("allow_squash_merge", enabled);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow or disallow merging pull requests with a merge commit.
|
||||
*
|
||||
* @param enabled
|
||||
* true if enabled
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder allowMergeCommit(boolean b) {
|
||||
this.builder.with("allow_merge_commit",b);
|
||||
public GHCreateRepositoryBuilder allowMergeCommit(boolean enabled) {
|
||||
this.builder.with("allow_merge_commit", enabled);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow or disallow rebase-merging pull requests.
|
||||
*
|
||||
* @param enabled
|
||||
* true if enabled
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder allowRebaseMerge(boolean b) {
|
||||
this.builder.with("allow_rebase_merge",b);
|
||||
public GHCreateRepositoryBuilder allowRebaseMerge(boolean enabled) {
|
||||
this.builder.with("allow_rebase_merge", enabled);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a default .gitignore
|
||||
*
|
||||
* See https://developer.github.com/v3/repos/#create
|
||||
* @param language
|
||||
* template to base the ignore file on
|
||||
* @return a builder to continue with building See https://developer.github.com/v3/repos/#create
|
||||
*/
|
||||
public GHCreateRepositoryBuilder gitignoreTemplate(String language) {
|
||||
this.builder.with("gitignore_template",language);
|
||||
this.builder.with("gitignore_template", language);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Desired license template to apply
|
||||
*
|
||||
* See https://developer.github.com/v3/repos/#create
|
||||
* @param license
|
||||
* template to base the license file on
|
||||
* @return a builder to continue with building See https://developer.github.com/v3/repos/#create
|
||||
*/
|
||||
public GHCreateRepositoryBuilder licenseTemplate(String license) {
|
||||
this.builder.with("license_template",license);
|
||||
this.builder.with("license_template", license);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* The team that gets granted access to this repository. Only valid for creating a repository in
|
||||
* an organization.
|
||||
* The team that gets granted access to this repository. Only valid for creating a repository in an organization.
|
||||
*
|
||||
* @param team
|
||||
* team to grant access to
|
||||
* @return a builder to continue with building
|
||||
*/
|
||||
public GHCreateRepositoryBuilder team(GHTeam team) {
|
||||
if (team!=null)
|
||||
this.builder.with("team_id",team.getId());
|
||||
if (team != null)
|
||||
this.builder.with("team_id", team.getId());
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a repository with all the parameters.
|
||||
*
|
||||
* @return the gh repository
|
||||
* @throws IOException
|
||||
* if repsitory cannot be created
|
||||
*/
|
||||
public GHRepository create() throws IOException {
|
||||
return builder.method("POST").to(apiUrlTail, GHRepository.class).wrap(root);
|
||||
|
||||
@@ -4,6 +4,9 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* The type GHDeployKey.
|
||||
*/
|
||||
public class GHDeployKey {
|
||||
|
||||
protected String url, key, title;
|
||||
@@ -11,36 +14,75 @@ public class GHDeployKey {
|
||||
protected long id;
|
||||
private GHRepository owner;
|
||||
|
||||
/**
|
||||
* Gets id.
|
||||
*
|
||||
* @return the id
|
||||
*/
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets key.
|
||||
*
|
||||
* @return the key
|
||||
*/
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets title.
|
||||
*
|
||||
* @return the title
|
||||
*/
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is verified boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isVerified() {
|
||||
return verified;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap gh deploy key.
|
||||
*
|
||||
* @param repo
|
||||
* the repo
|
||||
* @return the gh deploy key
|
||||
*/
|
||||
public GHDeployKey wrap(GHRepository repo) {
|
||||
this.owner = repo;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return new ToStringBuilder(this).append("title",title).append("id",id).append("key",key).toString();
|
||||
return new ToStringBuilder(this).append("title", title).append("id", id).append("key", key).toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Delete.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(owner.root).method("DELETE").to(String.format("/repos/%s/%s/keys/%d", owner.getOwnerName(), owner.getName(), id));
|
||||
new Requester(owner.root).method("DELETE")
|
||||
.to(String.format("/repos/%s/%s/keys/%d", owner.getOwnerName(), owner.getName(), id));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,9 @@ import java.net.URL;
|
||||
* Represents a deployment
|
||||
*
|
||||
* @see <a href="https://developer.github.com/v3/repos/deployments/">documentation</a>
|
||||
* @see GHRepository#listDeployments(String, String, String, String)
|
||||
* @see GHRepository#getDeployment(long)
|
||||
* @see GHRepository#listDeployments(String, String, String, String) GHRepository#listDeployments(String, String,
|
||||
* String, String)
|
||||
* @see GHRepository#getDeployment(long) GHRepository#getDeployment(long)
|
||||
*/
|
||||
public class GHDeployment extends GHObject {
|
||||
private GHRepository owner;
|
||||
@@ -23,38 +24,85 @@ public class GHDeployment extends GHObject {
|
||||
protected String repository_url;
|
||||
protected GHUser creator;
|
||||
|
||||
|
||||
GHDeployment wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
this.root = owner.root;
|
||||
if(creator != null) creator.wrapUp(root);
|
||||
if (creator != null)
|
||||
creator.wrapUp(root);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets statuses url.
|
||||
*
|
||||
* @return the statuses url
|
||||
*/
|
||||
public URL getStatusesUrl() {
|
||||
return GitHub.parseURL(statuses_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets repository url.
|
||||
*
|
||||
* @return the repository url
|
||||
*/
|
||||
public URL getRepositoryUrl() {
|
||||
return GitHub.parseURL(repository_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets task.
|
||||
*
|
||||
* @return the task
|
||||
*/
|
||||
public String getTask() {
|
||||
return task;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets payload.
|
||||
*
|
||||
* @return the payload
|
||||
*/
|
||||
public String getPayload() {
|
||||
return (String) payload;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets environment.
|
||||
*
|
||||
* @return the environment
|
||||
*/
|
||||
public String getEnvironment() {
|
||||
return environment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets creator.
|
||||
*
|
||||
* @return the creator
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getCreator() throws IOException {
|
||||
return root.intern(creator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets ref.
|
||||
*
|
||||
* @return the ref
|
||||
*/
|
||||
public String getRef() {
|
||||
return ref;
|
||||
}
|
||||
public String getSha(){
|
||||
|
||||
/**
|
||||
* Gets sha.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
|
||||
@@ -66,16 +114,24 @@ public class GHDeployment extends GHObject {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create status gh deployment status builder.
|
||||
*
|
||||
* @param state
|
||||
* the state
|
||||
* @return the gh deployment status builder
|
||||
*/
|
||||
public GHDeploymentStatusBuilder createStatus(GHDeploymentState state) {
|
||||
return new GHDeploymentStatusBuilder(owner,id,state);
|
||||
return new GHDeploymentStatusBuilder(owner, id, state);
|
||||
}
|
||||
|
||||
/**
|
||||
* List statuses paged iterable.
|
||||
*
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHDeploymentStatus> listStatuses() {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
statuses_url,
|
||||
GHDeploymentStatus[].class,
|
||||
item -> item.wrap(owner) );
|
||||
return root.retrieve().asPagedIterable(statuses_url, GHDeploymentStatus[].class, item -> item.wrap(owner));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,53 +3,130 @@ package org.kohsuke.github;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
//Based on https://developer.github.com/v3/repos/deployments/#create-a-deployment
|
||||
/**
|
||||
* The type GHDeploymentBuilder.
|
||||
*/
|
||||
// Based on https://developer.github.com/v3/repos/deployments/#create-a-deployment
|
||||
public class GHDeploymentBuilder {
|
||||
private final GHRepository repo;
|
||||
private final Requester builder;
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh deployment builder.
|
||||
*
|
||||
* @param repo
|
||||
* the repo
|
||||
*/
|
||||
public GHDeploymentBuilder(GHRepository repo) {
|
||||
this.repo = repo;
|
||||
this.builder = new Requester(repo.root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh deployment builder.
|
||||
*
|
||||
* @param repo
|
||||
* the repo
|
||||
* @param ref
|
||||
* the ref
|
||||
*/
|
||||
public GHDeploymentBuilder(GHRepository repo, String ref) {
|
||||
this(repo);
|
||||
ref(ref);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ref gh deployment builder.
|
||||
*
|
||||
* @param branch
|
||||
* the branch
|
||||
* @return the gh deployment builder
|
||||
*/
|
||||
public GHDeploymentBuilder ref(String branch) {
|
||||
builder.with("ref",branch);
|
||||
builder.with("ref", branch);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Task gh deployment builder.
|
||||
*
|
||||
* @param task
|
||||
* the task
|
||||
* @return the gh deployment builder
|
||||
*/
|
||||
public GHDeploymentBuilder task(String task) {
|
||||
builder.with("task",task);
|
||||
builder.with("task", task);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Auto merge gh deployment builder.
|
||||
*
|
||||
* @param autoMerge
|
||||
* the auto merge
|
||||
* @return the gh deployment builder
|
||||
*/
|
||||
public GHDeploymentBuilder autoMerge(boolean autoMerge) {
|
||||
builder.with("auto_merge",autoMerge);
|
||||
builder.with("auto_merge", autoMerge);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Required contexts gh deployment builder.
|
||||
*
|
||||
* @param requiredContexts
|
||||
* the required contexts
|
||||
* @return the gh deployment builder
|
||||
*/
|
||||
public GHDeploymentBuilder requiredContexts(List<String> requiredContexts) {
|
||||
builder.with("required_contexts",requiredContexts);
|
||||
builder.with("required_contexts", requiredContexts);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Payload gh deployment builder.
|
||||
*
|
||||
* @param payload
|
||||
* the payload
|
||||
* @return the gh deployment builder
|
||||
*/
|
||||
public GHDeploymentBuilder payload(String payload) {
|
||||
builder.with("payload",payload);
|
||||
builder.with("payload", payload);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Environment gh deployment builder.
|
||||
*
|
||||
* @param environment
|
||||
* the environment
|
||||
* @return the gh deployment builder
|
||||
*/
|
||||
public GHDeploymentBuilder environment(String environment) {
|
||||
builder.with("environment",environment);
|
||||
return this;
|
||||
}
|
||||
public GHDeploymentBuilder description(String description) {
|
||||
builder.with("description",description);
|
||||
builder.with("environment", environment);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Description gh deployment builder.
|
||||
*
|
||||
* @param description
|
||||
* the description
|
||||
* @return the gh deployment builder
|
||||
*/
|
||||
public GHDeploymentBuilder description(String description) {
|
||||
builder.with("description", description);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create gh deployment.
|
||||
*
|
||||
* @return the gh deployment
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHDeployment create() throws IOException {
|
||||
return builder.to(repo.getApiTailUrl("deployments"),GHDeployment.class).wrap(repo);
|
||||
return builder.to(repo.getApiTailUrl("deployments"), GHDeployment.class).wrap(repo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ package org.kohsuke.github;
|
||||
import java.net.URL;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* The type GHDeploymentStatus.
|
||||
*/
|
||||
public class GHDeploymentStatus extends GHObject {
|
||||
private GHRepository owner;
|
||||
private GitHub root;
|
||||
@@ -12,24 +15,54 @@ public class GHDeploymentStatus extends GHObject {
|
||||
protected String target_url;
|
||||
protected String deployment_url;
|
||||
protected String repository_url;
|
||||
|
||||
/**
|
||||
* Wrap gh deployment status.
|
||||
*
|
||||
* @param owner
|
||||
* the owner
|
||||
* @return the gh deployment status
|
||||
*/
|
||||
public GHDeploymentStatus wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
this.root = owner.root;
|
||||
if(creator != null) creator.wrapUp(root);
|
||||
if (creator != null)
|
||||
creator.wrapUp(root);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets target url.
|
||||
*
|
||||
* @return the target url
|
||||
*/
|
||||
public URL getTargetUrl() {
|
||||
return GitHub.parseURL(target_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets deployment url.
|
||||
*
|
||||
* @return the deployment url
|
||||
*/
|
||||
public URL getDeploymentUrl() {
|
||||
return GitHub.parseURL(deployment_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets repository url.
|
||||
*
|
||||
* @return the repository url
|
||||
*/
|
||||
public URL getRepositoryUrl() {
|
||||
return GitHub.parseURL(repository_url);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets state.
|
||||
*
|
||||
* @return the state
|
||||
*/
|
||||
public GHDeploymentState getState() {
|
||||
return GHDeploymentState.valueOf(state.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
@@ -5,8 +5,7 @@ import java.io.IOException;
|
||||
/**
|
||||
* Creates a new deployment status.
|
||||
*
|
||||
* @see
|
||||
* GHDeployment#createStatus(GHDeploymentState)
|
||||
* @see GHDeployment#createStatus(GHDeploymentState) GHDeployment#createStatus(GHDeploymentState)
|
||||
*/
|
||||
public class GHDeploymentStatusBuilder {
|
||||
private final Requester builder;
|
||||
@@ -14,31 +13,60 @@ public class GHDeploymentStatusBuilder {
|
||||
private long deploymentId;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link GHDeployment#createStatus(GHDeploymentState)}
|
||||
* Instantiates a new Gh deployment status builder.
|
||||
*
|
||||
* @param repo
|
||||
* the repo
|
||||
* @param deploymentId
|
||||
* the deployment id
|
||||
* @param state
|
||||
* the state
|
||||
* @deprecated Use {@link GHDeployment#createStatus(GHDeploymentState)}
|
||||
*/
|
||||
public GHDeploymentStatusBuilder(GHRepository repo, int deploymentId, GHDeploymentState state) {
|
||||
this(repo,(long)deploymentId,state);
|
||||
this(repo, (long) deploymentId, state);
|
||||
}
|
||||
|
||||
/*package*/ GHDeploymentStatusBuilder(GHRepository repo, long deploymentId, GHDeploymentState state) {
|
||||
GHDeploymentStatusBuilder(GHRepository repo, long deploymentId, GHDeploymentState state) {
|
||||
this.repo = repo;
|
||||
this.deploymentId = deploymentId;
|
||||
this.builder = new Requester(repo.root);
|
||||
this.builder.with("state",state);
|
||||
this.builder.with("state", state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Description gh deployment status builder.
|
||||
*
|
||||
* @param description
|
||||
* the description
|
||||
* @return the gh deployment status builder
|
||||
*/
|
||||
public GHDeploymentStatusBuilder description(String description) {
|
||||
this.builder.with("description",description);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHDeploymentStatusBuilder targetUrl(String targetUrl) {
|
||||
this.builder.with("target_url",targetUrl);
|
||||
this.builder.with("description", description);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Target url gh deployment status builder.
|
||||
*
|
||||
* @param targetUrl
|
||||
* the target url
|
||||
* @return the gh deployment status builder
|
||||
*/
|
||||
public GHDeploymentStatusBuilder targetUrl(String targetUrl) {
|
||||
this.builder.with("target_url", targetUrl);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create gh deployment status.
|
||||
*
|
||||
* @return the gh deployment status
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHDeploymentStatus create() throws IOException {
|
||||
return builder.to(repo.getApiTailUrl("deployments/"+deploymentId+"/statuses"),GHDeploymentStatus.class).wrap(repo);
|
||||
return builder.to(repo.getApiTailUrl("deployments/" + deploymentId + "/statuses"), GHDeploymentStatus.class)
|
||||
.wrap(repo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,36 +25,51 @@ package org.kohsuke.github;
|
||||
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
|
||||
|
||||
/**
|
||||
* Represents an email of GitHub.
|
||||
*
|
||||
* @author Kelly Campbell
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD", "NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD"}, justification = "JSON API")
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD" },
|
||||
justification = "JSON API")
|
||||
public class GHEmail {
|
||||
|
||||
protected String email;
|
||||
protected boolean primary;
|
||||
protected boolean verified;
|
||||
|
||||
/**
|
||||
* Gets email.
|
||||
*
|
||||
* @return the email
|
||||
*/
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is primary boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isPrimary() {
|
||||
return primary;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is verified boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isVerified() {
|
||||
return verified;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Email:"+email;
|
||||
return "Email:" + email;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -44,7 +44,11 @@ public enum GHEvent {
|
||||
PULL_REQUEST_REVIEW_COMMENT,
|
||||
PUSH,
|
||||
RELEASE,
|
||||
REPOSITORY, // only valid for org hooks
|
||||
REPOSITORY, // only
|
||||
// valid
|
||||
// for
|
||||
// org
|
||||
// hooks
|
||||
STATUS,
|
||||
TEAM,
|
||||
TEAM_ADD,
|
||||
@@ -55,12 +59,12 @@ public enum GHEvent {
|
||||
*/
|
||||
ALL;
|
||||
|
||||
|
||||
/**
|
||||
* Returns GitHub's internal representation of this event.
|
||||
*/
|
||||
String symbol() {
|
||||
if (this==ALL) return "*";
|
||||
if (this == ALL)
|
||||
return "*";
|
||||
return name().toLowerCase(Locale.ENGLISH);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,73 +30,118 @@ public class GHEventInfo {
|
||||
/**
|
||||
* Inside the event JSON model, GitHub uses a slightly different format.
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" }, justification = "JSON API")
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" },
|
||||
justification = "JSON API")
|
||||
public static class GHEventRepository {
|
||||
@SuppressFBWarnings(value = "UUF_UNUSED_FIELD", justification = "We don't provide it in API now")
|
||||
private long id;
|
||||
@SuppressFBWarnings(value = "UUF_UNUSED_FIELD", justification = "We don't provide it in API now")
|
||||
private String url; // repository API URL
|
||||
private String name; // owner/repo
|
||||
private String url; // repository API URL
|
||||
private String name; // owner/repo
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets type.
|
||||
*
|
||||
* @return the type
|
||||
*/
|
||||
public GHEvent getType() {
|
||||
String t = type;
|
||||
if (t.endsWith("Event")) t=t.substring(0,t.length()-5);
|
||||
if (t.endsWith("Event"))
|
||||
t = t.substring(0, t.length() - 5);
|
||||
for (GHEvent e : GHEvent.values()) {
|
||||
if (e.name().replace("_","").equalsIgnoreCase(t))
|
||||
if (e.name().replace("_", "").equalsIgnoreCase(t))
|
||||
return e;
|
||||
}
|
||||
return null; // unknown event type
|
||||
return null; // unknown event type
|
||||
}
|
||||
|
||||
/*package*/ GHEventInfo wrapUp(GitHub root) {
|
||||
GHEventInfo wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets id.
|
||||
*
|
||||
* @return the id
|
||||
*/
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets created at.
|
||||
*
|
||||
* @return the created at
|
||||
*/
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
/**
|
||||
* Repository where the change was made.
|
||||
* Gets repository.
|
||||
*
|
||||
* @return Repository where the change was made.
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" },
|
||||
@SuppressFBWarnings(value = { "UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" },
|
||||
justification = "The field comes from JSON deserialization")
|
||||
public GHRepository getRepository() throws IOException {
|
||||
return root.getRepository(repo.name);
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = {"UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" },
|
||||
|
||||
/**
|
||||
* Gets actor.
|
||||
*
|
||||
* @return the {@link GHUser} actor for this event.
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
@SuppressFBWarnings(value = { "UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" },
|
||||
justification = "The field comes from JSON deserialization")
|
||||
public GHUser getActor() throws IOException {
|
||||
return root.getUser(actor.getLogin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Quick way to just get the actor of the login.
|
||||
* Gets actor login.
|
||||
*
|
||||
* @return the login of the actor.
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
public String getActorLogin() throws IOException {
|
||||
return actor.getLogin();
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = {"UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" },
|
||||
/**
|
||||
* Gets organization.
|
||||
*
|
||||
* @return the organization
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
@SuppressFBWarnings(value = { "UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" },
|
||||
justification = "The field comes from JSON deserialization")
|
||||
public GHOrganization getOrganization() throws IOException {
|
||||
return (org==null || org.getLogin()==null) ? null : root.getOrganization(org.getLogin());
|
||||
return (org == null || org.getLogin() == null) ? null : root.getOrganization(org.getLogin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the payload.
|
||||
*
|
||||
*
|
||||
* @param <T>
|
||||
* the type parameter
|
||||
* @param type
|
||||
* Specify one of the {@link GHEventPayload} subtype that defines a type-safe access to the payload.
|
||||
* This must match the {@linkplain #getType() event type}.
|
||||
* Specify one of the {@link GHEventPayload} subtype that defines a type-safe access to the payload. This
|
||||
* must match the {@linkplain #getType() event type}.
|
||||
* @return parsed event payload
|
||||
* @throws IOException
|
||||
* if payload cannot be parsed
|
||||
*/
|
||||
public <T extends GHEventPayload> T getPayload(Class<T> type) throws IOException {
|
||||
T v = GitHub.MAPPER.readValue(payload.traverse(), type);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,13 +1,29 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
* The type GHException.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GHException extends RuntimeException {
|
||||
/**
|
||||
* Instantiates a new Gh exception.
|
||||
*
|
||||
* @param message
|
||||
* the message
|
||||
*/
|
||||
public GHException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh exception.
|
||||
*
|
||||
* @param message
|
||||
* the message
|
||||
* @param cause
|
||||
* the cause
|
||||
*/
|
||||
public GHException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
@@ -1,27 +1,41 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
|
||||
/**
|
||||
* Request/responce contains useful metadata.
|
||||
* Custom exception allows store info for next diagnostics.
|
||||
* Request/responce contains useful metadata. Custom exception allows store info for next diagnostics.
|
||||
*
|
||||
* @author Kanstantsin Shautsou
|
||||
*/
|
||||
public class GHFileNotFoundException extends FileNotFoundException {
|
||||
protected Map<String, List<String>> responseHeaderFields;
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh file not found exception.
|
||||
*/
|
||||
public GHFileNotFoundException() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh file not found exception.
|
||||
*
|
||||
* @param s
|
||||
* the s
|
||||
*/
|
||||
public GHFileNotFoundException(String s) {
|
||||
super(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets response header fields.
|
||||
*
|
||||
* @return the response header fields
|
||||
*/
|
||||
@CheckForNull
|
||||
public Map<String, List<String>> getResponseHeaderFields() {
|
||||
return responseHeaderFields;
|
||||
|
||||
@@ -14,14 +14,14 @@ import java.util.Map.Entry;
|
||||
* Gist
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHUser#listGists()
|
||||
* @see GitHub#getGist(String)
|
||||
* @see GitHub#createGist()
|
||||
* @see GHUser#listGists() GHUser#listGists()
|
||||
* @see GitHub#getGist(String) GitHub#getGist(String)
|
||||
* @see GitHub#createGist() GitHub#createGist()
|
||||
* @see <a href="https://developer.github.com/v3/gists/">documentation</a>
|
||||
*/
|
||||
public class GHGist extends GHObject {
|
||||
/*package almost final*/ GHUser owner;
|
||||
/*package almost final*/ GitHub root;
|
||||
/* package almost final */ GHUser owner;
|
||||
/* package almost final */ GitHub root;
|
||||
|
||||
private String forks_url, commits_url, id, git_pull_url, git_push_url, html_url;
|
||||
|
||||
@@ -34,30 +34,51 @@ public class GHGist extends GHObject {
|
||||
|
||||
private String comments_url;
|
||||
|
||||
private Map<String,GHGistFile> files = new HashMap<String, GHGistFile>();
|
||||
private Map<String, GHGistFile> files = new HashMap<String, GHGistFile>();
|
||||
|
||||
/**
|
||||
* User that owns this Gist.
|
||||
* Gets owner.
|
||||
*
|
||||
* @return User that owns this Gist.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getOwner() throws IOException {
|
||||
return root.intern(owner);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets forks url.
|
||||
*
|
||||
* @return the forks url
|
||||
*/
|
||||
public String getForksUrl() {
|
||||
return forks_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets commits url.
|
||||
*
|
||||
* @return the commits url
|
||||
*/
|
||||
public String getCommitsUrl() {
|
||||
return commits_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* URL like https://gist.github.com/gists/12345.git
|
||||
* Gets git pull url.
|
||||
*
|
||||
* @return URL like https://gist.github.com/gists/12345.git
|
||||
*/
|
||||
public String getGitPullUrl() {
|
||||
return git_pull_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets git push url.
|
||||
*
|
||||
* @return the git push url
|
||||
*/
|
||||
public String getGitPushUrl() {
|
||||
return git_push_url;
|
||||
}
|
||||
@@ -66,34 +87,63 @@ public class GHGist extends GHObject {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is public boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isPublic() {
|
||||
return _public;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets description.
|
||||
*
|
||||
* @return the description
|
||||
*/
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets comment count.
|
||||
*
|
||||
* @return the comment count
|
||||
*/
|
||||
public int getCommentCount() {
|
||||
return comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* API URL of listing comments.
|
||||
* Gets comments url.
|
||||
*
|
||||
* @return API URL of listing comments.
|
||||
*/
|
||||
public String getCommentsUrl() {
|
||||
return comments_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets file.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @return the file
|
||||
*/
|
||||
public GHGistFile getFile(String name) {
|
||||
return files.get(name);
|
||||
}
|
||||
|
||||
public Map<String,GHGistFile> getFiles() {
|
||||
/**
|
||||
* Gets files.
|
||||
*
|
||||
* @return the files
|
||||
*/
|
||||
public Map<String, GHGistFile> getFiles() {
|
||||
return Collections.unmodifiableMap(files);
|
||||
}
|
||||
|
||||
/*package*/ GHGist wrapUp(GHUser owner) {
|
||||
GHGist wrapUp(GHUser owner) {
|
||||
this.owner = owner;
|
||||
this.root = owner.root;
|
||||
wrapUp();
|
||||
@@ -101,10 +151,10 @@ public class GHGist extends GHObject {
|
||||
}
|
||||
|
||||
/**
|
||||
* Used when caller obtains {@link GHGist} without knowing its owner.
|
||||
* A partially constructed owner object is interned.
|
||||
* Used when caller obtains {@link GHGist} without knowing its owner. A partially constructed owner object is
|
||||
* interned.
|
||||
*/
|
||||
/*package*/ GHGist wrapUp(GitHub root) {
|
||||
GHGist wrapUp(GitHub root) {
|
||||
this.owner = root.getUser(owner);
|
||||
this.root = root;
|
||||
wrapUp();
|
||||
@@ -125,35 +175,62 @@ public class GHGist extends GHObject {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Star.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void star() throws IOException {
|
||||
new Requester(root).method("PUT").to(getApiTailUrl("star"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unstar.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void unstar() throws IOException {
|
||||
new Requester(root).method("DELETE").to(getApiTailUrl("star"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Is starred boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public boolean isStarred() throws IOException {
|
||||
return root.retrieve().asHttpStatusCode(getApiTailUrl("star"))/100==2;
|
||||
return root.retrieve().asHttpStatusCode(getApiTailUrl("star")) / 100 == 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forks this gist into your own.
|
||||
*
|
||||
* @return the gh gist
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHGist fork() throws IOException {
|
||||
return new Requester(root).to(getApiTailUrl("forks"),GHGist.class).wrapUp(root);
|
||||
return new Requester(root).to(getApiTailUrl("forks"), GHGist.class).wrapUp(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* List forks paged iterable.
|
||||
*
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHGist> listForks() {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
getApiTailUrl("forks"),
|
||||
GHGist[].class,
|
||||
item -> item.wrapUp(root) );
|
||||
return root.retrieve().asPagedIterable(getApiTailUrl("forks"), GHGist[].class, item -> item.wrapUp(root));
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this gist.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").to("/gists/" + id);
|
||||
@@ -161,6 +238,10 @@ public class GHGist extends GHObject {
|
||||
|
||||
/**
|
||||
* Updates this gist via a builder.
|
||||
*
|
||||
* @return the gh gist updater
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHGistUpdater update() throws IOException {
|
||||
return new GHGistUpdater(this);
|
||||
@@ -168,8 +249,10 @@ public class GHGist extends GHObject {
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
if (this == o)
|
||||
return true;
|
||||
if (o == null || getClass() != o.getClass())
|
||||
return false;
|
||||
GHGist ghGist = (GHGist) o;
|
||||
return id.equals(ghGist.id);
|
||||
|
||||
|
||||
@@ -8,30 +8,56 @@ import java.util.LinkedHashMap;
|
||||
* Builder pattern for creating a new Gist.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GitHub#createGist()
|
||||
* @see GitHub#createGist() GitHub#createGist()
|
||||
*/
|
||||
public class GHGistBuilder {
|
||||
private final GitHub root;
|
||||
private final Requester req;
|
||||
private final LinkedHashMap<String,Object> files = new LinkedHashMap<String, Object>();
|
||||
private final LinkedHashMap<String, Object> files = new LinkedHashMap<String, Object>();
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh gist builder.
|
||||
*
|
||||
* @param root
|
||||
* the root
|
||||
*/
|
||||
public GHGistBuilder(GitHub root) {
|
||||
this.root = root;
|
||||
req = new Requester(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Description gh gist builder.
|
||||
*
|
||||
* @param desc
|
||||
* the desc
|
||||
* @return the gh gist builder
|
||||
*/
|
||||
public GHGistBuilder description(String desc) {
|
||||
req.with("description",desc);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHGistBuilder public_(boolean v) {
|
||||
req.with("public",v);
|
||||
req.with("description", desc);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new file.
|
||||
* Public gh gist builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh gist builder
|
||||
*/
|
||||
public GHGistBuilder public_(boolean v) {
|
||||
req.with("public", v);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* File gh gist builder.
|
||||
*
|
||||
* @param fileName
|
||||
* the file name
|
||||
* @param content
|
||||
* the content
|
||||
* @return Adds a new file.
|
||||
*/
|
||||
public GHGistBuilder file(String fileName, String content) {
|
||||
files.put(fileName, Collections.singletonMap("content", content));
|
||||
@@ -40,9 +66,13 @@ public class GHGistBuilder {
|
||||
|
||||
/**
|
||||
* Creates a Gist based on the parameters specified thus far.
|
||||
*
|
||||
* @return created Gist
|
||||
* @throws IOException
|
||||
* if Gist cannot be created.
|
||||
*/
|
||||
public GHGist create() throws IOException {
|
||||
req._with("files",files);
|
||||
return req.to("/gists",GHGist.class).wrapUp(root);
|
||||
req.with("files", files);
|
||||
return req.to("/gists", GHGist.class).wrapUp(root);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,23 +4,29 @@ package org.kohsuke.github;
|
||||
* A file inside {@link GHGist}
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHGist#getFile(String)
|
||||
* @see GHGist#getFiles()
|
||||
* @see GHGist#getFile(String) GHGist#getFile(String)
|
||||
* @see GHGist#getFiles() GHGist#getFiles()
|
||||
*/
|
||||
public class GHGistFile {
|
||||
/*package almost final*/ String fileName;
|
||||
/* package almost final */ String fileName;
|
||||
|
||||
private int size;
|
||||
private String raw_url, type, language, content;
|
||||
private boolean truncated;
|
||||
|
||||
|
||||
/**
|
||||
* Gets file name.
|
||||
*
|
||||
* @return the file name
|
||||
*/
|
||||
public String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
|
||||
/**
|
||||
* File size in bytes.
|
||||
*
|
||||
* @return the size
|
||||
*/
|
||||
public int getSize() {
|
||||
return size;
|
||||
@@ -28,6 +34,8 @@ public class GHGistFile {
|
||||
|
||||
/**
|
||||
* URL that serves this file as-is.
|
||||
*
|
||||
* @return the raw url
|
||||
*/
|
||||
public String getRawUrl() {
|
||||
return raw_url;
|
||||
@@ -35,17 +43,26 @@ public class GHGistFile {
|
||||
|
||||
/**
|
||||
* Content type of this Gist, such as "text/plain"
|
||||
*
|
||||
* @return the type
|
||||
*/
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets language.
|
||||
*
|
||||
* @return the language
|
||||
*/
|
||||
public String getLanguage() {
|
||||
return language;
|
||||
}
|
||||
|
||||
/**
|
||||
* Content of this file.
|
||||
*
|
||||
* @return the content
|
||||
*/
|
||||
public String getContent() {
|
||||
return content;
|
||||
@@ -53,6 +70,8 @@ public class GHGistFile {
|
||||
|
||||
/**
|
||||
* (?) indicates if {@link #getContent()} contains a truncated content.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isTruncated() {
|
||||
return truncated;
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.util.LinkedHashMap;
|
||||
public class GHGistUpdater {
|
||||
private final GHGist base;
|
||||
private final Requester builder;
|
||||
LinkedHashMap<String,Object> files;
|
||||
LinkedHashMap<String, Object> files;
|
||||
|
||||
GHGistUpdater(GHGist base) {
|
||||
this.base = base;
|
||||
@@ -21,40 +21,81 @@ public class GHGistUpdater {
|
||||
files = new LinkedHashMap<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add file gh gist updater.
|
||||
*
|
||||
* @param fileName
|
||||
* the file name
|
||||
* @param content
|
||||
* the content
|
||||
* @return the gh gist updater
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHGistUpdater addFile(String fileName, String content) throws IOException {
|
||||
updateFile(fileName, content);
|
||||
return this;
|
||||
}
|
||||
|
||||
// // This method does not work.
|
||||
// public GHGistUpdater deleteFile(String fileName) throws IOException {
|
||||
// files.put(fileName, Collections.singletonMap("filename", null));
|
||||
// return this;
|
||||
// }
|
||||
// // This method does not work.
|
||||
// public GHGistUpdater deleteFile(String fileName) throws IOException {
|
||||
// files.put(fileName, Collections.singletonMap("filename", null));
|
||||
// return this;
|
||||
// }
|
||||
|
||||
public GHGistUpdater renameFile(String fileName, String newFileName) throws IOException
|
||||
{
|
||||
/**
|
||||
* Rename file gh gist updater.
|
||||
*
|
||||
* @param fileName
|
||||
* the file name
|
||||
* @param newFileName
|
||||
* the new file name
|
||||
* @return the gh gist updater
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHGistUpdater renameFile(String fileName, String newFileName) throws IOException {
|
||||
files.put(fileName, Collections.singletonMap("filename", newFileName));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update file gh gist updater.
|
||||
*
|
||||
* @param fileName
|
||||
* the file name
|
||||
* @param content
|
||||
* the content
|
||||
* @return the gh gist updater
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHGistUpdater updateFile(String fileName, String content) throws IOException {
|
||||
files.put(fileName, Collections.singletonMap("content", content));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Description gh gist updater.
|
||||
*
|
||||
* @param desc
|
||||
* the desc
|
||||
* @return the gh gist updater
|
||||
*/
|
||||
public GHGistUpdater description(String desc) {
|
||||
builder.with("description",desc);
|
||||
builder.with("description", desc);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the Gist based on the parameters specified thus far.
|
||||
*
|
||||
* @return the gh gist
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHGist update() throws IOException {
|
||||
builder._with("files", files);
|
||||
return builder
|
||||
.method("PATCH")
|
||||
.to(base.getApiTailUrl(""), GHGist.class).wrap(base.owner);
|
||||
builder.with("files", files);
|
||||
return builder.method("PATCH").to(base.getApiTailUrl(""), GHGist.class).wrap(base.owner);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,38 +11,66 @@ import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* The type GHHook.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD"}, justification = "JSON API")
|
||||
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
public abstract class GHHook extends GHObject {
|
||||
String name;
|
||||
List<String> events;
|
||||
boolean active;
|
||||
Map<String,String> config;
|
||||
Map<String, String> config;
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets events.
|
||||
*
|
||||
* @return the events
|
||||
*/
|
||||
public EnumSet<GHEvent> getEvents() {
|
||||
EnumSet<GHEvent> s = EnumSet.noneOf(GHEvent.class);
|
||||
for (String e : events) {
|
||||
if (e.equals("*")) s.add(GHEvent.ALL);
|
||||
else s.add(Enum.valueOf(GHEvent.class, e.toUpperCase(Locale.ENGLISH)));
|
||||
if (e.equals("*"))
|
||||
s.add(GHEvent.ALL);
|
||||
else
|
||||
s.add(Enum.valueOf(GHEvent.class, e.toUpperCase(Locale.ENGLISH)));
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is active boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isActive() {
|
||||
return active;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets config.
|
||||
*
|
||||
* @return the config
|
||||
*/
|
||||
public Map<String, String> getConfig() {
|
||||
return Collections.unmodifiableMap(config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ping.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @see <a href="https://developer.github.com/v3/repos/hooks/#ping-a-hook">Ping hook</a>
|
||||
*/
|
||||
public void ping() throws IOException {
|
||||
@@ -51,6 +79,9 @@ public abstract class GHHook extends GHObject {
|
||||
|
||||
/**
|
||||
* Deletes this hook.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(getRoot()).method("DELETE").to(getApiRoute());
|
||||
|
||||
@@ -16,37 +16,69 @@ class GHHooks {
|
||||
private final GitHub root;
|
||||
|
||||
private Context(GitHub root) {
|
||||
this.root = root;
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets hooks.
|
||||
*
|
||||
* @return the hooks
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHHook> getHooks() throws IOException {
|
||||
|
||||
GHHook [] hookArray = root.retrieve().to(collection(),collectionClass()); // jdk/eclipse bug requires this to be on separate line
|
||||
|
||||
GHHook[] hookArray = root.retrieve().to(collection(), collectionClass()); // jdk/eclipse bug requires this
|
||||
// to be on separate line
|
||||
List<GHHook> list = new ArrayList<GHHook>(Arrays.asList(hookArray));
|
||||
for (GHHook h : list)
|
||||
wrap(h);
|
||||
wrap(h);
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets hook.
|
||||
*
|
||||
* @param id
|
||||
* the id
|
||||
* @return the hook
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
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 {
|
||||
/**
|
||||
* Create hook gh hook.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @param config
|
||||
* the config
|
||||
* @param events
|
||||
* the events
|
||||
* @param active
|
||||
* the active
|
||||
* @return the gh hook
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
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.symbol());
|
||||
if (events != null) {
|
||||
ea = new ArrayList<String>();
|
||||
for (GHEvent e : events)
|
||||
ea.add(e.symbol());
|
||||
}
|
||||
|
||||
GHHook hook = new Requester(root)
|
||||
.with("name", name)
|
||||
.with("active", active)
|
||||
._with("config", config)
|
||||
._with("events", ea)
|
||||
.to(collection(), clazz());
|
||||
GHHook hook = new Requester(root).with("name", name)
|
||||
.with("active", active)
|
||||
.with("config", config)
|
||||
.with("events", ea)
|
||||
.to(collection(), clazz());
|
||||
|
||||
return wrap(hook);
|
||||
}
|
||||
@@ -87,7 +119,7 @@ class GHHooks {
|
||||
|
||||
@Override
|
||||
GHHook wrap(GHHook hook) {
|
||||
return ((GHRepoHook)hook).wrap(repository);
|
||||
return ((GHRepoHook) hook).wrap(repository);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,15 +148,15 @@ class GHHooks {
|
||||
|
||||
@Override
|
||||
GHHook wrap(GHHook hook) {
|
||||
return ((GHOrgHook)hook).wrap(organization);
|
||||
return ((GHOrgHook) hook).wrap(organization);
|
||||
}
|
||||
}
|
||||
|
||||
static Context repoContext(GHRepository repository, GHUser owner) {
|
||||
return new RepoContext(repository, owner);
|
||||
}
|
||||
static Context repoContext(GHRepository repository, GHUser owner) {
|
||||
return new RepoContext(repository, owner);
|
||||
}
|
||||
|
||||
static Context orgContext(GHOrganization organization) {
|
||||
return new OrgContext(organization);
|
||||
}
|
||||
static Context orgContext(GHOrganization organization) {
|
||||
return new OrgContext(organization);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1,41 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
|
||||
/**
|
||||
* Request/responce contains useful metadata.
|
||||
* Custom exception allows store info for next diagnostics.
|
||||
* Request/responce contains useful metadata. Custom exception allows store info for next diagnostics.
|
||||
*
|
||||
* @author Kanstantsin Shautsou
|
||||
*/
|
||||
public class GHIOException extends IOException {
|
||||
protected Map<String, List<String>> responseHeaderFields;
|
||||
|
||||
/**
|
||||
* Instantiates a new Ghio exception.
|
||||
*/
|
||||
public GHIOException() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Ghio exception.
|
||||
*
|
||||
* @param message
|
||||
* the message
|
||||
*/
|
||||
public GHIOException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets response header fields.
|
||||
*
|
||||
* @return the response header fields
|
||||
*/
|
||||
@CheckForNull
|
||||
public Map<String, List<String>> getResponseHeaderFields() {
|
||||
return responseHeaderFields;
|
||||
|
||||
@@ -6,13 +6,17 @@ import java.io.IOException;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* @see GitHub#getMyInvitations()
|
||||
* @see GHRepository#listInvitations()
|
||||
* The type GHInvitation.
|
||||
*
|
||||
* @see GitHub#getMyInvitations() GitHub#getMyInvitations()
|
||||
* @see GHRepository#listInvitations() GHRepository#listInvitations()
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD", "UUF_UNUSED_FIELD"}, justification = "JSON API")
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"UUF_UNUSED_FIELD" },
|
||||
justification = "JSON API")
|
||||
public class GHInvitation extends GHObject {
|
||||
/*package almost final*/ GitHub root;
|
||||
/* package almost final */ GitHub root;
|
||||
|
||||
private int id;
|
||||
private GHRepository repository;
|
||||
@@ -20,13 +24,16 @@ public class GHInvitation extends GHObject {
|
||||
private String permissions;
|
||||
private String html_url;
|
||||
|
||||
/*package*/ GHInvitation wrapUp(GitHub root) {
|
||||
GHInvitation wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Accept a repository invitation.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void accept() throws IOException {
|
||||
root.retrieve().method("PATCH").to("/user/repository_invitations/" + id);
|
||||
@@ -34,6 +41,9 @@ public class GHInvitation extends GHObject {
|
||||
|
||||
/**
|
||||
* Decline a repository invitation.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void decline() throws IOException {
|
||||
root.retrieve().method("DELETE").to("/user/repository_invitations/" + id);
|
||||
|
||||
@@ -24,10 +24,9 @@
|
||||
|
||||
package org.kohsuke.github;
|
||||
|
||||
import static org.kohsuke.github.Previews.SQUIRREL_GIRL;
|
||||
|
||||
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
@@ -35,28 +34,28 @@ import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.kohsuke.github.Previews.SQUIRREL_GIRL;
|
||||
|
||||
/**
|
||||
* Represents an issue on GitHub.
|
||||
*
|
||||
* @author Eric Maupin
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#getIssue(int)
|
||||
* @see GitHub#searchIssues()
|
||||
* @see GHRepository#getIssue(int) GHRepository#getIssue(int)
|
||||
* @see GitHub#searchIssues() GitHub#searchIssues()
|
||||
* @see GHIssueSearchBuilder
|
||||
*/
|
||||
public class GHIssue extends GHObject implements Reactable{
|
||||
public class GHIssue extends GHObject implements Reactable {
|
||||
private static final String ASSIGNEES = "assignees";
|
||||
|
||||
GitHub root;
|
||||
GHRepository owner;
|
||||
|
||||
|
||||
// API v3
|
||||
protected GHUser assignee; // not sure what this field is now that 'assignees' exist
|
||||
protected GHUser assignee; // not sure what this field is now that 'assignees' exist
|
||||
protected GHUser[] assignees;
|
||||
protected String state;
|
||||
protected int number;
|
||||
@@ -74,27 +73,34 @@ public class GHIssue extends GHObject implements Reactable{
|
||||
protected boolean locked;
|
||||
|
||||
/**
|
||||
* The type Label.
|
||||
*
|
||||
* @deprecated use {@link GHLabel}
|
||||
*/
|
||||
public static class Label extends GHLabel {
|
||||
}
|
||||
|
||||
/*package*/ GHIssue wrap(GHRepository owner) {
|
||||
|
||||
GHIssue wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
if(milestone != null) milestone.wrap(owner);
|
||||
if (milestone != null)
|
||||
milestone.wrap(owner);
|
||||
return wrap(owner.root);
|
||||
}
|
||||
|
||||
/*package*/ GHIssue wrap(GitHub root) {
|
||||
GHIssue wrap(GitHub root) {
|
||||
this.root = root;
|
||||
if(assignee != null) assignee.wrapUp(root);
|
||||
if(assignees!=null) GHUser.wrap(assignees,root);
|
||||
if(user != null) user.wrapUp(root);
|
||||
if(closed_by != null) closed_by.wrapUp(root);
|
||||
if (assignee != null)
|
||||
assignee.wrapUp(root);
|
||||
if (assignees != null)
|
||||
GHUser.wrap(assignees, root);
|
||||
if (user != null)
|
||||
user.wrapUp(root);
|
||||
if (closed_by != null)
|
||||
closed_by.wrapUp(root);
|
||||
return this;
|
||||
}
|
||||
|
||||
/*package*/ static GHIssue[] wrap(GHIssue[] issues, GHRepository owner) {
|
||||
static GHIssue[] wrap(GHIssue[] issues, GHRepository owner) {
|
||||
for (GHIssue i : issues)
|
||||
i.wrap(owner);
|
||||
return issues;
|
||||
@@ -102,6 +108,8 @@ public class GHIssue extends GHObject implements Reactable{
|
||||
|
||||
/**
|
||||
* Repository to which the issue belongs.
|
||||
*
|
||||
* @return the repository
|
||||
*/
|
||||
public GHRepository getRepository() {
|
||||
return owner;
|
||||
@@ -109,6 +117,8 @@ public class GHIssue extends GHObject implements Reactable{
|
||||
|
||||
/**
|
||||
* The description of this pull request.
|
||||
*
|
||||
* @return the body
|
||||
*/
|
||||
public String getBody() {
|
||||
return body;
|
||||
@@ -116,76 +126,128 @@ public class GHIssue extends GHObject implements Reactable{
|
||||
|
||||
/**
|
||||
* ID.
|
||||
*
|
||||
* @return the number
|
||||
*/
|
||||
public int getNumber() {
|
||||
return number;
|
||||
}
|
||||
|
||||
/**
|
||||
* The HTML page of this issue,
|
||||
* like https://github.com/jenkinsci/jenkins/issues/100
|
||||
* The HTML page of this issue, like https://github.com/jenkinsci/jenkins/issues/100
|
||||
*/
|
||||
public URL getHtmlUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets title.
|
||||
*
|
||||
* @return the title
|
||||
*/
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is locked boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isLocked() {
|
||||
return locked;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets state.
|
||||
*
|
||||
* @return the state
|
||||
*/
|
||||
public GHIssueState getState() {
|
||||
return Enum.valueOf(GHIssueState.class, state.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets labels.
|
||||
*
|
||||
* @return the labels
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public Collection<GHLabel> getLabels() throws IOException {
|
||||
if(labels == null){
|
||||
if (labels == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return Collections.<GHLabel>unmodifiableList(labels);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets closed at.
|
||||
*
|
||||
* @return the closed at
|
||||
*/
|
||||
public Date getClosedAt() {
|
||||
return GitHub.parseDate(closed_at);
|
||||
}
|
||||
|
||||
public URL getApiURL(){
|
||||
/**
|
||||
* Gets api url.
|
||||
*
|
||||
* @return the api url
|
||||
*/
|
||||
public URL getApiURL() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lock.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void lock() throws IOException {
|
||||
new Requester(root).method("PUT").to(getApiRoute()+"/lock");
|
||||
new Requester(root).method("PUT").to(getApiRoute() + "/lock");
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlock.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void unlock() throws IOException {
|
||||
new Requester(root).method("PUT").to(getApiRoute()+"/lock");
|
||||
new Requester(root).method("PUT").to(getApiRoute() + "/lock");
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the issue by adding a comment.
|
||||
*
|
||||
* @return
|
||||
* Newly posted comment.
|
||||
* @param message
|
||||
* the message
|
||||
* @return Newly posted comment.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
@WithBridgeMethods(void.class)
|
||||
public GHIssueComment comment(String message) throws IOException {
|
||||
GHIssueComment r = new Requester(root).with("body",message).to(getIssuesApiRoute() + "/comments", GHIssueComment.class);
|
||||
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 {
|
||||
new Requester(root)._with(key, value).method("PATCH").to(getApiRoute());
|
||||
new Requester(root).with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
|
||||
private void editIssue(String key, Object value) throws IOException {
|
||||
new Requester(root)._with(key, value).method("PATCH").to(getIssuesApiRoute());
|
||||
new Requester(root).with(key, value).method("PATCH").to(getIssuesApiRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes this issue.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void close() throws IOException {
|
||||
edit("state", "closed");
|
||||
@@ -193,44 +255,106 @@ public class GHIssue extends GHObject implements Reactable{
|
||||
|
||||
/**
|
||||
* Reopens this issue.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void reopen() throws IOException {
|
||||
edit("state", "open");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets title.
|
||||
*
|
||||
* @param title
|
||||
* the title
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setTitle(String title) throws IOException {
|
||||
edit("title",title);
|
||||
edit("title", title);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets body.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setBody(String body) throws IOException {
|
||||
edit("body",body);
|
||||
edit("body", body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets milestone.
|
||||
*
|
||||
* @param milestone
|
||||
* the milestone
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setMilestone(GHMilestone milestone) throws IOException {
|
||||
edit("milestone",milestone.getNumber());
|
||||
edit("milestone", milestone.getNumber());
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign to.
|
||||
*
|
||||
* @param user
|
||||
* the user
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void assignTo(GHUser user) throws IOException {
|
||||
setAssignees(user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets labels.
|
||||
*
|
||||
* @param labels
|
||||
* the labels
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setLabels(String... labels) throws IOException {
|
||||
editIssue("labels",labels);
|
||||
editIssue("labels", labels);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds labels to the issue.
|
||||
*
|
||||
* @param names Names of the label
|
||||
* @param names
|
||||
* Names of the label
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void addLabels(String... names) throws IOException {
|
||||
_addLabels(Arrays.asList(names));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add labels.
|
||||
*
|
||||
* @param labels
|
||||
* the labels
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void addLabels(GHLabel... labels) throws IOException {
|
||||
addLabels(Arrays.asList(labels));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add labels.
|
||||
*
|
||||
* @param labels
|
||||
* the labels
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void addLabels(Collection<GHLabel> labels) throws IOException {
|
||||
_addLabels(GHLabel.toNames(labels));
|
||||
}
|
||||
@@ -251,18 +375,37 @@ public class GHIssue extends GHObject implements Reactable{
|
||||
|
||||
/**
|
||||
* Remove a given label by name from this issue.
|
||||
*
|
||||
* @param names
|
||||
* the names
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void removeLabels(String... names) throws IOException {
|
||||
_removeLabels(Arrays.asList(names));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see #removeLabels(String...)
|
||||
* Remove labels.
|
||||
*
|
||||
* @param labels
|
||||
* the labels
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @see #removeLabels(String...) #removeLabels(String...)
|
||||
*/
|
||||
public void removeLabels(GHLabel... labels) throws IOException {
|
||||
removeLabels(Arrays.asList(labels));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove labels.
|
||||
*
|
||||
* @param labels
|
||||
* the labels
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void removeLabels(Collection<GHLabel> labels) throws IOException {
|
||||
_removeLabels(GHLabel.toNames(labels));
|
||||
}
|
||||
@@ -281,83 +424,170 @@ public class GHIssue extends GHObject implements Reactable{
|
||||
|
||||
/**
|
||||
* Obtains all the comments associated with this issue.
|
||||
*
|
||||
* @see #listComments()
|
||||
*
|
||||
* @return the comments
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @see #listComments() #listComments()
|
||||
*/
|
||||
public List<GHIssueComment> getComments() throws IOException {
|
||||
return listComments().asList();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Obtains all the comments associated with this issue.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHIssueComment> listComments() throws IOException {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
getIssuesApiRoute() + "/comments",
|
||||
GHIssueComment[].class,
|
||||
item -> item.wrapUp(GHIssue.this) );
|
||||
.asPagedIterable(getIssuesApiRoute() + "/comments",
|
||||
GHIssueComment[].class,
|
||||
item -> item.wrapUp(GHIssue.this));
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHReaction createReaction(ReactionContent content) throws IOException {
|
||||
return new Requester(owner.root)
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
return new Requester(owner.root).withPreview(SQUIRREL_GIRL)
|
||||
.with("content", content.getContent())
|
||||
.to(getApiRoute()+"/reactions", GHReaction.class).wrap(root);
|
||||
.to(getApiRoute() + "/reactions", GHReaction.class)
|
||||
.wrap(root);
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public PagedIterable<GHReaction> listReactions() {
|
||||
return owner.root.retrieve().withPreview(SQUIRREL_GIRL)
|
||||
.asPagedIterable(
|
||||
getApiRoute()+"/reactions",
|
||||
GHReaction[].class,
|
||||
item -> item.wrap(owner.root) );
|
||||
return owner.root.retrieve()
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
.asPagedIterable(getApiRoute() + "/reactions", GHReaction[].class, item -> item.wrap(owner.root));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add assignees.
|
||||
*
|
||||
* @param assignees
|
||||
* the assignees
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void addAssignees(GHUser... assignees) throws IOException {
|
||||
addAssignees(Arrays.asList(assignees));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add assignees.
|
||||
*
|
||||
* @param assignees
|
||||
* the assignees
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void addAssignees(Collection<GHUser> assignees) throws IOException {
|
||||
root.retrieve().method("POST").withLogins(ASSIGNEES,assignees).to(getIssuesApiRoute()+"/assignees",this);
|
||||
root.retrieve()
|
||||
.method("POST")
|
||||
.with(ASSIGNEES, getLogins(assignees))
|
||||
.to(getIssuesApiRoute() + "/assignees", this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets assignees.
|
||||
*
|
||||
* @param assignees
|
||||
* the assignees
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setAssignees(GHUser... assignees) throws IOException {
|
||||
setAssignees(Arrays.asList(assignees));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets assignees.
|
||||
*
|
||||
* @param assignees
|
||||
* the assignees
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setAssignees(Collection<GHUser> assignees) throws IOException {
|
||||
new Requester(root).withLogins(ASSIGNEES, assignees).method("PATCH").to(getIssuesApiRoute());
|
||||
new Requester(root).with(ASSIGNEES, getLogins(assignees)).method("PATCH").to(getIssuesApiRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove assignees.
|
||||
*
|
||||
* @param assignees
|
||||
* the assignees
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void removeAssignees(GHUser... assignees) throws IOException {
|
||||
removeAssignees(Arrays.asList(assignees));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove assignees.
|
||||
*
|
||||
* @param assignees
|
||||
* the assignees
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void removeAssignees(Collection<GHUser> assignees) throws IOException {
|
||||
root.retrieve().method("DELETE").withLogins(ASSIGNEES,assignees).inBody().to(getIssuesApiRoute()+"/assignees",this);
|
||||
root.retrieve()
|
||||
.method("DELETE")
|
||||
.with(ASSIGNEES, getLogins(assignees))
|
||||
.inBody()
|
||||
.to(getIssuesApiRoute() + "/assignees", this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets api route.
|
||||
*
|
||||
* @return the api route
|
||||
*/
|
||||
protected String getApiRoute() {
|
||||
return getIssuesApiRoute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets issues api route.
|
||||
*
|
||||
* @return the issues api route
|
||||
*/
|
||||
protected String getIssuesApiRoute() {
|
||||
return "/repos/"+owner.getOwnerName()+"/"+owner.getName()+"/issues/"+number;
|
||||
return "/repos/" + owner.getOwnerName() + "/" + owner.getName() + "/issues/" + number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets assignee.
|
||||
*
|
||||
* @return the assignee
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getAssignee() throws IOException {
|
||||
return root.intern(assignee);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets assignees.
|
||||
*
|
||||
* @return the assignees
|
||||
*/
|
||||
public List<GHUser> getAssignees() {
|
||||
return Collections.unmodifiableList(Arrays.asList(assignees));
|
||||
}
|
||||
|
||||
/**
|
||||
* User who submitted the issue.
|
||||
*
|
||||
* @return the user
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getUser() throws IOException {
|
||||
return root.intern(user);
|
||||
@@ -367,67 +597,115 @@ public class GHIssue extends GHObject implements Reactable{
|
||||
* Reports who has closed the issue.
|
||||
*
|
||||
* <p>
|
||||
* Note that GitHub doesn't always seem to report this information
|
||||
* even for an issue that's already closed. See
|
||||
* Note that GitHub doesn't always seem to report this information even for an issue that's already closed. See
|
||||
* https://github.com/kohsuke/github-api/issues/60.
|
||||
*
|
||||
* @return the closed by
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getClosedBy() throws IOException {
|
||||
if(!"closed".equals(state)) return null;
|
||||
if (!"closed".equals(state))
|
||||
return null;
|
||||
|
||||
//TODO
|
||||
// TODO
|
||||
/*
|
||||
if (closed_by==null) {
|
||||
closed_by = owner.getIssue(number).getClosed_by();
|
||||
}
|
||||
*/
|
||||
* if (closed_by==null) { closed_by = owner.getIssue(number).getClosed_by(); }
|
||||
*/
|
||||
return root.intern(closed_by);
|
||||
}
|
||||
|
||||
public int getCommentsCount(){
|
||||
|
||||
/**
|
||||
* Gets comments count.
|
||||
*
|
||||
* @return the comments count
|
||||
*/
|
||||
public int getCommentsCount() {
|
||||
return comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns non-null if this issue is a shadow of a pull request.
|
||||
*
|
||||
* @return the pull request
|
||||
*/
|
||||
public PullRequest getPullRequest() {
|
||||
return pull_request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is pull request boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isPullRequest() {
|
||||
return pull_request!=null;
|
||||
return pull_request != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets milestone.
|
||||
*
|
||||
* @return the milestone
|
||||
*/
|
||||
public GHMilestone getMilestone() {
|
||||
return milestone;
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD"},
|
||||
justification = "JSON API")
|
||||
public static class PullRequest{
|
||||
/**
|
||||
* The type PullRequest.
|
||||
*/
|
||||
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
public static class PullRequest {
|
||||
private String diff_url, patch_url, html_url;
|
||||
|
||||
|
||||
/**
|
||||
* Gets diff url.
|
||||
*
|
||||
* @return the diff url
|
||||
*/
|
||||
public URL getDiffUrl() {
|
||||
return GitHub.parseURL(diff_url);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets patch url.
|
||||
*
|
||||
* @return the patch url
|
||||
*/
|
||||
public URL getPatchUrl() {
|
||||
return GitHub.parseURL(patch_url);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
}
|
||||
|
||||
protected static List<String> getLogins(Collection<GHUser> users) {
|
||||
List<String> names = new ArrayList<String>(users.size());
|
||||
for (GHUser a : users) {
|
||||
names.add(a.getLogin());
|
||||
}
|
||||
return names;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists events for this issue.
|
||||
* See https://developer.github.com/v3/issues/events/
|
||||
* Lists events for this issue. See https://developer.github.com/v3/issues/events/
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHIssueEvent> listEvents() throws IOException {
|
||||
return root.retrieve().asPagedIterable(
|
||||
owner.getApiTailUrl(String.format("/issues/%s/events", number)),
|
||||
GHIssueEvent[].class,
|
||||
item -> item.wrapUp(GHIssue.this) );
|
||||
return root.retrieve()
|
||||
.asPagedIterable(owner.getApiTailUrl(String.format("/issues/%s/events", number)),
|
||||
GHIssueEvent[].class,
|
||||
item -> item.wrapUp(GHIssue.this));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* The type GHIssueBuilder.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GHIssueBuilder {
|
||||
@@ -16,45 +18,84 @@ public class GHIssueBuilder {
|
||||
GHIssueBuilder(GHRepository repo, String title) {
|
||||
this.repo = repo;
|
||||
this.builder = new Requester(repo.root);
|
||||
builder.with("title",title);
|
||||
builder.with("title", title);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the main text of an issue, which is arbitrary multi-line text.
|
||||
*
|
||||
* @param str
|
||||
* the str
|
||||
* @return the gh issue builder
|
||||
*/
|
||||
public GHIssueBuilder body(String str) {
|
||||
builder.with("body",str);
|
||||
builder.with("body", str);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assignee gh issue builder.
|
||||
*
|
||||
* @param user
|
||||
* the user
|
||||
* @return the gh issue builder
|
||||
*/
|
||||
public GHIssueBuilder assignee(GHUser user) {
|
||||
if (user!=null)
|
||||
if (user != null)
|
||||
assignees.add(user.getLogin());
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assignee gh issue builder.
|
||||
*
|
||||
* @param user
|
||||
* the user
|
||||
* @return the gh issue builder
|
||||
*/
|
||||
public GHIssueBuilder assignee(String user) {
|
||||
if (user!=null)
|
||||
if (user != null)
|
||||
assignees.add(user);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Milestone gh issue builder.
|
||||
*
|
||||
* @param milestone
|
||||
* the milestone
|
||||
* @return the gh issue builder
|
||||
*/
|
||||
public GHIssueBuilder milestone(GHMilestone milestone) {
|
||||
if (milestone!=null)
|
||||
builder.with("milestone",milestone.getNumber());
|
||||
if (milestone != null)
|
||||
builder.with("milestone", milestone.getNumber());
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Label gh issue builder.
|
||||
*
|
||||
* @param label
|
||||
* the label
|
||||
* @return the gh issue builder
|
||||
*/
|
||||
public GHIssueBuilder label(String label) {
|
||||
if (label!=null)
|
||||
if (label != null)
|
||||
labels.add(label);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new issue.
|
||||
*
|
||||
* @return the gh issue
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHIssue create() throws IOException {
|
||||
return builder.with("labels",labels).with("assignees",assignees).to(repo.getApiTailUrl("issues"),GHIssue.class).wrap(repo);
|
||||
return builder.with("labels", labels)
|
||||
.with("assignees", assignees)
|
||||
.to(repo.getApiTailUrl("issues"), GHIssue.class)
|
||||
.wrap(repo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,8 +32,8 @@ import static org.kohsuke.github.Previews.*;
|
||||
* Comment to the issue
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHIssue#comment(String)
|
||||
* @see GHIssue#listComments()
|
||||
* @see GHIssue#comment(String) GHIssue#comment(String)
|
||||
* @see GHIssue#listComments() GHIssue#listComments()
|
||||
*/
|
||||
public class GHIssueComment extends GHObject implements Reactable {
|
||||
GHIssue owner;
|
||||
@@ -41,13 +41,15 @@ public class GHIssueComment extends GHObject implements Reactable {
|
||||
private String body, gravatar_id, html_url, author_association;
|
||||
private GHUser user; // not fully populated. beware.
|
||||
|
||||
/*package*/ GHIssueComment wrapUp(GHIssue owner) {
|
||||
GHIssueComment wrapUp(GHIssue owner) {
|
||||
this.owner = owner;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the issue to which this comment is associated.
|
||||
*
|
||||
* @return the parent
|
||||
*/
|
||||
public GHIssue getParent() {
|
||||
return owner;
|
||||
@@ -55,6 +57,8 @@ public class GHIssueComment extends GHObject implements Reactable {
|
||||
|
||||
/**
|
||||
* The comment itself.
|
||||
*
|
||||
* @return the body
|
||||
*/
|
||||
public String getBody() {
|
||||
return body;
|
||||
@@ -62,6 +66,8 @@ public class GHIssueComment extends GHObject implements Reactable {
|
||||
|
||||
/**
|
||||
* Gets the ID of the user who posted this comment.
|
||||
*
|
||||
* @return the user name
|
||||
*/
|
||||
@Deprecated
|
||||
public String getUserName() {
|
||||
@@ -70,22 +76,36 @@ public class GHIssueComment extends GHObject implements Reactable {
|
||||
|
||||
/**
|
||||
* Gets the user who posted this comment.
|
||||
*
|
||||
* @return the user
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getUser() throws IOException {
|
||||
return owner == null || owner.root.isOffline() ? user : owner.root.getUser(user.getLogin());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public URL getHtmlUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets author association.
|
||||
*
|
||||
* @return the author association
|
||||
*/
|
||||
public GHCommentAuthorAssociation getAuthorAssociation() {
|
||||
return GHCommentAuthorAssociation.valueOf(author_association);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Updates the body of the issue comment.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void update(String body) throws IOException {
|
||||
new Requester(owner.root).with("body", body).method("PATCH").to(getApiRoute(), GHIssueComment.class);
|
||||
@@ -94,30 +114,33 @@ public class GHIssueComment extends GHObject implements Reactable {
|
||||
|
||||
/**
|
||||
* Deletes this issue comment.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(owner.root).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHReaction createReaction(ReactionContent content) throws IOException {
|
||||
return new Requester(owner.root)
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
return new Requester(owner.root).withPreview(SQUIRREL_GIRL)
|
||||
.with("content", content.getContent())
|
||||
.to(getApiRoute()+"/reactions", GHReaction.class).wrap(owner.root);
|
||||
.to(getApiRoute() + "/reactions", GHReaction.class)
|
||||
.wrap(owner.root);
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public PagedIterable<GHReaction> listReactions() {
|
||||
return owner.root.retrieve()
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
.asPagedIterable(
|
||||
getApiRoute()+"/reactions",
|
||||
GHReaction[].class,
|
||||
item -> item.wrap(owner.root) );
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
.asPagedIterable(getApiRoute() + "/reactions", GHReaction[].class, item -> item.wrap(owner.root));
|
||||
}
|
||||
|
||||
private String getApiRoute() {
|
||||
return "/repos/"+owner.getRepository().getOwnerName()+"/"+owner.getRepository().getName()+"/issues/comments/" + id;
|
||||
return "/repos/" + owner.getRepository().getOwnerName() + "/" + owner.getRepository().getName()
|
||||
+ "/issues/comments/" + id;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@ package org.kohsuke.github;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* The type GHIssueEvent.
|
||||
*
|
||||
* @author Martin van Zijl
|
||||
*/
|
||||
public class GHIssueEvent {
|
||||
@@ -19,42 +21,92 @@ public class GHIssueEvent {
|
||||
|
||||
private GHIssue issue;
|
||||
|
||||
/**
|
||||
* Gets id.
|
||||
*
|
||||
* @return the id
|
||||
*/
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets node id.
|
||||
*
|
||||
* @return the node id
|
||||
*/
|
||||
public String getNodeId() {
|
||||
return node_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets actor.
|
||||
*
|
||||
* @return the actor
|
||||
*/
|
||||
public GHUser getActor() {
|
||||
return actor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets event.
|
||||
*
|
||||
* @return the event
|
||||
*/
|
||||
public String getEvent() {
|
||||
return event;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets commit id.
|
||||
*
|
||||
* @return the commit id
|
||||
*/
|
||||
public String getCommitId() {
|
||||
return commit_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets commit url.
|
||||
*
|
||||
* @return the commit url
|
||||
*/
|
||||
public String getCommitUrl() {
|
||||
return commit_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets created at.
|
||||
*
|
||||
* @return the created at
|
||||
*/
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets issue.
|
||||
*
|
||||
* @return the issue
|
||||
*/
|
||||
public GHIssue getIssue() {
|
||||
return issue;
|
||||
}
|
||||
|
||||
@@ -4,11 +4,11 @@ package org.kohsuke.github;
|
||||
* Search issues.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GitHub#searchIssues()
|
||||
* @see GitHub#searchIssues() GitHub#searchIssues()
|
||||
*/
|
||||
public class GHIssueSearchBuilder extends GHSearchBuilder<GHIssue> {
|
||||
/*package*/ GHIssueSearchBuilder(GitHub root) {
|
||||
super(root,IssueSearchResult.class);
|
||||
GHIssueSearchBuilder(GitHub root) {
|
||||
super(root, IssueSearchResult.class);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -19,43 +19,91 @@ public class GHIssueSearchBuilder extends GHSearchBuilder<GHIssue> {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mentions gh issue search builder.
|
||||
*
|
||||
* @param u
|
||||
* the u
|
||||
* @return the gh issue search builder
|
||||
*/
|
||||
public GHIssueSearchBuilder mentions(GHUser u) {
|
||||
return mentions(u.getLogin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Mentions gh issue search builder.
|
||||
*
|
||||
* @param login
|
||||
* the login
|
||||
* @return the gh issue search builder
|
||||
*/
|
||||
public GHIssueSearchBuilder mentions(String login) {
|
||||
return q("mentions:"+login);
|
||||
return q("mentions:" + login);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is open gh issue search builder.
|
||||
*
|
||||
* @return the gh issue search builder
|
||||
*/
|
||||
public GHIssueSearchBuilder isOpen() {
|
||||
return q("is:open");
|
||||
}
|
||||
|
||||
/**
|
||||
* Is closed gh issue search builder.
|
||||
*
|
||||
* @return the gh issue search builder
|
||||
*/
|
||||
public GHIssueSearchBuilder isClosed() {
|
||||
return q("is:closed");
|
||||
}
|
||||
|
||||
/**
|
||||
* Is merged gh issue search builder.
|
||||
*
|
||||
* @return the gh issue search builder
|
||||
*/
|
||||
public GHIssueSearchBuilder isMerged() {
|
||||
return q("is:merged");
|
||||
}
|
||||
|
||||
/**
|
||||
* Order gh issue search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh issue search builder
|
||||
*/
|
||||
public GHIssueSearchBuilder order(GHDirection v) {
|
||||
req.with("order",v);
|
||||
req.with("order", v);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort gh issue search builder.
|
||||
*
|
||||
* @param sort
|
||||
* the sort
|
||||
* @return the gh issue search builder
|
||||
*/
|
||||
public GHIssueSearchBuilder sort(Sort sort) {
|
||||
req.with("sort",sort);
|
||||
req.with("sort", sort);
|
||||
return this;
|
||||
}
|
||||
|
||||
public enum Sort { COMMENTS, CREATED, UPDATED }
|
||||
/**
|
||||
* The enum Sort.
|
||||
*/
|
||||
public enum Sort {
|
||||
COMMENTS, CREATED, UPDATED
|
||||
}
|
||||
|
||||
private static class IssueSearchResult extends SearchResult<GHIssue> {
|
||||
private GHIssue[] items;
|
||||
|
||||
@Override
|
||||
/*package*/ GHIssue[] getItems(GitHub root) {
|
||||
GHIssue[] getItems(GitHub root) {
|
||||
for (GHIssue i : items)
|
||||
i.wrap(root);
|
||||
return items;
|
||||
|
||||
@@ -25,10 +25,10 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
* @see GHPullRequestQueryBuilder#state(GHIssueState)
|
||||
* The enum GHIssueState.
|
||||
*
|
||||
* @see GHPullRequestQueryBuilder#state(GHIssueState) GHPullRequestQueryBuilder#state(GHIssueState)
|
||||
*/
|
||||
public enum GHIssueState {
|
||||
OPEN,
|
||||
CLOSED,
|
||||
ALL
|
||||
OPEN, CLOSED, ALL
|
||||
}
|
||||
@@ -10,45 +10,72 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
*/
|
||||
@SuppressFBWarnings(value = "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", justification = "JSON API")
|
||||
public class GHKey {
|
||||
/*package almost final*/ GitHub root;
|
||||
/* package almost final */ GitHub root;
|
||||
|
||||
protected String url, key, title;
|
||||
protected boolean verified;
|
||||
protected int id;
|
||||
|
||||
/**
|
||||
* Gets id.
|
||||
*
|
||||
* @return the id
|
||||
*/
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets key.
|
||||
*
|
||||
* @return the key
|
||||
*/
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets title.
|
||||
*
|
||||
* @return the title
|
||||
*/
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Something like "https://api.github.com/user/keys/73593"
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Is verified boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isVerified() {
|
||||
return verified;
|
||||
}
|
||||
|
||||
/*package*/ GHKey wrap(GitHub root) {
|
||||
GHKey wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return new ToStringBuilder(this).append("title",title).append("id",id).append("key",key).toString();
|
||||
return new ToStringBuilder(this).append("title", title).append("id", id).append("key", key).toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,25 +7,40 @@ import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.kohsuke.github.Previews.SYMMETRA;
|
||||
|
||||
/**
|
||||
* The type GHLabel.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHIssue#getLabels()
|
||||
* @see GHRepository#listLabels()
|
||||
* @see GHIssue#getLabels() GHIssue#getLabels()
|
||||
* @see GHRepository#listLabels() GHRepository#listLabels()
|
||||
*/
|
||||
public class GHLabel {
|
||||
private String url, name, color, description;
|
||||
private GHRepository repo;
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Color code without leading '#', such as 'f29513'
|
||||
*
|
||||
* @return the color
|
||||
*/
|
||||
public String getColor() {
|
||||
return color;
|
||||
@@ -33,27 +48,41 @@ public class GHLabel {
|
||||
|
||||
/**
|
||||
* Purpose of Label
|
||||
*
|
||||
* @return the description
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/*package*/ GHLabel wrapUp(GHRepository repo) {
|
||||
GHLabel wrapUp(GHRepository repo) {
|
||||
this.repo = repo;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
repo.root.retrieve().method("DELETE").to(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets color.
|
||||
*
|
||||
* @param newColor
|
||||
* 6-letter hex color code, like "f29513"
|
||||
* 6-letter hex color code, like "f29513"
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setColor(String newColor) throws IOException {
|
||||
repo.root.retrieve().method("PATCH")
|
||||
repo.root.retrieve()
|
||||
.method("PATCH")
|
||||
.withPreview(SYMMETRA)
|
||||
.with("name", name)
|
||||
.with("color", newColor)
|
||||
@@ -62,12 +91,18 @@ public class GHLabel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets description.
|
||||
*
|
||||
* @param newDescription
|
||||
* Description of label
|
||||
* Description of label
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public void setDescription(String newDescription) throws IOException {
|
||||
repo.root.retrieve().method("PATCH")
|
||||
repo.root.retrieve()
|
||||
.method("PATCH")
|
||||
.withPreview(SYMMETRA)
|
||||
.with("name", name)
|
||||
.with("color", color)
|
||||
@@ -75,7 +110,7 @@ public class GHLabel {
|
||||
.to(url);
|
||||
}
|
||||
|
||||
/*package*/ static Collection<String> toNames(Collection<GHLabel> labels) {
|
||||
static Collection<String> toNames(Collection<GHLabel> labels) {
|
||||
List<String> r = new ArrayList<String>();
|
||||
for (GHLabel l : labels) {
|
||||
r.add(l.getName());
|
||||
@@ -85,13 +120,13 @@ public class GHLabel {
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
if (this == o)
|
||||
return true;
|
||||
if (o == null || getClass() != o.getClass())
|
||||
return false;
|
||||
final GHLabel ghLabel = (GHLabel) o;
|
||||
return Objects.equals(url, ghLabel.url) &&
|
||||
Objects.equals(name, ghLabel.name) &&
|
||||
Objects.equals(color, ghLabel.color) &&
|
||||
Objects.equals(repo, ghLabel.repo);
|
||||
return Objects.equals(url, ghLabel.url) && Objects.equals(name, ghLabel.name)
|
||||
&& Objects.equals(color, ghLabel.color) && Objects.equals(repo, ghLabel.repo);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -34,19 +34,19 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* The GitHub Preview API's license information
|
||||
* <p>
|
||||
*
|
||||
* @author Duncan Dickinson
|
||||
* @see GitHub#getLicense(String)
|
||||
* @see GHRepository#getLicense()
|
||||
* @see GitHub#getLicense(String) GitHub#getLicense(String)
|
||||
* @see GHRepository#getLicense() GHRepository#getLicense()
|
||||
* @see <a href="https://developer.github.com/v3/licenses/">https://developer.github.com/v3/licenses/</a>
|
||||
*/
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD"}, justification = "JSON API")
|
||||
@SuppressWarnings({ "UnusedDeclaration" })
|
||||
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
public class GHLicense extends GHObject {
|
||||
@SuppressFBWarnings("IS2_INCONSISTENT_SYNC") // root is set before the object is returned to the app
|
||||
/*package almost final*/ GitHub root;
|
||||
@SuppressFBWarnings("IS2_INCONSISTENT_SYNC")
|
||||
// root is set before the object is returned to the app
|
||||
/* package almost final */ GitHub root;
|
||||
|
||||
// these fields are always present, even in the short form
|
||||
protected String key, name;
|
||||
@@ -61,6 +61,8 @@ public class GHLicense extends GHObject {
|
||||
protected List<String> forbidden = new ArrayList<String>();
|
||||
|
||||
/**
|
||||
* Gets key.
|
||||
*
|
||||
* @return a mnemonic for the license
|
||||
*/
|
||||
public String getKey() {
|
||||
@@ -68,6 +70,8 @@ public class GHLicense extends GHObject {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the license name
|
||||
*/
|
||||
public String getName() {
|
||||
@@ -86,6 +90,8 @@ public class GHLicense extends GHObject {
|
||||
* Featured licenses are bold in the new repository drop-down
|
||||
*
|
||||
* @return True if the license is featured, false otherwise
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public Boolean isFeatured() throws IOException {
|
||||
populate();
|
||||
@@ -97,36 +103,85 @@ public class GHLicense extends GHObject {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets description.
|
||||
*
|
||||
* @return the description
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getDescription() throws IOException {
|
||||
populate();
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets category.
|
||||
*
|
||||
* @return the category
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getCategory() throws IOException {
|
||||
populate();
|
||||
return category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets implementation.
|
||||
*
|
||||
* @return the implementation
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getImplementation() throws IOException {
|
||||
populate();
|
||||
return implementation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets required.
|
||||
*
|
||||
* @return the required
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<String> getRequired() throws IOException {
|
||||
populate();
|
||||
return required;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets permitted.
|
||||
*
|
||||
* @return the permitted
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<String> getPermitted() throws IOException {
|
||||
populate();
|
||||
return permitted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets forbidden.
|
||||
*
|
||||
* @return the forbidden
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<String> getForbidden() throws IOException {
|
||||
populate();
|
||||
return forbidden;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets body.
|
||||
*
|
||||
* @return the body
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getBody() throws IOException {
|
||||
populate();
|
||||
return body;
|
||||
@@ -134,19 +189,25 @@ public class GHLicense extends GHObject {
|
||||
|
||||
/**
|
||||
* Fully populate the data by retrieving missing data.
|
||||
*
|
||||
* <p>
|
||||
* Depending on the original API call where this object is created, it may not contain everything.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
protected synchronized void populate() throws IOException {
|
||||
if (description!=null) return; // already populated
|
||||
if (description != null)
|
||||
return; // already populated
|
||||
|
||||
root.retrieve().to(url, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (!(o instanceof GHLicense)) return false;
|
||||
if (this == o)
|
||||
return true;
|
||||
if (!(o instanceof GHLicense))
|
||||
return false;
|
||||
|
||||
GHLicense that = (GHLicense) o;
|
||||
return this.url.equals(that.url);
|
||||
@@ -157,7 +218,7 @@ public class GHLicense extends GHObject {
|
||||
return url.hashCode();
|
||||
}
|
||||
|
||||
/*package*/ GHLicense wrap(GitHub root) {
|
||||
GHLicense wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.util.Locale;
|
||||
* Represents a membership of a user in an organization.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHMyself#listOrgMemberships()
|
||||
* @see GHMyself#listOrgMemberships() GHMyself#listOrgMemberships()
|
||||
*/
|
||||
public class GHMembership /* extends GHObject --- but it doesn't have id, created_at, etc. */ {
|
||||
GitHub root;
|
||||
@@ -19,22 +19,47 @@ public class GHMembership /* extends GHObject --- but it doesn't have id, create
|
||||
GHUser user;
|
||||
GHOrganization organization;
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets state.
|
||||
*
|
||||
* @return the state
|
||||
*/
|
||||
public State getState() {
|
||||
return Enum.valueOf(State.class, state.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets role.
|
||||
*
|
||||
* @return the role
|
||||
*/
|
||||
public Role getRole() {
|
||||
return Enum.valueOf(Role.class, role.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets user.
|
||||
*
|
||||
* @return the user
|
||||
*/
|
||||
public GHUser getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets organization.
|
||||
*
|
||||
* @return the organization
|
||||
*/
|
||||
public GHOrganization getOrganization() {
|
||||
return organization;
|
||||
}
|
||||
@@ -42,20 +67,24 @@ public class GHMembership /* extends GHObject --- but it doesn't have id, create
|
||||
/**
|
||||
* Accepts a pending invitation to an organization.
|
||||
*
|
||||
* @see GHMyself#getMembership(GHOrganization)
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @see GHMyself#getMembership(GHOrganization) GHMyself#getMembership(GHOrganization)
|
||||
*/
|
||||
public void activate() throws IOException {
|
||||
root.retrieve().method("PATCH").with("state",State.ACTIVE).to(url,this);
|
||||
root.retrieve().method("PATCH").with("state", State.ACTIVE).to(url, this);
|
||||
}
|
||||
|
||||
/*package*/ GHMembership wrap(GitHub root) {
|
||||
GHMembership wrap(GitHub root) {
|
||||
this.root = root;
|
||||
if (user!=null) user = root.getUser(user.wrapUp(root));
|
||||
if (organization!=null) organization.wrapUp(root);
|
||||
if (user != null)
|
||||
user = root.getUser(user.wrapUp(root));
|
||||
if (organization != null)
|
||||
organization.wrapUp(root);
|
||||
return this;
|
||||
}
|
||||
|
||||
/*package*/ static void wrap(GHMembership[] page, GitHub root) {
|
||||
static void wrap(GHMembership[] page, GitHub root) {
|
||||
for (GHMembership m : page)
|
||||
m.wrap(root);
|
||||
}
|
||||
@@ -78,7 +107,6 @@ public class GHMembership /* extends GHObject --- but it doesn't have id, create
|
||||
* Whether a role is currently active or waiting for acceptance (pending)
|
||||
*/
|
||||
public enum State {
|
||||
ACTIVE,
|
||||
PENDING;
|
||||
ACTIVE, PENDING;
|
||||
}
|
||||
}
|
||||
|
||||
89
src/main/java/org/kohsuke/github/GHMeta.java
Normal file
89
src/main/java/org/kohsuke/github/GHMeta.java
Normal file
@@ -0,0 +1,89 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Class that wraps the list of GitHub's IP addresses.
|
||||
*
|
||||
* @author Paulo Miguel Almeida
|
||||
* @see GitHub#getMeta() GitHub#getMeta()
|
||||
* @see <a href="https://developer.github.com/v3/meta/#meta">Get Meta</a>
|
||||
*/
|
||||
public class GHMeta {
|
||||
|
||||
@JsonProperty("verifiable_password_authentication")
|
||||
private boolean verifiablePasswordAuthentication;
|
||||
private List<String> hooks;
|
||||
private List<String> git;
|
||||
private List<String> web;
|
||||
private List<String> api;
|
||||
private List<String> pages;
|
||||
private List<String> importer = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Is verifiable password authentication boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isVerifiablePasswordAuthentication() {
|
||||
return verifiablePasswordAuthentication;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets hooks.
|
||||
*
|
||||
* @return the hooks
|
||||
*/
|
||||
public List<String> getHooks() {
|
||||
return Collections.unmodifiableList(hooks);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets git.
|
||||
*
|
||||
* @return the git
|
||||
*/
|
||||
public List<String> getGit() {
|
||||
return Collections.unmodifiableList(git);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets web.
|
||||
*
|
||||
* @return the web
|
||||
*/
|
||||
public List<String> getWeb() {
|
||||
return Collections.unmodifiableList(web);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets api.
|
||||
*
|
||||
* @return the api
|
||||
*/
|
||||
public List<String> getApi() {
|
||||
return Collections.unmodifiableList(api);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets pages.
|
||||
*
|
||||
* @return the pages
|
||||
*/
|
||||
public List<String> getPages() {
|
||||
return Collections.unmodifiableList(pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets importer.
|
||||
*
|
||||
* @return the importer
|
||||
*/
|
||||
public List<String> getImporter() {
|
||||
return Collections.unmodifiableList(importer);
|
||||
}
|
||||
}
|
||||
@@ -6,9 +6,9 @@ import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Yusuke Kokubo
|
||||
* The type GHMilestone.
|
||||
*
|
||||
* @author Yusuke Kokubo
|
||||
*/
|
||||
public class GHMilestone extends GHObject {
|
||||
GitHub root;
|
||||
@@ -19,46 +19,98 @@ public class GHMilestone extends GHObject {
|
||||
private int closed_issues, open_issues, number;
|
||||
protected String closed_at;
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets owner.
|
||||
*
|
||||
* @return the owner
|
||||
*/
|
||||
public GHRepository getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets creator.
|
||||
*
|
||||
* @return the creator
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getCreator() throws IOException {
|
||||
return root.intern(creator);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets due on.
|
||||
*
|
||||
* @return the due on
|
||||
*/
|
||||
public Date getDueOn() {
|
||||
if (due_on == null) return null;
|
||||
if (due_on == null)
|
||||
return null;
|
||||
return GitHub.parseDate(due_on);
|
||||
}
|
||||
|
||||
/**
|
||||
* When was this milestone closed?
|
||||
*
|
||||
* @return the closed at
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public Date getClosedAt() throws IOException {
|
||||
return GitHub.parseDate(closed_at);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets title.
|
||||
*
|
||||
* @return the title
|
||||
*/
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets description.
|
||||
*
|
||||
* @return the description
|
||||
*/
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets closed issues.
|
||||
*
|
||||
* @return the closed issues
|
||||
*/
|
||||
public int getClosedIssues() {
|
||||
return closed_issues;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets open issues.
|
||||
*
|
||||
* @return the open issues
|
||||
*/
|
||||
public int getOpenIssues() {
|
||||
return open_issues;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets number.
|
||||
*
|
||||
* @return the number
|
||||
*/
|
||||
public int getNumber() {
|
||||
return number;
|
||||
}
|
||||
@@ -66,13 +118,21 @@ public class GHMilestone extends GHObject {
|
||||
public URL getHtmlUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets state.
|
||||
*
|
||||
* @return the state
|
||||
*/
|
||||
public GHMilestoneState getState() {
|
||||
return Enum.valueOf(GHMilestoneState.class, state.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes this milestone.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void close() throws IOException {
|
||||
edit("state", "closed");
|
||||
@@ -80,6 +140,9 @@ public class GHMilestone extends GHObject {
|
||||
|
||||
/**
|
||||
* Reopens this milestone.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void reopen() throws IOException {
|
||||
edit("state", "open");
|
||||
@@ -87,31 +150,70 @@ public class GHMilestone extends GHObject {
|
||||
|
||||
/**
|
||||
* Deletes this milestone.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
root.retrieve().method("DELETE").to(getApiRoute());
|
||||
}
|
||||
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
new Requester(root)._with(key, value).method("PATCH").to(getApiRoute());
|
||||
new Requester(root).with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets title.
|
||||
*
|
||||
* @param title
|
||||
* the title
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setTitle(String title) throws IOException {
|
||||
edit("title", title);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets description.
|
||||
*
|
||||
* @param description
|
||||
* the description
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setDescription(String description) throws IOException {
|
||||
edit("description", description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets due on.
|
||||
*
|
||||
* @param dueOn
|
||||
* the due on
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setDueOn(Date dueOn) throws IOException {
|
||||
edit("due_on", GitHub.printDate(dueOn));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets api route.
|
||||
*
|
||||
* @return the api route
|
||||
*/
|
||||
protected String getApiRoute() {
|
||||
return "/repos/"+owner.getOwnerName()+"/"+owner.getName()+"/milestones/"+number;
|
||||
return "/repos/" + owner.getOwnerName() + "/" + owner.getName() + "/milestones/" + number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap gh milestone.
|
||||
*
|
||||
* @param repo
|
||||
* the repo
|
||||
* @return the gh milestone
|
||||
*/
|
||||
public GHMilestone wrap(GHRepository repo) {
|
||||
this.owner = repo;
|
||||
this.root = repo.root;
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Yusuke Kokubo
|
||||
* The enum GHMilestoneState.
|
||||
*
|
||||
* @author Yusuke Kokubo
|
||||
*/
|
||||
public enum GHMilestoneState {
|
||||
OPEN,
|
||||
CLOSED
|
||||
OPEN, CLOSED
|
||||
}
|
||||
@@ -44,8 +44,12 @@ public class GHMyself extends GHUser {
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link #getEmails2()}
|
||||
* Gets emails.
|
||||
*
|
||||
* @return the emails
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated Use {@link #getEmails2()}
|
||||
*/
|
||||
public List<String> getEmails() throws IOException {
|
||||
List<GHEmail> src = getEmails2();
|
||||
@@ -58,13 +62,13 @@ public class GHMyself extends GHUser {
|
||||
|
||||
/**
|
||||
* Returns the read-only list of e-mail addresses configured for you.
|
||||
* <p>
|
||||
* This corresponds to the stuff you configure in https://github.com/settings/emails, and not to be confused with
|
||||
* {@link #getEmail()} that shows your public e-mail address set in https://github.com/settings/profile
|
||||
*
|
||||
* This corresponds to the stuff you configure in https://github.com/settings/emails,
|
||||
* and not to be confused with {@link #getEmail()} that shows your public e-mail address
|
||||
* set in https://github.com/settings/profile
|
||||
*
|
||||
* @return
|
||||
* Always non-null.
|
||||
* @return Always non-null.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHEmail> getEmails2() throws IOException {
|
||||
GHEmail[] addresses = root.retrieve().to("/user/emails", GHEmail[].class);
|
||||
@@ -73,12 +77,13 @@ public class GHMyself extends GHUser {
|
||||
|
||||
/**
|
||||
* Returns the read-only list of all the pulic keys of the current user.
|
||||
* <p>
|
||||
* NOTE: When using OAuth authenticaiton, the READ/WRITE User scope is required by the GitHub APIs, otherwise you
|
||||
* will get a 404 NOT FOUND.
|
||||
*
|
||||
* NOTE: When using OAuth authenticaiton, the READ/WRITE User scope is
|
||||
* required by the GitHub APIs, otherwise you will get a 404 NOT FOUND.
|
||||
*
|
||||
* @return
|
||||
* Always non-null.
|
||||
* @return Always non-null.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHKey> getPublicKeys() throws IOException {
|
||||
return Collections.unmodifiableList(Arrays.asList(root.retrieve().to("/user/keys", GHKey[].class)));
|
||||
@@ -86,27 +91,31 @@ public class GHMyself extends GHUser {
|
||||
|
||||
/**
|
||||
* Returns the read-only list of all the public verified keys of the current user.
|
||||
* <p>
|
||||
* Differently from the getPublicKeys() method, the retrieval of the user's verified public keys does not require
|
||||
* any READ/WRITE OAuth Scope to the user's profile.
|
||||
*
|
||||
* Differently from the getPublicKeys() method, the retrieval of the user's
|
||||
* verified public keys does not require any READ/WRITE OAuth Scope to the
|
||||
* user's profile.
|
||||
*
|
||||
* @return
|
||||
* Always non-null.
|
||||
* @return Always non-null.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHVerifiedKey> getPublicVerifiedKeys() throws IOException {
|
||||
return Collections.unmodifiableList(Arrays.asList(root.retrieve().to(
|
||||
"/users/" + getLogin() + "/keys", GHVerifiedKey[].class)));
|
||||
}
|
||||
public List<GHVerifiedKey> getPublicVerifiedKeys() throws IOException {
|
||||
return Collections.unmodifiableList(
|
||||
Arrays.asList(root.retrieve().to("/users/" + getLogin() + "/keys", GHVerifiedKey[].class)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the organization that this user belongs to.
|
||||
*
|
||||
* @return the all organizations
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHPersonSet<GHOrganization> getAllOrganizations() throws IOException {
|
||||
GHPersonSet<GHOrganization> orgs = new GHPersonSet<GHOrganization>();
|
||||
Set<String> names = new HashSet<String>();
|
||||
for (GHOrganization o : root.retrieve().to("/user/orgs", GHOrganization[].class)) {
|
||||
if (names.add(o.getLogin())) // in case of rumoured duplicates in the data
|
||||
if (names.add(o.getLogin())) // in case of rumoured duplicates in the data
|
||||
orgs.add(root.getOrganization(o.getLogin()));
|
||||
}
|
||||
return orgs;
|
||||
@@ -114,11 +123,15 @@ public class GHMyself extends GHUser {
|
||||
|
||||
/**
|
||||
* Gets the all repositories this user owns (public and private).
|
||||
*
|
||||
* @return the all repositories
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public synchronized Map<String,GHRepository> getAllRepositories() throws IOException {
|
||||
Map<String,GHRepository> repositories = new TreeMap<String, GHRepository>();
|
||||
public synchronized Map<String, GHRepository> getAllRepositories() throws IOException {
|
||||
Map<String, GHRepository> repositories = new TreeMap<String, GHRepository>();
|
||||
for (GHRepository r : listAllRepositories()) {
|
||||
repositories.put(r.getName(),r);
|
||||
repositories.put(r.getName(), r);
|
||||
}
|
||||
return Collections.unmodifiableMap(repositories);
|
||||
}
|
||||
@@ -126,48 +139,53 @@ public class GHMyself extends GHUser {
|
||||
/**
|
||||
* Lists up all repositories this user owns (public and private).
|
||||
*
|
||||
* Unlike {@link #getAllRepositories()}, this does not wait until all the repositories are returned.
|
||||
* Repositories are returned by GitHub API with a 30 items per page.
|
||||
* Unlike {@link #getAllRepositories()}, this does not wait until all the repositories are returned. Repositories
|
||||
* are returned by GitHub API with a 30 items per page.
|
||||
*/
|
||||
@Override
|
||||
public PagedIterable<GHRepository> listRepositories() {
|
||||
return listRepositories(30);
|
||||
return listRepositories(30);
|
||||
}
|
||||
|
||||
/**
|
||||
* List repositories that are accessible to the authenticated user (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.
|
||||
* 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.
|
||||
* @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.
|
||||
* 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.
|
||||
* 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
|
||||
* @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
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHRepository> listRepositories(final int pageSize, final RepositoryListFilter repoType) {
|
||||
return root.retrieve()
|
||||
.with("type",repoType)
|
||||
.asPagedIterable(
|
||||
"/user/repos",
|
||||
GHRepository[].class,
|
||||
item -> item.wrap(root)
|
||||
).withPageSize(pageSize);
|
||||
.with("type", repoType)
|
||||
.asPagedIterable("/user/repos", GHRepository[].class, item -> item.wrap(root))
|
||||
.withPageSize(pageSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link #listRepositories()}
|
||||
* List all repositories paged iterable.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @deprecated Use {@link #listRepositories()}
|
||||
*/
|
||||
public PagedIterable<GHRepository> listAllRepositories() {
|
||||
return listRepositories();
|
||||
@@ -175,6 +193,8 @@ public class GHMyself extends GHUser {
|
||||
|
||||
/**
|
||||
* List your organization memberships
|
||||
*
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHMembership> listOrgMemberships() {
|
||||
return listOrgMemberships(null);
|
||||
@@ -184,26 +204,30 @@ public class GHMyself extends GHUser {
|
||||
* List your organization memberships
|
||||
*
|
||||
* @param state
|
||||
* Filter by a specific state
|
||||
* Filter by a specific state
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHMembership> listOrgMemberships(final GHMembership.State state) {
|
||||
return root.retrieve()
|
||||
.with("state",state)
|
||||
.asPagedIterable(
|
||||
"/user/memberships/orgs",
|
||||
GHMembership[].class,
|
||||
item -> item.wrap(root) );
|
||||
.with("state", state)
|
||||
.asPagedIterable("/user/memberships/orgs", GHMembership[].class, item -> item.wrap(root));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets your membership in a specific organization.
|
||||
*
|
||||
* @param o
|
||||
* the o
|
||||
* @return the membership
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHMembership getMembership(GHOrganization o) throws IOException {
|
||||
return root.retrieve().to("/user/memberships/orgs/"+o.getLogin(),GHMembership.class).wrap(root);
|
||||
return root.retrieve().to("/user/memberships/orgs/" + o.getLogin(), GHMembership.class).wrap(root);
|
||||
}
|
||||
|
||||
// public void addEmails(Collection<String> emails) throws IOException {
|
||||
//// new Requester(root,ApiVersion.V3).withCredential().to("/user/emails");
|
||||
// root.retrieveWithAuth3()
|
||||
// }
|
||||
// public void addEmails(Collection<String> emails) throws IOException {
|
||||
//// new Requester(root,ApiVersion.V3).withCredential().to("/user/emails");
|
||||
// root.retrieveWithAuth3()
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -9,23 +9,19 @@ import java.util.NoSuchElementException;
|
||||
* Listens to GitHub notification stream.
|
||||
*
|
||||
* <p>
|
||||
* This class supports two modes of retrieving notifications that can
|
||||
* be controlled via {@link #nonBlocking(boolean)}.
|
||||
* This class supports two modes of retrieving notifications that can be controlled via {@link #nonBlocking(boolean)}.
|
||||
*
|
||||
* <p>
|
||||
* In the blocking mode, which is the default, iterator will be infinite.
|
||||
* The call to {@link Iterator#next()} will block until a new notification
|
||||
* arrives. This is useful for application that runs perpetually and reacts
|
||||
* to notifications.
|
||||
* In the blocking mode, which is the default, iterator will be infinite. The call to {@link Iterator#next()} will block
|
||||
* until a new notification arrives. This is useful for application that runs perpetually and reacts to notifications.
|
||||
*
|
||||
* <p>
|
||||
* In the non-blocking mode, the iterator will only report the set of
|
||||
* notifications initially retrieved from GitHub, then quit. This is useful
|
||||
* for a batch application to process the current set of notifications.
|
||||
* In the non-blocking mode, the iterator will only report the set of notifications initially retrieved from GitHub,
|
||||
* then quit. This is useful for a batch application to process the current set of notifications.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GitHub#listNotifications()
|
||||
* @see GHRepository#listNotifications()
|
||||
* @see GitHub#listNotifications() GitHub#listNotifications()
|
||||
* @see GHRepository#listNotifications() GHRepository#listNotifications()
|
||||
*/
|
||||
public class GHNotificationStream implements Iterable<GHThread> {
|
||||
private final GitHub root;
|
||||
@@ -35,13 +31,17 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
private String apiUrl;
|
||||
private boolean nonBlocking = false;
|
||||
|
||||
/*package*/ GHNotificationStream(GitHub root, String apiUrl) {
|
||||
GHNotificationStream(GitHub root, String apiUrl) {
|
||||
this.root = root;
|
||||
this.apiUrl = apiUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should the stream include notifications that are already read?
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh notification stream
|
||||
*/
|
||||
public GHNotificationStream read(boolean v) {
|
||||
all = v;
|
||||
@@ -49,26 +49,47 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Should the stream be restricted to notifications in which the user
|
||||
* is directly participating or mentioned?
|
||||
* Should the stream be restricted to notifications in which the user is directly participating or mentioned?
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh notification stream
|
||||
*/
|
||||
public GHNotificationStream participating(boolean v) {
|
||||
participating = v;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Since gh notification stream.
|
||||
*
|
||||
* @param timestamp
|
||||
* the timestamp
|
||||
* @return the gh notification stream
|
||||
*/
|
||||
public GHNotificationStream since(long timestamp) {
|
||||
return since(new Date(timestamp));
|
||||
}
|
||||
|
||||
/**
|
||||
* Since gh notification stream.
|
||||
*
|
||||
* @param dt
|
||||
* the dt
|
||||
* @return the gh notification stream
|
||||
*/
|
||||
public GHNotificationStream since(Date dt) {
|
||||
since = GitHub.printDate(dt);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* If set to true, {@link #iterator()} will stop iterating instead of blocking and
|
||||
* waiting for the updates to arrive.
|
||||
* If set to true, {@link #iterator()} will stop iterating instead of blocking and waiting for the updates to
|
||||
* arrive.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh notification stream
|
||||
*/
|
||||
public GHNotificationStream nonBlocking(boolean v) {
|
||||
this.nonBlocking = v;
|
||||
@@ -76,25 +97,25 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an infinite blocking {@link Iterator} that returns
|
||||
* {@link GHThread} as notifications arrive.
|
||||
* Returns an infinite blocking {@link Iterator} that returns {@link GHThread} as notifications arrive.
|
||||
*/
|
||||
public Iterator<GHThread> iterator() {
|
||||
// capture the configuration setting here
|
||||
final Requester req = new Requester(root).method("GET")
|
||||
.with("all", all).with("participating", participating).with("since", since);
|
||||
.with("all", all)
|
||||
.with("participating", participating)
|
||||
.with("since", since);
|
||||
|
||||
return new Iterator<GHThread>() {
|
||||
/**
|
||||
* Stuff we've fetched but haven't returned to the caller.
|
||||
* Newer ones first.
|
||||
* Stuff we've fetched but haven't returned to the caller. Newer ones first.
|
||||
*/
|
||||
private GHThread[] threads = EMPTY_ARRAY;
|
||||
|
||||
/**
|
||||
* Next element in {@link #threads} to return. This counts down.
|
||||
*/
|
||||
private int idx=-1;
|
||||
private int idx = -1;
|
||||
|
||||
/**
|
||||
* threads whose updated_at is older than this should be ignored.
|
||||
@@ -114,9 +135,9 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
private GHThread next;
|
||||
|
||||
public GHThread next() {
|
||||
if (next==null) {
|
||||
if (next == null) {
|
||||
next = fetch();
|
||||
if (next==null)
|
||||
if (next == null)
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
|
||||
@@ -126,9 +147,9 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
if (next==null)
|
||||
if (next == null)
|
||||
next = fetch();
|
||||
return next!=null;
|
||||
return next != null;
|
||||
}
|
||||
|
||||
GHThread fetch() {
|
||||
@@ -136,7 +157,7 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
while (true) {// loop until we get new threads to return
|
||||
|
||||
// if we have fetched un-returned threads, use them first
|
||||
while (idx>=0) {
|
||||
while (idx >= 0) {
|
||||
GHThread n = threads[idx--];
|
||||
long nt = n.getUpdatedAt().getTime();
|
||||
if (nt >= lastUpdated) {
|
||||
@@ -145,13 +166,14 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
}
|
||||
}
|
||||
|
||||
if (nonBlocking && nextCheckTime>=0)
|
||||
return null; // nothing more to report, and we aren't blocking
|
||||
if (nonBlocking && nextCheckTime >= 0)
|
||||
return null; // nothing more to report, and we aren't blocking
|
||||
|
||||
// observe the polling interval before making the call
|
||||
while (true) {
|
||||
long now = System.currentTimeMillis();
|
||||
if (nextCheckTime < now) break;
|
||||
if (nextCheckTime < now)
|
||||
break;
|
||||
long waitTime = Math.min(Math.max(nextCheckTime - now, 1000), 60 * 1000);
|
||||
Thread.sleep(waitTime);
|
||||
}
|
||||
@@ -159,13 +181,13 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
req.setHeader("If-Modified-Since", lastModified);
|
||||
|
||||
threads = req.to(apiUrl, GHThread[].class);
|
||||
if (threads==null) {
|
||||
threads = EMPTY_ARRAY; // if unmodified, we get empty array
|
||||
if (threads == null) {
|
||||
threads = EMPTY_ARRAY; // if unmodified, we get empty array
|
||||
} else {
|
||||
// we get a new batch, but we want to ignore the ones that we've seen
|
||||
lastUpdated++;
|
||||
}
|
||||
idx = threads.length-1;
|
||||
idx = threads.length - 1;
|
||||
|
||||
nextCheckTime = calcNextCheckTime();
|
||||
lastModified = req.getResponseHeader("Last-Modified");
|
||||
@@ -179,9 +201,10 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
|
||||
private long calcNextCheckTime() {
|
||||
String v = req.getResponseHeader("X-Poll-Interval");
|
||||
if (v==null) v="60";
|
||||
if (v == null)
|
||||
v = "60";
|
||||
long seconds = Integer.parseInt(v);
|
||||
return System.currentTimeMillis() + seconds*1000;
|
||||
return System.currentTimeMillis() + seconds * 1000;
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
@@ -190,16 +213,27 @@ public class GHNotificationStream implements Iterable<GHThread> {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark as read.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void markAsRead() throws IOException {
|
||||
markAsRead(-1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks all the notifications as read.
|
||||
*
|
||||
* @param timestamp
|
||||
* the timestamp
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void markAsRead(long timestamp) throws IOException {
|
||||
final Requester req = new Requester(root).method("PUT");
|
||||
if (timestamp>=0)
|
||||
if (timestamp >= 0)
|
||||
req.with("last_read_at", GitHub.printDate(new Date(timestamp)));
|
||||
req.asHttpStatusCode(apiUrl);
|
||||
}
|
||||
|
||||
10
src/main/java/org/kohsuke/github/GHOTPRequiredException.java
Normal file
10
src/main/java/org/kohsuke/github/GHOTPRequiredException.java
Normal file
@@ -0,0 +1,10 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
* This exception is thrown when GitHub is requesting an OTP from the user
|
||||
*
|
||||
* @author Kevin Harrington mad.hephaestus@gmail.com
|
||||
*/
|
||||
public class GHOTPRequiredException extends GHIOException {
|
||||
// ...
|
||||
}
|
||||
@@ -5,7 +5,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.URL;
|
||||
@@ -13,11 +12,13 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
|
||||
/**
|
||||
* Most (all?) domain objects in GitHub seems to have these 4 properties.
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD"}, justification = "JSON API")
|
||||
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
public abstract class GHObject {
|
||||
/**
|
||||
* Capture response HTTP headers on the state object.
|
||||
@@ -29,28 +30,35 @@ public abstract class GHObject {
|
||||
protected String created_at;
|
||||
protected String updated_at;
|
||||
|
||||
/*package*/ GHObject() {
|
||||
GHObject() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTTP response headers given along with the state of this object.
|
||||
*
|
||||
* <p>
|
||||
* Some of the HTTP headers have nothing to do with the object, for example "Cache-Control"
|
||||
* and others are different depending on how this object was retrieved.
|
||||
* Some of the HTTP headers have nothing to do with the object, for example "Cache-Control" and others are different
|
||||
* depending on how this object was retrieved.
|
||||
* <p>
|
||||
* This method was added as a kind of hack to allow the caller to retrieve OAuth scopes and such. Use with caution.
|
||||
* The method might be removed in the future.
|
||||
*
|
||||
* This method was added as a kind of hack to allow the caller to retrieve OAuth scopes and such.
|
||||
* Use with caution. The method might be removed in the future.
|
||||
* @return a map of header names to value lists
|
||||
*/
|
||||
@CheckForNull @Deprecated
|
||||
@CheckForNull
|
||||
@Deprecated
|
||||
public Map<String, List<String>> getResponseHeaderFields() {
|
||||
return responseHeaderFields;
|
||||
}
|
||||
|
||||
/**
|
||||
* When was this resource created?
|
||||
*
|
||||
* @return date created
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
@WithBridgeMethods(value=String.class, adapterMethod="createdAtStr")
|
||||
@WithBridgeMethods(value = String.class, adapterMethod = "createdAtStr")
|
||||
public Date getCreatedAt() throws IOException {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
@@ -61,51 +69,63 @@ public abstract class GHObject {
|
||||
}
|
||||
|
||||
/**
|
||||
* API URL of this object.
|
||||
* Gets url.
|
||||
*
|
||||
* @return API URL of this object.
|
||||
*/
|
||||
@WithBridgeMethods(value=String.class, adapterMethod="urlToString")
|
||||
@WithBridgeMethods(value = String.class, adapterMethod = "urlToString")
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* URL of this object for humans, which renders some HTML.
|
||||
* Gets html url.
|
||||
*
|
||||
* @return URL of this object for humans, which renders some HTML.
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
@WithBridgeMethods(value=String.class, adapterMethod="urlToString")
|
||||
@WithBridgeMethods(value = String.class, adapterMethod = "urlToString")
|
||||
public abstract URL getHtmlUrl() throws IOException;
|
||||
|
||||
/**
|
||||
* When was this resource last updated?
|
||||
*
|
||||
* @return updated date
|
||||
* @throws IOException
|
||||
* on error
|
||||
*/
|
||||
public Date getUpdatedAt() throws IOException {
|
||||
return GitHub.parseDate(updated_at);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unique ID number of this resource.
|
||||
* Gets id.
|
||||
*
|
||||
* @return Unique ID number of this resource.
|
||||
*/
|
||||
@WithBridgeMethods(value={String.class,int.class}, adapterMethod="longToStringOrInt")
|
||||
@WithBridgeMethods(value = { String.class, int.class }, adapterMethod = "longToStringOrInt")
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD", justification = "Bridge method of getId")
|
||||
private Object longToStringOrInt(long id, Class type) {
|
||||
if (type==String.class)
|
||||
if (type == String.class)
|
||||
return String.valueOf(id);
|
||||
if (type==int.class)
|
||||
return (int)id;
|
||||
throw new AssertionError("Unexpected type: "+type);
|
||||
if (type == int.class)
|
||||
return (int) id;
|
||||
throw new AssertionError("Unexpected type: " + type);
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD", justification = "Bridge method of getHtmlUrl")
|
||||
private Object urlToString(URL url, Class type) {
|
||||
return url==null ? null : url.toString();
|
||||
return url == null ? null : url.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* String representation to assist debugging and inspection. The output format of this string
|
||||
* is not a committed part of the API and is subject to change.
|
||||
* String representation to assist debugging and inspection. The output format of this string is not a committed
|
||||
* part of the API and is subject to change.
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
@@ -134,7 +154,7 @@ public abstract class GHObject {
|
||||
if (value instanceof GitHub)
|
||||
return;
|
||||
|
||||
super.append(buffer,fieldName,value,fullDetail);
|
||||
super.append(buffer, fieldName, value, fullDetail);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -8,9 +8,9 @@ class GHOrgHook extends GHHook {
|
||||
/**
|
||||
* Organization that the hook belongs to.
|
||||
*/
|
||||
/*package*/ transient GHOrganization organization;
|
||||
transient GHOrganization organization;
|
||||
|
||||
/*package*/ GHOrgHook wrap(GHOrganization owner) {
|
||||
GHOrgHook wrap(GHOrganization owner) {
|
||||
this.organization = owner;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -9,80 +9,136 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import static org.kohsuke.github.Previews.INERTIA;
|
||||
|
||||
/**
|
||||
* The type GHOrganization.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GHOrganization extends GHPerson {
|
||||
/*package*/ GHOrganization wrapUp(GitHub root) {
|
||||
return (GHOrganization)super.wrapUp(root);
|
||||
GHOrganization wrapUp(GitHub root) {
|
||||
return (GHOrganization) super.wrapUp(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new repository.
|
||||
*
|
||||
* @return
|
||||
* Newly created repository.
|
||||
* @deprecated
|
||||
* Use {@link #createRepository(String)} that uses a builder pattern to let you control every aspect.
|
||||
* @param name
|
||||
* the name
|
||||
* @param description
|
||||
* the description
|
||||
* @param homepage
|
||||
* the homepage
|
||||
* @param team
|
||||
* the team
|
||||
* @param isPublic
|
||||
* the is public
|
||||
* @return Newly created repository.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated Use {@link #createRepository(String)} that uses a builder pattern to let you control every aspect.
|
||||
*/
|
||||
public GHRepository createRepository(String name, String description, String homepage, String team, boolean isPublic) throws IOException {
|
||||
public GHRepository createRepository(String name,
|
||||
String description,
|
||||
String homepage,
|
||||
String team,
|
||||
boolean isPublic) throws IOException {
|
||||
GHTeam t = getTeams().get(team);
|
||||
if (t==null)
|
||||
throw new IllegalArgumentException("No such team: "+team);
|
||||
if (t == null)
|
||||
throw new IllegalArgumentException("No such team: " + team);
|
||||
return createRepository(name, description, homepage, t, isPublic);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link #createRepository(String)} that uses a builder pattern to let you control every aspect.
|
||||
* Create repository gh repository.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @param description
|
||||
* the description
|
||||
* @param homepage
|
||||
* the homepage
|
||||
* @param team
|
||||
* the team
|
||||
* @param isPublic
|
||||
* the is public
|
||||
* @return the gh repository
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated Use {@link #createRepository(String)} that uses a builder pattern to let you control every aspect.
|
||||
*/
|
||||
public GHRepository createRepository(String name, String description, String homepage, GHTeam team, boolean isPublic) throws IOException {
|
||||
if (team==null)
|
||||
public GHRepository createRepository(String name,
|
||||
String description,
|
||||
String homepage,
|
||||
GHTeam team,
|
||||
boolean isPublic) throws IOException {
|
||||
if (team == null)
|
||||
throw new IllegalArgumentException("Invalid team");
|
||||
return createRepository(name).description(description).homepage(homepage).private_(!isPublic).team(team).create();
|
||||
return createRepository(name).description(description)
|
||||
.homepage(homepage)
|
||||
.private_(!isPublic)
|
||||
.team(team)
|
||||
.create();
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a builder that creates a new repository.
|
||||
*
|
||||
* <p>
|
||||
* You use the returned builder to set various properties, then call {@link GHCreateRepositoryBuilder#create()}
|
||||
* to finally createa repository.
|
||||
* You use the returned builder to set various properties, then call {@link GHCreateRepositoryBuilder#create()} to
|
||||
* finally createa repository.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @return the gh create repository builder
|
||||
*/
|
||||
public GHCreateRepositoryBuilder createRepository(String name) {
|
||||
return new GHCreateRepositoryBuilder(root,"/orgs/"+login+"/repos",name);
|
||||
return new GHCreateRepositoryBuilder(root, "/orgs/" + login + "/repos", name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Teams by their names.
|
||||
*
|
||||
* @return the teams
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public Map<String,GHTeam> getTeams() throws IOException {
|
||||
Map<String,GHTeam> r = new TreeMap<String, GHTeam>();
|
||||
public Map<String, GHTeam> getTeams() throws IOException {
|
||||
Map<String, GHTeam> r = new TreeMap<String, GHTeam>();
|
||||
for (GHTeam t : listTeams()) {
|
||||
r.put(t.getName(),t);
|
||||
r.put(t.getName(), t);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* List up all the teams.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHTeam> listTeams() throws IOException {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
String.format("/orgs/%s/teams", login),
|
||||
GHTeam[].class,
|
||||
item -> item.wrapUp(GHOrganization.this) );
|
||||
.asPagedIterable(String.format("/orgs/%s/teams", login),
|
||||
GHTeam[].class,
|
||||
item -> item.wrapUp(GHOrganization.this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds a team that has the given name in its {@link GHTeam#getName()}
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @return the team by name
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHTeam getTeamByName(String name) throws IOException {
|
||||
for (GHTeam t : listTeams()) {
|
||||
if(t.getName().equals(name))
|
||||
if (t.getName().equals(name))
|
||||
return t;
|
||||
}
|
||||
return null;
|
||||
@@ -90,37 +146,59 @@ public class GHOrganization extends GHPerson {
|
||||
|
||||
/**
|
||||
* Finds a team that has the given slug in its {@link GHTeam#getSlug()}
|
||||
*
|
||||
* @param slug
|
||||
* the slug
|
||||
* @return the team by slug
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHTeam getTeamBySlug(String slug) throws IOException {
|
||||
for (GHTeam t : listTeams()) {
|
||||
if(t.getSlug().equals(slug))
|
||||
if (t.getSlug().equals(slug))
|
||||
return t;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Member's role in an organization */
|
||||
/**
|
||||
* Member's role in an organization
|
||||
*/
|
||||
public enum Role {
|
||||
ADMIN, /** The user is an owner of the organization. */
|
||||
ADMIN,
|
||||
/** The user is an owner of the organization. */
|
||||
MEMBER /** The user is a non-owner member of the organization. */
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds (invites) a user to the organization.
|
||||
* @see <a href="https://developer.github.com/v3/orgs/members/#add-or-update-organization-membership">documentation</a>
|
||||
*
|
||||
* @param user
|
||||
* the user
|
||||
* @param role
|
||||
* the role
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @see <a href=
|
||||
* "https://developer.github.com/v3/orgs/members/#add-or-update-organization-membership">documentation</a>
|
||||
*/
|
||||
public void add(GHUser user, Role role) throws IOException {
|
||||
root.retrieve().method("PUT")
|
||||
root.retrieve()
|
||||
.method("PUT")
|
||||
.with("role", role.name().toLowerCase())
|
||||
.to("/orgs/" + login + "/memberships/" + user.getLogin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this organization has the specified user as a member.
|
||||
*
|
||||
* @param user
|
||||
* the user
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean hasMember(GHUser user) {
|
||||
try {
|
||||
root.retrieve().to("/orgs/" + login + "/members/" + user.getLogin());
|
||||
root.retrieve().to("/orgs/" + login + "/members/" + user.getLogin());
|
||||
return true;
|
||||
} catch (IOException ignore) {
|
||||
return false;
|
||||
@@ -128,15 +206,24 @@ public class GHOrganization extends GHPerson {
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a member of the organisation - which will remove them from
|
||||
* all teams, and remove their access to the organization’s repositories.
|
||||
* Remove a member of the organisation - which will remove them from all teams, and remove their access to the
|
||||
* organization’s repositories.
|
||||
*
|
||||
* @param user
|
||||
* the user
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void remove(GHUser user) throws IOException {
|
||||
root.retrieve().method("DELETE").to("/orgs/" + login + "/members/" + user.getLogin());
|
||||
root.retrieve().method("DELETE").to("/orgs/" + login + "/members/" + user.getLogin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this organization has the specified user as a public member.
|
||||
*
|
||||
* @param user
|
||||
* the user
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean hasPublicMember(GHUser user) {
|
||||
try {
|
||||
@@ -149,12 +236,22 @@ public class GHOrganization extends GHPerson {
|
||||
|
||||
/**
|
||||
* Publicizes the membership.
|
||||
*
|
||||
* @param u
|
||||
* the u
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void publicize(GHUser u) throws IOException {
|
||||
root.retrieve().method("PUT").to("/orgs/" + login + "/public_members/" + u.getLogin(), null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets members.
|
||||
*
|
||||
* @return the members
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated use {@link #listMembers()}
|
||||
*/
|
||||
public List<GHUser> getMembers() throws IOException {
|
||||
@@ -163,6 +260,10 @@ public class GHOrganization extends GHPerson {
|
||||
|
||||
/**
|
||||
* All the members of this organization.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHUser> listMembers() throws IOException {
|
||||
return listMembers("members");
|
||||
@@ -170,6 +271,10 @@ public class GHOrganization extends GHPerson {
|
||||
|
||||
/**
|
||||
* All the public members of this organization.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHUser> listPublicMembers() throws IOException {
|
||||
return listMembers("public_members");
|
||||
@@ -179,6 +284,15 @@ public class GHOrganization extends GHPerson {
|
||||
return listMembers(suffix, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* List members with filter paged iterable.
|
||||
*
|
||||
* @param filter
|
||||
* the filter
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHUser> listMembersWithFilter(String filter) throws IOException {
|
||||
return listMembers("members", filter);
|
||||
}
|
||||
@@ -186,14 +300,18 @@ public class GHOrganization extends GHPerson {
|
||||
private PagedIterable<GHUser> listMembers(final String suffix, final String filter) throws IOException {
|
||||
String filterParams = (filter == null) ? "" : ("?filter=" + filter);
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
String.format("/orgs/%s/%s%s", login, suffix, filterParams),
|
||||
GHUser[].class,
|
||||
item -> item.wrapUp(root) );
|
||||
.asPagedIterable(String.format("/orgs/%s/%s%s", login, suffix, filterParams),
|
||||
GHUser[].class,
|
||||
item -> item.wrapUp(root));
|
||||
}
|
||||
|
||||
/**
|
||||
* Conceals the membership.
|
||||
*
|
||||
* @param u
|
||||
* the u
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void conceal(GHUser u) throws IOException {
|
||||
root.retrieve().method("DELETE").to("/orgs/" + login + "/public_members/" + u.getLogin(), null);
|
||||
@@ -201,19 +319,26 @@ public class GHOrganization extends GHPerson {
|
||||
|
||||
/**
|
||||
* Returns the projects for this organization.
|
||||
* @param status The status filter (all, open or closed).
|
||||
*
|
||||
* @param status
|
||||
* The status filter (all, open or closed).
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHProject> listProjects(final GHProject.ProjectStateFilter status) throws IOException {
|
||||
return root.retrieve().withPreview(INERTIA)
|
||||
.with("state", status)
|
||||
.asPagedIterable(
|
||||
String.format("/orgs/%s/projects", login),
|
||||
GHProject[].class,
|
||||
item -> item.wrap(root) );
|
||||
return root.retrieve()
|
||||
.withPreview(INERTIA)
|
||||
.with("state", status)
|
||||
.asPagedIterable(String.format("/orgs/%s/projects", login), GHProject[].class, item -> item.wrap(root));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all open projects for the organization.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHProject> listProjects() throws IOException {
|
||||
return listProjects(GHProject.ProjectStateFilter.OPEN);
|
||||
@@ -221,39 +346,123 @@ public class GHOrganization extends GHPerson {
|
||||
|
||||
/**
|
||||
* Creates a project for the organization.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @param body
|
||||
* the body
|
||||
* @return the gh project
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHProject createProject(String name, String body) throws IOException {
|
||||
return root.retrieve().method("POST")
|
||||
return root.retrieve()
|
||||
.method("POST")
|
||||
.withPreview(INERTIA)
|
||||
.with("name", name)
|
||||
.with("body", body)
|
||||
.to(String.format("/orgs/%s/projects", login), GHProject.class).wrap(root);
|
||||
.to(String.format("/orgs/%s/projects", login), GHProject.class)
|
||||
.wrap(root);
|
||||
}
|
||||
|
||||
public enum Permission { ADMIN, PUSH, PULL }
|
||||
/**
|
||||
* The enum Permission.
|
||||
*/
|
||||
public enum Permission {
|
||||
ADMIN, PUSH, PULL
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new team and assigns the repositories.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @param p
|
||||
* the p
|
||||
* @param repositories
|
||||
* the repositories
|
||||
* @return the gh team
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated https://developer.github.com/v3/teams/#create-team deprecates permission field use
|
||||
* {@link #createTeam(String, Collection)}
|
||||
*/
|
||||
@Deprecated
|
||||
public GHTeam createTeam(String name, Permission p, Collection<GHRepository> repositories) throws IOException {
|
||||
Requester post = new Requester(root).with("name", name).with("permission", p);
|
||||
List<String> repo_names = new ArrayList<String>();
|
||||
for (GHRepository r : repositories) {
|
||||
repo_names.add(login + "/" + r.getName());
|
||||
}
|
||||
post.with("repo_names",repo_names);
|
||||
post.with("repo_names", repo_names);
|
||||
return post.method("POST").to("/orgs/" + login + "/teams", GHTeam.class).wrapUp(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create team gh team.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @param p
|
||||
* the p
|
||||
* @param repositories
|
||||
* the repositories
|
||||
* @return the gh team
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated https://developer.github.com/v3/teams/#create-team deprecates permission field use
|
||||
* {@link #createTeam(String, GHRepository...)}
|
||||
*/
|
||||
@Deprecated
|
||||
public GHTeam createTeam(String name, Permission p, GHRepository... repositories) throws IOException {
|
||||
return createTeam(name, p, Arrays.asList(repositories));
|
||||
}
|
||||
|
||||
/**
|
||||
* List up repositories that has some open pull requests.
|
||||
* Creates a new team and assigns the repositories.
|
||||
*
|
||||
* This used to be an efficient method that didn't involve traversing every repository, but now
|
||||
* it doesn't do any optimization.
|
||||
* @param name
|
||||
* the name
|
||||
* @param repositories
|
||||
* the repositories
|
||||
* @return the gh team
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHTeam createTeam(String name, Collection<GHRepository> repositories) throws IOException {
|
||||
Requester post = new Requester(root).with("name", name);
|
||||
List<String> repo_names = new ArrayList<String>();
|
||||
for (GHRepository r : repositories) {
|
||||
repo_names.add(login + "/" + r.getName());
|
||||
}
|
||||
post.with("repo_names", repo_names);
|
||||
return post.method("POST").to("/orgs/" + login + "/teams", GHTeam.class).wrapUp(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create team gh team.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @param repositories
|
||||
* the repositories
|
||||
* @return the gh team
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHTeam createTeam(String name, GHRepository... repositories) throws IOException {
|
||||
return createTeam(name, Arrays.asList(repositories));
|
||||
}
|
||||
|
||||
/**
|
||||
* List up repositories that has some open pull requests.
|
||||
* <p>
|
||||
* This used to be an efficient method that didn't involve traversing every repository, but now it doesn't do any
|
||||
* optimization.
|
||||
*
|
||||
* @return the repositories with open pull requests
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHRepository> getRepositoriesWithOpenPullRequests() throws IOException {
|
||||
List<GHRepository> r = new ArrayList<GHRepository>();
|
||||
@@ -269,6 +478,10 @@ public class GHOrganization extends GHPerson {
|
||||
|
||||
/**
|
||||
* Gets all the open pull requests in this organizataion.
|
||||
*
|
||||
* @return the pull requests
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHPullRequest> getPullRequests() throws IOException {
|
||||
List<GHPullRequest> all = new ArrayList<GHPullRequest>();
|
||||
@@ -283,60 +496,95 @@ public class GHOrganization extends GHPerson {
|
||||
*/
|
||||
public PagedIterable<GHEventInfo> listEvents() throws IOException {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
String.format("/orgs/%s/events", login),
|
||||
GHEventInfo[].class,
|
||||
item -> item.wrapUp(root) );
|
||||
.asPagedIterable(String.format("/orgs/%s/events", login),
|
||||
GHEventInfo[].class,
|
||||
item -> item.wrapUp(root));
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up all the repositories using the specified page size.
|
||||
*
|
||||
* @param pageSize size for each page of items returned by GitHub. Maximum page size is 100.
|
||||
* @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.
|
||||
* Unlike {@link #getRepositories()}, this does not wait until all the repositories are returned.
|
||||
*/
|
||||
@Override
|
||||
public PagedIterable<GHRepository> listRepositories(final int pageSize) {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
"/orgs/" + login + "/repos",
|
||||
GHRepository[].class,
|
||||
item -> item.wrap(root)
|
||||
).withPageSize(pageSize);
|
||||
.asPagedIterable("/orgs/" + login + "/repos", GHRepository[].class, item -> item.wrap(root))
|
||||
.withPageSize(pageSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the currently configured hooks.
|
||||
*
|
||||
* @return the hooks
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHHook> getHooks() throws IOException {
|
||||
return GHHooks.orgContext(this).getHooks();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets hook.
|
||||
*
|
||||
* @param id
|
||||
* the id
|
||||
* @return the hook
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
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
|
||||
* 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.
|
||||
* Type of the hook to be created. See https://api.github.com/hooks for possible names.
|
||||
* @param config
|
||||
* The configuration hash.
|
||||
* The configuration hash.
|
||||
* @param events
|
||||
* Can be null. Types of events to hook into.
|
||||
* Can be null. Types of events to hook into.
|
||||
* @param active
|
||||
* the active
|
||||
* @return the gh hook
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHHook createHook(String name, Map<String,String> config, Collection<GHEvent> events, boolean active) throws IOException {
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create web hook gh hook.
|
||||
*
|
||||
* @param url
|
||||
* the url
|
||||
* @param events
|
||||
* the events
|
||||
* @return the gh hook
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHHook createWebHook(URL url, Collection<GHEvent> events) throws IOException {
|
||||
return createHook("web", Collections.singletonMap("url", url.toExternalForm()),events,true);
|
||||
return createHook("web", Collections.singletonMap("url", url.toExternalForm()), events, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create web hook gh hook.
|
||||
*
|
||||
* @param url
|
||||
* the url
|
||||
* @return the gh hook
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHHook createWebHook(URL url) throws IOException {
|
||||
return createWebHook(url, null);
|
||||
}
|
||||
|
||||
@@ -28,24 +28,37 @@ import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Permission for a user in a repository.
|
||||
*
|
||||
* @see <a href="https://developer.github.com/v3/repos/collaborators/#review-a-users-permission-level">API</a>
|
||||
*/
|
||||
/*package*/ class GHPermission {
|
||||
class GHPermission {
|
||||
|
||||
private String permission;
|
||||
private GHUser user;
|
||||
|
||||
/**
|
||||
* Gets permission.
|
||||
*
|
||||
* @return one of {@code admin}, {@code write}, {@code read}, or {@code none}
|
||||
*/
|
||||
public String getPermission() {
|
||||
return permission;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets permission type.
|
||||
*
|
||||
* @return the permission type
|
||||
*/
|
||||
public GHPermissionType getPermissionType() {
|
||||
return Enum.valueOf(GHPermissionType.class, permission.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets user.
|
||||
*
|
||||
* @return the user
|
||||
*/
|
||||
public GHUser getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
* The enum GHPermissionType.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public enum GHPermissionType {
|
||||
ADMIN,
|
||||
WRITE,
|
||||
READ,
|
||||
NONE
|
||||
ADMIN, WRITE, READ, NONE
|
||||
}
|
||||
|
||||
@@ -13,32 +13,35 @@ import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* Common part of {@link GHUser} and {@link GHOrganization}.
|
||||
*
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public abstract class GHPerson extends GHObject {
|
||||
/*package almost final*/ GitHub root;
|
||||
/* package almost final */ GitHub root;
|
||||
|
||||
// core data fields that exist even for "small" user data (such as the user info in pull request)
|
||||
protected String login, avatar_url, gravatar_id;
|
||||
|
||||
// other fields (that only show up in full data)
|
||||
protected String location,blog,email,name,company;
|
||||
protected String location, blog, email, name, company;
|
||||
protected String html_url;
|
||||
protected int followers,following,public_repos,public_gists;
|
||||
protected int followers, following, public_repos, public_gists;
|
||||
|
||||
/*package*/ GHPerson wrapUp(GitHub root) {
|
||||
GHPerson wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fully populate the data by retrieving missing data.
|
||||
*
|
||||
* <p>
|
||||
* Depending on the original API call where this object is created, it may not contain everything.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
protected synchronized void populate() throws IOException {
|
||||
if (created_at!=null) {
|
||||
if (created_at != null) {
|
||||
return; // already populated
|
||||
}
|
||||
if (root == null || root.isOffline()) {
|
||||
@@ -51,60 +54,66 @@ public abstract class GHPerson extends GHObject {
|
||||
* Gets the public repositories this user owns.
|
||||
*
|
||||
* <p>
|
||||
* To list your own repositories, including private repositories,
|
||||
* use {@link GHMyself#listRepositories()}
|
||||
* To list your own repositories, including private repositories, use {@link GHMyself#listRepositories()}
|
||||
*
|
||||
* @return the repositories
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public synchronized Map<String,GHRepository> getRepositories() throws IOException {
|
||||
Map<String,GHRepository> repositories = new TreeMap<String, GHRepository>();
|
||||
public synchronized Map<String, GHRepository> getRepositories() throws IOException {
|
||||
Map<String, GHRepository> repositories = new TreeMap<String, GHRepository>();
|
||||
for (GHRepository r : listRepositories(100)) {
|
||||
repositories.put(r.getName(),r);
|
||||
repositories.put(r.getName(), r);
|
||||
}
|
||||
return Collections.unmodifiableMap(repositories);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up all the repositories using a 30 items page size.
|
||||
*
|
||||
* <p>
|
||||
* Unlike {@link #getRepositories()}, this does not wait until all the repositories are returned.
|
||||
*
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHRepository> listRepositories() {
|
||||
return listRepositories(30);
|
||||
return listRepositories(30);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up all the repositories using the specified page size.
|
||||
*
|
||||
* @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.
|
||||
* @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.
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHRepository> listRepositories(final int pageSize) {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
"/users/" + login + "/repos",
|
||||
GHRepository[].class,
|
||||
item -> item.wrap(root)
|
||||
).withPageSize(pageSize);
|
||||
.asPagedIterable("/users/" + login + "/repos", GHRepository[].class, item -> item.wrap(root))
|
||||
.withPageSize(pageSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads repository list in a paginated fashion.
|
||||
*
|
||||
* <p>
|
||||
* For a person with a lot of repositories, GitHub returns the list of repositories in a paginated fashion.
|
||||
* Unlike {@link #getRepositories()}, this method allows the caller to start processing data as it arrives.
|
||||
* For a person with a lot of repositories, GitHub returns the list of repositories in a paginated fashion. Unlike
|
||||
* {@link #getRepositories()}, this method allows the caller to start processing data as it arrives.
|
||||
* <p>
|
||||
* Every {@link Iterator#next()} call results in I/O. Exceptions that occur during the processing is wrapped into
|
||||
* {@link Error}.
|
||||
*
|
||||
* Every {@link Iterator#next()} call results in I/O. Exceptions that occur during the processing is wrapped
|
||||
* into {@link Error}.
|
||||
*
|
||||
* @deprecated
|
||||
* Use {@link #listRepositories()}
|
||||
* @param pageSize
|
||||
* the page size
|
||||
* @return the iterable
|
||||
* @deprecated Use {@link #listRepositories()}
|
||||
*/
|
||||
@Deprecated
|
||||
public synchronized Iterable<List<GHRepository>> iterateRepositories(final int pageSize) {
|
||||
return new Iterable<List<GHRepository>>() {
|
||||
public Iterator<List<GHRepository>> iterator() {
|
||||
final Iterator<GHRepository[]> pager = root.retrieve().asIterator("/users/" + login + "/repos",GHRepository[].class, pageSize);
|
||||
final Iterator<GHRepository[]> pager = root.retrieve()
|
||||
.asIterator("/users/" + login + "/repos", GHRepository[].class, pageSize);
|
||||
|
||||
return new Iterator<List<GHRepository>>() {
|
||||
public boolean hasNext() {
|
||||
@@ -127,9 +136,13 @@ public abstract class GHPerson extends GHObject {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets repository.
|
||||
*
|
||||
* @return
|
||||
* null if the repository was not found
|
||||
* @param name
|
||||
* the name
|
||||
* @return null if the repository was not found
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHRepository getRepository(String name) throws IOException {
|
||||
try {
|
||||
@@ -141,33 +154,41 @@ public abstract class GHPerson extends GHObject {
|
||||
|
||||
/**
|
||||
* Lists events for an organization or an user.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public abstract PagedIterable<GHEventInfo> listEvents() throws IOException;
|
||||
|
||||
/**
|
||||
* Gravatar ID of this user, like 0cb9832a01c22c083390f3c5dcb64105
|
||||
*
|
||||
* @deprecated
|
||||
* No longer available in the v3 API.
|
||||
* @return the gravatar id
|
||||
* @deprecated No longer available in the v3 API.
|
||||
*/
|
||||
public String getGravatarId() {
|
||||
return gravatar_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string like 'https://secure.gravatar.com/avatar/0cb9832a01c22c083390f3c5dcb64105'
|
||||
* that indicates the avatar image URL.
|
||||
* Returns a string like 'https://secure.gravatar.com/avatar/0cb9832a01c22c083390f3c5dcb64105' that indicates the
|
||||
* avatar image URL.
|
||||
*
|
||||
* @return the avatar url
|
||||
*/
|
||||
public String getAvatarUrl() {
|
||||
if (avatar_url!=null)
|
||||
if (avatar_url != null)
|
||||
return avatar_url;
|
||||
if (gravatar_id!=null)
|
||||
return "https://secure.gravatar.com/avatar/"+gravatar_id;
|
||||
if (gravatar_id != null)
|
||||
return "https://secure.gravatar.com/avatar/" + gravatar_id;
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the login ID of this user, like 'kohsuke'
|
||||
*
|
||||
* @return the login
|
||||
*/
|
||||
public String getLogin() {
|
||||
return login;
|
||||
@@ -175,6 +196,10 @@ public abstract class GHPerson extends GHObject {
|
||||
|
||||
/**
|
||||
* Gets the human-readable name of the user, like "Kohsuke Kawaguchi"
|
||||
*
|
||||
* @return the name
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getName() throws IOException {
|
||||
populate();
|
||||
@@ -183,6 +208,10 @@ public abstract class GHPerson extends GHObject {
|
||||
|
||||
/**
|
||||
* Gets the company name of this user, like "Sun Microsystems, Inc."
|
||||
*
|
||||
* @return the company
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getCompany() throws IOException {
|
||||
populate();
|
||||
@@ -191,6 +220,10 @@ public abstract class GHPerson extends GHObject {
|
||||
|
||||
/**
|
||||
* Gets the location of this user, like "Santa Clara, California"
|
||||
*
|
||||
* @return the location
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getLocation() throws IOException {
|
||||
populate();
|
||||
@@ -209,6 +242,10 @@ public abstract class GHPerson extends GHObject {
|
||||
|
||||
/**
|
||||
* Gets the blog URL of this user.
|
||||
*
|
||||
* @return the blog
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getBlog() throws IOException {
|
||||
populate();
|
||||
@@ -222,27 +259,59 @@ public abstract class GHPerson extends GHObject {
|
||||
|
||||
/**
|
||||
* Gets the e-mail address of the user.
|
||||
*
|
||||
* @return the email
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getEmail() throws IOException {
|
||||
populate();
|
||||
return email;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets public gist count.
|
||||
*
|
||||
* @return the public gist count
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public int getPublicGistCount() throws IOException {
|
||||
populate();
|
||||
return public_gists;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets public repo count.
|
||||
*
|
||||
* @return the public repo count
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public int getPublicRepoCount() throws IOException {
|
||||
populate();
|
||||
return public_repos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets following count.
|
||||
*
|
||||
* @return the following count
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public int getFollowingCount() throws IOException {
|
||||
populate();
|
||||
return following;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets followers count.
|
||||
*
|
||||
* @return the followers count
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public int getFollowersCount() throws IOException {
|
||||
populate();
|
||||
return followers;
|
||||
|
||||
@@ -6,38 +6,73 @@ import java.util.HashSet;
|
||||
|
||||
/**
|
||||
* Set of {@link GHPerson} with helper lookup methods.
|
||||
*
|
||||
*
|
||||
* @param <T>
|
||||
* the type parameter
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GHPersonSet<T extends GHPerson> extends HashSet<T> {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh person set.
|
||||
*/
|
||||
public GHPersonSet() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh person set.
|
||||
*
|
||||
* @param c
|
||||
* the c
|
||||
*/
|
||||
public GHPersonSet(Collection<? extends T> c) {
|
||||
super(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh person set.
|
||||
*
|
||||
* @param c
|
||||
* the c
|
||||
*/
|
||||
public GHPersonSet(T... c) {
|
||||
super(Arrays.asList(c));
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh person set.
|
||||
*
|
||||
* @param initialCapacity
|
||||
* the initial capacity
|
||||
* @param loadFactor
|
||||
* the load factor
|
||||
*/
|
||||
public GHPersonSet(int initialCapacity, float loadFactor) {
|
||||
super(initialCapacity, loadFactor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh person set.
|
||||
*
|
||||
* @param initialCapacity
|
||||
* the initial capacity
|
||||
*/
|
||||
public GHPersonSet(int initialCapacity) {
|
||||
super(initialCapacity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the item by its login.
|
||||
*
|
||||
* @param login
|
||||
* the login
|
||||
* @return the t
|
||||
*/
|
||||
public T byLogin(String login) {
|
||||
for (T t : this)
|
||||
if (t.getLogin().equals(login))
|
||||
return t;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,8 +32,9 @@ import static org.kohsuke.github.Previews.INERTIA;
|
||||
|
||||
/**
|
||||
* A GitHub project.
|
||||
* @see <a href="https://developer.github.com/v3/projects/">Projects</a>
|
||||
*
|
||||
* @author Martin van Zijl
|
||||
* @see <a href="https://developer.github.com/v3/projects/">Projects</a>
|
||||
*/
|
||||
public class GHProject extends GHObject {
|
||||
protected GitHub root;
|
||||
@@ -53,18 +54,30 @@ public class GHProject extends GHObject {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets owner.
|
||||
*
|
||||
* @return the owner
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHObject getOwner() throws IOException {
|
||||
if(owner == null) {
|
||||
if (owner == null) {
|
||||
try {
|
||||
if(owner_url.contains("/orgs/")) {
|
||||
if (owner_url.contains("/orgs/")) {
|
||||
owner = root.retrieve().to(getOwnerUrl().getPath(), GHOrganization.class).wrapUp(root);
|
||||
} else if(owner_url.contains("/users/")) {
|
||||
} else if (owner_url.contains("/users/")) {
|
||||
owner = root.retrieve().to(getOwnerUrl().getPath(), GHUser.class).wrapUp(root);
|
||||
} else if(owner_url.contains("/repos/")) {
|
||||
} else if (owner_url.contains("/repos/")) {
|
||||
owner = root.retrieve().to(getOwnerUrl().getPath(), GHRepository.class).wrap(root);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
@@ -74,110 +87,223 @@ public class GHProject extends GHObject {
|
||||
return owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets owner url.
|
||||
*
|
||||
* @return the owner url
|
||||
*/
|
||||
public URL getOwnerUrl() {
|
||||
return GitHub.parseURL(owner_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets node id.
|
||||
*
|
||||
* @return the node id
|
||||
*/
|
||||
public String getNode_id() {
|
||||
return node_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets body.
|
||||
*
|
||||
* @return the body
|
||||
*/
|
||||
public String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets number.
|
||||
*
|
||||
* @return the number
|
||||
*/
|
||||
public int getNumber() {
|
||||
return number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets state.
|
||||
*
|
||||
* @return the state
|
||||
*/
|
||||
public ProjectState getState() {
|
||||
return Enum.valueOf(ProjectState.class, state.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets creator.
|
||||
*
|
||||
* @return the creator
|
||||
*/
|
||||
public GHUser getCreator() {
|
||||
return creator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap gh project.
|
||||
*
|
||||
* @param repo
|
||||
* the repo
|
||||
* @return the gh project
|
||||
*/
|
||||
public GHProject wrap(GHRepository repo) {
|
||||
this.owner = repo;
|
||||
this.root = repo.root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap gh project.
|
||||
*
|
||||
* @param root
|
||||
* the root
|
||||
* @return the gh project
|
||||
*/
|
||||
public GHProject wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
new Requester(root).withPreview(INERTIA)._with(key, value).method("PATCH").to(getApiRoute());
|
||||
new Requester(root).withPreview(INERTIA).with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets api route.
|
||||
*
|
||||
* @return the api route
|
||||
*/
|
||||
protected String getApiRoute() {
|
||||
return "/projects/" + id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets name.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setName(String name) throws IOException {
|
||||
edit("name", name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets body.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setBody(String body) throws IOException {
|
||||
edit("body", body);
|
||||
}
|
||||
|
||||
/**
|
||||
* The enum ProjectState.
|
||||
*/
|
||||
public enum ProjectState {
|
||||
OPEN,
|
||||
CLOSED
|
||||
OPEN, CLOSED
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets state.
|
||||
*
|
||||
* @param state
|
||||
* the state
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setState(ProjectState state) throws IOException {
|
||||
edit("state", state.toString().toLowerCase());
|
||||
}
|
||||
|
||||
/**
|
||||
* The enum ProjectStateFilter.
|
||||
*/
|
||||
public static enum ProjectStateFilter {
|
||||
ALL,
|
||||
OPEN,
|
||||
CLOSED
|
||||
ALL, OPEN, CLOSED
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the permission level that all members of the project's organization will have on this project.
|
||||
* Only applicable for organization-owned projects.
|
||||
* Set the permission level that all members of the project's organization will have on this project. Only
|
||||
* applicable for organization-owned projects.
|
||||
*
|
||||
* @param permission
|
||||
* the permission
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setOrganizationPermission(GHPermissionType permission) throws IOException {
|
||||
edit("organization_permission", permission.toString().toLowerCase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets visibility of the project within the organization.
|
||||
* Only applicable for organization-owned projects.
|
||||
* Sets visibility of the project within the organization. Only applicable for organization-owned projects.
|
||||
*
|
||||
* @param isPublic
|
||||
* the is public
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setPublic(boolean isPublic) throws IOException {
|
||||
edit("public", isPublic);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).withPreview(INERTIA).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
* List columns paged iterable.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHProjectColumn> listColumns() throws IOException {
|
||||
final GHProject project = this;
|
||||
return root.retrieve()
|
||||
.withPreview(INERTIA)
|
||||
.asPagedIterable(
|
||||
String.format("/projects/%d/columns", id),
|
||||
GHProjectColumn[].class,
|
||||
item -> item.wrap(project) );
|
||||
.withPreview(INERTIA)
|
||||
.asPagedIterable(String.format("/projects/%d/columns", id),
|
||||
GHProjectColumn[].class,
|
||||
item -> item.wrap(project));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create column gh project column.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @return the gh project column
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHProjectColumn createColumn(String name) throws IOException {
|
||||
return root.retrieve().method("POST")
|
||||
return root.retrieve()
|
||||
.method("POST")
|
||||
.withPreview(INERTIA)
|
||||
.with("name", name)
|
||||
.to(String.format("/projects/%d/columns", id), GHProjectColumn.class).wrap(this);
|
||||
.to(String.format("/projects/%d/columns", id), GHProjectColumn.class)
|
||||
.wrap(this);
|
||||
}
|
||||
}
|
||||
@@ -9,115 +9,214 @@ import java.net.URL;
|
||||
import static org.kohsuke.github.Previews.INERTIA;
|
||||
|
||||
/**
|
||||
* The type GHProjectCard.
|
||||
*
|
||||
* @author Gunnar Skjold
|
||||
*/
|
||||
public class GHProjectCard extends GHObject {
|
||||
private GitHub root;
|
||||
private GHProject project;
|
||||
private GHProjectColumn column;
|
||||
private GitHub root;
|
||||
private GHProject project;
|
||||
private GHProjectColumn column;
|
||||
|
||||
private String note;
|
||||
private GHUser creator;
|
||||
private String content_url, project_url, column_url;
|
||||
private boolean archived;
|
||||
private String note;
|
||||
private GHUser creator;
|
||||
private String content_url, project_url, column_url;
|
||||
private boolean archived;
|
||||
|
||||
public URL getHtmlUrl() throws IOException {
|
||||
return null;
|
||||
}
|
||||
public URL getHtmlUrl() throws IOException {
|
||||
return null;
|
||||
}
|
||||
|
||||
public GHProjectCard wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Wrap gh project card.
|
||||
*
|
||||
* @param root
|
||||
* the root
|
||||
* @return the gh project card
|
||||
*/
|
||||
public GHProjectCard wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHProjectCard wrap(GHProjectColumn column) {
|
||||
this.column = column;
|
||||
this.project = column.project;
|
||||
this.root = column.root;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Wrap gh project card.
|
||||
*
|
||||
* @param column
|
||||
* the column
|
||||
* @return the gh project card
|
||||
*/
|
||||
public GHProjectCard wrap(GHProjectColumn column) {
|
||||
this.column = column;
|
||||
this.project = column.project;
|
||||
this.root = column.root;
|
||||
return this;
|
||||
}
|
||||
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
public GHProject getProject() throws IOException {
|
||||
if(project == null) {
|
||||
try {
|
||||
project = root.retrieve().to(getProjectUrl().getPath(), GHProject.class).wrap(root);
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return project;
|
||||
}
|
||||
/**
|
||||
* Gets project.
|
||||
*
|
||||
* @return the project
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHProject getProject() throws IOException {
|
||||
if (project == null) {
|
||||
try {
|
||||
project = root.retrieve().to(getProjectUrl().getPath(), GHProject.class).wrap(root);
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return project;
|
||||
}
|
||||
|
||||
public GHProjectColumn getColumn() throws IOException {
|
||||
if(column == null) {
|
||||
try {
|
||||
column = root.retrieve().to(getColumnUrl().getPath(), GHProjectColumn.class).wrap(root);
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return column;
|
||||
}
|
||||
/**
|
||||
* Gets column.
|
||||
*
|
||||
* @return the column
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHProjectColumn getColumn() throws IOException {
|
||||
if (column == null) {
|
||||
try {
|
||||
column = root.retrieve().to(getColumnUrl().getPath(), GHProjectColumn.class).wrap(root);
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return column;
|
||||
}
|
||||
|
||||
public GHIssue getContent() throws IOException {
|
||||
if(StringUtils.isEmpty(content_url))
|
||||
return null;
|
||||
try {
|
||||
if(content_url.contains("/pulls")) {
|
||||
return root.retrieve().to(getContentUrl().getPath(), GHPullRequest.class).wrap(root);
|
||||
} else {
|
||||
return root.retrieve().to(getContentUrl().getPath(), GHIssue.class).wrap(root);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Gets content.
|
||||
*
|
||||
* @return the content
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHIssue getContent() throws IOException {
|
||||
if (StringUtils.isEmpty(content_url))
|
||||
return null;
|
||||
try {
|
||||
if (content_url.contains("/pulls")) {
|
||||
return root.retrieve().to(getContentUrl().getPath(), GHPullRequest.class).wrap(root);
|
||||
} else {
|
||||
return root.retrieve().to(getContentUrl().getPath(), GHIssue.class).wrap(root);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public String getNote() {
|
||||
return note;
|
||||
}
|
||||
/**
|
||||
* Gets note.
|
||||
*
|
||||
* @return the note
|
||||
*/
|
||||
public String getNote() {
|
||||
return note;
|
||||
}
|
||||
|
||||
public GHUser getCreator() {
|
||||
return creator;
|
||||
}
|
||||
/**
|
||||
* Gets creator.
|
||||
*
|
||||
* @return the creator
|
||||
*/
|
||||
public GHUser getCreator() {
|
||||
return creator;
|
||||
}
|
||||
|
||||
public URL getContentUrl() {
|
||||
return GitHub.parseURL(content_url);
|
||||
}
|
||||
/**
|
||||
* Gets content url.
|
||||
*
|
||||
* @return the content url
|
||||
*/
|
||||
public URL getContentUrl() {
|
||||
return GitHub.parseURL(content_url);
|
||||
}
|
||||
|
||||
public URL getProjectUrl() {
|
||||
return GitHub.parseURL(project_url);
|
||||
}
|
||||
/**
|
||||
* Gets project url.
|
||||
*
|
||||
* @return the project url
|
||||
*/
|
||||
public URL getProjectUrl() {
|
||||
return GitHub.parseURL(project_url);
|
||||
}
|
||||
|
||||
public URL getColumnUrl() {
|
||||
return GitHub.parseURL(column_url);
|
||||
}
|
||||
/**
|
||||
* Gets column url.
|
||||
*
|
||||
* @return the column url
|
||||
*/
|
||||
public URL getColumnUrl() {
|
||||
return GitHub.parseURL(column_url);
|
||||
}
|
||||
|
||||
public boolean isArchived() {
|
||||
return archived;
|
||||
}
|
||||
/**
|
||||
* Is archived boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isArchived() {
|
||||
return archived;
|
||||
}
|
||||
|
||||
public void setNote(String note) throws IOException {
|
||||
edit("note", note);
|
||||
}
|
||||
/**
|
||||
* Sets note.
|
||||
*
|
||||
* @param note
|
||||
* the note
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setNote(String note) throws IOException {
|
||||
edit("note", note);
|
||||
}
|
||||
|
||||
public void setArchived(boolean archived) throws IOException {
|
||||
edit("archived", archived);
|
||||
}
|
||||
/**
|
||||
* Sets archived.
|
||||
*
|
||||
* @param archived
|
||||
* the archived
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setArchived(boolean archived) throws IOException {
|
||||
edit("archived", archived);
|
||||
}
|
||||
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
new Requester(root).withPreview(INERTIA)._with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
new Requester(root).withPreview(INERTIA).with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
|
||||
protected String getApiRoute() {
|
||||
return String.format("/projects/columns/cards/%d", id);
|
||||
}
|
||||
/**
|
||||
* Gets api route.
|
||||
*
|
||||
* @return the api route
|
||||
*/
|
||||
protected String getApiRoute() {
|
||||
return String.format("/projects/columns/cards/%d", id);
|
||||
}
|
||||
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).withPreview(INERTIA).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
/**
|
||||
* Delete.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).withPreview(INERTIA).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,92 +7,177 @@ import java.net.URL;
|
||||
import static org.kohsuke.github.Previews.INERTIA;
|
||||
|
||||
/**
|
||||
* The type GHProjectColumn.
|
||||
*
|
||||
* @author Gunnar Skjold
|
||||
*/
|
||||
public class GHProjectColumn extends GHObject {
|
||||
protected GitHub root;
|
||||
protected GHProject project;
|
||||
protected GitHub root;
|
||||
protected GHProject project;
|
||||
|
||||
private String name;
|
||||
private String project_url;
|
||||
private String name;
|
||||
private String project_url;
|
||||
|
||||
@Override
|
||||
public URL getHtmlUrl() throws IOException {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public URL getHtmlUrl() throws IOException {
|
||||
return null;
|
||||
}
|
||||
|
||||
public GHProjectColumn wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Wrap gh project column.
|
||||
*
|
||||
* @param root
|
||||
* the root
|
||||
* @return the gh project column
|
||||
*/
|
||||
public GHProjectColumn wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHProjectColumn wrap(GHProject project) {
|
||||
this.project = project;
|
||||
this.root = project.root;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Wrap gh project column.
|
||||
*
|
||||
* @param project
|
||||
* the project
|
||||
* @return the gh project column
|
||||
*/
|
||||
public GHProjectColumn wrap(GHProject project) {
|
||||
this.project = project;
|
||||
this.root = project.root;
|
||||
return this;
|
||||
}
|
||||
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
public GHProject getProject() throws IOException {
|
||||
if(project == null) {
|
||||
try {
|
||||
project = root.retrieve().to(getProjectUrl().getPath(), GHProject.class).wrap(root);
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return project;
|
||||
}
|
||||
/**
|
||||
* Gets project.
|
||||
*
|
||||
* @return the project
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHProject getProject() throws IOException {
|
||||
if (project == null) {
|
||||
try {
|
||||
project = root.retrieve().to(getProjectUrl().getPath(), GHProject.class).wrap(root);
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return project;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public URL getProjectUrl() {
|
||||
return GitHub.parseURL(project_url);
|
||||
}
|
||||
/**
|
||||
* Gets project url.
|
||||
*
|
||||
* @return the project url
|
||||
*/
|
||||
public URL getProjectUrl() {
|
||||
return GitHub.parseURL(project_url);
|
||||
}
|
||||
|
||||
public void setName(String name) throws IOException {
|
||||
edit("name", name);
|
||||
}
|
||||
/**
|
||||
* Sets name.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void setName(String name) throws IOException {
|
||||
edit("name", name);
|
||||
}
|
||||
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
new Requester(root).withPreview(INERTIA)._with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
new Requester(root).withPreview(INERTIA).with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
|
||||
protected String getApiRoute() {
|
||||
return String.format("/projects/columns/%d", id);
|
||||
}
|
||||
/**
|
||||
* Gets api route.
|
||||
*
|
||||
* @return the api route
|
||||
*/
|
||||
protected String getApiRoute() {
|
||||
return String.format("/projects/columns/%d", id);
|
||||
}
|
||||
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).withPreview(INERTIA).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
/**
|
||||
* Delete.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).withPreview(INERTIA).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
|
||||
public PagedIterable<GHProjectCard> listCards() throws IOException {
|
||||
final GHProjectColumn column = this;
|
||||
return root.retrieve()
|
||||
.withPreview(INERTIA)
|
||||
.asPagedIterable(
|
||||
String.format("/projects/columns/%d/cards", id),
|
||||
GHProjectCard[].class,
|
||||
item -> item.wrap(column) );
|
||||
}
|
||||
/**
|
||||
* List cards paged iterable.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHProjectCard> listCards() throws IOException {
|
||||
final GHProjectColumn column = this;
|
||||
return root.retrieve()
|
||||
.withPreview(INERTIA)
|
||||
.asPagedIterable(String.format("/projects/columns/%d/cards", id),
|
||||
GHProjectCard[].class,
|
||||
item -> item.wrap(column));
|
||||
}
|
||||
|
||||
public GHProjectCard createCard(String note) throws IOException {
|
||||
return root.retrieve().method("POST")
|
||||
.withPreview(INERTIA)
|
||||
.with("note", note)
|
||||
.to(String.format("/projects/columns/%d/cards", id), GHProjectCard.class).wrap(this);
|
||||
}
|
||||
/**
|
||||
* Create card gh project card.
|
||||
*
|
||||
* @param note
|
||||
* the note
|
||||
* @return the gh project card
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHProjectCard createCard(String note) throws IOException {
|
||||
return root.retrieve()
|
||||
.method("POST")
|
||||
.withPreview(INERTIA)
|
||||
.with("note", note)
|
||||
.to(String.format("/projects/columns/%d/cards", id), GHProjectCard.class)
|
||||
.wrap(this);
|
||||
}
|
||||
|
||||
public GHProjectCard createCard(GHIssue issue) throws IOException {
|
||||
return root.retrieve().method("POST")
|
||||
.withPreview(INERTIA)
|
||||
.with("content_type", issue instanceof GHPullRequest ? "PullRequest" : "Issue")
|
||||
.with("content_id", issue.getId())
|
||||
.to(String.format("/projects/columns/%d/cards", id), GHProjectCard.class).wrap(this);
|
||||
}
|
||||
/**
|
||||
* Create card gh project card.
|
||||
*
|
||||
* @param issue
|
||||
* the issue
|
||||
* @return the gh project card
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHProjectCard createCard(GHIssue issue) throws IOException {
|
||||
return root.retrieve()
|
||||
.method("POST")
|
||||
.withPreview(INERTIA)
|
||||
.with("content_type", issue instanceof GHPullRequest ? "PullRequest" : "Issue")
|
||||
.with("content_id", issue.getId())
|
||||
.to(String.format("/projects/columns/%d/cards", id), GHProjectCard.class)
|
||||
.wrap(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
*/
|
||||
package org.kohsuke.github;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
@@ -33,15 +32,17 @@ import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
|
||||
import static org.kohsuke.github.Previews.SHADOW_CAT;
|
||||
|
||||
/**
|
||||
* A pull request.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#getPullRequest(int)
|
||||
* @see GHRepository#getPullRequest(int) GHRepository#getPullRequest(int)
|
||||
*/
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
@SuppressWarnings({ "UnusedDeclaration" })
|
||||
public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
|
||||
private static final String COMMENTS_ACTION = "/comments";
|
||||
@@ -69,52 +70,60 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
private GHTeam[] requested_teams;
|
||||
|
||||
/**
|
||||
* GitHub doesn't return some properties of {@link GHIssue} when requesting the GET on the 'pulls' API
|
||||
* route as opposed to 'issues' API route. This flag remembers whether we made the GET call on the 'issues' route
|
||||
* on this object to fill in those missing details
|
||||
* GitHub doesn't return some properties of {@link GHIssue} when requesting the GET on the 'pulls' API route as
|
||||
* opposed to 'issues' API route. This flag remembers whether we made the GET call on the 'issues' route on this
|
||||
* object to fill in those missing details
|
||||
*/
|
||||
private transient boolean fetchedIssueDetails;
|
||||
|
||||
|
||||
GHPullRequest wrapUp(GHRepository owner) {
|
||||
this.wrap(owner);
|
||||
return wrapUp(owner.root);
|
||||
}
|
||||
|
||||
GHPullRequest wrapUp(GitHub root) {
|
||||
if (owner != null) owner.wrap(root);
|
||||
if (base != null) base.wrapUp(root);
|
||||
if (head != null) head.wrapUp(root);
|
||||
if (merged_by != null) merged_by.wrapUp(root);
|
||||
if (requested_reviewers != null) GHUser.wrap(requested_reviewers, root);
|
||||
if (requested_teams != null) GHTeam.wrapUp(requested_teams, this);
|
||||
if (owner != null)
|
||||
owner.wrap(root);
|
||||
if (base != null)
|
||||
base.wrapUp(root);
|
||||
if (head != null)
|
||||
head.wrapUp(root);
|
||||
if (merged_by != null)
|
||||
merged_by.wrapUp(root);
|
||||
if (requested_reviewers != null)
|
||||
GHUser.wrap(requested_reviewers, root);
|
||||
if (requested_teams != null)
|
||||
GHTeam.wrapUp(requested_teams, this);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getApiRoute() {
|
||||
return "/repos/"+owner.getOwnerName()+"/"+owner.getName()+"/pulls/"+number;
|
||||
return "/repos/" + owner.getOwnerName() + "/" + owner.getName() + "/pulls/" + number;
|
||||
}
|
||||
|
||||
/**
|
||||
* The URL of the patch file.
|
||||
* like https://github.com/jenkinsci/jenkins/pull/100.patch
|
||||
* The URL of the patch file. like https://github.com/jenkinsci/jenkins/pull/100.patch
|
||||
*
|
||||
* @return the patch url
|
||||
*/
|
||||
public URL getPatchUrl() {
|
||||
return GitHub.parseURL(patch_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* The URL of the patch file.
|
||||
* like https://github.com/jenkinsci/jenkins/pull/100.patch
|
||||
* The URL of the patch file. like https://github.com/jenkinsci/jenkins/pull/100.patch
|
||||
*
|
||||
* @return the issue url
|
||||
*/
|
||||
public URL getIssueUrl() {
|
||||
return GitHub.parseURL(issue_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* This points to where the change should be pulled into,
|
||||
* but I'm not really sure what exactly it means.
|
||||
* This points to where the change should be pulled into, but I'm not really sure what exactly it means.
|
||||
*
|
||||
* @return the base
|
||||
*/
|
||||
public GHCommitPointer getBase() {
|
||||
return base;
|
||||
@@ -122,24 +131,39 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
|
||||
/**
|
||||
* The change that should be pulled. The tip of the commits to merge.
|
||||
*
|
||||
* @return the head
|
||||
*/
|
||||
public GHCommitPointer getHead() {
|
||||
return head;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets issue updated at.
|
||||
*
|
||||
* @return the issue updated at
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
@Deprecated
|
||||
public Date getIssueUpdatedAt() throws IOException {
|
||||
return super.getUpdatedAt();
|
||||
}
|
||||
|
||||
/**
|
||||
* The diff file,
|
||||
* like https://github.com/jenkinsci/jenkins/pull/100.diff
|
||||
* The diff file, like https://github.com/jenkinsci/jenkins/pull/100.diff
|
||||
*
|
||||
* @return the diff url
|
||||
*/
|
||||
public URL getDiffUrl() {
|
||||
return GitHub.parseURL(diff_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets merged at.
|
||||
*
|
||||
* @return the merged at
|
||||
*/
|
||||
public Date getMergedAt() {
|
||||
return GitHub.parseDate(merged_at);
|
||||
}
|
||||
@@ -164,36 +188,85 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
// details that are only available via get with ID
|
||||
//
|
||||
|
||||
/**
|
||||
* Gets merged by.
|
||||
*
|
||||
* @return the merged by
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getMergedBy() throws IOException {
|
||||
populate();
|
||||
return merged_by;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets review comments.
|
||||
*
|
||||
* @return the review comments
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public int getReviewComments() throws IOException {
|
||||
populate();
|
||||
return review_comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets additions.
|
||||
*
|
||||
* @return the additions
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public int getAdditions() throws IOException {
|
||||
populate();
|
||||
return additions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets commits.
|
||||
*
|
||||
* @return the commits
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public int getCommits() throws IOException {
|
||||
populate();
|
||||
return commits;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is merged boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public boolean isMerged() throws IOException {
|
||||
populate();
|
||||
return merged;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can maintainer modify boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public boolean canMaintainerModify() throws IOException {
|
||||
populate();
|
||||
return maintainer_can_modify;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is draft boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public boolean isDraft() throws IOException {
|
||||
populate();
|
||||
return draft;
|
||||
@@ -202,10 +275,11 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
/**
|
||||
* Is this PR mergeable?
|
||||
*
|
||||
* @return
|
||||
* null if the state has not been determined yet, for example when a PR is newly created.
|
||||
* If this method is called on an instance whose mergeable state is not yet known,
|
||||
* API call is made to retrieve the latest state.
|
||||
* @return null if the state has not been determined yet, for example when a PR is newly created. If this method is
|
||||
* called on an instance whose mergeable state is not yet known, API call is made to retrieve the latest
|
||||
* state.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public Boolean getMergeable() throws IOException {
|
||||
refresh(mergeable);
|
||||
@@ -220,17 +294,37 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
return mergeable;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets deletions.
|
||||
*
|
||||
* @return the deletions
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public int getDeletions() throws IOException {
|
||||
populate();
|
||||
return deletions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets mergeable state.
|
||||
*
|
||||
* @return the mergeable state
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getMergeableState() throws IOException {
|
||||
populate();
|
||||
return mergeable_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets changed files.
|
||||
*
|
||||
* @return the changed files
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public int getChangedFiles() throws IOException {
|
||||
populate();
|
||||
return changed_files;
|
||||
@@ -238,17 +332,35 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
|
||||
/**
|
||||
* See <a href="https://developer.github.com/changes/2013-04-25-deprecating-merge-commit-sha">GitHub blog post</a>
|
||||
*
|
||||
* @return the merge commit sha
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public String getMergeCommitSha() throws IOException {
|
||||
populate();
|
||||
return merge_commit_sha;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets requested reviewers.
|
||||
*
|
||||
* @return the requested reviewers
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHUser> getRequestedReviewers() throws IOException {
|
||||
refresh(requested_reviewers);
|
||||
return Collections.unmodifiableList(Arrays.asList(requested_reviewers));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets requested teams.
|
||||
*
|
||||
* @return the requested teams
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHTeam> getRequestedTeams() throws IOException {
|
||||
refresh(requested_teams);
|
||||
return Collections.unmodifiableList(Arrays.asList(requested_teams));
|
||||
@@ -260,7 +372,8 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
* Depending on the original API call where this object is created, it may not contain everything.
|
||||
*/
|
||||
private void populate() throws IOException {
|
||||
if (mergeable_state!=null) return; // already populated
|
||||
if (mergeable_state != null)
|
||||
return; // already populated
|
||||
refresh();
|
||||
}
|
||||
|
||||
@@ -271,70 +384,94 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
if (root.isOffline()) {
|
||||
return; // cannot populate, will have to live with what we have
|
||||
}
|
||||
root.retrieve()
|
||||
.withPreview(SHADOW_CAT)
|
||||
.to(url, this).wrapUp(owner);
|
||||
root.retrieve().withPreview(SHADOW_CAT).to(url, this).wrapUp(owner);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all the files associated to this pull request.
|
||||
*
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHPullRequestFileDetail> listFiles() {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
String.format("%s/files", getApiRoute()),
|
||||
GHPullRequestFileDetail[].class,
|
||||
null);
|
||||
.asPagedIterable(String.format("%s/files", getApiRoute()), GHPullRequestFileDetail[].class, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all the reviews associated to this pull request.
|
||||
*
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHPullRequestReview> listReviews() {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
String.format("%s/reviews", getApiRoute()),
|
||||
GHPullRequestReview[].class,
|
||||
item -> item.wrapUp(GHPullRequest.this));
|
||||
.asPagedIterable(String.format("%s/reviews", getApiRoute()),
|
||||
GHPullRequestReview[].class,
|
||||
item -> item.wrapUp(GHPullRequest.this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtains all the review comments associated with this pull request.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHPullRequestReviewComment> listReviewComments() throws IOException {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
getApiRoute() + COMMENTS_ACTION,
|
||||
.asPagedIterable(getApiRoute() + COMMENTS_ACTION,
|
||||
GHPullRequestReviewComment[].class,
|
||||
item -> item.wrapUp(GHPullRequest.this) );
|
||||
item -> item.wrapUp(GHPullRequest.this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all the commits associated to this pull request.
|
||||
*
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public PagedIterable<GHPullRequestCommitDetail> listCommits() {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
String.format("%s/commits", getApiRoute()),
|
||||
.asPagedIterable(String.format("%s/commits", getApiRoute()),
|
||||
GHPullRequestCommitDetail[].class,
|
||||
item -> item.wrapUp(GHPullRequest.this) );
|
||||
item -> item.wrapUp(GHPullRequest.this));
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link #createReview()}
|
||||
* Create review gh pull request review.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @param event
|
||||
* the event
|
||||
* @param comments
|
||||
* the comments
|
||||
* @return the gh pull request review
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated Use {@link #createReview()}
|
||||
*/
|
||||
public GHPullRequestReview createReview(String body, @CheckForNull GHPullRequestReviewState event,
|
||||
GHPullRequestReviewComment... comments) throws IOException {
|
||||
public GHPullRequestReview createReview(String body,
|
||||
@CheckForNull GHPullRequestReviewState event,
|
||||
GHPullRequestReviewComment... comments) throws IOException {
|
||||
return createReview(body, event, Arrays.asList(comments));
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link #createReview()}
|
||||
* Create review gh pull request review.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @param event
|
||||
* the event
|
||||
* @param comments
|
||||
* the comments
|
||||
* @return the gh pull request review
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated Use {@link #createReview()}
|
||||
*/
|
||||
public GHPullRequestReview createReview(String body, @CheckForNull GHPullRequestReviewState event,
|
||||
List<GHPullRequestReviewComment> comments) throws IOException {
|
||||
public GHPullRequestReview createReview(String body,
|
||||
@CheckForNull GHPullRequestReviewState event,
|
||||
List<GHPullRequestReviewComment> comments) throws IOException {
|
||||
GHPullRequestReviewBuilder b = createReview().body(body);
|
||||
for (GHPullRequestReviewComment c : comments) {
|
||||
b.comment(c.getBody(), c.getPath(), c.getPosition());
|
||||
@@ -342,56 +479,96 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
return b.create();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create review gh pull request review builder.
|
||||
*
|
||||
* @return the gh pull request review builder
|
||||
*/
|
||||
public GHPullRequestReviewBuilder createReview() {
|
||||
return new GHPullRequestReviewBuilder(this);
|
||||
}
|
||||
|
||||
public GHPullRequestReviewComment createReviewComment(String body, String sha, String path, int position) throws IOException {
|
||||
/**
|
||||
* Create review comment gh pull request review comment.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @param sha
|
||||
* the sha
|
||||
* @param path
|
||||
* the path
|
||||
* @param position
|
||||
* the position
|
||||
* @return the gh pull request review comment
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHPullRequestReviewComment createReviewComment(String body, String sha, String path, int position)
|
||||
throws IOException {
|
||||
return new Requester(root).method("POST")
|
||||
.with("body", body)
|
||||
.with("commit_id", sha)
|
||||
.with("path", path)
|
||||
.with("position", position)
|
||||
.to(getApiRoute() + COMMENTS_ACTION, GHPullRequestReviewComment.class).wrapUp(this);
|
||||
.to(getApiRoute() + COMMENTS_ACTION, GHPullRequestReviewComment.class)
|
||||
.wrapUp(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Request reviewers.
|
||||
*
|
||||
* @param reviewers
|
||||
* the reviewers
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void requestReviewers(List<GHUser> reviewers) throws IOException {
|
||||
new Requester(root).method("POST")
|
||||
.withLogins("reviewers", reviewers)
|
||||
.with("reviewers", getLogins(reviewers))
|
||||
.to(getApiRoute() + REQUEST_REVIEWERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Request team reviewers.
|
||||
*
|
||||
* @param teams
|
||||
* the teams
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void requestTeamReviewers(List<GHTeam> teams) throws IOException {
|
||||
List<String> teamReviewers = new ArrayList<String>(teams.size());
|
||||
for (GHTeam team : teams) {
|
||||
teamReviewers.add(team.getSlug());
|
||||
teamReviewers.add(team.getSlug());
|
||||
}
|
||||
new Requester(root).method("POST")
|
||||
.with("team_reviewers", teamReviewers)
|
||||
.to(getApiRoute() + REQUEST_REVIEWERS);
|
||||
new Requester(root).method("POST").with("team_reviewers", teamReviewers).to(getApiRoute() + REQUEST_REVIEWERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge this pull request.
|
||||
*
|
||||
* <p>
|
||||
* The equivalent of the big green "Merge pull request" button.
|
||||
*
|
||||
* @param msg
|
||||
* Commit message. If null, the default one will be used.
|
||||
* Commit message. If null, the default one will be used.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void merge(String msg) throws IOException {
|
||||
merge(msg,null);
|
||||
merge(msg, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge this pull request.
|
||||
*
|
||||
* <p>
|
||||
* The equivalent of the big green "Merge pull request" button.
|
||||
*
|
||||
* @param msg
|
||||
* Commit message. If null, the default one will be used.
|
||||
* Commit message. If null, the default one will be used.
|
||||
* @param sha
|
||||
* SHA that pull request head must match to allow merge.
|
||||
* SHA that pull request head must match to allow merge.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void merge(String msg, String sha) throws IOException {
|
||||
merge(msg, sha, null);
|
||||
@@ -399,13 +576,17 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
|
||||
/**
|
||||
* Merge this pull request, using the specified merge method.
|
||||
*
|
||||
* <p>
|
||||
* The equivalent of the big green "Merge pull request" button.
|
||||
*
|
||||
* @param msg
|
||||
* Commit message. If null, the default one will be used.
|
||||
* Commit message. If null, the default one will be used.
|
||||
* @param sha
|
||||
* the sha
|
||||
* @param method
|
||||
* SHA that pull request head must match to allow merge.
|
||||
* SHA that pull request head must match to allow merge.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void merge(String msg, String sha, MergeMethod method) throws IOException {
|
||||
new Requester(root).method("PUT")
|
||||
@@ -415,7 +596,12 @@ public class GHPullRequest extends GHIssue implements Refreshable {
|
||||
.to(getApiRoute() + "/merge");
|
||||
}
|
||||
|
||||
public enum MergeMethod{ MERGE, SQUASH, REBASE }
|
||||
/**
|
||||
* The enum MergeMethod.
|
||||
*/
|
||||
public enum MergeMethod {
|
||||
MERGE, SQUASH, REBASE
|
||||
}
|
||||
|
||||
private void fetchIssue() throws IOException {
|
||||
if (!fetchedIssueDetails) {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
/*
|
||||
* The MIT License
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2013, Luca Milanesio
|
||||
*
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
@@ -30,38 +30,58 @@ import java.net.URL;
|
||||
|
||||
/**
|
||||
* Commit detail inside a {@link GHPullRequest}.
|
||||
*
|
||||
*
|
||||
* @author Luca Milanesio
|
||||
* @see GHPullRequest#listCommits()
|
||||
* @see GHPullRequest#listCommits() GHPullRequest#listCommits()
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD", "URF_UNREAD_FIELD"}, justification = "JSON API")
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"URF_UNREAD_FIELD" },
|
||||
justification = "JSON API")
|
||||
public class GHPullRequestCommitDetail {
|
||||
private GHPullRequest owner;
|
||||
|
||||
/*package*/ void wrapUp(GHPullRequest owner) {
|
||||
void wrapUp(GHPullRequest owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* The type Authorship.
|
||||
*
|
||||
* @deprecated Use {@link GitUser}
|
||||
*/
|
||||
public static class Authorship extends GitUser {
|
||||
}
|
||||
|
||||
/**
|
||||
* The type Tree.
|
||||
*/
|
||||
public static class Tree {
|
||||
String sha;
|
||||
String url;
|
||||
|
||||
/**
|
||||
* Gets sha.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type Commit.
|
||||
*/
|
||||
public static class Commit {
|
||||
Authorship author;
|
||||
Authorship committer;
|
||||
@@ -70,46 +90,94 @@ public class GHPullRequestCommitDetail {
|
||||
String url;
|
||||
int comment_count;
|
||||
|
||||
/**
|
||||
* Gets author.
|
||||
*
|
||||
* @return the author
|
||||
*/
|
||||
@WithBridgeMethods(value = Authorship.class, castRequired = true)
|
||||
public GitUser getAuthor() {
|
||||
return author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets committer.
|
||||
*
|
||||
* @return the committer
|
||||
*/
|
||||
@WithBridgeMethods(value = Authorship.class, castRequired = true)
|
||||
public GitUser getCommitter() {
|
||||
return committer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets message.
|
||||
*
|
||||
* @return the message
|
||||
*/
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets comment count.
|
||||
*
|
||||
* @return the comment count
|
||||
*/
|
||||
public int getComment_count() {
|
||||
return comment_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets tree.
|
||||
*
|
||||
* @return the tree
|
||||
*/
|
||||
public Tree getTree() {
|
||||
return tree;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type CommitPointer.
|
||||
*/
|
||||
public static class CommitPointer {
|
||||
String sha;
|
||||
String url;
|
||||
String html_url;
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets html url.
|
||||
*
|
||||
* @return the html url
|
||||
*/
|
||||
public URL getHtml_url() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sha.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
@@ -122,26 +190,56 @@ public class GHPullRequestCommitDetail {
|
||||
String comments_url;
|
||||
CommitPointer[] parents;
|
||||
|
||||
/**
|
||||
* Gets sha.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets commit.
|
||||
*
|
||||
* @return the commit
|
||||
*/
|
||||
public Commit getCommit() {
|
||||
return commit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets api url.
|
||||
*
|
||||
* @return the api url
|
||||
*/
|
||||
public URL getApiUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets url.
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets comments url.
|
||||
*
|
||||
* @return the comments url
|
||||
*/
|
||||
public URL getCommentsUrl() {
|
||||
return GitHub.parseURL(comments_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get parents commit pointer [ ].
|
||||
*
|
||||
* @return the commit pointer [ ]
|
||||
*/
|
||||
public CommitPointer[] getParents() {
|
||||
CommitPointer[] newValue = new CommitPointer[parents.length];
|
||||
System.arraycopy(parents, 0, newValue, 0, parents.length);
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
/*
|
||||
* The MIT License
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2015, Julien Henry
|
||||
*
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
@@ -27,9 +27,9 @@ import java.net.URL;
|
||||
|
||||
/**
|
||||
* File detail inside a {@link GHPullRequest}.
|
||||
*
|
||||
*
|
||||
* @author Julien Henry
|
||||
* @see GHPullRequest#listFiles()
|
||||
* @see GHPullRequest#listFiles() GHPullRequest#listFiles()
|
||||
*/
|
||||
public class GHPullRequestFileDetail {
|
||||
|
||||
@@ -45,48 +45,102 @@ public class GHPullRequestFileDetail {
|
||||
String patch;
|
||||
String previous_filename;
|
||||
|
||||
/**
|
||||
* Gets sha.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets filename.
|
||||
*
|
||||
* @return the filename
|
||||
*/
|
||||
public String getFilename() {
|
||||
return filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets status.
|
||||
*
|
||||
* @return the status
|
||||
*/
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets additions.
|
||||
*
|
||||
* @return the additions
|
||||
*/
|
||||
public int getAdditions() {
|
||||
return additions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets deletions.
|
||||
*
|
||||
* @return the deletions
|
||||
*/
|
||||
public int getDeletions() {
|
||||
return deletions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets changes.
|
||||
*
|
||||
* @return the changes
|
||||
*/
|
||||
public int getChanges() {
|
||||
return changes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets blob url.
|
||||
*
|
||||
* @return the blob url
|
||||
*/
|
||||
public URL getBlobUrl() {
|
||||
return GitHub.parseURL(blob_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets raw url.
|
||||
*
|
||||
* @return the raw url
|
||||
*/
|
||||
public URL getRawUrl() {
|
||||
return GitHub.parseURL(raw_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets contents url.
|
||||
*
|
||||
* @return the contents url
|
||||
*/
|
||||
public URL getContentsUrl() {
|
||||
return GitHub.parseURL(contents_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets patch.
|
||||
*
|
||||
* @return the patch
|
||||
*/
|
||||
public String getPatch() {
|
||||
return patch;
|
||||
}
|
||||
|
||||
public String getPreviousFilename()
|
||||
{
|
||||
/**
|
||||
* Gets previous filename.
|
||||
*
|
||||
* @return the previous filename
|
||||
*/
|
||||
public String getPreviousFilename() {
|
||||
return previous_filename;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,53 +6,89 @@ import static org.kohsuke.github.Previews.SHADOW_CAT;
|
||||
* Lists up pull requests with some filtering and sorting.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#queryPullRequests()
|
||||
* @see GHRepository#queryPullRequests() GHRepository#queryPullRequests()
|
||||
*/
|
||||
public class GHPullRequestQueryBuilder extends GHQueryBuilder<GHPullRequest> {
|
||||
private final GHRepository repo;
|
||||
|
||||
/*package*/ GHPullRequestQueryBuilder(GHRepository repo) {
|
||||
GHPullRequestQueryBuilder(GHRepository repo) {
|
||||
super(repo.root);
|
||||
this.repo = repo;
|
||||
}
|
||||
|
||||
/**
|
||||
* State gh pull request query builder.
|
||||
*
|
||||
* @param state
|
||||
* the state
|
||||
* @return the gh pull request query builder
|
||||
*/
|
||||
public GHPullRequestQueryBuilder state(GHIssueState state) {
|
||||
req.with("state",state);
|
||||
req.with("state", state);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Head gh pull request query builder.
|
||||
*
|
||||
* @param head
|
||||
* the head
|
||||
* @return the gh pull request query builder
|
||||
*/
|
||||
public GHPullRequestQueryBuilder head(String head) {
|
||||
if (head != null && !head.contains(":")) {
|
||||
head = repo.getOwnerName() + ":" + head;
|
||||
}
|
||||
req.with("head",head);
|
||||
req.with("head", head);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Base gh pull request query builder.
|
||||
*
|
||||
* @param base
|
||||
* the base
|
||||
* @return the gh pull request query builder
|
||||
*/
|
||||
public GHPullRequestQueryBuilder base(String base) {
|
||||
req.with("base",base);
|
||||
req.with("base", base);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort gh pull request query builder.
|
||||
*
|
||||
* @param sort
|
||||
* the sort
|
||||
* @return the gh pull request query builder
|
||||
*/
|
||||
public GHPullRequestQueryBuilder sort(Sort sort) {
|
||||
req.with("sort",sort);
|
||||
req.with("sort", sort);
|
||||
return this;
|
||||
}
|
||||
|
||||
public enum Sort { CREATED, UPDATED, POPULARITY, LONG_RUNNING }
|
||||
/**
|
||||
* The enum Sort.
|
||||
*/
|
||||
public enum Sort {
|
||||
CREATED, UPDATED, POPULARITY, LONG_RUNNING
|
||||
}
|
||||
|
||||
/**
|
||||
* Direction gh pull request query builder.
|
||||
*
|
||||
* @param d
|
||||
* the d
|
||||
* @return the gh pull request query builder
|
||||
*/
|
||||
public GHPullRequestQueryBuilder direction(GHDirection d) {
|
||||
req.with("direction",d);
|
||||
req.with("direction", d);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PagedIterable<GHPullRequest> list() {
|
||||
return req
|
||||
.withPreview(SHADOW_CAT)
|
||||
.asPagedIterable(
|
||||
repo.getApiTailUrl("pulls"),
|
||||
GHPullRequest[].class,
|
||||
item -> item.wrapUp(repo) );
|
||||
return req.withPreview(SHADOW_CAT)
|
||||
.asPagedIterable(repo.getApiTailUrl("pulls"), GHPullRequest[].class, item -> item.wrapUp(repo));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,18 +25,19 @@ package org.kohsuke.github;
|
||||
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
|
||||
import java.util.Date;
|
||||
import javax.annotation.CheckForNull;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Date;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
|
||||
/**
|
||||
* Review to a pull request.
|
||||
*
|
||||
* @see GHPullRequest#listReviews()
|
||||
* @see GHPullRequest#listReviews() GHPullRequest#listReviews()
|
||||
* @see GHPullRequestReviewBuilder
|
||||
*/
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_FIELD"}, justification = "JSON API")
|
||||
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_FIELD" }, justification = "JSON API")
|
||||
public class GHPullRequestReview extends GHObject {
|
||||
GHPullRequest owner;
|
||||
|
||||
@@ -46,13 +47,15 @@ public class GHPullRequestReview extends GHObject {
|
||||
private GHPullRequestReviewState state;
|
||||
private String submitted_at;
|
||||
|
||||
/*package*/ GHPullRequestReview wrapUp(GHPullRequest owner) {
|
||||
GHPullRequestReview wrapUp(GHPullRequest owner) {
|
||||
this.owner = owner;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the pull request to which this review is associated.
|
||||
*
|
||||
* @return the parent
|
||||
*/
|
||||
public GHPullRequest getParent() {
|
||||
return owner;
|
||||
@@ -60,6 +63,8 @@ public class GHPullRequestReview extends GHObject {
|
||||
|
||||
/**
|
||||
* The comment itself.
|
||||
*
|
||||
* @return the body
|
||||
*/
|
||||
public String getBody() {
|
||||
return body;
|
||||
@@ -67,15 +72,29 @@ public class GHPullRequestReview extends GHObject {
|
||||
|
||||
/**
|
||||
* Gets the user who posted this review.
|
||||
*
|
||||
* @return the user
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getUser() throws IOException {
|
||||
return owner.root.getUser(user.getLogin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets commit id.
|
||||
*
|
||||
* @return the commit id
|
||||
*/
|
||||
public String getCommitId() {
|
||||
return commit_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets state.
|
||||
*
|
||||
* @return the state
|
||||
*/
|
||||
@CheckForNull
|
||||
public GHPullRequestReviewState getState() {
|
||||
return state;
|
||||
@@ -86,12 +105,21 @@ public class GHPullRequestReview extends GHObject {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets api route.
|
||||
*
|
||||
* @return the api route
|
||||
*/
|
||||
protected String getApiRoute() {
|
||||
return owner.getApiRoute()+"/reviews/"+id;
|
||||
return owner.getApiRoute() + "/reviews/" + id;
|
||||
}
|
||||
|
||||
/**
|
||||
* When was this resource created?
|
||||
*
|
||||
* @return the submitted at
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public Date getSubmittedAt() throws IOException {
|
||||
return GitHub.parseDate(submitted_at);
|
||||
@@ -106,52 +134,74 @@ public class GHPullRequestReview extends GHObject {
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Former preview method that changed when it got public. Left here for backward compatibility.
|
||||
* Use {@link #submit(String, GHPullRequestReviewEvent)}
|
||||
* Submit.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @param state
|
||||
* the state
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated Former preview method that changed when it got public. Left here for backward compatibility. Use
|
||||
* {@link #submit(String, GHPullRequestReviewEvent)}
|
||||
*/
|
||||
public void submit(String body, GHPullRequestReviewState state) throws IOException {
|
||||
submit(body,state.toEvent());
|
||||
submit(body, state.toEvent());
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the comment.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @param event
|
||||
* the event
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void submit(String body, GHPullRequestReviewEvent event) throws IOException {
|
||||
new Requester(owner.root).method("POST")
|
||||
.with("body", body)
|
||||
.with("event", event.action())
|
||||
.to(getApiRoute()+"/events",this);
|
||||
.to(getApiRoute() + "/events", this);
|
||||
this.body = body;
|
||||
this.state = event.toState();
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this review.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(owner.root).method("DELETE")
|
||||
.to(getApiRoute());
|
||||
new Requester(owner.root).method("DELETE").to(getApiRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
* Dismisses this review.
|
||||
*
|
||||
* @param message
|
||||
* the message
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void dismiss(String message) throws IOException {
|
||||
new Requester(owner.root).method("PUT")
|
||||
.with("message", message)
|
||||
.to(getApiRoute()+"/dismissals");
|
||||
new Requester(owner.root).method("PUT").with("message", message).to(getApiRoute() + "/dismissals");
|
||||
state = GHPullRequestReviewState.DISMISSED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtains all the review comments associated with this pull request review.
|
||||
*
|
||||
* @return the paged iterable
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<GHPullRequestReviewComment> listReviewComments() throws IOException {
|
||||
return owner.root.retrieve()
|
||||
.asPagedIterable(
|
||||
getApiRoute() + "/comments",
|
||||
GHPullRequestReviewComment[].class,
|
||||
item -> item.wrapUp(owner) );
|
||||
.asPagedIterable(getApiRoute() + "/comments",
|
||||
GHPullRequestReviewComment[].class,
|
||||
item -> item.wrapUp(owner));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,59 +8,89 @@ import java.util.List;
|
||||
* Builds up a creation of new {@link GHPullRequestReview}.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHPullRequest#createReview()
|
||||
* @see GHPullRequest#createReview() GHPullRequest#createReview()
|
||||
*/
|
||||
public class GHPullRequestReviewBuilder {
|
||||
private final GHPullRequest pr;
|
||||
private final Requester builder;
|
||||
private final List<DraftReviewComment> comments = new ArrayList<DraftReviewComment>();
|
||||
|
||||
/*package*/ GHPullRequestReviewBuilder(GHPullRequest pr) {
|
||||
GHPullRequestReviewBuilder(GHPullRequest pr) {
|
||||
this.pr = pr;
|
||||
this.builder = new Requester(pr.root);
|
||||
}
|
||||
|
||||
// public GHPullRequestReview createReview(@Nullable String commitId, String body, GHPullRequestReviewEvent event,
|
||||
// List<GHPullRequestReviewComment> comments) throws IOException
|
||||
// public GHPullRequestReview createReview(@Nullable String commitId, String body, GHPullRequestReviewEvent event,
|
||||
// List<GHPullRequestReviewComment> comments) throws IOException
|
||||
|
||||
/**
|
||||
* The SHA of the commit that needs a review. Not using the latest commit SHA may render your review comment outdated if a subsequent commit modifies the line you specify as the position. Defaults to the most recent commit in the pull request when you do not specify a value.
|
||||
* The SHA of the commit that needs a review. Not using the latest commit SHA may render your review comment
|
||||
* outdated if a subsequent commit modifies the line you specify as the position. Defaults to the most recent commit
|
||||
* in the pull request when you do not specify a value.
|
||||
*
|
||||
* @param commitId
|
||||
* the commit id
|
||||
* @return the gh pull request review builder
|
||||
*/
|
||||
public GHPullRequestReviewBuilder commitId(String commitId) {
|
||||
builder.with("commit_id",commitId);
|
||||
builder.with("commit_id", commitId);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Required when using REQUEST_CHANGES or COMMENT for the event parameter. The body text of the pull request review.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @return the gh pull request review builder
|
||||
*/
|
||||
public GHPullRequestReviewBuilder body(String body) {
|
||||
builder.with("body",body);
|
||||
builder.with("body", body);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* The review action you want to perform. The review actions include: APPROVE, REQUEST_CHANGES, or COMMENT.
|
||||
* By leaving this blank, you set the review action state to PENDING,
|
||||
* which means you will need to {@linkplain GHPullRequestReview#submit(String, GHPullRequestReviewEvent) submit the pull request review} when you are ready.
|
||||
* The review action you want to perform. The review actions include: APPROVE, REQUEST_CHANGES, or COMMENT. By
|
||||
* leaving this blank, you set the review action state to PENDING, which means you will need to
|
||||
* {@linkplain GHPullRequestReview#submit(String, GHPullRequestReviewEvent) submit the pull request review} when you
|
||||
* are ready.
|
||||
*
|
||||
* @param event
|
||||
* the event
|
||||
* @return the gh pull request review builder
|
||||
*/
|
||||
public GHPullRequestReviewBuilder event(GHPullRequestReviewEvent event) {
|
||||
builder.with("event",event.action());
|
||||
builder.with("event", event.action());
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param body The relative path to the file that necessitates a review comment.
|
||||
* @param path The position in the diff where you want to add a review comment. Note this value is not the same as the line number in the file. For help finding the position value, read the note below.
|
||||
* @param position Text of the review comment.
|
||||
* Comment gh pull request review builder.
|
||||
*
|
||||
* @param body
|
||||
* The relative path to the file that necessitates a review comment.
|
||||
* @param path
|
||||
* The position in the diff where you want to add a review comment. Note this value is not the same as
|
||||
* the line number in the file. For help finding the position value, read the note below.
|
||||
* @param position
|
||||
* Text of the review comment.
|
||||
* @return the gh pull request review builder
|
||||
*/
|
||||
public GHPullRequestReviewBuilder comment(String body, String path, int position) {
|
||||
comments.add(new DraftReviewComment(body,path,position));
|
||||
comments.add(new DraftReviewComment(body, path, position));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create gh pull request review.
|
||||
*
|
||||
* @return the gh pull request review
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHPullRequestReview create() throws IOException {
|
||||
return builder.method("POST")._with("comments",comments)
|
||||
return builder.method("POST")
|
||||
.with("comments", comments)
|
||||
.to(pr.getApiRoute() + "/reviews", GHPullRequestReview.class)
|
||||
.wrapUp(pr);
|
||||
}
|
||||
@@ -76,14 +106,29 @@ public class GHPullRequestReviewBuilder {
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets body.
|
||||
*
|
||||
* @return the body
|
||||
*/
|
||||
public String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets path.
|
||||
*
|
||||
* @return the path
|
||||
*/
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets position.
|
||||
*
|
||||
* @return the position
|
||||
*/
|
||||
public int getPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
|
||||
import javax.annotation.CheckForNull;
|
||||
|
||||
import static org.kohsuke.github.Previews.*;
|
||||
@@ -33,8 +34,9 @@ import static org.kohsuke.github.Previews.*;
|
||||
* Review comment to the pull request
|
||||
*
|
||||
* @author Julien Henry
|
||||
* @see GHPullRequest#listReviewComments()
|
||||
* @see GHPullRequest#createReviewComment(String, String, String, int)
|
||||
* @see GHPullRequest#listReviewComments() GHPullRequest#listReviewComments()
|
||||
* @see GHPullRequest#createReviewComment(String, String, String, int) GHPullRequest#createReviewComment(String, String,
|
||||
* String, int)
|
||||
*/
|
||||
public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
||||
GHPullRequest owner;
|
||||
@@ -46,10 +48,17 @@ public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
||||
private int original_position = -1;
|
||||
private long in_reply_to_id = -1L;
|
||||
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* You should be using {@link GHPullRequestReviewBuilder#comment(String, String, int)}
|
||||
* Draft gh pull request review comment.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @param path
|
||||
* the path
|
||||
* @param position
|
||||
* the position
|
||||
* @return the gh pull request review comment
|
||||
* @deprecated You should be using {@link GHPullRequestReviewBuilder#comment(String, String, int)}
|
||||
*/
|
||||
public static GHPullRequestReviewComment draft(String body, String path, int position) {
|
||||
GHPullRequestReviewComment result = new GHPullRequestReviewComment();
|
||||
@@ -59,13 +68,15 @@ public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
||||
return result;
|
||||
}
|
||||
|
||||
/*package*/ GHPullRequestReviewComment wrapUp(GHPullRequest owner) {
|
||||
GHPullRequestReviewComment wrapUp(GHPullRequest owner) {
|
||||
this.owner = owner;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the pull request to which this review comment is associated.
|
||||
*
|
||||
* @return the parent
|
||||
*/
|
||||
public GHPullRequest getParent() {
|
||||
return owner;
|
||||
@@ -73,6 +84,8 @@ public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
||||
|
||||
/**
|
||||
* The comment itself.
|
||||
*
|
||||
* @return the body
|
||||
*/
|
||||
public String getBody() {
|
||||
return body;
|
||||
@@ -80,24 +93,48 @@ public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
||||
|
||||
/**
|
||||
* Gets the user who posted this comment.
|
||||
*
|
||||
* @return the user
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHUser getUser() throws IOException {
|
||||
return owner.root.getUser(user.getLogin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets path.
|
||||
*
|
||||
* @return the path
|
||||
*/
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets position.
|
||||
*
|
||||
* @return the position
|
||||
*/
|
||||
@CheckForNull
|
||||
public int getPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets original position.
|
||||
*
|
||||
* @return the original position
|
||||
*/
|
||||
public int getOriginalPosition() {
|
||||
return original_position;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets in reply to id.
|
||||
*
|
||||
* @return the in reply to id
|
||||
*/
|
||||
@CheckForNull
|
||||
public long getInReplyToId() {
|
||||
return in_reply_to_id;
|
||||
@@ -108,20 +145,33 @@ public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets api route.
|
||||
*
|
||||
* @return the api route
|
||||
*/
|
||||
protected String getApiRoute() {
|
||||
return "/repos/"+owner.getRepository().getFullName()+"/pulls/comments/"+id;
|
||||
return "/repos/" + owner.getRepository().getFullName() + "/pulls/comments/" + id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the comment.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void update(String body) throws IOException {
|
||||
new Requester(owner.root).method("PATCH").with("body", body).to(getApiRoute(),this);
|
||||
new Requester(owner.root).method("PATCH").with("body", body).to(getApiRoute(), this);
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this review comment.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(owner.root).method("DELETE").to(getApiRoute());
|
||||
@@ -129,6 +179,12 @@ public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
||||
|
||||
/**
|
||||
* Create a new comment that replies to this comment.
|
||||
*
|
||||
* @param body
|
||||
* the body
|
||||
* @return the gh pull request review comment
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHPullRequestReviewComment reply(String body) throws IOException {
|
||||
return new Requester(owner.root).method("POST")
|
||||
@@ -138,21 +194,20 @@ public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
||||
.wrapUp(owner);
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public GHReaction createReaction(ReactionContent content) throws IOException {
|
||||
return new Requester(owner.root)
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
return new Requester(owner.root).withPreview(SQUIRREL_GIRL)
|
||||
.with("content", content.getContent())
|
||||
.to(getApiRoute()+"/reactions", GHReaction.class).wrap(owner.root);
|
||||
.to(getApiRoute() + "/reactions", GHReaction.class)
|
||||
.wrap(owner.root);
|
||||
}
|
||||
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public PagedIterable<GHReaction> listReactions() {
|
||||
return owner.root.retrieve()
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
.asPagedIterable(
|
||||
getApiRoute() + "/reactions",
|
||||
GHReaction[].class,
|
||||
item -> item.wrap(owner.root) );
|
||||
.withPreview(SQUIRREL_GIRL)
|
||||
.asPagedIterable(getApiRoute() + "/reactions", GHReaction[].class, item -> item.wrap(owner.root));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,24 +27,25 @@ package org.kohsuke.github;
|
||||
* Action to perform on {@link GHPullRequestReview}.
|
||||
*/
|
||||
public enum GHPullRequestReviewEvent {
|
||||
PENDING,
|
||||
APPROVE,
|
||||
REQUEST_CHANGES,
|
||||
COMMENT;
|
||||
PENDING, APPROVE, REQUEST_CHANGES, COMMENT;
|
||||
|
||||
/*package*/ String action() {
|
||||
return this==PENDING ? null : name();
|
||||
String action() {
|
||||
return this == PENDING ? null : name();
|
||||
}
|
||||
|
||||
/**
|
||||
* When a {@link GHPullRequestReview} is submitted with this event, it should transition to this state.
|
||||
*/
|
||||
/*package*/ GHPullRequestReviewState toState() {
|
||||
GHPullRequestReviewState toState() {
|
||||
switch (this) {
|
||||
case PENDING: return GHPullRequestReviewState.PENDING;
|
||||
case APPROVE: return GHPullRequestReviewState.APPROVED;
|
||||
case REQUEST_CHANGES: return GHPullRequestReviewState.CHANGES_REQUESTED;
|
||||
case COMMENT: return GHPullRequestReviewState.COMMENTED;
|
||||
case PENDING :
|
||||
return GHPullRequestReviewState.PENDING;
|
||||
case APPROVE :
|
||||
return GHPullRequestReviewState.APPROVED;
|
||||
case REQUEST_CHANGES :
|
||||
return GHPullRequestReviewState.CHANGES_REQUESTED;
|
||||
case COMMENT :
|
||||
return GHPullRequestReviewState.COMMENTED;
|
||||
}
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
@@ -8,31 +8,36 @@ public enum GHPullRequestReviewState {
|
||||
APPROVED,
|
||||
CHANGES_REQUESTED,
|
||||
/**
|
||||
* @deprecated
|
||||
* This was the thing when this API was in preview, but it changed when it became public.
|
||||
* Use {@link #CHANGES_REQUESTED}. Left here for compatibility.
|
||||
* @deprecated This was the thing when this API was in preview, but it changed when it became public. Use
|
||||
* {@link #CHANGES_REQUESTED}. Left here for compatibility.
|
||||
*/
|
||||
REQUEST_CHANGES,
|
||||
COMMENTED,
|
||||
DISMISSED;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* This was an internal method accidentally exposed.
|
||||
* Left here for compatibility.
|
||||
* Action string.
|
||||
*
|
||||
* @return the string
|
||||
* @deprecated This was an internal method accidentally exposed. Left here for compatibility.
|
||||
*/
|
||||
public String action() {
|
||||
GHPullRequestReviewEvent e = toEvent();
|
||||
return e==null ? null : e.action();
|
||||
return e == null ? null : e.action();
|
||||
}
|
||||
|
||||
/*package*/ GHPullRequestReviewEvent toEvent() {
|
||||
GHPullRequestReviewEvent toEvent() {
|
||||
switch (this) {
|
||||
case PENDING: return GHPullRequestReviewEvent.PENDING;
|
||||
case APPROVED: return GHPullRequestReviewEvent.APPROVE;
|
||||
case CHANGES_REQUESTED: return GHPullRequestReviewEvent.REQUEST_CHANGES;
|
||||
case REQUEST_CHANGES: return GHPullRequestReviewEvent.REQUEST_CHANGES;
|
||||
case COMMENTED: return GHPullRequestReviewEvent.COMMENT;
|
||||
case PENDING :
|
||||
return GHPullRequestReviewEvent.PENDING;
|
||||
case APPROVED :
|
||||
return GHPullRequestReviewEvent.APPROVE;
|
||||
case CHANGES_REQUESTED :
|
||||
return GHPullRequestReviewEvent.REQUEST_CHANGES;
|
||||
case REQUEST_CHANGES :
|
||||
return GHPullRequestReviewEvent.REQUEST_CHANGES;
|
||||
case COMMENTED :
|
||||
return GHPullRequestReviewEvent.COMMENT;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -3,19 +3,23 @@ package org.kohsuke.github;
|
||||
/**
|
||||
* Used to specify filters, sort order, etc for listing items in a collection.
|
||||
*
|
||||
* @param <T>
|
||||
* the type parameter
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public abstract class GHQueryBuilder<T> {
|
||||
protected final GitHub root;
|
||||
protected final Requester req;
|
||||
|
||||
/*package*/ GHQueryBuilder(GitHub root) {
|
||||
GHQueryBuilder(GitHub root) {
|
||||
this.root = root;
|
||||
this.req = root.retrieve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Start listing items by using the settings built up on this object.
|
||||
*
|
||||
* @return the paged iterable
|
||||
*/
|
||||
public abstract PagedIterable<T> list();
|
||||
}
|
||||
|
||||
@@ -1,43 +1,400 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.DateTimeParseException;
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import static java.util.logging.Level.FINEST;
|
||||
|
||||
/**
|
||||
* Rate limit.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "JSON API")
|
||||
public class GHRateLimit {
|
||||
|
||||
/**
|
||||
* Remaining calls that can be made.
|
||||
*
|
||||
* @deprecated This value should never have been made public. Use {@link #getRemaining()}
|
||||
*/
|
||||
@Deprecated
|
||||
public int remaining;
|
||||
|
||||
/**
|
||||
* Allotted API call per hour.
|
||||
*
|
||||
* @deprecated This value should never have been made public. Use {@link #getLimit()}
|
||||
*/
|
||||
@Deprecated
|
||||
public int limit;
|
||||
|
||||
/**
|
||||
* The time at which the current rate limit window resets in UTC epoch seconds.
|
||||
* The time at which the current rate limit window resets in UTC epoch seconds. NOTE: that means to
|
||||
*
|
||||
* @deprecated This value should never have been made public. Use {@link #getResetDate()}
|
||||
*/
|
||||
@Deprecated
|
||||
public Date reset;
|
||||
|
||||
@Nonnull
|
||||
private final Record core;
|
||||
|
||||
@Nonnull
|
||||
private final Record search;
|
||||
|
||||
@Nonnull
|
||||
private final Record graphql;
|
||||
|
||||
@Nonnull
|
||||
private final Record integrationManifest;
|
||||
|
||||
static GHRateLimit Unknown() {
|
||||
return new GHRateLimit(new UnknownLimitRecord(),
|
||||
new UnknownLimitRecord(),
|
||||
new UnknownLimitRecord(),
|
||||
new UnknownLimitRecord());
|
||||
}
|
||||
|
||||
static GHRateLimit fromHeaderRecord(Record header) {
|
||||
return new GHRateLimit(header, new UnknownLimitRecord(), new UnknownLimitRecord(), new UnknownLimitRecord());
|
||||
}
|
||||
|
||||
@JsonCreator
|
||||
GHRateLimit(@Nonnull @JsonProperty("core") Record core,
|
||||
@Nonnull @JsonProperty("search") Record search,
|
||||
@Nonnull @JsonProperty("graphql") Record graphql,
|
||||
@Nonnull @JsonProperty("integration_manifest") Record integrationManifest) {
|
||||
this.core = core;
|
||||
this.search = search;
|
||||
this.graphql = graphql;
|
||||
this.integrationManifest = integrationManifest;
|
||||
|
||||
// Deprecated fields
|
||||
this.remaining = core.getRemaining();
|
||||
this.limit = core.getLimit();
|
||||
this.reset = new Date(core.getResetEpochSeconds());
|
||||
}
|
||||
|
||||
/**
|
||||
* Non-epoch date
|
||||
* Returns the date at which the Core API rate limit will reset.
|
||||
*
|
||||
* @return the calculated date at which the rate limit has or will reset.
|
||||
*/
|
||||
@SuppressFBWarnings(value = "UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR",
|
||||
justification = "The value comes from JSON deserialization")
|
||||
@Nonnull
|
||||
public Date getResetDate() {
|
||||
return new Date(reset.getTime() * 1000);
|
||||
return getCore().getResetDate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the remaining number of Core APIs requests allowed before this connection will be throttled.
|
||||
*
|
||||
* @return an integer
|
||||
* @since 1.100
|
||||
*/
|
||||
public int getRemaining() {
|
||||
return getCore().getRemaining();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the total number of Core API calls per hour allotted for this connection.
|
||||
*
|
||||
* @return an integer
|
||||
* @since 1.100
|
||||
*/
|
||||
public int getLimit() {
|
||||
return getCore().getLimit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the time in epoch seconds when the Core API rate limit will reset.
|
||||
*
|
||||
* @return a long
|
||||
* @since 1.100
|
||||
*/
|
||||
public long getResetEpochSeconds() {
|
||||
return getCore().getResetEpochSeconds();
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the rate limit reset date for this instance has passed.
|
||||
*
|
||||
* @return true if the rate limit reset date has passed. Otherwise false.
|
||||
* @since 1.100
|
||||
*/
|
||||
public boolean isExpired() {
|
||||
return getCore().isExpired();
|
||||
}
|
||||
|
||||
/**
|
||||
* The core object provides your rate limit status for all non-search-related resources in the REST API.
|
||||
*
|
||||
* @return a rate limit record
|
||||
* @since 1.100
|
||||
*/
|
||||
@Nonnull
|
||||
public Record getCore() {
|
||||
return core;
|
||||
}
|
||||
|
||||
/**
|
||||
* The search object provides your rate limit status for the Search API. TODO: integrate with header limit updating.
|
||||
* Issue #605.
|
||||
*
|
||||
* @return a rate limit record
|
||||
*/
|
||||
@Nonnull
|
||||
Record getSearch() {
|
||||
return search;
|
||||
}
|
||||
|
||||
/**
|
||||
* The graphql object provides your rate limit status for the GraphQL API. TODO: integrate with header limit
|
||||
* updating. Issue #605.
|
||||
*
|
||||
* @return a rate limit record
|
||||
*/
|
||||
@Nonnull
|
||||
Record getGraphQL() {
|
||||
return graphql;
|
||||
}
|
||||
|
||||
/**
|
||||
* The integration_manifest object provides your rate limit status for the GitHub App Manifest code conversion
|
||||
* endpoint. TODO: integrate with header limit updating. Issue #605.
|
||||
*
|
||||
* @return a rate limit record
|
||||
*/
|
||||
@Nonnull
|
||||
Record getIntegrationManifest() {
|
||||
return integrationManifest;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "GHRateLimit{" +
|
||||
"remaining=" + remaining +
|
||||
", limit=" + limit +
|
||||
", resetDate=" + getResetDate() +
|
||||
'}';
|
||||
return "GHRateLimit {" + "core " + getCore().toString() + "search " + getSearch().toString() + "graphql "
|
||||
+ getGraphQL().toString() + "integrationManifest " + getIntegrationManifest().toString() + '}';
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
GHRateLimit rateLimit = (GHRateLimit) o;
|
||||
return getCore().equals(rateLimit.getCore()) && getSearch().equals(rateLimit.getSearch())
|
||||
&& getGraphQL().equals(rateLimit.getGraphQL())
|
||||
&& getIntegrationManifest().equals(rateLimit.getIntegrationManifest());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(getCore(), getSearch(), getGraphQL(), getIntegrationManifest());
|
||||
}
|
||||
|
||||
/**
|
||||
* A limit record used as a placeholder when the the actual limit is not known.
|
||||
* <p>
|
||||
* Has a large limit and long duration so that it will doesn't expire too often.
|
||||
*
|
||||
* @since 1.100
|
||||
*/
|
||||
public static class UnknownLimitRecord extends Record {
|
||||
|
||||
// One hour
|
||||
private static final long unknownLimitResetSeconds = 60L * 60L;
|
||||
|
||||
static final int unknownLimit = 1000000;
|
||||
static final int unknownRemaining = 999999;
|
||||
|
||||
private UnknownLimitRecord() {
|
||||
super(unknownLimit, unknownRemaining, System.currentTimeMillis() / 1000L + unknownLimitResetSeconds);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A rate limit record.
|
||||
*
|
||||
* @since 1.100
|
||||
*/
|
||||
public static class Record {
|
||||
/**
|
||||
* Remaining calls that can be made.
|
||||
*/
|
||||
private final int remaining;
|
||||
|
||||
/**
|
||||
* Allotted API call per hour.
|
||||
*/
|
||||
private final int limit;
|
||||
|
||||
/**
|
||||
* The time at which the current rate limit window resets in UTC epoch seconds.
|
||||
*/
|
||||
private final long resetEpochSeconds;
|
||||
|
||||
/**
|
||||
* EpochSeconds time (UTC) at which this instance was created.
|
||||
*/
|
||||
private final long createdAtEpochSeconds = System.currentTimeMillis() / 1000;
|
||||
|
||||
/**
|
||||
* The calculated time at which the rate limit will reset. Recalculated if {@link #recalculateResetDate} is
|
||||
* called.
|
||||
*/
|
||||
@Nonnull
|
||||
private Date resetDate;
|
||||
|
||||
/**
|
||||
* Instantiates a new Record.
|
||||
*
|
||||
* @param limit
|
||||
* the limit
|
||||
* @param remaining
|
||||
* the remaining
|
||||
* @param resetEpochSeconds
|
||||
* the reset epoch seconds
|
||||
*/
|
||||
@JsonCreator
|
||||
public Record(@JsonProperty("limit") int limit,
|
||||
@JsonProperty("remaining") int remaining,
|
||||
@JsonProperty("reset") long resetEpochSeconds) {
|
||||
this(limit, remaining, resetEpochSeconds, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Record.
|
||||
*
|
||||
* @param limit
|
||||
* the limit
|
||||
* @param remaining
|
||||
* the remaining
|
||||
* @param resetEpochSeconds
|
||||
* the reset epoch seconds
|
||||
* @param updatedAt
|
||||
* the updated at
|
||||
*/
|
||||
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "Deprecated")
|
||||
public Record(int limit, int remaining, long resetEpochSeconds, String updatedAt) {
|
||||
this.limit = limit;
|
||||
this.remaining = remaining;
|
||||
this.resetEpochSeconds = resetEpochSeconds;
|
||||
this.resetDate = recalculateResetDate(updatedAt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recalculates the reset date using the server response date to calculate a time duration and then add that to
|
||||
* the local created time for this record.
|
||||
*
|
||||
* @param updatedAt
|
||||
* a string date in RFC 1123
|
||||
* @return reset date based on the passed date
|
||||
*/
|
||||
Date recalculateResetDate(String updatedAt) {
|
||||
long updatedAtEpochSeconds = createdAtEpochSeconds;
|
||||
if (!StringUtils.isBlank(updatedAt)) {
|
||||
try {
|
||||
// Get the server date and reset data, will always return a time in GMT
|
||||
updatedAtEpochSeconds = ZonedDateTime.parse(updatedAt, DateTimeFormatter.RFC_1123_DATE_TIME)
|
||||
.toEpochSecond();
|
||||
} catch (DateTimeParseException e) {
|
||||
if (LOGGER.isLoggable(FINEST)) {
|
||||
LOGGER.log(FINEST, "Malformed Date header value " + updatedAt, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This may seem odd but it results in an accurate or slightly pessimistic reset date
|
||||
// based on system time rather than on the system being in sync with the server
|
||||
long calculatedSecondsUntilReset = resetEpochSeconds - updatedAtEpochSeconds;
|
||||
return resetDate = new Date((createdAtEpochSeconds + calculatedSecondsUntilReset) * 1000);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the remaining number of requests allowed before this connection will be throttled.
|
||||
*
|
||||
* @return an integer
|
||||
*/
|
||||
public int getRemaining() {
|
||||
return remaining;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the total number of API calls per hour allotted for this connection.
|
||||
*
|
||||
* @return an integer
|
||||
*/
|
||||
public int getLimit() {
|
||||
return limit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the time in epoch seconds when the rate limit will reset.
|
||||
*
|
||||
* @return a long
|
||||
*/
|
||||
public long getResetEpochSeconds() {
|
||||
return resetEpochSeconds;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the rate limit reset date indicated by this instance is in the
|
||||
*
|
||||
* @return true if the rate limit reset date has passed. Otherwise false.
|
||||
*/
|
||||
public boolean isExpired() {
|
||||
return getResetDate().getTime() < System.currentTimeMillis();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the date at which the rate limit will reset.
|
||||
*
|
||||
* @return the calculated date at which the rate limit has or will reset.
|
||||
*/
|
||||
@Nonnull
|
||||
public Date getResetDate() {
|
||||
return new Date(resetDate.getTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "{" + "remaining=" + getRemaining() + ", limit=" + getLimit() + ", resetDate=" + getResetDate()
|
||||
+ '}';
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
Record record = (Record) o;
|
||||
return getRemaining() == record.getRemaining() && getLimit() == record.getLimit()
|
||||
&& getResetEpochSeconds() == record.getResetEpochSeconds()
|
||||
&& getResetDate().equals(record.getResetDate());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(getRemaining(), getLimit(), getResetEpochSeconds(), getResetDate());
|
||||
}
|
||||
}
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(Requester.class.getName());
|
||||
}
|
||||
|
||||
@@ -11,14 +11,15 @@ import static org.kohsuke.github.Previews.*;
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see Reactable
|
||||
*/
|
||||
@Preview @Deprecated
|
||||
@Preview
|
||||
@Deprecated
|
||||
public class GHReaction extends GHObject {
|
||||
private GitHub root;
|
||||
|
||||
private GHUser user;
|
||||
private ReactionContent content;
|
||||
|
||||
/*package*/ GHReaction wrap(GitHub root) {
|
||||
GHReaction wrap(GitHub root) {
|
||||
this.root = root;
|
||||
user.wrapUp(root);
|
||||
return this;
|
||||
@@ -26,6 +27,8 @@ public class GHReaction extends GHObject {
|
||||
|
||||
/**
|
||||
* The kind of reaction left.
|
||||
*
|
||||
* @return the content
|
||||
*/
|
||||
public ReactionContent getContent() {
|
||||
return content;
|
||||
@@ -33,6 +36,8 @@ public class GHReaction extends GHObject {
|
||||
|
||||
/**
|
||||
* User who left the reaction.
|
||||
*
|
||||
* @return the user
|
||||
*/
|
||||
public GHUser getUser() {
|
||||
return user;
|
||||
@@ -48,8 +53,11 @@ public class GHReaction extends GHObject {
|
||||
|
||||
/**
|
||||
* Removes this reaction.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").withPreview(SQUIRREL_GIRL).to("/reactions/"+id);
|
||||
new Requester(root).method("DELETE").withPreview(SQUIRREL_GIRL).to("/reactions/" + id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,13 +11,15 @@ import java.net.URL;
|
||||
* @author Michael Clarke
|
||||
*/
|
||||
public class GHRef {
|
||||
/*package almost final*/ GitHub root;
|
||||
/* package almost final */ GitHub root;
|
||||
|
||||
private String ref, url;
|
||||
private GHObject object;
|
||||
|
||||
/**
|
||||
* Name of the ref, such as "refs/tags/abc"
|
||||
*
|
||||
* @return the ref
|
||||
*/
|
||||
public String getRef() {
|
||||
return ref;
|
||||
@@ -25,6 +27,8 @@ public class GHRef {
|
||||
|
||||
/**
|
||||
* The API URL of this tag, such as https://api.github.com/repos/jenkinsci/jenkins/git/refs/tags/1.312
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
@@ -32,6 +36,8 @@ public class GHRef {
|
||||
|
||||
/**
|
||||
* The object that this ref points to.
|
||||
*
|
||||
* @return the object
|
||||
*/
|
||||
public GHObject getObject() {
|
||||
return object;
|
||||
@@ -41,51 +47,63 @@ public class GHRef {
|
||||
* Updates this ref to the specified commit.
|
||||
*
|
||||
* @param sha
|
||||
* The SHA1 value to set this reference to
|
||||
* The SHA1 value to set this reference to
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void updateTo(String sha) throws IOException {
|
||||
updateTo(sha, false);
|
||||
updateTo(sha, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this ref to the specified commit.
|
||||
*
|
||||
* @param sha
|
||||
* The SHA1 value to set this reference to
|
||||
* The SHA1 value to set this reference to
|
||||
* @param force
|
||||
* Whether or not to force this ref update.
|
||||
* Whether or not to force this ref update.
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void updateTo(String sha, Boolean force) throws IOException {
|
||||
new Requester(root)
|
||||
.with("sha", sha).with("force", force).method("PATCH").to(url, GHRef.class).wrap(root);
|
||||
new Requester(root).with("sha", sha).with("force", force).method("PATCH").to(url, GHRef.class).wrap(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this ref from the repository using the GitHub API.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").to(url);
|
||||
new Requester(root).method("DELETE").to(url);
|
||||
}
|
||||
|
||||
/*package*/ GHRef wrap(GitHub root) {
|
||||
GHRef wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/*package*/ static GHRef[] wrap(GHRef[] in, GitHub root) {
|
||||
static GHRef[] wrap(GHRef[] in, GitHub root) {
|
||||
for (GHRef r : in) {
|
||||
r.wrap(root);
|
||||
}
|
||||
return in;
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD"}, justification = "JSON API")
|
||||
/**
|
||||
* The type GHObject.
|
||||
*/
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
public static class GHObject {
|
||||
private String type, sha, url;
|
||||
private String type, sha, url;
|
||||
|
||||
/**
|
||||
* Type of the object, such as "commit"
|
||||
*
|
||||
* @return the type
|
||||
*/
|
||||
public String getType() {
|
||||
return type;
|
||||
@@ -93,13 +111,18 @@ public class GHRef {
|
||||
|
||||
/**
|
||||
* SHA1 of this object.
|
||||
*
|
||||
* @return the sha
|
||||
*/
|
||||
public String getSha() {
|
||||
return sha;
|
||||
}
|
||||
|
||||
/**
|
||||
* API URL to this Git data, such as https://api.github.com/repos/jenkinsci/jenkins/git/commits/b72322675eb0114363a9a86e9ad5a170d1d07ac0
|
||||
* API URL to this Git data, such as
|
||||
* https://api.github.com/repos/jenkinsci/jenkins/git/commits/b72322675eb0114363a9a86e9ad5a170d1d07ac0
|
||||
*
|
||||
* @return the url
|
||||
*/
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
@@ -14,8 +15,8 @@ import static java.lang.String.*;
|
||||
/**
|
||||
* Release in a github repository.
|
||||
*
|
||||
* @see GHRepository#getReleases()
|
||||
* @see GHRepository#createRelease(String)
|
||||
* @see GHRepository#getReleases() GHRepository#getReleases()
|
||||
* @see GHRepository#createRelease(String) GHRepository#createRelease(String)
|
||||
*/
|
||||
public class GHRelease extends GHObject {
|
||||
GitHub root;
|
||||
@@ -34,21 +35,42 @@ public class GHRelease extends GHObject {
|
||||
private String tarball_url;
|
||||
private String zipball_url;
|
||||
|
||||
/**
|
||||
* Gets assets url.
|
||||
*
|
||||
* @return the assets url
|
||||
*/
|
||||
public String getAssetsUrl() {
|
||||
return assets_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets body.
|
||||
*
|
||||
* @return the body
|
||||
*/
|
||||
public String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is draft boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isDraft() {
|
||||
return draft;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link #update()}
|
||||
* Sets draft.
|
||||
*
|
||||
* @param draft
|
||||
* the draft
|
||||
* @return the draft
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @deprecated Use {@link #update()}
|
||||
*/
|
||||
public GHRelease setDraft(boolean draft) throws IOException {
|
||||
return update().draft(draft).update();
|
||||
@@ -58,50 +80,112 @@ public class GHRelease extends GHObject {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets name.
|
||||
*
|
||||
* @param name
|
||||
* the name
|
||||
*/
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets owner.
|
||||
*
|
||||
* @return the owner
|
||||
*/
|
||||
public GHRepository getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets owner.
|
||||
*
|
||||
* @param owner
|
||||
* the owner
|
||||
*/
|
||||
public void setOwner(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is prerelease boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public boolean isPrerelease() {
|
||||
return prerelease;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets published at.
|
||||
*
|
||||
* @return the published at
|
||||
*/
|
||||
public Date getPublished_at() {
|
||||
return new Date(published_at.getTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets tag name.
|
||||
*
|
||||
* @return the tag name
|
||||
*/
|
||||
public String getTagName() {
|
||||
return tag_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets target commitish.
|
||||
*
|
||||
* @return the target commitish
|
||||
*/
|
||||
public String getTargetCommitish() {
|
||||
return target_commitish;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets upload url.
|
||||
*
|
||||
* @return the upload url
|
||||
*/
|
||||
public String getUploadUrl() {
|
||||
return upload_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets zipball url.
|
||||
*
|
||||
* @return the zipball url
|
||||
*/
|
||||
public String getZipballUrl() {
|
||||
return zipball_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets tarball url.
|
||||
*
|
||||
* @return the tarball url
|
||||
*/
|
||||
public String getTarballUrl() {
|
||||
return tarball_url;
|
||||
}
|
||||
@@ -121,10 +205,18 @@ public class GHRelease extends GHObject {
|
||||
|
||||
/**
|
||||
* Because github relies on SNI (http://en.wikipedia.org/wiki/Server_Name_Indication) this method will only work on
|
||||
* Java 7 or greater. Options for fixing this for earlier JVMs can be found here
|
||||
* Java 7 or greater. Options for fixing this for earlier JVMs can be found here
|
||||
* http://stackoverflow.com/questions/12361090/server-name-indication-sni-on-java but involve more complicated
|
||||
* handling of the HTTP requests to github's API.
|
||||
*/
|
||||
*
|
||||
* @param file
|
||||
* the file
|
||||
* @param contentType
|
||||
* the content type
|
||||
* @return the gh asset
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHAsset uploadAsset(File file, String contentType) throws IOException {
|
||||
FileInputStream s = new FileInputStream(file);
|
||||
try {
|
||||
@@ -133,41 +225,63 @@ public class GHRelease extends GHObject {
|
||||
s.close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Upload asset gh asset.
|
||||
*
|
||||
* @param filename
|
||||
* the filename
|
||||
* @param stream
|
||||
* the stream
|
||||
* @param contentType
|
||||
* the content type
|
||||
* @return the gh asset
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHAsset uploadAsset(String filename, InputStream stream, String contentType) throws IOException {
|
||||
Requester builder = new Requester(owner.root);
|
||||
|
||||
String url = format("https://uploads.github.com%s/releases/%d/assets?name=%s",
|
||||
owner.getApiTailUrl(""), getId(), filename);
|
||||
return builder.contentType(contentType)
|
||||
.with(stream)
|
||||
.to(url, GHAsset.class).wrap(this);
|
||||
String url = getUploadUrl();
|
||||
// strip the helpful garbage from the url
|
||||
url = url.substring(0, url.indexOf('{'));
|
||||
url += "?name=" + URLEncoder.encode(filename, "UTF-8");
|
||||
return builder.contentType(contentType).with(stream).to(url, GHAsset.class).wrap(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets assets.
|
||||
*
|
||||
* @return the assets
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<GHAsset> getAssets() throws IOException {
|
||||
Requester builder = new Requester(owner.root);
|
||||
|
||||
GHAsset[] assets = builder
|
||||
.method("GET")
|
||||
.to(getApiTailUrl("assets"), GHAsset[].class);
|
||||
GHAsset[] assets = builder.method("GET").to(getApiTailUrl("assets"), GHAsset[].class);
|
||||
return Arrays.asList(GHAsset.wrap(assets, this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this release.
|
||||
*
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").to(owner.getApiTailUrl("releases/"+id));
|
||||
new Requester(root).method("DELETE").to(owner.getApiTailUrl("releases/" + id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this release via a builder.
|
||||
*
|
||||
* @return the gh release updater
|
||||
*/
|
||||
public GHReleaseUpdater update() {
|
||||
return new GHReleaseUpdater(this);
|
||||
}
|
||||
|
||||
private String getApiTailUrl(String end) {
|
||||
return owner.getApiTailUrl(format("releases/%s/%s",id,end));
|
||||
return owner.getApiTailUrl(format("releases/%s/%s", id, end));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,12 +5,20 @@ import java.io.IOException;
|
||||
/**
|
||||
* Builder pattern for creating a {@link GHRelease}
|
||||
*
|
||||
* @see GHRepository#createRelease(String)
|
||||
* @see GHRepository#createRelease(String) GHRepository#createRelease(String)
|
||||
*/
|
||||
public class GHReleaseBuilder {
|
||||
private final GHRepository repo;
|
||||
private final Requester builder;
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh release builder.
|
||||
*
|
||||
* @param ghRepository
|
||||
* the gh repository
|
||||
* @param tag
|
||||
* the tag
|
||||
*/
|
||||
public GHReleaseBuilder(GHRepository ghRepository, String tag) {
|
||||
this.repo = ghRepository;
|
||||
this.builder = new Requester(repo.root);
|
||||
@@ -18,7 +26,11 @@ public class GHReleaseBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param body The release notes body.
|
||||
* Body gh release builder.
|
||||
*
|
||||
* @param body
|
||||
* The release notes body.
|
||||
* @return the gh release builder
|
||||
*/
|
||||
public GHReleaseBuilder body(String body) {
|
||||
builder.with("body", body);
|
||||
@@ -26,11 +38,11 @@ public class GHReleaseBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies the commitish value that determines where the Git tag is created from. Can be any branch or
|
||||
* commit SHA.
|
||||
* Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA.
|
||||
*
|
||||
* @param commitish Defaults to the repository’s default branch (usually "master"). Unused if the Git tag
|
||||
* already exists.
|
||||
* @param commitish
|
||||
* Defaults to the repository’s default branch (usually "master"). Unused if the Git tag already exists.
|
||||
* @return the gh release builder
|
||||
*/
|
||||
public GHReleaseBuilder commitish(String commitish) {
|
||||
builder.with("target_commitish", commitish);
|
||||
@@ -40,8 +52,10 @@ public class GHReleaseBuilder {
|
||||
/**
|
||||
* Optional.
|
||||
*
|
||||
* @param draft {@code true} to create a draft (unpublished) release, {@code false} to create a published one.
|
||||
* Default is {@code false}.
|
||||
* @param draft
|
||||
* {@code true} to create a draft (unpublished) release, {@code false} to create a published one. Default
|
||||
* is {@code false}.
|
||||
* @return the gh release builder
|
||||
*/
|
||||
public GHReleaseBuilder draft(boolean draft) {
|
||||
builder.with("draft", draft);
|
||||
@@ -49,7 +63,11 @@ public class GHReleaseBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name the name of the release
|
||||
* Name gh release builder.
|
||||
*
|
||||
* @param name
|
||||
* the name of the release
|
||||
* @return the gh release builder
|
||||
*/
|
||||
public GHReleaseBuilder name(String name) {
|
||||
builder.with("name", name);
|
||||
@@ -59,14 +77,23 @@ public class GHReleaseBuilder {
|
||||
/**
|
||||
* Optional
|
||||
*
|
||||
* @param prerelease {@code true} to identify the release as a prerelease. {@code false} to identify the release
|
||||
* as a full release. Default is {@code false}.
|
||||
* @param prerelease
|
||||
* {@code true} to identify the release as a prerelease. {@code false} to identify the release as a full
|
||||
* release. Default is {@code false}.
|
||||
* @return the gh release builder
|
||||
*/
|
||||
public GHReleaseBuilder prerelease(boolean prerelease) {
|
||||
builder.with("prerelease", prerelease);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create gh release.
|
||||
*
|
||||
* @return the gh release
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHRelease create() throws IOException {
|
||||
return builder.to(repo.getApiTailUrl("releases"), GHRelease.class).wrap(repo);
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import java.io.IOException;
|
||||
* Modifies {@link GHRelease}.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRelease#update()
|
||||
* @see GHRelease#update() GHRelease#update()
|
||||
*/
|
||||
public class GHReleaseUpdater {
|
||||
private final GHRelease base;
|
||||
@@ -17,13 +17,24 @@ public class GHReleaseUpdater {
|
||||
this.builder = new Requester(base.root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tag gh release updater.
|
||||
*
|
||||
* @param tag
|
||||
* the tag
|
||||
* @return the gh release updater
|
||||
*/
|
||||
public GHReleaseUpdater tag(String tag) {
|
||||
builder.with("tag_name",tag);
|
||||
builder.with("tag_name", tag);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param body The release notes body.
|
||||
* Body gh release updater.
|
||||
*
|
||||
* @param body
|
||||
* The release notes body.
|
||||
* @return the gh release updater
|
||||
*/
|
||||
public GHReleaseUpdater body(String body) {
|
||||
builder.with("body", body);
|
||||
@@ -31,11 +42,11 @@ public class GHReleaseUpdater {
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies the commitish value that determines where the Git tag is created from. Can be any branch or
|
||||
* commit SHA.
|
||||
* Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA.
|
||||
*
|
||||
* @param commitish Defaults to the repository’s default branch (usually "master"). Unused if the Git tag
|
||||
* already exists.
|
||||
* @param commitish
|
||||
* Defaults to the repository’s default branch (usually "master"). Unused if the Git tag already exists.
|
||||
* @return the gh release updater
|
||||
*/
|
||||
public GHReleaseUpdater commitish(String commitish) {
|
||||
builder.with("target_commitish", commitish);
|
||||
@@ -45,8 +56,10 @@ public class GHReleaseUpdater {
|
||||
/**
|
||||
* Optional.
|
||||
*
|
||||
* @param draft {@code true} to create a draft (unpublished) release, {@code false} to create a published one.
|
||||
* Default is {@code false}.
|
||||
* @param draft
|
||||
* {@code true} to create a draft (unpublished) release, {@code false} to create a published one. Default
|
||||
* is {@code false}.
|
||||
* @return the gh release updater
|
||||
*/
|
||||
public GHReleaseUpdater draft(boolean draft) {
|
||||
builder.with("draft", draft);
|
||||
@@ -54,7 +67,11 @@ public class GHReleaseUpdater {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name the name of the release
|
||||
* Name gh release updater.
|
||||
*
|
||||
* @param name
|
||||
* the name of the release
|
||||
* @return the gh release updater
|
||||
*/
|
||||
public GHReleaseUpdater name(String name) {
|
||||
builder.with("name", name);
|
||||
@@ -64,18 +81,27 @@ public class GHReleaseUpdater {
|
||||
/**
|
||||
* Optional
|
||||
*
|
||||
* @param prerelease {@code true} to identify the release as a prerelease. {@code false} to identify the release
|
||||
* as a full release. Default is {@code false}.
|
||||
* @param prerelease
|
||||
* {@code true} to identify the release as a prerelease. {@code false} to identify the release as a full
|
||||
* release. Default is {@code false}.
|
||||
* @return the gh release updater
|
||||
*/
|
||||
public GHReleaseUpdater prerelease(boolean prerelease) {
|
||||
builder.with("prerelease", prerelease);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update gh release.
|
||||
*
|
||||
* @return the gh release
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public GHRelease update() throws IOException {
|
||||
return builder
|
||||
.method("PATCH")
|
||||
.to(base.owner.getApiTailUrl("releases/"+base.id), GHRelease.class).wrap(base.owner);
|
||||
return builder.method("PATCH")
|
||||
.to(base.owner.getApiTailUrl("releases/" + base.id), GHRelease.class)
|
||||
.wrap(base.owner);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -4,9 +4,9 @@ class GHRepoHook extends GHHook {
|
||||
/**
|
||||
* Repository that the hook belongs to.
|
||||
*/
|
||||
/*package*/ transient GHRepository repository;
|
||||
transient GHRepository repository;
|
||||
|
||||
/*package*/ GHRepoHook wrap(GHRepository owner) {
|
||||
GHRepoHook wrap(GHRepository owner) {
|
||||
this.repository = owner;
|
||||
return this;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,19 +5,24 @@ import java.util.List;
|
||||
/**
|
||||
* Repository clone statistics.
|
||||
*
|
||||
* @see GHRepository#getCloneTraffic()
|
||||
* @see GHRepository#getCloneTraffic() GHRepository#getCloneTraffic()
|
||||
*/
|
||||
public class GHRepositoryCloneTraffic extends GHRepositoryTraffic {
|
||||
private List<DailyInfo> clones;
|
||||
|
||||
/*package*/ GHRepositoryCloneTraffic() {
|
||||
GHRepositoryCloneTraffic() {
|
||||
}
|
||||
|
||||
/*package*/ GHRepositoryCloneTraffic(Integer count, Integer uniques, List<DailyInfo> clones) {
|
||||
GHRepositoryCloneTraffic(Integer count, Integer uniques, List<DailyInfo> clones) {
|
||||
super(count, uniques);
|
||||
this.clones = clones;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets clones.
|
||||
*
|
||||
* @return the clones
|
||||
*/
|
||||
public List<DailyInfo> getClones() {
|
||||
return clones;
|
||||
}
|
||||
@@ -26,11 +31,14 @@ public class GHRepositoryCloneTraffic extends GHRepositoryTraffic {
|
||||
return getClones();
|
||||
}
|
||||
|
||||
/**
|
||||
* The type DailyInfo.
|
||||
*/
|
||||
public static class DailyInfo extends GHRepositoryTraffic.DailyInfo {
|
||||
/*package*/ DailyInfo() {
|
||||
DailyInfo() {
|
||||
}
|
||||
|
||||
/*package*/ DailyInfo(String timestamp, int count, int uniques) {
|
||||
DailyInfo(String timestamp, int count, int uniques) {
|
||||
super(timestamp, count, uniques);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,11 +4,11 @@ package org.kohsuke.github;
|
||||
* Search repositories.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GitHub#searchRepositories()
|
||||
* @see GitHub#searchRepositories() GitHub#searchRepositories()
|
||||
*/
|
||||
public class GHRepositorySearchBuilder extends GHSearchBuilder<GHRepository> {
|
||||
/*package*/ GHRepositorySearchBuilder(GitHub root) {
|
||||
super(root,RepositorySearchResult.class);
|
||||
GHRepositorySearchBuilder(GitHub root) {
|
||||
super(root, RepositorySearchResult.class);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -19,63 +19,152 @@ public class GHRepositorySearchBuilder extends GHSearchBuilder<GHRepository> {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* In gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder in(String v) {
|
||||
return q("in:"+v);
|
||||
return q("in:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Size gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder size(String v) {
|
||||
return q("size:"+v);
|
||||
return q("size:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Forks gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder forks(String v) {
|
||||
return q("forks:"+v);
|
||||
return q("forks:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Created gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder created(String v) {
|
||||
return q("created:"+v);
|
||||
return q("created:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushed gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder pushed(String v) {
|
||||
return q("pushed:"+v);
|
||||
return q("pushed:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* User gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder user(String v) {
|
||||
return q("user:"+v);
|
||||
return q("user:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Repo gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder repo(String v) {
|
||||
return q("repo:"+v);
|
||||
return q("repo:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Language gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder language(String v) {
|
||||
return q("language:"+v);
|
||||
return q("language:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stars gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder stars(String v) {
|
||||
return q("stars:"+v);
|
||||
return q("stars:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Topic gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder topic(String v) {
|
||||
return q("topic:"+v);
|
||||
return q("topic:" + v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Order gh repository search builder.
|
||||
*
|
||||
* @param v
|
||||
* the v
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder order(GHDirection v) {
|
||||
req.with("order",v);
|
||||
req.with("order", v);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort gh repository search builder.
|
||||
*
|
||||
* @param sort
|
||||
* the sort
|
||||
* @return the gh repository search builder
|
||||
*/
|
||||
public GHRepositorySearchBuilder sort(Sort sort) {
|
||||
req.with("sort",sort);
|
||||
req.with("sort", sort);
|
||||
return this;
|
||||
}
|
||||
|
||||
public enum Sort { STARS, FORKS, UPDATED }
|
||||
/**
|
||||
* The enum Sort.
|
||||
*/
|
||||
public enum Sort {
|
||||
STARS, FORKS, UPDATED
|
||||
}
|
||||
|
||||
private static class RepositorySearchResult extends SearchResult<GHRepository> {
|
||||
private GHRepository[] items;
|
||||
|
||||
@Override
|
||||
/*package*/ GHRepository[] getItems(GitHub root) {
|
||||
GHRepository[] getItems(GitHub root) {
|
||||
for (GHRepository item : items)
|
||||
item.wrap(root);
|
||||
return items;
|
||||
|
||||
@@ -6,12 +6,10 @@ import java.util.Locale;
|
||||
* App installation repository selection.
|
||||
*
|
||||
* @author Paulo Miguel Almeida
|
||||
*
|
||||
* @see GHAppInstallation
|
||||
*/
|
||||
public enum GHRepositorySelection {
|
||||
SELECTED,
|
||||
ALL;
|
||||
SELECTED, ALL;
|
||||
|
||||
/**
|
||||
* Returns GitHub's internal representation of this event.
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
@@ -24,6 +25,12 @@ public class GHRepositoryStatistics {
|
||||
private static final int MAX_WAIT_ITERATIONS = 3;
|
||||
private static final int WAIT_SLEEP_INTERVAL = 5000;
|
||||
|
||||
/**
|
||||
* Instantiates a new Gh repository statistics.
|
||||
*
|
||||
* @param repo
|
||||
* the repo
|
||||
*/
|
||||
public GHRepositoryStatistics(GHRepository repo) {
|
||||
this.repo = repo;
|
||||
this.root = repo.root;
|
||||
@@ -32,24 +39,37 @@ public class GHRepositoryStatistics {
|
||||
/**
|
||||
* Get contributors list with additions, deletions, and commit count. See
|
||||
* https://developer.github.com/v3/repos/statistics/#get-contributors-list-with-additions-deletions-and-commit-counts
|
||||
*
|
||||
* @return the contributor stats
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @throws InterruptedException
|
||||
* the interrupted exception
|
||||
*/
|
||||
public PagedIterable<ContributorStats> getContributorStats() throws IOException, InterruptedException {
|
||||
return getContributorStats(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param waitTillReady Whether to sleep the thread if necessary until the
|
||||
* statistics are ready. This is true by default.
|
||||
* Gets contributor stats.
|
||||
*
|
||||
* @param waitTillReady
|
||||
* Whether to sleep the thread if necessary until the statistics are ready. This is true by default.
|
||||
* @return the contributor stats
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
* @throws InterruptedException
|
||||
* the interrupted exception
|
||||
*/
|
||||
@Preview
|
||||
@Deprecated
|
||||
@SuppressWarnings("SleepWhileInLoop")
|
||||
@SuppressFBWarnings(value = {"RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE"}, justification = "JSON API")
|
||||
public PagedIterable<ContributorStats> getContributorStats(boolean waitTillReady) throws IOException, InterruptedException {
|
||||
PagedIterable<GHRepositoryStatistics.ContributorStats> stats =
|
||||
getContributorStatsImpl();
|
||||
@SuppressFBWarnings(value = { "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" }, justification = "JSON API")
|
||||
public PagedIterable<ContributorStats> getContributorStats(boolean waitTillReady)
|
||||
throws IOException, InterruptedException {
|
||||
PagedIterable<GHRepositoryStatistics.ContributorStats> stats = getContributorStatsImpl();
|
||||
|
||||
if (stats == null && waitTillReady) {
|
||||
if (stats == null && waitTillReady) {
|
||||
for (int i = 0; i < MAX_WAIT_ITERATIONS; i += 1) {
|
||||
// Wait a few seconds and try again.
|
||||
Thread.sleep(WAIT_SLEEP_INTERVAL);
|
||||
@@ -64,21 +84,22 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* This gets the actual statistics from the server. Returns null if they
|
||||
* are still being cached.
|
||||
* This gets the actual statistics from the server. Returns null if they are still being cached.
|
||||
*/
|
||||
private PagedIterable<ContributorStats> getContributorStatsImpl() throws IOException {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
getApiTailUrl("contributors"),
|
||||
ContributorStats[].class,
|
||||
item -> item.wrapUp(root) );
|
||||
.asPagedIterable(getApiTailUrl("contributors"), ContributorStats[].class, item -> item.wrapUp(root));
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD", "URF_UNREAD_FIELD"}, justification = "JSON API")
|
||||
/**
|
||||
* The type ContributorStats.
|
||||
*/
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"URF_UNREAD_FIELD" },
|
||||
justification = "JSON API")
|
||||
public static class ContributorStats extends GHObject {
|
||||
/*package almost final*/ private GitHub root;
|
||||
/* package almost final */ private GitHub root;
|
||||
private GHUser author;
|
||||
private int total;
|
||||
private List<Week> weeks;
|
||||
@@ -88,11 +109,18 @@ public class GHRepositoryStatistics {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets author.
|
||||
*
|
||||
* @return The author described by these statistics.
|
||||
*/
|
||||
public GHUser getAuthor() {
|
||||
@@ -100,6 +128,8 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets total.
|
||||
*
|
||||
* @return The total number of commits authored by the contributor.
|
||||
*/
|
||||
public int getTotal() {
|
||||
@@ -109,10 +139,11 @@ public class GHRepositoryStatistics {
|
||||
/**
|
||||
* Convenience method to look up week with particular timestamp.
|
||||
*
|
||||
* @param timestamp The timestamp to look for.
|
||||
* @return The week starting with the given timestamp. Throws an
|
||||
* exception if it is not found.
|
||||
* @param timestamp
|
||||
* The timestamp to look for.
|
||||
* @return The week starting with the given timestamp. Throws an exception if it is not found.
|
||||
* @throws NoSuchElementException
|
||||
* the no such element exception
|
||||
*/
|
||||
public Week getWeek(long timestamp) throws NoSuchElementException {
|
||||
// maybe store the weeks in a map to make this more efficient?
|
||||
@@ -127,6 +158,8 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets weeks.
|
||||
*
|
||||
* @return The total number of commits authored by the contributor.
|
||||
*/
|
||||
public List<Week> getWeeks() {
|
||||
@@ -135,13 +168,17 @@ public class GHRepositoryStatistics {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return author.getLogin() + " made " + String.valueOf(total)
|
||||
+ " contributions over " + String.valueOf(weeks.size())
|
||||
+ " weeks";
|
||||
return author.getLogin() + " made " + String.valueOf(total) + " contributions over "
|
||||
+ String.valueOf(weeks.size()) + " weeks";
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD", "URF_UNREAD_FIELD"}, justification = "JSON API")
|
||||
/**
|
||||
* The type Week.
|
||||
*/
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
|
||||
"URF_UNREAD_FIELD" },
|
||||
justification = "JSON API")
|
||||
public static class Week {
|
||||
|
||||
private long w;
|
||||
@@ -150,6 +187,8 @@ public class GHRepositoryStatistics {
|
||||
private int c;
|
||||
|
||||
/**
|
||||
* Gets week timestamp.
|
||||
*
|
||||
* @return Start of the week, as a UNIX timestamp.
|
||||
*/
|
||||
public long getWeekTimestamp() {
|
||||
@@ -157,6 +196,8 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets number of additions.
|
||||
*
|
||||
* @return The number of additions for the week.
|
||||
*/
|
||||
public int getNumberOfAdditions() {
|
||||
@@ -164,6 +205,8 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets number of deletions.
|
||||
*
|
||||
* @return The number of deletions for the week.
|
||||
*/
|
||||
public int getNumberOfDeletions() {
|
||||
@@ -171,6 +214,8 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets number of commits.
|
||||
*
|
||||
* @return The number of commits for the week.
|
||||
*/
|
||||
public int getNumberOfCommits() {
|
||||
@@ -183,7 +228,7 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
}
|
||||
|
||||
/*package*/ ContributorStats wrapUp(GitHub root) {
|
||||
ContributorStats wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
@@ -192,32 +237,40 @@ public class GHRepositoryStatistics {
|
||||
/**
|
||||
* Get the last year of commit activity data. See
|
||||
* https://developer.github.com/v3/repos/statistics/#get-the-last-year-of-commit-activity-data
|
||||
*
|
||||
* @return the commit activity
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public PagedIterable<CommitActivity> getCommitActivity() throws IOException {
|
||||
return root.retrieve()
|
||||
.asPagedIterable(
|
||||
getApiTailUrl("commit_activity"),
|
||||
CommitActivity[].class,
|
||||
item -> item.wrapUp(root) );
|
||||
.asPagedIterable(getApiTailUrl("commit_activity"), CommitActivity[].class, item -> item.wrapUp(root));
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
|
||||
"NP_UNWRITTEN_FIELD"}, justification = "JSON API")
|
||||
/**
|
||||
* The type CommitActivity.
|
||||
*/
|
||||
@SuppressFBWarnings(
|
||||
value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD" },
|
||||
justification = "JSON API")
|
||||
public static class CommitActivity extends GHObject {
|
||||
/*package almost final*/ private GitHub root;
|
||||
/* package almost final */ private GitHub root;
|
||||
private List<Integer> days;
|
||||
private int total;
|
||||
private long week;
|
||||
|
||||
/**
|
||||
* @return The number of commits for each day of the week. 0 = Sunday, 1
|
||||
* = Monday, etc.
|
||||
* Gets days.
|
||||
*
|
||||
* @return The number of commits for each day of the week. 0 = Sunday, 1 = Monday, etc.
|
||||
*/
|
||||
public List<Integer> getDays() {
|
||||
return days;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets total.
|
||||
*
|
||||
* @return The total number of commits for the week.
|
||||
*/
|
||||
public int getTotal() {
|
||||
@@ -225,17 +278,24 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets week.
|
||||
*
|
||||
* @return The start of the week as a UNIX timestamp.
|
||||
*/
|
||||
public long getWeek() {
|
||||
return week;
|
||||
}
|
||||
|
||||
/*package*/ CommitActivity wrapUp(GitHub root) {
|
||||
CommitActivity wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
@@ -246,9 +306,13 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of additions and deletions per week.
|
||||
* See https://developer.github.com/v3/repos/statistics/#get-the-number-of-additions-and-deletions-per-week
|
||||
/**
|
||||
* Get the number of additions and deletions per week. See
|
||||
* https://developer.github.com/v3/repos/statistics/#get-the-number-of-additions-and-deletions-per-week
|
||||
*
|
||||
* @return the code frequency
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<CodeFrequency> getCodeFrequency() throws IOException {
|
||||
// Map to ArrayLists first, since there are no field names in the
|
||||
@@ -257,14 +321,13 @@ public class GHRepositoryStatistics {
|
||||
InputStream stream = root.retrieve().asStream(getApiTailUrl("code_frequency"));
|
||||
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
TypeReference<ArrayList<ArrayList<Integer> > > typeRef =
|
||||
new TypeReference<ArrayList< ArrayList<Integer> > >() {};
|
||||
ArrayList<ArrayList <Integer> > list = mapper.readValue(stream, typeRef);
|
||||
TypeReference<ArrayList<ArrayList<Integer>>> typeRef = new TypeReference<ArrayList<ArrayList<Integer>>>() {
|
||||
};
|
||||
ArrayList<ArrayList<Integer>> list = mapper.readValue(stream, typeRef);
|
||||
|
||||
// Convert to proper objects.
|
||||
ArrayList<CodeFrequency> returnList = new ArrayList<CodeFrequency>();
|
||||
for(ArrayList<Integer> item: list)
|
||||
{
|
||||
for (ArrayList<Integer> item : list) {
|
||||
CodeFrequency cf = new CodeFrequency(item);
|
||||
returnList.add(cf);
|
||||
}
|
||||
@@ -278,6 +341,9 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The type CodeFrequency.
|
||||
*/
|
||||
public static class CodeFrequency {
|
||||
private int week;
|
||||
private int additions;
|
||||
@@ -290,6 +356,8 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets week timestamp.
|
||||
*
|
||||
* @return The start of the week as a UNIX timestamp.
|
||||
*/
|
||||
public int getWeekTimestamp() {
|
||||
@@ -297,6 +365,8 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets additions.
|
||||
*
|
||||
* @return The number of additions for the week.
|
||||
*/
|
||||
public long getAdditions() {
|
||||
@@ -304,8 +374,9 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The number of deletions for the week.
|
||||
* NOTE: This will be a NEGATIVE number.
|
||||
* Gets deletions.
|
||||
*
|
||||
* @return The number of deletions for the week. NOTE: This will be a NEGATIVE number.
|
||||
*/
|
||||
public long getDeletions() {
|
||||
// TODO: Perhaps return Math.abs(deletions),
|
||||
@@ -315,21 +386,28 @@ public class GHRepositoryStatistics {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Week starting " + getWeekTimestamp() + " has " + getAdditions() +
|
||||
" additions and " + Math.abs(getDeletions()) + " deletions";
|
||||
return "Week starting " + getWeekTimestamp() + " has " + getAdditions() + " additions and "
|
||||
+ Math.abs(getDeletions()) + " deletions";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the weekly commit count for the repository owner and everyone else.
|
||||
* See https://developer.github.com/v3/repos/statistics/#get-the-weekly-commit-count-for-the-repository-owner-and-everyone-else
|
||||
* Get the weekly commit count for the repository owner and everyone else. See
|
||||
* https://developer.github.com/v3/repos/statistics/#get-the-weekly-commit-count-for-the-repository-owner-and-everyone-else
|
||||
*
|
||||
* @return the participation
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public Participation getParticipation() throws IOException {
|
||||
return root.retrieve().to(getApiTailUrl("participation"), Participation.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* The type Participation.
|
||||
*/
|
||||
public static class Participation extends GHObject {
|
||||
/*package almost final*/ private GitHub root;
|
||||
/* package almost final */ private GitHub root;
|
||||
private List<Integer> all;
|
||||
private List<Integer> owner;
|
||||
|
||||
@@ -338,35 +416,46 @@ public class GHRepositoryStatistics {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets root.
|
||||
*
|
||||
* @return the root
|
||||
*/
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The list of commit counts for everyone combined, for the
|
||||
* last 52 weeks.
|
||||
* Gets all commits.
|
||||
*
|
||||
* @return The list of commit counts for everyone combined, for the last 52 weeks.
|
||||
*/
|
||||
public List<Integer> getAllCommits() {
|
||||
return all;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The list of commit counts for the owner, for the
|
||||
* last 52 weeks.
|
||||
* Gets owner commits.
|
||||
*
|
||||
* @return The list of commit counts for the owner, for the last 52 weeks.
|
||||
*/
|
||||
public List<Integer> getOwnerCommits() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
/*package*/ Participation wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
Participation wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of commits per hour in each day.
|
||||
* See https://developer.github.com/v3/repos/statistics/#get-the-number-of-commits-per-hour-in-each-day
|
||||
* Get the number of commits per hour in each day. See
|
||||
* https://developer.github.com/v3/repos/statistics/#get-the-number-of-commits-per-hour-in-each-day
|
||||
*
|
||||
* @return the punch card
|
||||
* @throws IOException
|
||||
* the io exception
|
||||
*/
|
||||
public List<PunchCardItem> getPunchCard() throws IOException {
|
||||
// Map to ArrayLists first, since there are no field names in the
|
||||
@@ -374,13 +463,13 @@ public class GHRepositoryStatistics {
|
||||
InputStream stream = root.retrieve().asStream(getApiTailUrl("punch_card"));
|
||||
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
TypeReference<ArrayList<ArrayList<Integer> > > typeRef =
|
||||
new TypeReference<ArrayList< ArrayList<Integer> > >() {};
|
||||
ArrayList<ArrayList <Integer> > list = mapper.readValue(stream, typeRef);
|
||||
TypeReference<ArrayList<ArrayList<Integer>>> typeRef = new TypeReference<ArrayList<ArrayList<Integer>>>() {
|
||||
};
|
||||
ArrayList<ArrayList<Integer>> list = mapper.readValue(stream, typeRef);
|
||||
|
||||
// Convert to proper objects.
|
||||
ArrayList<PunchCardItem> returnList = new ArrayList<PunchCardItem>();
|
||||
for(ArrayList<Integer> item: list) {
|
||||
for (ArrayList<Integer> item : list) {
|
||||
PunchCardItem pci = new PunchCardItem(item);
|
||||
returnList.add(pci);
|
||||
}
|
||||
@@ -388,6 +477,9 @@ public class GHRepositoryStatistics {
|
||||
return returnList;
|
||||
}
|
||||
|
||||
/**
|
||||
* The type PunchCardItem.
|
||||
*/
|
||||
public static class PunchCardItem {
|
||||
private int dayOfWeek;
|
||||
private int hourOfDay;
|
||||
@@ -400,14 +492,17 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The day of the week.
|
||||
* 0 = Sunday, 1 = Monday, etc.
|
||||
* Gets day of week.
|
||||
*
|
||||
* @return The day of the week. 0 = Sunday, 1 = Monday, etc.
|
||||
*/
|
||||
public int getDayOfWeek() {
|
||||
return dayOfWeek;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets hour of day.
|
||||
*
|
||||
* @return The hour of the day from 0 to 23.
|
||||
*/
|
||||
public long getHourOfDay() {
|
||||
@@ -415,6 +510,8 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets number of commits.
|
||||
*
|
||||
* @return The number of commits for the day and hour.
|
||||
*/
|
||||
public long getNumberOfCommits() {
|
||||
@@ -422,8 +519,7 @@ public class GHRepositoryStatistics {
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "Day " + getDayOfWeek() + " Hour " + getHourOfDay() + ": " +
|
||||
getNumberOfCommits() + " commits";
|
||||
return "Day " + getDayOfWeek() + " Hour " + getHourOfDay() + ": " + getNumberOfCommits() + " commits";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user