mirror of
https://github.com/jlengrand/github-api.git
synced 2026-03-14 08:21:22 +00:00
Compare commits
128 Commits
github-api
...
github-api
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
38b1e367b1 | ||
|
|
3cddffa37f | ||
|
|
ea7a1a7175 | ||
|
|
36b5601588 | ||
|
|
c5ee07add4 | ||
|
|
279df00404 | ||
|
|
bfd4b17fa0 | ||
|
|
5fe2817164 | ||
|
|
b337bb39bc | ||
|
|
65ae41c5f1 | ||
|
|
796c644c4a | ||
|
|
bfd9023a27 | ||
|
|
c9cdf5d03e | ||
|
|
f60bb41ad9 | ||
|
|
c333903b4a | ||
|
|
dd55e8a22c | ||
|
|
3ab9381d0a | ||
|
|
58f1fe0671 | ||
|
|
82b9c05d0f | ||
|
|
7c9397f7f6 | ||
|
|
6214b6a3ff | ||
|
|
883c8cc4c8 | ||
|
|
8d47c72913 | ||
|
|
89a6664e45 | ||
|
|
30d792d6e1 | ||
|
|
3745bf3157 | ||
|
|
a7fda3e50d | ||
|
|
7f07204fef | ||
|
|
8b51a44b7c | ||
|
|
c499c73dcc | ||
|
|
c01f3f5e8a | ||
|
|
2aef35655f | ||
|
|
7ddf1f5830 | ||
|
|
b2c513ea42 | ||
|
|
4c30f94355 | ||
|
|
e911e86c4c | ||
|
|
ca640b3f64 | ||
|
|
b4c4a05f3b | ||
|
|
fd3c36a259 | ||
|
|
d8274ac2d4 | ||
|
|
9c7479f953 | ||
|
|
b5dc3c4366 | ||
|
|
26b8082155 | ||
|
|
418df15f7b | ||
|
|
31ed0125b8 | ||
|
|
494318b879 | ||
|
|
f554ddc372 | ||
|
|
03de12c221 | ||
|
|
6c41f22b57 | ||
|
|
7ae96388e3 | ||
|
|
e8b4de00d2 | ||
|
|
cd7963b30d | ||
|
|
0dc44cffcf | ||
|
|
7a650132c5 | ||
|
|
c7fb390c38 | ||
|
|
572ff9df19 | ||
|
|
b715e0cef7 | ||
|
|
36ab2a889f | ||
|
|
a78d2f28d7 | ||
|
|
7d5a39ed89 | ||
|
|
772272ff36 | ||
|
|
2ab4eafee9 | ||
|
|
b15e0d4c45 | ||
|
|
b8180314d8 | ||
|
|
fcb8d03a0f | ||
|
|
09ec89bc2e | ||
|
|
863ad0f486 | ||
|
|
79a1bb3571 | ||
|
|
9f1d7323c7 | ||
|
|
64a82f4785 | ||
|
|
f37e4bd76e | ||
|
|
98ef2cc640 | ||
|
|
134222fd69 | ||
|
|
0cb2371517 | ||
|
|
b7de4359fd | ||
|
|
2607d6a107 | ||
|
|
db46b1ce13 | ||
|
|
d7b08d5207 | ||
|
|
29fbba832c | ||
|
|
fd621a442a | ||
|
|
a1a73568ae | ||
|
|
3daccbd6ec | ||
|
|
293deadb48 | ||
|
|
452b56c47b | ||
|
|
5cb6bfa633 | ||
|
|
0515cee6f3 | ||
|
|
4247112539 | ||
|
|
8d3374f574 | ||
|
|
26833e5f7c | ||
|
|
6752b46f67 | ||
|
|
b9429ffcaa | ||
|
|
10827c7e21 | ||
|
|
23cb4a34a4 | ||
|
|
adfd09565f | ||
|
|
78b9ff49d4 | ||
|
|
fca425d25e | ||
|
|
1a4238156c | ||
|
|
f6210cc014 | ||
|
|
6c8b466e59 | ||
|
|
2aebe97f9f | ||
|
|
157724bff8 | ||
|
|
6cbb1a0bee | ||
|
|
960a13dd38 | ||
|
|
9213f80435 | ||
|
|
bccae94c7a | ||
|
|
d71f77ce06 | ||
|
|
2787f3dc71 | ||
|
|
fb00baab5b | ||
|
|
9e22155d31 | ||
|
|
963373435d | ||
|
|
377987fa92 | ||
|
|
0b6980639e | ||
|
|
4f1cc9f94f | ||
|
|
6e5434a0ec | ||
|
|
3244f7c38f | ||
|
|
f27b676e89 | ||
|
|
4f2a80a4a3 | ||
|
|
a51bc27829 | ||
|
|
4fd321c93d | ||
|
|
bbd62bdef5 | ||
|
|
4bb1d78939 | ||
|
|
53c37ef413 | ||
|
|
a6511b6c5a | ||
|
|
829e96a2d0 | ||
|
|
2e25f37433 | ||
|
|
fbf6c73226 | ||
|
|
aab54e3f23 | ||
|
|
a6eff7fbfb |
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -7,4 +7,6 @@ We love getting PRs, but we hate asking people for the same basic changes every
|
|||||||
- [ ] Push your changes to a branch other than `master`. Create your PR from that branch.
|
- [ ] Push your changes to a branch other than `master`. Create your PR from that branch.
|
||||||
- [ ] Add JavaDocs and other comments
|
- [ ] 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.
|
- [ ] Write tests that run and pass in CI. See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to capture snapshot data.
|
||||||
- [ ] Run `mvn -D enable-ci clean install site` locally. This may reformat your code, commit those changes. If this command doesn't succeed, your change will not pass CI.
|
- [ ] Run `mvn clean compile` locally. This may reformat your code, commit those changes.
|
||||||
|
- [ ] Run `mvn -D enable-ci clean install site` locally. 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
@@ -30,7 +30,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
java: [ 11 ]
|
java: [ 8, 11 ]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Set up JDK
|
- name: Set up JDK
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
[](https://mvnrepository.com/artifact/org.kohsuke/github-api)
|
[](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)
|
[](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
|
See https://github-api.kohsuke.org/ for more details
|
||||||
|
|||||||
42
pom.xml
42
pom.xml
@@ -2,7 +2,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>org.kohsuke</groupId>
|
<groupId>org.kohsuke</groupId>
|
||||||
<artifactId>github-api</artifactId>
|
<artifactId>github-api</artifactId>
|
||||||
<version>1.108</version>
|
<version>1.109</version>
|
||||||
<name>GitHub API for Java</name>
|
<name>GitHub API for Java</name>
|
||||||
<url>https://github-api.kohsuke.org/</url>
|
<url>https://github-api.kohsuke.org/</url>
|
||||||
<description>GitHub API for Java</description>
|
<description>GitHub API for Java</description>
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
<connection>scm:git:git@github.com/github-api/${project.artifactId}.git</connection>
|
<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>
|
<developerConnection>scm:git:ssh://git@github.com/github-api/${project.artifactId}.git</developerConnection>
|
||||||
<url>https://github.com/github-api/github-api/</url>
|
<url>https://github.com/github-api/github-api/</url>
|
||||||
<tag>github-api-1.108</tag>
|
<tag>github-api-1.109</tag>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
@@ -33,12 +33,12 @@
|
|||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<spotbugs-maven-plugin.version>3.1.12.2</spotbugs-maven-plugin.version>
|
<spotbugs-maven-plugin.version>4.0.0</spotbugs-maven-plugin.version>
|
||||||
<spotbugs.version>4.0.0</spotbugs.version>
|
<spotbugs.version>4.0.1</spotbugs.version>
|
||||||
<spotbugs-maven-plugin.failOnError>true</spotbugs-maven-plugin.failOnError>
|
<spotbugs-maven-plugin.failOnError>true</spotbugs-maven-plugin.failOnError>
|
||||||
<hamcrest.version>2.2</hamcrest.version>
|
<hamcrest.version>2.2</hamcrest.version>
|
||||||
<okhttp3.version>4.4.0</okhttp3.version>
|
<okhttp3.version>4.4.1</okhttp3.version>
|
||||||
<okio.version>2.4.3</okio.version>
|
<okio.version>2.5.0</okio.version>
|
||||||
<formatter-maven-plugin.goal>format</formatter-maven-plugin.goal>
|
<formatter-maven-plugin.goal>format</formatter-maven-plugin.goal>
|
||||||
<impsort-maven-plugin.goal>sort</impsort-maven-plugin.goal>
|
<impsort-maven-plugin.goal>sort</impsort-maven-plugin.goal>
|
||||||
<!-- Using this as the minimum bar for code coverage. Adding methods without covering them will fail this. -->
|
<!-- Using this as the minimum bar for code coverage. Adding methods without covering them will fail this. -->
|
||||||
@@ -209,7 +209,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
<version>3.1.1</version>
|
<version>3.2.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>8</source>
|
<source>8</source>
|
||||||
<failOnWarnings>true</failOnWarnings>
|
<failOnWarnings>true</failOnWarnings>
|
||||||
@@ -233,7 +233,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-site-plugin</artifactId>
|
<artifactId>maven-site-plugin</artifactId>
|
||||||
<version>3.8.2</version>
|
<version>3.9.0</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
@@ -281,6 +281,10 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.22.2</version>
|
<version>2.22.2</version>
|
||||||
|
<configuration>
|
||||||
|
<!-- SUREFIRE-1226 workaround -->
|
||||||
|
<trimStackTrace>false</trimStackTrace>
|
||||||
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
@@ -453,7 +457,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.eclipse.jgit</groupId>
|
<groupId>org.eclipse.jgit</groupId>
|
||||||
<artifactId>org.eclipse.jgit</artifactId>
|
<artifactId>org.eclipse.jgit</artifactId>
|
||||||
<version>5.6.1.202002131546-r</version>
|
<version>5.7.0.202003110725-r</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -491,7 +495,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mockito</groupId>
|
<groupId>org.mockito</groupId>
|
||||||
<artifactId>mockito-core</artifactId>
|
<artifactId>mockito-core</artifactId>
|
||||||
<version>3.3.1</version>
|
<version>3.3.3</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -503,7 +507,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.tomakehurst</groupId>
|
<groupId>com.github.tomakehurst</groupId>
|
||||||
<artifactId>wiremock-jre8-standalone</artifactId>
|
<artifactId>wiremock-jre8-standalone</artifactId>
|
||||||
<version>2.26.2</version>
|
<version>2.26.3</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -568,6 +572,10 @@
|
|||||||
</properties>
|
</properties>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jacoco</groupId>
|
||||||
|
<artifactId>jacoco-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-gpg-plugin</artifactId>
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
@@ -617,6 +625,18 @@
|
|||||||
</profiles>
|
</profiles>
|
||||||
<reporting>
|
<reporting>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jacoco</groupId>
|
||||||
|
<artifactId>jacoco-maven-plugin</artifactId>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<!-- select non-aggregate reports -->
|
||||||
|
<report>report</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
|||||||
165
src/main/java/org/kohsuke/github/AbstractBuilder.java
Normal file
165
src/main/java/org/kohsuke/github/AbstractBuilder.java
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
package org.kohsuke.github;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.annotation.CheckForNull;
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An abstract data object builder/updater.
|
||||||
|
*
|
||||||
|
* This class can be use to make a Builder that supports both batch and single property changes.
|
||||||
|
* <p>
|
||||||
|
* Batching looks like this:
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* update().someName(value).otherName(value).done()
|
||||||
|
* </pre>
|
||||||
|
* <p>
|
||||||
|
* Single changes look like this:
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* set().someName(value);
|
||||||
|
* set().otherName(value);
|
||||||
|
* </pre>
|
||||||
|
* <p>
|
||||||
|
* If {@link S} is the same as {@link R}, {@link #with(String, Object)} will commit changes after the first value change
|
||||||
|
* and return a {@link R} from {@link #done()}.
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* If {@link S} is not the same as {@link R}, {@link #with(String, Object)} will batch together multiple changes and let
|
||||||
|
* the user call {@link #done()} when they are ready.
|
||||||
|
*
|
||||||
|
* @param <R>
|
||||||
|
* Final return type built by this builder returned when {@link #done()}} is called.
|
||||||
|
* @param <S>
|
||||||
|
* Intermediate return type for this builder returned by calls to {@link #with(String, Object)}. If {@link S}
|
||||||
|
* the same as {@link R}, this builder will commit changes after each call to {@link #with(String, Object)}.
|
||||||
|
*/
|
||||||
|
abstract class AbstractBuilder<R, S> {
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
private final Class<R> returnType;
|
||||||
|
|
||||||
|
private final boolean commitChangesImmediately;
|
||||||
|
|
||||||
|
@CheckForNull
|
||||||
|
private final R baseInstance;
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
protected final Requester requester;
|
||||||
|
|
||||||
|
// TODO: Not sure how update-in-place behavior should be controlled
|
||||||
|
// However, it certainly can be controlled dynamically down to the instance level or inherited for all children of
|
||||||
|
// some
|
||||||
|
// connection.
|
||||||
|
protected boolean updateInPlace;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a builder.
|
||||||
|
*
|
||||||
|
* @param root
|
||||||
|
* the GitHub instance to connect to.
|
||||||
|
* @param intermediateReturnType
|
||||||
|
* the intermediate return type of type {@link S} returned by calls to {@link #with(String, Object)}.
|
||||||
|
* Must either be equal to {@code builtReturnType} or this instance must be castable to this class. If
|
||||||
|
* not, the constructor will throw {@link IllegalArgumentException}.
|
||||||
|
* @param finalReturnType
|
||||||
|
* the final return type for built by this builder returned when {@link #done()}} is called.
|
||||||
|
* @param baseInstance
|
||||||
|
* optional instance on which to base this builder.
|
||||||
|
*/
|
||||||
|
protected AbstractBuilder(@Nonnull Class<R> finalReturnType,
|
||||||
|
@Nonnull Class<S> intermediateReturnType,
|
||||||
|
@Nonnull GitHub root,
|
||||||
|
@CheckForNull R baseInstance) {
|
||||||
|
this.requester = root.createRequest();
|
||||||
|
this.returnType = finalReturnType;
|
||||||
|
this.commitChangesImmediately = returnType.equals(intermediateReturnType);
|
||||||
|
if (!commitChangesImmediately && !intermediateReturnType.isInstance(this)) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Argument \"intermediateReturnType\": This instance must be castable to intermediateReturnType or finalReturnType must be equal to intermediateReturnType.");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.baseInstance = baseInstance;
|
||||||
|
this.updateInPlace = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finishes an update, committing changes.
|
||||||
|
*
|
||||||
|
* This method may update-in-place or not. Either way it returns the resulting instance.
|
||||||
|
*
|
||||||
|
* @return an instance with updated current data
|
||||||
|
* @throws IOException
|
||||||
|
* if there is an I/O Exception
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public R done() throws IOException {
|
||||||
|
R result;
|
||||||
|
if (updateInPlace && baseInstance != null) {
|
||||||
|
result = requester.fetchInto(baseInstance);
|
||||||
|
} else {
|
||||||
|
result = requester.fetch(returnType);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies a value to a name for this builder.
|
||||||
|
*
|
||||||
|
* If {@link S} is the same as {@link R}, this method will commit changes after the first value change and return a
|
||||||
|
* {@link R} from {@link #done()}.
|
||||||
|
*
|
||||||
|
* If {@link S} is not the same as {@link R}, this method will return an {@link S} and letting the caller batch
|
||||||
|
* together multiple changes and call {@link #done()} when they are ready.
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* the name of the field
|
||||||
|
* @param value
|
||||||
|
* the value of the field
|
||||||
|
* @return either a continuing builder or an updated data record
|
||||||
|
* @throws IOException
|
||||||
|
* if an I/O error occurs
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
protected S with(@Nonnull String name, Object value) throws IOException {
|
||||||
|
requester.with(name, value);
|
||||||
|
return continueOrDone();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chooses whether to return a continuing builder or an updated data record
|
||||||
|
*
|
||||||
|
* If {@link S} is the same as {@link R}, this method will commit changes after the first value change and return a
|
||||||
|
* {@link R} from {@link #done()}.
|
||||||
|
*
|
||||||
|
* If {@link S} is not the same as {@link R}, this method will return an {@link S} and letting the caller batch
|
||||||
|
* together multiple changes and call {@link #done()} when they are ready.
|
||||||
|
*
|
||||||
|
* @return either a continuing builder or an updated data record
|
||||||
|
* @throws IOException
|
||||||
|
* if an I/O error occurs
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
protected S continueOrDone() throws IOException {
|
||||||
|
// This little bit of roughness in this base class means all inheriting builders get to create Updater and
|
||||||
|
// Setter classes from almost identical code. Creator can often be implemented with significant code reuse as
|
||||||
|
// well.
|
||||||
|
if (commitChangesImmediately) {
|
||||||
|
// These casts look strange and risky, but they they're actually guaranteed safe due to the return path
|
||||||
|
// being based on the previous comparison of class instances passed to the constructor.
|
||||||
|
return (S) done();
|
||||||
|
} else {
|
||||||
|
return (S) this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -51,24 +51,33 @@ public class GHCheckRun extends GHObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets status of the check run. It can be one of "queue", "in_progress", or "completed"
|
* Gets status of the check run.
|
||||||
*
|
*
|
||||||
* @return Status of the check run
|
* @return Status of the check run
|
||||||
|
* @see Status
|
||||||
*/
|
*/
|
||||||
public String getStatus() {
|
public String getStatus() {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static enum Status {
|
||||||
|
QUEUED, IN_PROGRESS, COMPLETED
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets conclusion of a completed check run. It can be one of "success", "failure", "neutral", "cancelled",
|
* Gets conclusion of a completed check run.
|
||||||
* "time_out", or "action_required".
|
|
||||||
*
|
*
|
||||||
* @return Status of the check run
|
* @return Status of the check run
|
||||||
|
* @see Conclusion
|
||||||
*/
|
*/
|
||||||
public String getConclusion() {
|
public String getConclusion() {
|
||||||
return conclusion;
|
return conclusion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static enum Conclusion {
|
||||||
|
SUCCESS, FAILURE, NEUTRAL, CANCELLED, TIMED_OUT, ACTION_REQUIRED
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the custom name of this check run.
|
* Gets the custom name of this check run.
|
||||||
*
|
*
|
||||||
@@ -243,4 +252,8 @@ public class GHCheckRun extends GHObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static enum AnnotationLevel {
|
||||||
|
NOTICE, WARNING, FAILURE
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
291
src/main/java/org/kohsuke/github/GHCheckRunBuilder.java
Normal file
291
src/main/java/org/kohsuke/github/GHCheckRunBuilder.java
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
/*
|
||||||
|
* The MIT License
|
||||||
|
*
|
||||||
|
* Copyright 2020 CloudBees, Inc.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.kohsuke.github;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import edu.umd.cs.findbugs.annotations.CheckForNull;
|
||||||
|
import edu.umd.cs.findbugs.annotations.NonNull;
|
||||||
|
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drafts a check run.
|
||||||
|
*
|
||||||
|
* @see GHCheckRun
|
||||||
|
* @see GHRepository#createCheckRun
|
||||||
|
* @see <a href="https://developer.github.com/v3/checks/runs/#create-a-check-run">documentation</a>
|
||||||
|
*/
|
||||||
|
@SuppressFBWarnings(value = "URF_UNREAD_FIELD", justification = "Jackson serializes these even without a getter")
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public final class GHCheckRunBuilder {
|
||||||
|
|
||||||
|
private final GHRepository repo;
|
||||||
|
private final Requester requester;
|
||||||
|
private Output output;
|
||||||
|
private List<Action> actions;
|
||||||
|
|
||||||
|
GHCheckRunBuilder(GHRepository repo, String name, String headSHA) {
|
||||||
|
this.repo = repo;
|
||||||
|
requester = repo.root.createRequest()
|
||||||
|
.withPreview(Previews.ANTIOPE)
|
||||||
|
.method("POST")
|
||||||
|
.with("name", name)
|
||||||
|
.with("head_sha", headSHA)
|
||||||
|
.withUrlPath(repo.getApiTailUrl("check-runs"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull GHCheckRunBuilder withDetailsURL(@CheckForNull String detailsURL) {
|
||||||
|
requester.with("details_url", detailsURL);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull GHCheckRunBuilder withExternalID(@CheckForNull String externalID) {
|
||||||
|
requester.with("external_id", externalID);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull GHCheckRunBuilder withStatus(@CheckForNull GHCheckRun.Status status) {
|
||||||
|
if (status != null) {
|
||||||
|
// Do *not* use the overload taking Enum, as that s/_/-/g which would be wrong here.
|
||||||
|
requester.with("status", status.toString().toLowerCase(Locale.ROOT));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull GHCheckRunBuilder withConclusion(@CheckForNull GHCheckRun.Conclusion conclusion) {
|
||||||
|
if (conclusion != null) {
|
||||||
|
requester.with("conclusion", conclusion.toString().toLowerCase(Locale.ROOT));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull GHCheckRunBuilder withStartedAt(@CheckForNull Date startedAt) {
|
||||||
|
if (startedAt != null) {
|
||||||
|
requester.with("started_at", GitHubClient.printDate(startedAt));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull GHCheckRunBuilder withCompletedAt(@CheckForNull Date completedAt) {
|
||||||
|
if (completedAt != null) {
|
||||||
|
requester.with("completed_at", GitHubClient.printDate(completedAt));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull GHCheckRunBuilder add(@NonNull Output output) {
|
||||||
|
if (this.output != null) {
|
||||||
|
throw new IllegalStateException("cannot add Output twice");
|
||||||
|
}
|
||||||
|
this.output = output;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull GHCheckRunBuilder add(@NonNull Action action) {
|
||||||
|
if (actions == null) {
|
||||||
|
actions = new LinkedList<>();
|
||||||
|
}
|
||||||
|
actions.add(action);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int MAX_ANNOTATIONS = 50;
|
||||||
|
/**
|
||||||
|
* Actually creates the check run. (If more than fifty annotations were requested, this is done in batches.)
|
||||||
|
*
|
||||||
|
* @return the resulting run
|
||||||
|
* @throws IOException
|
||||||
|
* for the usual reasons
|
||||||
|
*/
|
||||||
|
public @NonNull GHCheckRun create() throws IOException {
|
||||||
|
List<Annotation> extraAnnotations;
|
||||||
|
if (output != null && output.annotations != null && output.annotations.size() > MAX_ANNOTATIONS) {
|
||||||
|
extraAnnotations = output.annotations.subList(MAX_ANNOTATIONS, output.annotations.size());
|
||||||
|
output.annotations = output.annotations.subList(0, MAX_ANNOTATIONS);
|
||||||
|
} else {
|
||||||
|
extraAnnotations = Collections.emptyList();
|
||||||
|
}
|
||||||
|
GHCheckRun run = requester.with("output", output).with("actions", actions).fetch(GHCheckRun.class).wrap(repo);
|
||||||
|
while (!extraAnnotations.isEmpty()) {
|
||||||
|
Output output2 = new Output(output.title, output.summary);
|
||||||
|
int i = Math.min(extraAnnotations.size(), MAX_ANNOTATIONS);
|
||||||
|
output2.annotations = extraAnnotations.subList(0, i);
|
||||||
|
extraAnnotations = extraAnnotations.subList(i, extraAnnotations.size());
|
||||||
|
run = repo.root.createRequest()
|
||||||
|
.withPreview(Previews.ANTIOPE)
|
||||||
|
.method("PATCH")
|
||||||
|
.with("output", output2)
|
||||||
|
.withUrlPath(repo.getApiTailUrl("check-runs/" + run.id))
|
||||||
|
.fetch(GHCheckRun.class)
|
||||||
|
.wrap(repo);
|
||||||
|
}
|
||||||
|
return run;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="https://developer.github.com/v3/checks/runs/#output-object">documentation</a>
|
||||||
|
*/
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
public static final class Output {
|
||||||
|
|
||||||
|
private final String title;
|
||||||
|
private final String summary;
|
||||||
|
private String text;
|
||||||
|
private List<Annotation> annotations;
|
||||||
|
private List<Image> images;
|
||||||
|
|
||||||
|
public Output(@NonNull String title, @NonNull String summary) {
|
||||||
|
this.title = title;
|
||||||
|
this.summary = summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull Output withText(@CheckForNull String text) {
|
||||||
|
this.text = text;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull Output add(@NonNull Annotation annotation) {
|
||||||
|
if (annotations == null) {
|
||||||
|
annotations = new LinkedList<>();
|
||||||
|
}
|
||||||
|
annotations.add(annotation);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull Output add(@NonNull Image image) {
|
||||||
|
if (images == null) {
|
||||||
|
images = new LinkedList<>();
|
||||||
|
}
|
||||||
|
images.add(image);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="https://developer.github.com/v3/checks/runs/#annotations-object">documentation</a>
|
||||||
|
*/
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
public static final class Annotation {
|
||||||
|
|
||||||
|
private final String path;
|
||||||
|
private final int start_line;
|
||||||
|
private final int end_line;
|
||||||
|
private final String annotation_level;
|
||||||
|
private final String message;
|
||||||
|
private Integer start_column;
|
||||||
|
private Integer end_column;
|
||||||
|
private String title;
|
||||||
|
private String raw_details;
|
||||||
|
|
||||||
|
public Annotation(@NonNull String path,
|
||||||
|
int line,
|
||||||
|
@NonNull GHCheckRun.AnnotationLevel annotationLevel,
|
||||||
|
@NonNull String message) {
|
||||||
|
this(path, line, line, annotationLevel, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Annotation(@NonNull String path,
|
||||||
|
int startLine,
|
||||||
|
int endLine,
|
||||||
|
@NonNull GHCheckRun.AnnotationLevel annotationLevel,
|
||||||
|
@NonNull String message) {
|
||||||
|
this.path = path;
|
||||||
|
start_line = startLine;
|
||||||
|
end_line = endLine;
|
||||||
|
annotation_level = annotationLevel.toString().toLowerCase(Locale.ROOT);
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull Annotation withStartColumn(@CheckForNull Integer startColumn) {
|
||||||
|
start_column = startColumn;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull Annotation withEndColumn(@CheckForNull Integer endColumn) {
|
||||||
|
end_column = endColumn;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull Annotation withTitle(@CheckForNull String title) {
|
||||||
|
this.title = title;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull Annotation withRawDetails(@CheckForNull String rawDetails) {
|
||||||
|
raw_details = rawDetails;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="https://developer.github.com/v3/checks/runs/#images-object">documentation</a>
|
||||||
|
*/
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
public static final class Image {
|
||||||
|
|
||||||
|
private final String alt;
|
||||||
|
private final String image_url;
|
||||||
|
private String caption;
|
||||||
|
|
||||||
|
public Image(@NonNull String alt, @NonNull String imageURL) {
|
||||||
|
this.alt = alt;
|
||||||
|
image_url = imageURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull Image withCaption(@CheckForNull String caption) {
|
||||||
|
this.caption = caption;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="https://developer.github.com/v3/checks/runs/#actions-object">documentation</a>
|
||||||
|
*/
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
public static final class Action {
|
||||||
|
|
||||||
|
private final String label;
|
||||||
|
private final String description;
|
||||||
|
private final String identifier;
|
||||||
|
|
||||||
|
public Action(@NonNull String label, @NonNull String description, @NonNull String identifier) {
|
||||||
|
this.label = label;
|
||||||
|
this.description = description;
|
||||||
|
this.identifier = identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
44
src/main/java/org/kohsuke/github/GHCheckRunsIterable.java
Normal file
44
src/main/java/org/kohsuke/github/GHCheckRunsIterable.java
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package org.kohsuke.github;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterable for check-runs listing.
|
||||||
|
*/
|
||||||
|
class GHCheckRunsIterable extends PagedIterable<GHCheckRun> {
|
||||||
|
private GitHub root;
|
||||||
|
private final GitHubRequest request;
|
||||||
|
|
||||||
|
private GHCheckRunsPage result;
|
||||||
|
|
||||||
|
public GHCheckRunsIterable(GitHub root, GitHubRequest request) {
|
||||||
|
this.root = root;
|
||||||
|
this.request = request;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public PagedIterator<GHCheckRun> _iterator(int pageSize) {
|
||||||
|
return new PagedIterator<>(
|
||||||
|
adapt(GitHubPageIterator.create(root.getClient(), GHCheckRunsPage.class, request, pageSize)),
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Iterator<GHCheckRun[]> adapt(final Iterator<GHCheckRunsPage> base) {
|
||||||
|
return new Iterator<GHCheckRun[]>() {
|
||||||
|
public boolean hasNext() {
|
||||||
|
return base.hasNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
public GHCheckRun[] next() {
|
||||||
|
GHCheckRunsPage v = base.next();
|
||||||
|
if (result == null) {
|
||||||
|
result = v;
|
||||||
|
}
|
||||||
|
return v.getCheckRuns(root);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/main/java/org/kohsuke/github/GHCheckRunsPage.java
Normal file
20
src/main/java/org/kohsuke/github/GHCheckRunsPage.java
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package org.kohsuke.github;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the one page of check-runs result when listing check-runs.
|
||||||
|
*/
|
||||||
|
class GHCheckRunsPage {
|
||||||
|
private int total_count;
|
||||||
|
private GHCheckRun[] check_runs;
|
||||||
|
|
||||||
|
public int getTotalCount() {
|
||||||
|
return total_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
GHCheckRun[] getCheckRuns(GitHub root) {
|
||||||
|
for (GHCheckRun check_run : check_runs) {
|
||||||
|
check_run.wrap(root);
|
||||||
|
}
|
||||||
|
return check_runs;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,6 +39,8 @@ public class GHCommit {
|
|||||||
|
|
||||||
private int comment_count;
|
private int comment_count;
|
||||||
|
|
||||||
|
private GHVerification verification;
|
||||||
|
|
||||||
static class Tree {
|
static class Tree {
|
||||||
String sha;
|
String sha;
|
||||||
}
|
}
|
||||||
@@ -100,6 +102,15 @@ public class GHCommit {
|
|||||||
public int getCommentCount() {
|
public int getCommentCount() {
|
||||||
return comment_count;
|
return comment_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets Verification Status.
|
||||||
|
*
|
||||||
|
* @return the Verification status
|
||||||
|
*/
|
||||||
|
public GHVerification getVerification() {
|
||||||
|
return verification;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -512,6 +523,19 @@ public class GHCommit {
|
|||||||
return owner.getLastCommitStatus(sha);
|
return owner.getLastCommitStatus(sha);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets check-runs for given sha.
|
||||||
|
*
|
||||||
|
* @return check runs for given sha.
|
||||||
|
* @throws IOException
|
||||||
|
* on error
|
||||||
|
*/
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public PagedIterable<GHCheckRun> getCheckRuns() throws IOException {
|
||||||
|
return owner.getCheckRuns(sha);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Some of the fields are not always filled in when this object is retrieved as a part of another API call.
|
* Some of the fields are not always filled in when this object is retrieved as a part of another API call.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -79,6 +79,18 @@ public class GHCreateRepositoryBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables projects
|
||||||
|
*
|
||||||
|
* @param enabled
|
||||||
|
* true if enabled
|
||||||
|
* @return a builder to continue with building
|
||||||
|
*/
|
||||||
|
public GHCreateRepositoryBuilder projects(boolean enabled) {
|
||||||
|
this.builder.with("has_projects", enabled);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enables wiki
|
* Enables wiki
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public enum GHEvent {
|
|||||||
PULL_REQUEST_REVIEW,
|
PULL_REQUEST_REVIEW,
|
||||||
PULL_REQUEST_REVIEW_COMMENT,
|
PULL_REQUEST_REVIEW_COMMENT,
|
||||||
PUSH,
|
PUSH,
|
||||||
|
REGISTRY_PACKAGE,
|
||||||
RELEASE,
|
RELEASE,
|
||||||
REPOSITORY_DISPATCH, // only valid for org hooks
|
REPOSITORY_DISPATCH, // only valid for org hooks
|
||||||
REPOSITORY,
|
REPOSITORY,
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ public abstract class GHEventPayload {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// List of events that still need to be added:
|
// List of events that still need to be added:
|
||||||
// CheckRunEvent CheckSuiteEvent ContentReferenceEvent
|
// ContentReferenceEvent
|
||||||
// DeployKeyEvent DownloadEvent FollowEvent ForkApplyEvent GitHubAppAuthorizationEvent GistEvent GollumEvent
|
// DeployKeyEvent DownloadEvent FollowEvent ForkApplyEvent GitHubAppAuthorizationEvent GistEvent GollumEvent
|
||||||
// InstallationEvent InstallationRepositoriesEvent IssuesEvent LabelEvent MarketplacePurchaseEvent MemberEvent
|
// InstallationEvent InstallationRepositoriesEvent IssuesEvent LabelEvent MarketplacePurchaseEvent MemberEvent
|
||||||
// MembershipEvent MetaEvent MilestoneEvent OrganizationEvent OrgBlockEvent PackageEvent PageBuildEvent
|
// MembershipEvent MetaEvent MilestoneEvent OrganizationEvent OrgBlockEvent PackageEvent PageBuildEvent
|
||||||
@@ -191,6 +191,20 @@ public abstract class GHEventPayload {
|
|||||||
repository.root = root;
|
repository.root = root;
|
||||||
return repository;
|
return repository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void wrapUp(GitHub root) {
|
||||||
|
super.wrapUp(root);
|
||||||
|
if (checkSuite == null)
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"Expected check_suite payload, but got something else. Maybe we've got another type of event?");
|
||||||
|
if (repository != null) {
|
||||||
|
repository.wrap(root);
|
||||||
|
checkSuite.wrap(repository);
|
||||||
|
} else {
|
||||||
|
checkSuite.wrap(root);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,56 @@
|
|||||||
package org.kohsuke.github;
|
package org.kohsuke.github;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JacksonInject;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import javax.annotation.CheckForNull;
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The type GHLabel.
|
* The type GHLabel.
|
||||||
*
|
*
|
||||||
* @author Kohsuke Kawaguchi
|
* @author Kohsuke Kawaguchi
|
||||||
|
* @see <a href="https://developer.github.com/v3/issues/labels/">Labels</a>
|
||||||
* @see GHIssue#getLabels() GHIssue#getLabels()
|
* @see GHIssue#getLabels() GHIssue#getLabels()
|
||||||
* @see GHRepository#listLabels() GHRepository#listLabels()
|
* @see GHRepository#listLabels() GHRepository#listLabels()
|
||||||
*/
|
*/
|
||||||
public class GHLabel {
|
public class GHLabel {
|
||||||
private String url, name, color, description;
|
|
||||||
private GHRepository repo;
|
@Nonnull
|
||||||
|
private String url, name, color;
|
||||||
|
|
||||||
|
@CheckForNull
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
private final GitHub root;
|
||||||
|
|
||||||
|
@JsonCreator
|
||||||
|
private GHLabel(@JacksonInject @Nonnull GitHub root) {
|
||||||
|
this.root = root;
|
||||||
|
url = "";
|
||||||
|
name = "";
|
||||||
|
color = "";
|
||||||
|
description = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
GitHub getApiRoot() {
|
||||||
|
return Objects.requireNonNull(root);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets url.
|
* Gets url.
|
||||||
*
|
*
|
||||||
* @return the url
|
* @return the url
|
||||||
*/
|
*/
|
||||||
|
@Nonnull
|
||||||
public String getUrl() {
|
public String getUrl() {
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
@@ -31,6 +60,7 @@ public class GHLabel {
|
|||||||
*
|
*
|
||||||
* @return the name
|
* @return the name
|
||||||
*/
|
*/
|
||||||
|
@Nonnull
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
@@ -40,6 +70,7 @@ public class GHLabel {
|
|||||||
*
|
*
|
||||||
* @return the color
|
* @return the color
|
||||||
*/
|
*/
|
||||||
|
@Nonnull
|
||||||
public String getColor() {
|
public String getColor() {
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
@@ -49,25 +80,11 @@ public class GHLabel {
|
|||||||
*
|
*
|
||||||
* @return the description
|
* @return the description
|
||||||
*/
|
*/
|
||||||
|
@CheckForNull
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
GHLabel wrapUp(GHRepository repo) {
|
|
||||||
this.repo = repo;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete.
|
|
||||||
*
|
|
||||||
* @throws IOException
|
|
||||||
* the io exception
|
|
||||||
*/
|
|
||||||
public void delete() throws IOException {
|
|
||||||
repo.root.createRequest().method("DELETE").setRawUrlPath(url).send();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets color.
|
* Sets color.
|
||||||
*
|
*
|
||||||
@@ -75,15 +92,11 @@ public class GHLabel {
|
|||||||
* 6-letter hex color code, like "f29513"
|
* 6-letter hex color code, like "f29513"
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* the io exception
|
* the io exception
|
||||||
|
* @deprecated use {@link #set()} or {@link #update()} instead
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void setColor(String newColor) throws IOException {
|
public void setColor(String newColor) throws IOException {
|
||||||
repo.root.createRequest()
|
set().color(newColor);
|
||||||
.method("PATCH")
|
|
||||||
.with("name", name)
|
|
||||||
.with("color", newColor)
|
|
||||||
.with("description", description)
|
|
||||||
.setRawUrlPath(url)
|
|
||||||
.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -93,25 +106,106 @@ public class GHLabel {
|
|||||||
* Description of label
|
* Description of label
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* the io exception
|
* the io exception
|
||||||
|
* @deprecated use {@link #set()} or {@link #update()} instead
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void setDescription(String newDescription) throws IOException {
|
public void setDescription(String newDescription) throws IOException {
|
||||||
repo.root.createRequest()
|
set().description(newDescription);
|
||||||
.method("PATCH")
|
|
||||||
.with("name", name)
|
|
||||||
.with("color", color)
|
|
||||||
.with("description", newDescription)
|
|
||||||
.setRawUrlPath(url)
|
|
||||||
.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Collection<String> toNames(Collection<GHLabel> labels) {
|
static Collection<String> toNames(Collection<GHLabel> labels) {
|
||||||
List<String> r = new ArrayList<String>();
|
List<String> r = new ArrayList<>();
|
||||||
for (GHLabel l : labels) {
|
for (GHLabel l : labels) {
|
||||||
r.add(l.getName());
|
r.add(l.getName());
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begins the creation of a new instance.
|
||||||
|
*
|
||||||
|
* Consumer must call {@link Creator#done()} to commit changes.
|
||||||
|
*
|
||||||
|
* @param repository
|
||||||
|
* the repository in which the label will be created.
|
||||||
|
* @return a {@link Creator}
|
||||||
|
* @throws IOException
|
||||||
|
* the io exception
|
||||||
|
*/
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
static Creator create(GHRepository repository) throws IOException {
|
||||||
|
return new Creator(repository);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a label from a repository.
|
||||||
|
*
|
||||||
|
* @param repository
|
||||||
|
* the repository to read from
|
||||||
|
* @param name
|
||||||
|
* the name of the label
|
||||||
|
* @return a label
|
||||||
|
* @throws IOException
|
||||||
|
* the io exception
|
||||||
|
*/
|
||||||
|
static GHLabel read(@Nonnull GHRepository repository, @Nonnull String name) throws IOException {
|
||||||
|
return repository.root.createRequest()
|
||||||
|
.withUrlPath(repository.getApiTailUrl("labels"), name)
|
||||||
|
.fetch(GHLabel.class);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads all labels from a repository.
|
||||||
|
*
|
||||||
|
* @param repository
|
||||||
|
* the repository to read from
|
||||||
|
* @return iterable of all labels
|
||||||
|
* @throws IOException
|
||||||
|
* the io exception
|
||||||
|
*/
|
||||||
|
static PagedIterable<GHLabel> readAll(@Nonnull final GHRepository repository) throws IOException {
|
||||||
|
return repository.root.createRequest()
|
||||||
|
.withUrlPath(repository.getApiTailUrl("labels"))
|
||||||
|
.toIterable(GHLabel[].class, null);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begins a batch update
|
||||||
|
*
|
||||||
|
* Consumer must call {@link Updater#done()} to commit changes.
|
||||||
|
*
|
||||||
|
* @return a {@link Updater}
|
||||||
|
*/
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public Updater update() {
|
||||||
|
return new Updater(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begins a single property update.
|
||||||
|
*
|
||||||
|
* @return a {@link Setter}
|
||||||
|
*/
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public Setter set() {
|
||||||
|
return new Setter(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete this label from the repository.
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
* the io exception
|
||||||
|
*/
|
||||||
|
public void delete() throws IOException {
|
||||||
|
root.createRequest().method("DELETE").setRawUrlPath(getUrl()).send();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final Object o) {
|
public boolean equals(final Object o) {
|
||||||
if (this == o)
|
if (this == o)
|
||||||
@@ -120,11 +214,54 @@ public class GHLabel {
|
|||||||
return false;
|
return false;
|
||||||
final GHLabel ghLabel = (GHLabel) o;
|
final GHLabel ghLabel = (GHLabel) o;
|
||||||
return Objects.equals(url, ghLabel.url) && Objects.equals(name, ghLabel.name)
|
return Objects.equals(url, ghLabel.url) && Objects.equals(name, ghLabel.name)
|
||||||
&& Objects.equals(color, ghLabel.color) && Objects.equals(repo, ghLabel.repo);
|
&& Objects.equals(color, ghLabel.color) && Objects.equals(description, ghLabel.description);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(url, name, color, repo);
|
return Objects.hash(url, name, color, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link GHLabelBuilder} that updates a single property per request
|
||||||
|
*
|
||||||
|
* {@link #done()} is called automatically after the property is set.
|
||||||
|
*/
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public static class Setter extends GHLabelBuilder<GHLabel> {
|
||||||
|
private Setter(@Nonnull GHLabel base) {
|
||||||
|
super(GHLabel.class, base.getApiRoot(), base);
|
||||||
|
requester.method("PATCH").setRawUrlPath(base.getUrl());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link GHLabelBuilder} that allows multiple properties to be updated per request.
|
||||||
|
*
|
||||||
|
* Consumer must call {@link #done()} to commit changes.
|
||||||
|
*/
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public static class Updater extends GHLabelBuilder<Updater> {
|
||||||
|
private Updater(@Nonnull GHLabel base) {
|
||||||
|
super(Updater.class, base.getApiRoot(), base);
|
||||||
|
requester.method("PATCH").setRawUrlPath(base.getUrl());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link GHLabelBuilder} that creates a new {@link GHLabel}
|
||||||
|
*
|
||||||
|
* Consumer must call {@link #done()} to create the new instance.
|
||||||
|
*/
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public static class Creator extends GHLabelBuilder<Creator> {
|
||||||
|
private Creator(@Nonnull GHRepository repository) {
|
||||||
|
super(Creator.class, repository.root, null);
|
||||||
|
requester.method("POST").withUrlPath(repository.getApiTailUrl("labels"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
60
src/main/java/org/kohsuke/github/GHLabelBuilder.java
Normal file
60
src/main/java/org/kohsuke/github/GHLabelBuilder.java
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
package org.kohsuke.github;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.annotation.CheckForNull;
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param <S>
|
||||||
|
* Intermediate return type for this builder returned by calls to {@link #with(String, Object)}. If {@link S}
|
||||||
|
* the same as {@link GHLabel}, this builder will commit changes after each call to
|
||||||
|
* {@link #with(String, Object)}.
|
||||||
|
*/
|
||||||
|
class GHLabelBuilder<S> extends AbstractBuilder<GHLabel, S> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param intermediateReturnType
|
||||||
|
* Intermediate return type for this builder returned by calls to {@link #with(String, Object)}. If
|
||||||
|
* {@link S} the same as {@link GHLabel}, this builder will commit changes after each call to
|
||||||
|
* {@link #with(String, Object)}.
|
||||||
|
* @param root
|
||||||
|
* the GitHub instance to which updates will be sent
|
||||||
|
* @param baseInstance
|
||||||
|
* instance on which to base this builder. If {@code null} a new instance will be created.
|
||||||
|
*/
|
||||||
|
protected GHLabelBuilder(@Nonnull Class<S> intermediateReturnType,
|
||||||
|
@Nonnull GitHub root,
|
||||||
|
@CheckForNull GHLabel baseInstance) {
|
||||||
|
super(GHLabel.class, intermediateReturnType, root, baseInstance);
|
||||||
|
|
||||||
|
if (baseInstance != null) {
|
||||||
|
requester.with("name", baseInstance.getName());
|
||||||
|
requester.with("color", baseInstance.getColor());
|
||||||
|
requester.with("description", baseInstance.getDescription());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public S name(String value) throws IOException {
|
||||||
|
return with("name", value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public S color(String value) throws IOException {
|
||||||
|
return with("color", value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public S description(String value) throws IOException {
|
||||||
|
return with("description", value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -128,6 +128,24 @@ public class GHOrganization extends GHPerson {
|
|||||||
.toIterable(GHTeam[].class, item -> item.wrapUp(this));
|
.toIterable(GHTeam[].class, item -> item.wrapUp(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a single team by ID.
|
||||||
|
*
|
||||||
|
* @param teamId
|
||||||
|
* id of the team that we want to query for
|
||||||
|
* @return the team
|
||||||
|
* @throws IOException
|
||||||
|
* the io exception
|
||||||
|
*
|
||||||
|
* @see <a href= "https://developer.github.com/v3/teams/#get-team-by-name">documentation</a>
|
||||||
|
*/
|
||||||
|
public GHTeam getTeam(int teamId) throws IOException {
|
||||||
|
return root.createRequest()
|
||||||
|
.withUrlPath(String.format("/organizations/%d/team/%d", id, teamId))
|
||||||
|
.fetch(GHTeam.class)
|
||||||
|
.wrapUp(this);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds a team that has the given name in its {@link GHTeam#getName()}
|
* Finds a team that has the given name in its {@link GHTeam#getName()}
|
||||||
*
|
*
|
||||||
@@ -147,19 +165,19 @@ public class GHOrganization extends GHPerson {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds a team that has the given slug in its {@link GHTeam#getSlug()}
|
* Finds a team that has the given slug in its {@link GHTeam#getSlug()}
|
||||||
*
|
*
|
||||||
* @param slug
|
* @param slug
|
||||||
* the slug
|
* the slug
|
||||||
* @return the team by slug
|
* @return the team by slug
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* the io exception
|
* the io exception
|
||||||
|
* @see <a href= "https://developer.github.com/v3/teams/#get-team-by-name">documentation</a>
|
||||||
*/
|
*/
|
||||||
public GHTeam getTeamBySlug(String slug) throws IOException {
|
public GHTeam getTeamBySlug(String slug) throws IOException {
|
||||||
for (GHTeam t : listTeams()) {
|
return root.createRequest()
|
||||||
if (t.getSlug().equals(slug))
|
.withUrlPath(String.format("/orgs/%s/teams/%s", login, slug))
|
||||||
return t;
|
.fetch(GHTeam.class)
|
||||||
}
|
.wrapUp(this);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
|||||||
private String body;
|
private String body;
|
||||||
private GHUser user;
|
private GHUser user;
|
||||||
private String path;
|
private String path;
|
||||||
|
private String html_url;
|
||||||
private int position = -1;
|
private int position = -1;
|
||||||
private int original_position = -1;
|
private int original_position = -1;
|
||||||
private long in_reply_to_id = -1L;
|
private long in_reply_to_id = -1L;
|
||||||
@@ -143,7 +144,7 @@ public class GHPullRequestReviewComment extends GHObject implements Reactable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public URL getHtmlUrl() {
|
public URL getHtmlUrl() {
|
||||||
return null;
|
return GitHubClient.parseURL(html_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ public class GHRepository extends GHObject {
|
|||||||
|
|
||||||
private String git_url, ssh_url, clone_url, svn_url, mirror_url;
|
private String git_url, ssh_url, clone_url, svn_url, mirror_url;
|
||||||
private GHUser owner; // not fully populated. beware.
|
private GHUser owner; // not fully populated. beware.
|
||||||
private boolean has_issues, has_wiki, fork, has_downloads, has_pages, archived;
|
private boolean has_issues, has_wiki, fork, has_downloads, has_pages, archived, has_projects;
|
||||||
|
|
||||||
private boolean allow_squash_merge;
|
private boolean allow_squash_merge;
|
||||||
private boolean allow_merge_commit;
|
private boolean allow_merge_commit;
|
||||||
@@ -547,6 +547,15 @@ public class GHRepository extends GHObject {
|
|||||||
return has_issues;
|
return has_issues;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Has projects boolean.
|
||||||
|
*
|
||||||
|
* @return the boolean
|
||||||
|
*/
|
||||||
|
public boolean hasProjects() {
|
||||||
|
return has_projects;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Has wiki boolean.
|
* Has wiki boolean.
|
||||||
*
|
*
|
||||||
@@ -988,6 +997,18 @@ public class GHRepository extends GHObject {
|
|||||||
edit("has_issues", String.valueOf(v));
|
edit("has_issues", String.valueOf(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables or disables projects for this repository.
|
||||||
|
*
|
||||||
|
* @param v
|
||||||
|
* the v
|
||||||
|
* @throws IOException
|
||||||
|
* the io exception
|
||||||
|
*/
|
||||||
|
public void enableProjects(boolean v) throws IOException {
|
||||||
|
edit("has_projects", String.valueOf(v));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enables or disables Wiki for this repository.
|
* Enables or disables Wiki for this repository.
|
||||||
*
|
*
|
||||||
@@ -1745,7 +1766,7 @@ public class GHRepository extends GHObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* /** Lists all the commit statues attached to the given commit, newer ones first.
|
* /** Lists all the commit statuses attached to the given commit, newer ones first.
|
||||||
*
|
*
|
||||||
* @param sha1
|
* @param sha1
|
||||||
* the sha 1
|
* the sha 1
|
||||||
@@ -1773,6 +1794,27 @@ public class GHRepository extends GHObject {
|
|||||||
return v.isEmpty() ? null : v.get(0);
|
return v.isEmpty() ? null : v.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets check runs for given ref.
|
||||||
|
*
|
||||||
|
* @param ref
|
||||||
|
* ref
|
||||||
|
* @return check runs for given ref
|
||||||
|
* @throws IOException
|
||||||
|
* the io exception
|
||||||
|
* @see <a href="https://developer.github.com/v3/checks/runs/#list-check-runs-for-a-specific-ref">List check runs
|
||||||
|
* for a specific ref</a>
|
||||||
|
*/
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public PagedIterable<GHCheckRun> getCheckRuns(String ref) throws IOException {
|
||||||
|
GitHubRequest request = root.createRequest()
|
||||||
|
.withUrlPath(String.format("/repos/%s/%s/commits/%s/check-runs", getOwnerName(), name, ref))
|
||||||
|
.withPreview(ANTIOPE)
|
||||||
|
.build();
|
||||||
|
return new GHCheckRunsIterable(root, request);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a commit status
|
* Creates a commit status
|
||||||
*
|
*
|
||||||
@@ -1828,6 +1870,21 @@ public class GHRepository extends GHObject {
|
|||||||
return createCommitStatus(sha1, state, targetUrl, description, null);
|
return createCommitStatus(sha1, state, targetUrl, description, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a check run for a commit.
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* an identifier for the run
|
||||||
|
* @param headSHA
|
||||||
|
* the commit hash
|
||||||
|
* @return a builder which you should customize, then call {@link GHCheckRunBuilder#create}
|
||||||
|
*/
|
||||||
|
@Preview
|
||||||
|
@Deprecated
|
||||||
|
public @NonNull GHCheckRunBuilder createCheckRun(@NonNull String name, @NonNull String headSHA) {
|
||||||
|
return new GHCheckRunBuilder(this, name, headSHA);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists repository events.
|
* Lists repository events.
|
||||||
*
|
*
|
||||||
@@ -1851,9 +1908,7 @@ public class GHRepository extends GHObject {
|
|||||||
* the io exception
|
* the io exception
|
||||||
*/
|
*/
|
||||||
public PagedIterable<GHLabel> listLabels() throws IOException {
|
public PagedIterable<GHLabel> listLabels() throws IOException {
|
||||||
return root.createRequest()
|
return GHLabel.readAll(this);
|
||||||
.withUrlPath(getApiTailUrl("labels"))
|
|
||||||
.toIterable(GHLabel[].class, item -> item.wrapUp(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1866,7 +1921,7 @@ public class GHRepository extends GHObject {
|
|||||||
* the io exception
|
* the io exception
|
||||||
*/
|
*/
|
||||||
public GHLabel getLabel(String name) throws IOException {
|
public GHLabel getLabel(String name) throws IOException {
|
||||||
return root.createRequest().withUrlPath(getApiTailUrl("labels/" + name)).fetch(GHLabel.class).wrapUp(this);
|
return GHLabel.read(this, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1881,7 +1936,7 @@ public class GHRepository extends GHObject {
|
|||||||
* the io exception
|
* the io exception
|
||||||
*/
|
*/
|
||||||
public GHLabel createLabel(String name, String color) throws IOException {
|
public GHLabel createLabel(String name, String color) throws IOException {
|
||||||
return createLabel(name, color, "");
|
return GHLabel.create(this).name(name).color(color).description("").done();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1898,14 +1953,7 @@ public class GHRepository extends GHObject {
|
|||||||
* the io exception
|
* the io exception
|
||||||
*/
|
*/
|
||||||
public GHLabel createLabel(String name, String color, String description) throws IOException {
|
public GHLabel createLabel(String name, String color, String description) throws IOException {
|
||||||
return root.createRequest()
|
return GHLabel.create(this).name(name).color(color).description(description).done();
|
||||||
.method("POST")
|
|
||||||
.with("name", name)
|
|
||||||
.with("color", color)
|
|
||||||
.with("description", description)
|
|
||||||
.withUrlPath(getApiTailUrl("labels"))
|
|
||||||
.fetch(GHLabel.class)
|
|
||||||
.wrapUp(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ public class GHTagObject {
|
|||||||
private String message;
|
private String message;
|
||||||
private GitUser tagger;
|
private GitUser tagger;
|
||||||
private GHRef.GHObject object;
|
private GHRef.GHObject object;
|
||||||
|
private GHVerification verification;
|
||||||
|
|
||||||
GHTagObject wrap(GHRepository owner) {
|
GHTagObject wrap(GHRepository owner) {
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
@@ -97,4 +98,13 @@ public class GHTagObject {
|
|||||||
public GHRef.GHObject getObject() {
|
public GHRef.GHObject getObject() {
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets Verification Status.
|
||||||
|
*
|
||||||
|
* @return the Verification status
|
||||||
|
*/
|
||||||
|
public GHVerification getVerification() {
|
||||||
|
return verification;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
82
src/main/java/org/kohsuke/github/GHVerification.java
Normal file
82
src/main/java/org/kohsuke/github/GHVerification.java
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
package org.kohsuke.github;
|
||||||
|
|
||||||
|
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The commit/tag can be signed by user. This object holds the verification status. Whether the Commit/Tag is signed or
|
||||||
|
* not.
|
||||||
|
*
|
||||||
|
* @see <a href="https://developer.github.com/v3/git/tags/#signature-verification-object">tags signature
|
||||||
|
* verificatiion</a>
|
||||||
|
* @see <a href="https://developer.github.com/v3/git/commits/#signature-verification-object">commits signature
|
||||||
|
* verificatiion</a>
|
||||||
|
*
|
||||||
|
* @author Sourabh Sarvotham Parkala
|
||||||
|
*/
|
||||||
|
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD" },
|
||||||
|
justification = "JSON API")
|
||||||
|
public class GHVerification {
|
||||||
|
private String signature, payload;
|
||||||
|
private boolean verified;
|
||||||
|
private Reason reason;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether GitHub considers the signature in this commit to be verified.
|
||||||
|
*
|
||||||
|
* @return true if the signature is valid else returns false.
|
||||||
|
*/
|
||||||
|
public boolean isVerified() {
|
||||||
|
return verified;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets reason for verification value.
|
||||||
|
*
|
||||||
|
* @return return reason of type {@link Reason}, such as "valid" or "unsigned". The possible values can be found in
|
||||||
|
* {@link Reason}}
|
||||||
|
*/
|
||||||
|
public Reason getReason() {
|
||||||
|
return reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets signature used for the verification.
|
||||||
|
*
|
||||||
|
* @return null if not signed else encoded signature.
|
||||||
|
*/
|
||||||
|
public String getSignature() {
|
||||||
|
return signature;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the payload that was signed.
|
||||||
|
*
|
||||||
|
* @return null if not signed else encoded signature.
|
||||||
|
*/
|
||||||
|
public String getPayload() {
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The possible values for reason in verification object from github.
|
||||||
|
*
|
||||||
|
* @see <a href="https://developer.github.com/v3/repos/commits/#signature-verification-object">List of possible
|
||||||
|
* reason values</a>
|
||||||
|
* @author Sourabh Sarvotham Parkala
|
||||||
|
*/
|
||||||
|
public enum Reason {
|
||||||
|
EXPIRED_KEY,
|
||||||
|
NOT_SIGNING_KEY,
|
||||||
|
GPGVERIFY_ERROR,
|
||||||
|
GPGVERIFY_UNAVAILABLE,
|
||||||
|
UNSIGNED,
|
||||||
|
UNKNOWN_SIGNATURE_TYPE,
|
||||||
|
NO_USER,
|
||||||
|
UNVERIFIED_EMAIL,
|
||||||
|
BAD_EMAIL,
|
||||||
|
UNKNOWN_KEY,
|
||||||
|
MALFORMED_SIGNATURE,
|
||||||
|
INVALID,
|
||||||
|
VALID
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -724,7 +724,11 @@ public class GitHub {
|
|||||||
* @return the team
|
* @return the team
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* the io exception
|
* the io exception
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link GHOrganization#getTeam(int)}
|
||||||
|
* @see <a href= "https://developer.github.com/v3/teams/#get-team-legacy">deprecation notice</a>
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public GHTeam getTeam(int id) throws IOException {
|
public GHTeam getTeam(int id) throws IOException {
|
||||||
return createRequest().withUrlPath("/teams/" + id).fetch(GHTeam.class).wrapUp(this);
|
return createRequest().withUrlPath("/teams/" + id).fetch(GHTeam.class).wrapUp(this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,13 +148,15 @@ abstract class GitHubClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensures that the credential is valid.
|
* Ensures that the credential for this client is valid.
|
||||||
*
|
*
|
||||||
* @return the boolean
|
* @return the boolean
|
||||||
*/
|
*/
|
||||||
public boolean isCredentialValid() {
|
public boolean isCredentialValid() {
|
||||||
try {
|
try {
|
||||||
fetch(GHUser.class, "/user");
|
// If 404, ratelimit returns a default value.
|
||||||
|
// This works as credential test because invalid credentials returns 401, not 404
|
||||||
|
getRateLimit();
|
||||||
return true;
|
return true;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
if (LOGGER.isLoggable(FINE))
|
if (LOGGER.isLoggable(FINE))
|
||||||
|
|||||||
@@ -12,9 +12,10 @@ import java.net.HttpURLConnection;
|
|||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import javax.annotation.CheckForNull;
|
import javax.annotation.CheckForNull;
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
@@ -206,6 +207,9 @@ class GitHubResponse<T> {
|
|||||||
*/
|
*/
|
||||||
static abstract class ResponseInfo {
|
static abstract class ResponseInfo {
|
||||||
|
|
||||||
|
private static final Comparator<String> nullableCaseInsensitiveComparator = Comparator
|
||||||
|
.nullsFirst(String.CASE_INSENSITIVE_ORDER);
|
||||||
|
|
||||||
private final int statusCode;
|
private final int statusCode;
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final GitHubRequest request;
|
private final GitHubRequest request;
|
||||||
@@ -217,7 +221,12 @@ class GitHubResponse<T> {
|
|||||||
@Nonnull Map<String, List<String>> headers) {
|
@Nonnull Map<String, List<String>> headers) {
|
||||||
this.request = request;
|
this.request = request;
|
||||||
this.statusCode = statusCode;
|
this.statusCode = statusCode;
|
||||||
this.headers = Collections.unmodifiableMap(new HashMap<>(headers));
|
|
||||||
|
// Response header field names must be case-insensitive.
|
||||||
|
TreeMap<String, List<String>> caseInsensitiveMap = new TreeMap<>(nullableCaseInsensitiveComparator);
|
||||||
|
caseInsensitiveMap.putAll(headers);
|
||||||
|
|
||||||
|
this.headers = Collections.unmodifiableMap(caseInsensitiveMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -8,6 +8,12 @@ package org.kohsuke.github;
|
|||||||
* @author Kohsuke Kawaguchi
|
* @author Kohsuke Kawaguchi
|
||||||
*/
|
*/
|
||||||
class Previews {
|
class Previews {
|
||||||
|
/**
|
||||||
|
* Check-runs and check-suites
|
||||||
|
*
|
||||||
|
* @see <a href="https://developer.github.com/v3/previews/#check-runs-and-check-suites-api">GitHub API Previews</a>
|
||||||
|
*/
|
||||||
|
static final String ANTIOPE = "application/vnd.github.antiope-preview+json";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commit Search
|
* Commit Search
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ public abstract class AbstractGitHubWireMockTest extends Assert {
|
|||||||
|
|
||||||
protected void verifyAuthenticated(GitHub instance) {
|
protected void verifyAuthenticated(GitHub instance) {
|
||||||
assertThat(
|
assertThat(
|
||||||
"GitHub connection believes it is anonymous. Make sure you set GITHUB_OAUTH or both GITHUB_USER and GITHUB_PASSWORD environment variables",
|
"GitHub connection believes it is anonymous. Make sure you set GITHUB_OAUTH or both GITHUB_LOGIN and GITHUB_PASSWORD environment variables",
|
||||||
instance.isAnonymous(),
|
instance.isAnonymous(),
|
||||||
Matchers.is(false));
|
Matchers.is(false));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import org.junit.Test;
|
|||||||
import org.kohsuke.github.GHCommit.File;
|
import org.kohsuke.github.GHCommit.File;
|
||||||
import org.kohsuke.github.GHOrganization.Permission;
|
import org.kohsuke.github.GHOrganization.Permission;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
@@ -39,13 +40,40 @@ public class AppTest extends AbstractGitHubWireMockTest {
|
|||||||
"a test repository",
|
"a test repository",
|
||||||
"http://github-api.kohsuke.org/",
|
"http://github-api.kohsuke.org/",
|
||||||
true);
|
true);
|
||||||
|
|
||||||
assertThat(r.hasIssues(), is(true));
|
assertThat(r.hasIssues(), is(true));
|
||||||
|
assertThat(r.hasWiki(), is(true));
|
||||||
|
assertThat(r.hasDownloads(), is(true));
|
||||||
|
assertThat(r.hasProjects(), is(true));
|
||||||
|
|
||||||
r.enableIssueTracker(false);
|
r.enableIssueTracker(false);
|
||||||
r.enableDownloads(false);
|
r.enableDownloads(false);
|
||||||
r.enableWiki(false);
|
r.enableWiki(false);
|
||||||
|
r.enableProjects(false);
|
||||||
|
|
||||||
r.renameTo(targetName);
|
r.renameTo(targetName);
|
||||||
getUser().getRepository(targetName).delete();
|
|
||||||
|
// local instance remains unchanged
|
||||||
|
assertThat(r.getName(), equalTo("github-api-test-rename"));
|
||||||
|
assertThat(r.hasIssues(), is(true));
|
||||||
|
assertThat(r.hasWiki(), is(true));
|
||||||
|
assertThat(r.hasDownloads(), is(true));
|
||||||
|
assertThat(r.hasProjects(), is(true));
|
||||||
|
|
||||||
|
r = gitHub.getMyself().getRepository(targetName);
|
||||||
|
|
||||||
|
// values are updated
|
||||||
|
assertThat(r.hasIssues(), is(false));
|
||||||
|
assertThat(r.hasWiki(), is(false));
|
||||||
|
assertThat(r.hasDownloads(), is(false));
|
||||||
|
assertThat(r.getName(), equalTo(targetName));
|
||||||
|
|
||||||
|
// ISSUE: #765
|
||||||
|
// From what I can tell this is a bug in GithHub.
|
||||||
|
// updating `has_projects` doesn't seem to do anything
|
||||||
|
assertThat(r.hasProjects(), is(true));
|
||||||
|
|
||||||
|
r.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -57,14 +85,12 @@ public class AppTest extends AbstractGitHubWireMockTest {
|
|||||||
.homepage("http://github-api.kohsuke.org/")
|
.homepage("http://github-api.kohsuke.org/")
|
||||||
.autoInit(true)
|
.autoInit(true)
|
||||||
.create();
|
.create();
|
||||||
r.enableIssueTracker(false);
|
|
||||||
r.enableDownloads(false);
|
|
||||||
r.enableWiki(false);
|
|
||||||
if (mockGitHub.isUseProxy()) {
|
if (mockGitHub.isUseProxy()) {
|
||||||
Thread.sleep(3000);
|
Thread.sleep(3000);
|
||||||
}
|
}
|
||||||
assertNotNull(r.getReadme());
|
assertNotNull(r.getReadme());
|
||||||
getUser().getRepository(name).delete();
|
|
||||||
|
r.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cleanupUserRepository(final String name) throws IOException {
|
private void cleanupUserRepository(final String name) throws IOException {
|
||||||
@@ -76,8 +102,34 @@ public class AppTest extends AbstractGitHubWireMockTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testCredentialValid() throws IOException {
|
public void testCredentialValid() throws IOException {
|
||||||
assertTrue(gitHub.isCredentialValid());
|
assertTrue(gitHub.isCredentialValid());
|
||||||
GitHub connect = GitHub.connect("totally", "bogus");
|
assertThat(gitHub.lastRateLimit().getCore(), not(instanceOf(GHRateLimit.UnknownLimitRecord.class)));
|
||||||
assertFalse(connect.isCredentialValid());
|
assertThat(gitHub.lastRateLimit().getCore().getLimit(), equalTo(5000));
|
||||||
|
|
||||||
|
gitHub = getGitHubBuilder().withOAuthToken("bogus", "user")
|
||||||
|
.withEndpoint(mockGitHub.apiServer().baseUrl())
|
||||||
|
.build();
|
||||||
|
assertThat(gitHub.lastRateLimit(), nullValue());
|
||||||
|
assertFalse(gitHub.isCredentialValid());
|
||||||
|
// For invalid credentials, we get a 401 but it includes anonymous rate limit headers
|
||||||
|
assertThat(gitHub.lastRateLimit().getCore(), not(instanceOf(GHRateLimit.UnknownLimitRecord.class)));
|
||||||
|
assertThat(gitHub.lastRateLimit().getCore().getLimit(), equalTo(60));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCredentialValidEnterprise() throws IOException {
|
||||||
|
// Simulated GHE: getRateLimit returns 404
|
||||||
|
assertThat(gitHub.lastRateLimit(), nullValue());
|
||||||
|
assertTrue(gitHub.isCredentialValid());
|
||||||
|
// lastRateLimit stays null when 404 is encountered
|
||||||
|
assertThat(gitHub.lastRateLimit(), nullValue());
|
||||||
|
|
||||||
|
gitHub = getGitHubBuilder().withOAuthToken("bogus", "user")
|
||||||
|
.withEndpoint(mockGitHub.apiServer().baseUrl())
|
||||||
|
.build();
|
||||||
|
assertThat(gitHub.lastRateLimit(), nullValue());
|
||||||
|
assertFalse(gitHub.isCredentialValid());
|
||||||
|
// Simulated GHE: For invalid credentials, we get a 401 that does not include ratelimit info
|
||||||
|
assertThat(gitHub.lastRateLimit(), nullValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -234,16 +286,28 @@ public class AppTest extends AbstractGitHubWireMockTest {
|
|||||||
return team.hasMember(gitHub.getMyself());
|
return team.hasMember(gitHub.getMyself());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("Needs mocking check")
|
|
||||||
@Test
|
@Test
|
||||||
public void testShouldFetchTeam() throws Exception {
|
public void testShouldFetchTeam() throws Exception {
|
||||||
GHOrganization j = gitHub.getOrganization(GITHUB_API_TEST_ORG);
|
GHOrganization organization = gitHub.getOrganization(GITHUB_API_TEST_ORG);
|
||||||
GHTeam teamByName = j.getTeams().get("Core Developers");
|
GHTeam teamByName = organization.getTeams().get("Core Developers");
|
||||||
|
|
||||||
GHTeam teamById = gitHub.getTeam(teamByName.getId());
|
GHTeam teamById = gitHub.getTeam(teamByName.getId());
|
||||||
assertNotNull(teamById);
|
assertNotNull(teamById);
|
||||||
|
|
||||||
assertEquals(teamByName, teamById);
|
assertEquals(teamByName.getId(), teamById.getId());
|
||||||
|
assertEquals(teamByName.getDescription(), teamById.getDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testShouldFetchTeamFromOrganization() throws Exception {
|
||||||
|
GHOrganization organization = gitHub.getOrganization(GITHUB_API_TEST_ORG);
|
||||||
|
GHTeam teamByName = organization.getTeams().get("Core Developers");
|
||||||
|
|
||||||
|
GHTeam teamById = organization.getTeam(teamByName.getId());
|
||||||
|
assertNotNull(teamById);
|
||||||
|
|
||||||
|
assertEquals(teamByName.getId(), teamById.getId());
|
||||||
|
assertEquals(teamByName.getDescription(), teamById.getDescription());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("Needs mocking check")
|
@Ignore("Needs mocking check")
|
||||||
@@ -584,6 +648,8 @@ public class AppTest extends AbstractGitHubWireMockTest {
|
|||||||
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f23");
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f23");
|
||||||
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Kohsuke Kawaguchi");
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Kohsuke Kawaguchi");
|
||||||
assertEquals(commit.getCommitShortInfo().getMessage(), "doc");
|
assertEquals(commit.getCommitShortInfo().getMessage(), "doc");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.UNSIGNED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("Needs mocking check")
|
@Ignore("Needs mocking check")
|
||||||
@@ -781,7 +847,7 @@ public class AppTest extends AbstractGitHubWireMockTest {
|
|||||||
GHRepository r = gitHub.getRepository("github-api-test-org/test-labels");
|
GHRepository r = gitHub.getRepository("github-api-test-org/test-labels");
|
||||||
List<GHLabel> lst = r.listLabels().toList();
|
List<GHLabel> lst = r.listLabels().toList();
|
||||||
for (GHLabel l : lst) {
|
for (GHLabel l : lst) {
|
||||||
// System.out.println(l.getName());
|
assertThat(l.getUrl(), containsString(l.getName().replace(" ", "%20")));
|
||||||
}
|
}
|
||||||
assertTrue(lst.size() > 5);
|
assertTrue(lst.size() > 5);
|
||||||
GHLabel e = r.getLabel("enhancement");
|
GHLabel e = r.getLabel("enhancement");
|
||||||
@@ -791,9 +857,13 @@ public class AppTest extends AbstractGitHubWireMockTest {
|
|||||||
|
|
||||||
GHLabel t = null;
|
GHLabel t = null;
|
||||||
GHLabel t2 = null;
|
GHLabel t2 = null;
|
||||||
|
GHLabel t3 = null;
|
||||||
try {// CRUD
|
try {// CRUD
|
||||||
t = r.createLabel("test", "123456");
|
t = r.createLabel("test", "123456");
|
||||||
t2 = r.getLabel("test");
|
t2 = r.getLabel("test");
|
||||||
|
assertThat(t, not(sameInstance(t2)));
|
||||||
|
assertThat(t, equalTo(t2));
|
||||||
|
|
||||||
assertEquals(t.getName(), t2.getName());
|
assertEquals(t.getName(), t2.getName());
|
||||||
assertEquals(t.getColor(), "123456");
|
assertEquals(t.getColor(), "123456");
|
||||||
assertEquals(t.getColor(), t2.getColor());
|
assertEquals(t.getColor(), t2.getColor());
|
||||||
@@ -801,28 +871,69 @@ public class AppTest extends AbstractGitHubWireMockTest {
|
|||||||
assertEquals(t.getDescription(), t2.getDescription());
|
assertEquals(t.getDescription(), t2.getDescription());
|
||||||
assertEquals(t.getUrl(), t2.getUrl());
|
assertEquals(t.getUrl(), t2.getUrl());
|
||||||
|
|
||||||
t.setColor("000000");
|
// update works on multiple changes in one call
|
||||||
|
t3 = t.update().color("000000").description("It is dark!").done();
|
||||||
|
|
||||||
|
// instances behave as immutable by default. Update returns a new updated instance.
|
||||||
|
assertThat(t, not(sameInstance(t2)));
|
||||||
|
assertThat(t, equalTo(t2));
|
||||||
|
|
||||||
|
assertThat(t, not(sameInstance(t3)));
|
||||||
|
assertThat(t, not(equalTo(t3)));
|
||||||
|
|
||||||
// This is annoying behavior, but it is by design at this time.
|
|
||||||
// Verifying so we can know when it is fixed.
|
|
||||||
assertEquals(t.getColor(), "123456");
|
assertEquals(t.getColor(), "123456");
|
||||||
|
assertEquals(t.getDescription(), "");
|
||||||
|
assertEquals(t3.getColor(), "000000");
|
||||||
|
assertEquals(t3.getDescription(), "It is dark!");
|
||||||
|
|
||||||
|
// Test deprecated methods
|
||||||
|
t.setDescription("Deprecated");
|
||||||
t = r.getLabel("test");
|
t = r.getLabel("test");
|
||||||
t.setDescription("this is also a test");
|
|
||||||
|
|
||||||
GHLabel t3 = r.getLabel("test");
|
// By using the old instance t when calling setDescription it also sets color to the old value
|
||||||
|
// this is a bad behavior, but it is expected
|
||||||
|
assertEquals(t.getColor(), "123456");
|
||||||
|
assertEquals(t.getDescription(), "Deprecated");
|
||||||
|
|
||||||
|
t.setColor("000000");
|
||||||
|
t = r.getLabel("test");
|
||||||
|
assertEquals(t.getColor(), "000000");
|
||||||
|
assertEquals(t.getDescription(), "Deprecated");
|
||||||
|
|
||||||
|
// set() makes a single change
|
||||||
|
t3 = t.set().description("this is also a test");
|
||||||
|
|
||||||
|
// instances behave as immutable by default. Update returns a new updated instance.
|
||||||
|
assertThat(t, not(sameInstance(t3)));
|
||||||
|
assertThat(t, not(equalTo(t3)));
|
||||||
|
|
||||||
assertEquals(t3.getColor(), "000000");
|
assertEquals(t3.getColor(), "000000");
|
||||||
assertEquals(t3.getDescription(), "this is also a test");
|
assertEquals(t3.getDescription(), "this is also a test");
|
||||||
|
|
||||||
t.delete();
|
t.delete();
|
||||||
|
try {
|
||||||
|
t = r.getLabel("test");
|
||||||
|
fail("Test label should be deleted.");
|
||||||
|
} catch (IOException ex) {
|
||||||
|
assertThat(ex, instanceOf(FileNotFoundException.class));
|
||||||
|
}
|
||||||
|
|
||||||
t = r.createLabel("test2", "123457", "this is a different test");
|
t = r.createLabel("test2", "123457", "this is a different test");
|
||||||
t2 = r.getLabel("test2");
|
t2 = r.getLabel("test2");
|
||||||
|
|
||||||
assertEquals(t.getName(), t2.getName());
|
assertEquals(t.getName(), t2.getName());
|
||||||
assertEquals(t.getColor(), "123457");
|
assertEquals(t.getColor(), "123457");
|
||||||
assertEquals(t.getColor(), t2.getColor());
|
assertEquals(t.getColor(), t2.getColor());
|
||||||
assertEquals(t.getDescription(), "this is a different test");
|
assertEquals(t.getDescription(), "this is a different test");
|
||||||
assertEquals(t.getDescription(), t2.getDescription());
|
assertEquals(t.getDescription(), t2.getDescription());
|
||||||
assertEquals(t.getUrl(), t2.getUrl());
|
assertEquals(t.getUrl(), t2.getUrl());
|
||||||
|
t.delete();
|
||||||
|
|
||||||
|
// Allow null description
|
||||||
|
t = GHLabel.create(r).name("test2").color("123458").done();
|
||||||
|
assertThat(t.getName(), equalTo("test2"));
|
||||||
|
assertThat(t.getDescription(), is(nullValue()));
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
cleanupLabel("test");
|
cleanupLabel("test");
|
||||||
cleanupLabel("test2");
|
cleanupLabel("test2");
|
||||||
@@ -832,7 +943,7 @@ public class AppTest extends AbstractGitHubWireMockTest {
|
|||||||
void cleanupLabel(String name) {
|
void cleanupLabel(String name) {
|
||||||
if (mockGitHub.isUseProxy()) {
|
if (mockGitHub.isUseProxy()) {
|
||||||
try {
|
try {
|
||||||
GHLabel t = getGitHubBeforeAfter().getRepository("github-api-test-org/test-labels").getLabel("test");
|
GHLabel t = getGitHubBeforeAfter().getRepository("github-api-test-org/test-labels").getLabel(name);
|
||||||
t.delete();
|
t.delete();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|
||||||
|
|||||||
@@ -24,4 +24,21 @@ public class CommitTest extends AbstractGitHubWireMockTest {
|
|||||||
assertEquals(expected.getFiles().size(), commit.getFiles().size());
|
assertEquals(expected.getFiles().size(), commit.getFiles().size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test // issue 737
|
||||||
|
public void commitSignatureVerification() throws Exception {
|
||||||
|
GHRepository repo = gitHub.getRepository("stapler/stapler");
|
||||||
|
PagedIterable<GHCommit> commits = repo.queryCommits().path("pom.xml").list();
|
||||||
|
for (GHCommit commit : Iterables.limit(commits, 10)) {
|
||||||
|
GHCommit expected = repo.getCommit(commit.getSHA1());
|
||||||
|
assertEquals(expected.getCommitShortInfo().getVerification().isVerified(),
|
||||||
|
commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(expected.getCommitShortInfo().getVerification().getReason(),
|
||||||
|
commit.getCommitShortInfo().getVerification().getReason());
|
||||||
|
assertEquals(expected.getCommitShortInfo().getVerification().getSignature(),
|
||||||
|
commit.getCommitShortInfo().getVerification().getSignature());
|
||||||
|
assertEquals(expected.getCommitShortInfo().getVerification().getPayload(),
|
||||||
|
commit.getCommitShortInfo().getVerification().getPayload());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
117
src/test/java/org/kohsuke/github/GHCheckRunBuilderTest.java
Normal file
117
src/test/java/org/kohsuke/github/GHCheckRunBuilderTest.java
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* The MIT License
|
||||||
|
*
|
||||||
|
* Copyright 2020 CloudBees, Inc.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.kohsuke.github;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.containsString;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // preview
|
||||||
|
public class GHCheckRunBuilderTest extends AbstractGitHubWireMockTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void createCheckRun() throws Exception {
|
||||||
|
GHCheckRun checkRun = gitHub.getRepository("jglick/github-api-test")
|
||||||
|
.createCheckRun("foo", "4a929d464a2fae7ee899ce603250f7dab304bc4b")
|
||||||
|
.withStatus(GHCheckRun.Status.COMPLETED)
|
||||||
|
.withConclusion(GHCheckRun.Conclusion.SUCCESS)
|
||||||
|
.withDetailsURL("http://nowhere.net/stuff")
|
||||||
|
.withExternalID("whatever")
|
||||||
|
.withStartedAt(new Date(999_999_000))
|
||||||
|
.withCompletedAt(new Date(999_999_999))
|
||||||
|
.add(new GHCheckRunBuilder.Output("Some Title", "what happened…")
|
||||||
|
.add(new GHCheckRunBuilder.Annotation("stuff.txt",
|
||||||
|
1,
|
||||||
|
GHCheckRun.AnnotationLevel.NOTICE,
|
||||||
|
"hello to you too").withTitle("Look here"))
|
||||||
|
.add(new GHCheckRunBuilder.Image("Unikitty",
|
||||||
|
"https://i.pinimg.com/474x/9e/65/c0/9e65c0972294f1e10f648c9780a79fab.jpg")
|
||||||
|
.withCaption("Princess Unikitty")))
|
||||||
|
.add(new GHCheckRunBuilder.Action("Help", "what I need help with", "doit"))
|
||||||
|
.create();
|
||||||
|
assertEquals("completed", checkRun.getStatus());
|
||||||
|
assertEquals(1, checkRun.getOutput().getAnnotationsCount());
|
||||||
|
assertEquals(546384586, checkRun.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void createCheckRunManyAnnotations() throws Exception {
|
||||||
|
GHCheckRunBuilder.Output output = new GHCheckRunBuilder.Output("Big Run", "Lots of stuff here »");
|
||||||
|
for (int i = 0; i < 101; i++) {
|
||||||
|
output.add(
|
||||||
|
new GHCheckRunBuilder.Annotation("stuff.txt", 1, GHCheckRun.AnnotationLevel.NOTICE, "hello #" + i));
|
||||||
|
}
|
||||||
|
GHCheckRun checkRun = gitHub.getRepository("jglick/github-api-test")
|
||||||
|
.createCheckRun("big", "4a929d464a2fae7ee899ce603250f7dab304bc4b")
|
||||||
|
.withConclusion(GHCheckRun.Conclusion.SUCCESS)
|
||||||
|
.add(output)
|
||||||
|
.create();
|
||||||
|
assertEquals("completed", checkRun.getStatus());
|
||||||
|
assertEquals("Big Run", checkRun.getOutput().getTitle());
|
||||||
|
assertEquals("Lots of stuff here »", checkRun.getOutput().getSummary());
|
||||||
|
assertEquals(101, checkRun.getOutput().getAnnotationsCount());
|
||||||
|
assertEquals(546384622, checkRun.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void createCheckRunNoAnnotations() throws Exception {
|
||||||
|
GHCheckRun checkRun = gitHub.getRepository("jglick/github-api-test")
|
||||||
|
.createCheckRun("quick", "4a929d464a2fae7ee899ce603250f7dab304bc4b")
|
||||||
|
.withConclusion(GHCheckRun.Conclusion.NEUTRAL)
|
||||||
|
.add(new GHCheckRunBuilder.Output("Quick note", "nothing more to see here"))
|
||||||
|
.create();
|
||||||
|
assertEquals("completed", checkRun.getStatus());
|
||||||
|
assertEquals(0, checkRun.getOutput().getAnnotationsCount());
|
||||||
|
assertEquals(546384705, checkRun.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void createPendingCheckRun() throws Exception {
|
||||||
|
GHCheckRun checkRun = gitHub.getRepository("jglick/github-api-test")
|
||||||
|
.createCheckRun("outstanding", "4a929d464a2fae7ee899ce603250f7dab304bc4b")
|
||||||
|
.withStatus(GHCheckRun.Status.IN_PROGRESS)
|
||||||
|
.create();
|
||||||
|
assertEquals("in_progress", checkRun.getStatus());
|
||||||
|
assertNull(checkRun.getConclusion());
|
||||||
|
assertEquals(546469053, checkRun.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void createCheckRunErrMissingConclusion() throws Exception {
|
||||||
|
try {
|
||||||
|
gitHub.getRepository("jglick/github-api-test")
|
||||||
|
.createCheckRun("outstanding", "4a929d464a2fae7ee899ce603250f7dab304bc4b")
|
||||||
|
.withStatus(GHCheckRun.Status.COMPLETED)
|
||||||
|
.create();
|
||||||
|
fail("should have been rejected");
|
||||||
|
} catch (HttpException x) {
|
||||||
|
assertEquals(422, x.getResponseCode());
|
||||||
|
assertThat(x.getMessage(), containsString("\\\"conclusion\\\" wasn't supplied"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import org.junit.Before;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -119,6 +120,11 @@ public class GHPullRequestTest extends AbstractGitHubWireMockTest {
|
|||||||
GHPullRequestReviewComment comment = comments.get(0);
|
GHPullRequestReviewComment comment = comments.get(0);
|
||||||
assertEquals("Sample review comment", comment.getBody());
|
assertEquals("Sample review comment", comment.getBody());
|
||||||
|
|
||||||
|
// Assert htmlUrl is not null
|
||||||
|
assertNotNull(comment.getHtmlUrl());
|
||||||
|
assertEquals(new URL("https://github.com/github-api-test-org/github-api/pull/266#discussion_r321995146"),
|
||||||
|
comment.getHtmlUrl());
|
||||||
|
|
||||||
comment.update("Updated review comment");
|
comment.update("Updated review comment");
|
||||||
comments = p.listReviewComments().toList();
|
comments = p.listReviewComments().toList();
|
||||||
assertEquals(1, comments.size());
|
assertEquals(1, comments.size());
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import java.io.IOException;
|
|||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.*;
|
import static org.hamcrest.Matchers.*;
|
||||||
import static org.hamcrest.core.IsInstanceOf.instanceOf;
|
import static org.hamcrest.core.IsInstanceOf.instanceOf;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -74,7 +74,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
GHRateLimit headerRateLimit = rateLimit;
|
GHRateLimit headerRateLimit = rateLimit;
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// ratelimit() uses headerRateLimit if available and headerRateLimit is not expired
|
// ratelimit() uses headerRateLimit if available and headerRateLimit is not expired
|
||||||
assertThat(gitHub.rateLimit(), equalTo(headerRateLimit));
|
assertThat(gitHub.rateLimit(), equalTo(headerRateLimit));
|
||||||
@@ -82,7 +82,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
assertThat(mockGitHub.getRequestCount(), equalTo(1));
|
assertThat(mockGitHub.getRequestCount(), equalTo(1));
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// Always requests new info
|
// Always requests new info
|
||||||
rateLimit = gitHub.getRateLimit();
|
rateLimit = gitHub.getRateLimit();
|
||||||
@@ -96,7 +96,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
previousLimit = rateLimit;
|
previousLimit = rateLimit;
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// Always requests new info
|
// Always requests new info
|
||||||
rateLimit = gitHub.getRateLimit();
|
rateLimit = gitHub.getRateLimit();
|
||||||
@@ -163,16 +163,20 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void verifyRateLimitValues(GHRateLimit previousLimit, int remaining, boolean changedResetDate) {
|
private void verifyRateLimitValues(GHRateLimit previousLimit, int remaining, boolean changedResetDate) {
|
||||||
// newer or unchange
|
|
||||||
int resetComparisionValue = changedResetDate ? 1 : 0;
|
|
||||||
|
|
||||||
// Basic checks of values
|
// Basic checks of values
|
||||||
assertThat(rateLimit, notNullValue());
|
assertThat(rateLimit, notNullValue());
|
||||||
assertThat(rateLimit.getLimit(), equalTo(previousLimit.getLimit()));
|
assertThat(rateLimit.getLimit(), equalTo(previousLimit.getLimit()));
|
||||||
assertThat(rateLimit.getRemaining(), equalTo(remaining));
|
assertThat(rateLimit.getRemaining(), equalTo(remaining));
|
||||||
|
|
||||||
// Check that the reset date of the current limit is not older than the previous one
|
// Check that the reset date of the current limit is not older than the previous one
|
||||||
assertThat(rateLimit.getResetDate().compareTo(previousLimit.getResetDate()), equalTo(resetComparisionValue));
|
long diffMillis = rateLimit.getResetDate().getTime() - previousLimit.getResetDate().getTime();
|
||||||
|
|
||||||
|
assertThat(diffMillis, greaterThanOrEqualTo(0L));
|
||||||
|
if (changedResetDate) {
|
||||||
|
assertThat(diffMillis, greaterThan(1000L));
|
||||||
|
} else {
|
||||||
|
assertThat(diffMillis, lessThanOrEqualTo(1000L));
|
||||||
|
}
|
||||||
|
|
||||||
// Additional checks for record values
|
// Additional checks for record values
|
||||||
assertThat(rateLimit.getCore().getLimit(), equalTo(rateLimit.getLimit()));
|
assertThat(rateLimit.getCore().getLimit(), equalTo(rateLimit.getLimit()));
|
||||||
@@ -196,7 +200,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
Date lastReset = new Date(System.currentTimeMillis() / 1000L);
|
Date lastReset = new Date(System.currentTimeMillis() / 1000L);
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
// Before any queries, rate limit starts as null but may be requested
|
// Before any queries, rate limit starts as null but may be requested
|
||||||
@@ -220,7 +224,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
assertThat(mockGitHub.getRequestCount(), equalTo(1));
|
assertThat(mockGitHub.getRequestCount(), equalTo(1));
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
// First call to /user gets response without rate limit information
|
// First call to /user gets response without rate limit information
|
||||||
@@ -240,7 +244,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
assertThat(mockGitHub.getRequestCount(), equalTo(3));
|
assertThat(mockGitHub.getRequestCount(), equalTo(3));
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// Always requests new info
|
// Always requests new info
|
||||||
rateLimit = gitHub.getRateLimit();
|
rateLimit = gitHub.getRateLimit();
|
||||||
@@ -252,13 +256,13 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
assertThat(rateLimit.getResetDate().compareTo(lastReset), equalTo(1));
|
assertThat(rateLimit.getResetDate().compareTo(lastReset), equalTo(1));
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// last is still null, because it actually means lastHeaderRateLimit
|
// last is still null, because it actually means lastHeaderRateLimit
|
||||||
assertThat(gitHub.lastRateLimit(), CoreMatchers.nullValue());
|
assertThat(gitHub.lastRateLimit(), CoreMatchers.nullValue());
|
||||||
|
|
||||||
// ratelimit() tries not to make additional requests, uses queried rate limit since header not available
|
// ratelimit() tries not to make additional requests, uses queried rate limit since header not available
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
assertThat(gitHub.rateLimit(), sameInstance(rateLimit));
|
assertThat(gitHub.rateLimit(), sameInstance(rateLimit));
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
@@ -279,7 +283,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
GHRateLimit headerRateLimit = rateLimit;
|
GHRateLimit headerRateLimit = rateLimit;
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// ratelimit() uses headerRateLimit if available and headerRateLimit is not expired
|
// ratelimit() uses headerRateLimit if available and headerRateLimit is not expired
|
||||||
assertThat(gitHub.rateLimit(), sameInstance(headerRateLimit));
|
assertThat(gitHub.rateLimit(), sameInstance(headerRateLimit));
|
||||||
@@ -287,7 +291,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
assertThat(mockGitHub.getRequestCount(), equalTo(5));
|
assertThat(mockGitHub.getRequestCount(), equalTo(5));
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// Always requests new info
|
// Always requests new info
|
||||||
rateLimit = gitHub.getRateLimit();
|
rateLimit = gitHub.getRateLimit();
|
||||||
@@ -304,7 +308,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
assertThat(mockGitHub.getRequestCount(), equalTo(6));
|
assertThat(mockGitHub.getRequestCount(), equalTo(6));
|
||||||
|
|
||||||
// Wait for the header
|
// Wait for the header
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -357,7 +361,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
GHRateLimit headerRateLimit = null;
|
GHRateLimit headerRateLimit = null;
|
||||||
|
|
||||||
// Give this a moment
|
// Give this a moment
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
// /user gets response with rate limit information
|
// /user gets response with rate limit information
|
||||||
@@ -376,7 +380,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
sameInstance(headerRateLimit));
|
sameInstance(headerRateLimit));
|
||||||
|
|
||||||
// Nothing changes still valid
|
// Nothing changes still valid
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1500);
|
||||||
|
|
||||||
assertThat("rateLimit() selects header instance when not expired, does not ask server",
|
assertThat("rateLimit() selects header instance when not expired, does not ask server",
|
||||||
gitHub.rateLimit(),
|
gitHub.rateLimit(),
|
||||||
@@ -388,7 +392,7 @@ public class GHRateLimitTest extends AbstractGitHubWireMockTest {
|
|||||||
assertThat(mockGitHub.getRequestCount(), equalTo(1));
|
assertThat(mockGitHub.getRequestCount(), equalTo(1));
|
||||||
|
|
||||||
// This time, rateLimit() should find an expired record and get a new one.
|
// This time, rateLimit() should find an expired record and get a new one.
|
||||||
Thread.sleep(3000);
|
Thread.sleep(2500);
|
||||||
|
|
||||||
assertThat("Header instance has expired", gitHub.lastRateLimit().isExpired(), is(true));
|
assertThat("Header instance has expired", gitHub.lastRateLimit().isExpired(), is(true));
|
||||||
|
|
||||||
|
|||||||
@@ -496,4 +496,31 @@ public class GHRepositoryTest extends AbstractGitHubWireMockTest {
|
|||||||
List<GHUser> collaborators = repo.listCollaborators().toList();
|
List<GHUser> collaborators = repo.listCollaborators().toList();
|
||||||
assertThat(collaborators.size(), greaterThan(10));
|
assertThat(collaborators.size(), greaterThan(10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getCheckRuns() throws Exception {
|
||||||
|
final int expectedCount = 8;
|
||||||
|
// Use github-api repository as it has checks set up
|
||||||
|
PagedIterable<GHCheckRun> checkRuns = gitHub.getOrganization("github-api")
|
||||||
|
.getRepository("github-api")
|
||||||
|
.getCheckRuns("78b9ff49d47daaa158eb373c4e2e040f739df8b9");
|
||||||
|
// Check if the paging works correctly
|
||||||
|
assertThat(checkRuns.withPageSize(2).iterator().nextPage(), hasSize(2));
|
||||||
|
|
||||||
|
// Check if the checkruns are all succeeded and if we got all of them
|
||||||
|
int checkRunsCount = 0;
|
||||||
|
for (GHCheckRun checkRun : checkRuns) {
|
||||||
|
assertThat(checkRun.getConclusion(), equalTo("success"));
|
||||||
|
checkRunsCount++;
|
||||||
|
}
|
||||||
|
assertThat(checkRunsCount, equalTo(expectedCount));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLastCommitStatus() throws Exception {
|
||||||
|
GHCommitStatus status = getRepository().getLastCommitStatus("8051615eff597f4e49f4f47625e6fc2b49f26bfc");
|
||||||
|
assertThat(status.getId(), equalTo(9027542286L));
|
||||||
|
assertThat(status.getState(), equalTo(GHCommitState.SUCCESS));
|
||||||
|
assertThat(status.getContext(), equalTo("ci/circleci: build"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ public class GHTagTest extends AbstractGitHubWireMockTest {
|
|||||||
assertEquals(tagName, tag.getTag());
|
assertEquals(tagName, tag.getTag());
|
||||||
assertEquals(tagMessage, tag.getMessage());
|
assertEquals(tagMessage, tag.getMessage());
|
||||||
assertEquals(commitSha, tag.getObject().getSha());
|
assertEquals(commitSha, tag.getObject().getSha());
|
||||||
|
assertFalse(tag.getVerification().isVerified());
|
||||||
|
assertEquals(tag.getVerification().getReason(), GHVerification.Reason.UNSIGNED);
|
||||||
|
|
||||||
// Make a reference to the newly created tag.
|
// Make a reference to the newly created tag.
|
||||||
GHRef ref = repo.createRef("refs/tags/" + tagName, tag.getSha());
|
GHRef ref = repo.createRef("refs/tags/" + tagName, tag.getSha());
|
||||||
|
|||||||
131
src/test/java/org/kohsuke/github/GHVerificationReasonTest.java
Normal file
131
src/test/java/org/kohsuke/github/GHVerificationReasonTest.java
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
package org.kohsuke.github;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Sourabh Sarvotham Parkala
|
||||||
|
*/
|
||||||
|
public class GHVerificationReasonTest extends AbstractGitHubWireMockTest {
|
||||||
|
// Issue 737
|
||||||
|
@Test
|
||||||
|
public void testExpiredKey() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f01");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.EXPIRED_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNotSigningKey() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f02");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.NOT_SIGNING_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGpgverifyError() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f03");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.GPGVERIFY_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGpgverifyUnavailable() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f04");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(),
|
||||||
|
GHVerification.Reason.GPGVERIFY_UNAVAILABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnsigned() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f05");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.UNSIGNED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnknownSignatureType() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f06");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(),
|
||||||
|
GHVerification.Reason.UNKNOWN_SIGNATURE_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoUser() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f07");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.NO_USER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnverifiedEmail() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f08");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.UNVERIFIED_EMAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBadEmail() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f09");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.BAD_EMAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnknownKey() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f10");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.UNKNOWN_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMalformedSignature() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f11");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(),
|
||||||
|
GHVerification.Reason.MALFORMED_SIGNATURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testInvalid() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f12");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertFalse(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.INVALID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValid() throws Exception {
|
||||||
|
GHRepository r = gitHub.getRepository("github-api/github-api");
|
||||||
|
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f13");
|
||||||
|
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Sourabh Parkala");
|
||||||
|
assertTrue(commit.getCommitShortInfo().getVerification().isVerified());
|
||||||
|
assertEquals(commit.getCommitShortInfo().getVerification().getReason(), GHVerification.Reason.VALID);
|
||||||
|
assertNotNull(commit.getCommitShortInfo().getVerification().getPayload());
|
||||||
|
assertNotNull(commit.getCommitShortInfo().getVerification().getSignature());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,8 @@ import java.io.IOException;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.*;
|
import static org.hamcrest.CoreMatchers.*;
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
import static org.kohsuke.github.GHMarketplaceAccountType.ORGANIZATION;
|
import static org.kohsuke.github.GHMarketplaceAccountType.ORGANIZATION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -162,4 +164,47 @@ public class GitHubTest extends AbstractGitHubWireMockTest {
|
|||||||
assertNull(account.getOrganizationBillingEmail());
|
assertNull(account.getOrganizationBillingEmail());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void gzip() throws Exception {
|
||||||
|
|
||||||
|
GHOrganization org = gitHub.getOrganization(GITHUB_API_TEST_ORG);
|
||||||
|
|
||||||
|
// getResponseHeaderFields is deprecated but we'll use it for testing.
|
||||||
|
assertThat(org.getResponseHeaderFields(), notNullValue());
|
||||||
|
|
||||||
|
// WireMock should automatically gzip all responses
|
||||||
|
assertThat(org.getResponseHeaderFields().get("Content-Encoding").get(0), is("gzip"));
|
||||||
|
assertThat(org.getResponseHeaderFields().get("Content-eNcoding").get(0), is("gzip"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHeaderFieldName() throws Exception {
|
||||||
|
|
||||||
|
GHOrganization org = gitHub.getOrganization(GITHUB_API_TEST_ORG);
|
||||||
|
|
||||||
|
// getResponseHeaderFields is deprecated but we'll use it for testing.
|
||||||
|
assertThat(org.getResponseHeaderFields(), notNullValue());
|
||||||
|
|
||||||
|
// Header field names must be case-insensitive
|
||||||
|
assertThat(org.getResponseHeaderFields().containsKey("CacHe-ContrOl"), is(true));
|
||||||
|
|
||||||
|
// The KeySet from header fields should also be case-insensitive
|
||||||
|
assertThat(org.getResponseHeaderFields().keySet().contains("CacHe-ControL"), is(true));
|
||||||
|
assertThat(org.getResponseHeaderFields().keySet().contains("CacHe-ControL"), is(true));
|
||||||
|
|
||||||
|
assertThat(org.getResponseHeaderFields().get("cachE-cOntrol").get(0), is("private, max-age=60, s-maxage=60"));
|
||||||
|
|
||||||
|
// GitHub has started changing their headers to all lowercase.
|
||||||
|
// For this test we want the field names to be with mixed-case (harder to do comparison).
|
||||||
|
// Ensure that it remains that way, if test resources are ever refreshed.
|
||||||
|
boolean found = false;
|
||||||
|
for (String key : org.getResponseHeaderFields().keySet()) {
|
||||||
|
if (Objects.equals("Cache-Control", key)) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertThat("Must have the literal expected string 'Cache-Control' for header field name", found);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,7 +119,8 @@ public class WireMockStatusReporterTest extends AbstractGitHubWireMockTest {
|
|||||||
|
|
||||||
assertThat(e, Matchers.<Exception>instanceOf(GHFileNotFoundException.class));
|
assertThat(e, Matchers.<Exception>instanceOf(GHFileNotFoundException.class));
|
||||||
assertThat(e.getMessage(),
|
assertThat(e.getMessage(),
|
||||||
equalTo("{\"message\":\"Not Found\",\"documentation_url\":\"https://developer.github.com/v3/repos/#get\"}"));
|
containsString(
|
||||||
|
"{\"message\":\"Not Found\",\"documentation_url\":\"https://developer.github.com/v3/repos/#get\"}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import java.lang.reflect.Type;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.*;
|
import static com.github.tomakehurst.wiremock.client.WireMock.*;
|
||||||
@@ -120,7 +121,7 @@ public class GitHubWireMockRule extends WireMockMultiServerRule {
|
|||||||
.extractTextBodiesOver(255));
|
.extractTextBodiesOver(255));
|
||||||
|
|
||||||
// After taking the snapshot, format the output
|
// After taking the snapshot, format the output
|
||||||
formatJsonFiles(new File(this.apiServer().getOptions().filesRoot().getPath()).toPath());
|
formatTestResources(new File(this.apiServer().getOptions().filesRoot().getPath()).toPath(), false);
|
||||||
|
|
||||||
if (this.rawServer() != null) {
|
if (this.rawServer() != null) {
|
||||||
this.rawServer()
|
this.rawServer()
|
||||||
@@ -132,7 +133,7 @@ public class GitHubWireMockRule extends WireMockMultiServerRule {
|
|||||||
.extractTextBodiesOver(255));
|
.extractTextBodiesOver(255));
|
||||||
|
|
||||||
// For raw server, only fix up mapping files
|
// For raw server, only fix up mapping files
|
||||||
formatJsonFiles(new File(this.rawServer().getOptions().filesRoot().child("mappings").getPath()).toPath());
|
formatTestResources(new File(this.rawServer().getOptions().filesRoot().getPath()).toPath(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.uploadsServer() != null) {
|
if (this.uploadsServer() != null) {
|
||||||
@@ -144,7 +145,7 @@ public class GitHubWireMockRule extends WireMockMultiServerRule {
|
|||||||
.captureHeader("Accept")
|
.captureHeader("Accept")
|
||||||
.extractTextBodiesOver(255));
|
.extractTextBodiesOver(255));
|
||||||
|
|
||||||
formatJsonFiles(new File(this.uploadsServer().getOptions().filesRoot().getPath()).toPath());
|
formatTestResources(new File(this.uploadsServer().getOptions().filesRoot().getPath()).toPath(), false);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -157,7 +158,7 @@ public class GitHubWireMockRule extends WireMockMultiServerRule {
|
|||||||
return server.countRequestsMatching(RequestPatternBuilder.allRequests().build()).getCount();
|
return server.countRequestsMatching(RequestPatternBuilder.allRequests().build()).getCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void formatJsonFiles(Path path) {
|
private void formatTestResources(Path path, boolean isRawServer) {
|
||||||
// The more consistent we can make the json output the more meaningful it will be.
|
// The more consistent we can make the json output the more meaningful it will be.
|
||||||
Gson g = new Gson().newBuilder()
|
Gson g = new Gson().newBuilder()
|
||||||
.serializeNulls()
|
.serializeNulls()
|
||||||
@@ -176,8 +177,32 @@ public class GitHubWireMockRule extends WireMockMultiServerRule {
|
|||||||
.create();
|
.create();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
Map<String, String> idToIndex = new HashMap<>();
|
||||||
|
|
||||||
|
// Match all the ids to request indexes
|
||||||
Files.walk(path).forEach(filePath -> {
|
Files.walk(path).forEach(filePath -> {
|
||||||
try {
|
try {
|
||||||
|
if (filePath.toString().endsWith(".json") && filePath.toString().contains("/mappings/")) {
|
||||||
|
String fileText = new String(Files.readAllBytes(filePath));
|
||||||
|
Object parsedObject = g.fromJson(fileText, Object.class);
|
||||||
|
addMappingId((Map<String, Object>) parsedObject, idToIndex);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("Files could not be read: " + filePath.toString(), e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update all
|
||||||
|
Files.walk(path).forEach(filePath -> {
|
||||||
|
try {
|
||||||
|
Map.Entry<String, String> entry = getId(filePath, idToIndex);
|
||||||
|
if (entry != null) {
|
||||||
|
filePath = renameFileToIndex(filePath, entry);
|
||||||
|
}
|
||||||
|
// For raw server, only fix up mapping files
|
||||||
|
if (isRawServer && !filePath.toString().contains("mappings")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (filePath.toString().endsWith(".json")) {
|
if (filePath.toString().endsWith(".json")) {
|
||||||
String fileText = new String(Files.readAllBytes(filePath));
|
String fileText = new String(Files.readAllBytes(filePath));
|
||||||
// while recording responses we replaced all github calls localhost
|
// while recording responses we replaced all github calls localhost
|
||||||
@@ -193,16 +218,18 @@ public class GitHubWireMockRule extends WireMockMultiServerRule {
|
|||||||
fileText = fileText.replace(this.uploadsServer().baseUrl(), "https://uploads.github.com");
|
fileText = fileText.replace(this.uploadsServer().baseUrl(), "https://uploads.github.com");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// point bodyFile in the mapping to the renamed body file
|
||||||
|
if (entry != null && filePath.toString().contains("mappings")) {
|
||||||
|
fileText = fileText.replace("-" + entry.getKey(), "-" + entry.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
// Can be Array or Map
|
// Can be Array or Map
|
||||||
Object parsedObject = g.fromJson(fileText, Object.class);
|
Object parsedObject = g.fromJson(fileText, Object.class);
|
||||||
if (parsedObject instanceof Map && filePath.toString().contains("mappings")) {
|
|
||||||
filePath = renameMappingFile(filePath, (Map<String, Object>) parsedObject);
|
|
||||||
}
|
|
||||||
fileText = g.toJson(parsedObject);
|
fileText = g.toJson(parsedObject);
|
||||||
Files.write(filePath, fileText.getBytes());
|
Files.write(filePath, fileText.getBytes());
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException("Files could not be written", e);
|
throw new RuntimeException("Files could not be written: " + filePath.toString(), e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -210,20 +237,29 @@ public class GitHubWireMockRule extends WireMockMultiServerRule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Path renameMappingFile(Path filePath, Map<String, Object> parsedObject) throws IOException {
|
private void addMappingId(Map<String, Object> parsedObject, Map<String, String> idToIndex) {
|
||||||
// Shorten the file names
|
|
||||||
// For understandability, rename the files to include the response order
|
|
||||||
Path targetPath = filePath;
|
|
||||||
String id = (String) parsedObject.getOrDefault("id", null);
|
String id = (String) parsedObject.getOrDefault("id", null);
|
||||||
Long insertionIndex = ((Double) parsedObject.getOrDefault("insertionIndex", 0.0)).longValue();
|
long insertionIndex = ((Double) parsedObject.getOrDefault("insertionIndex", 0.0)).longValue();
|
||||||
if (id != null && insertionIndex > 0) {
|
if (id != null && insertionIndex > 0) {
|
||||||
String filePathString = filePath.toString();
|
idToIndex.put(id, Long.toString(insertionIndex));
|
||||||
if (filePathString.contains(id)) {
|
}
|
||||||
targetPath = new File(filePathString.replace(id, insertionIndex.toString() + "-" + id.substring(0, 6)))
|
}
|
||||||
.toPath();
|
|
||||||
Files.move(filePath, targetPath);
|
private Map.Entry<String, String> getId(Path filePath, Map<String, String> idToIndex) throws IOException {
|
||||||
|
Path targetPath = filePath;
|
||||||
|
String filePathString = filePath.toString();
|
||||||
|
for (Map.Entry<String, String> item : idToIndex.entrySet()) {
|
||||||
|
if (filePathString.contains(item.getKey())) {
|
||||||
|
return item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Path renameFileToIndex(Path filePath, Map.Entry<String, String> idToIndex) throws IOException {
|
||||||
|
String filePathString = filePath.toString();
|
||||||
|
Path targetPath = new File(filePathString.replace(idToIndex.getKey(), idToIndex.getValue())).toPath();
|
||||||
|
Files.move(filePath, targetPath);
|
||||||
|
|
||||||
return targetPath;
|
return targetPath;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "574da117-6845-46d8-b2c1-4415546ca670",
|
|
||||||
"name": "repos_github-api-test-org_temp-testratelimithandler_fail",
|
|
||||||
"request": {
|
|
||||||
"url": "/repos/github-api-test-org/temp-testHandler_Fail",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "repos_github-api-test-org_temp-testratelimithandler_fail-574da117-6845-46d8-b2c1-4415546ca670.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4922",
|
|
||||||
"X-RateLimit-Reset": "{{testStartDate offset='3 seconds' format='unix'}}",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"858224998ac7d1fd6dcd43f73d375297\"",
|
|
||||||
"Last-Modified": "Thu, 06 Feb 2020 18:33:43 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "repo",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CC37:2605:3FADC:4EA8C:5E3C5C02"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "574da117-6845-46d8-b2c1-4415546ca670",
|
|
||||||
"persistent": true,
|
|
||||||
"scenarioName": "scenario-1-repos-github-api-test-org-temp-testHandler_Fail",
|
|
||||||
"requiredScenarioState": "scenario-1-repos-github-api-test-org-temp-testHandler_Fail-2",
|
|
||||||
"insertionIndex": 3
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"id": "574da117-6845-46d8-b2c1-4415546ca670",
|
||||||
|
"name": "repos_github-api-test-org_temp-testratelimithandler_fail",
|
||||||
|
"request": {
|
||||||
|
"url": "/repos/github-api-test-org/temp-testHandler_Fail",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "repos_github-api-test-org_temp-testratelimithandler_fail-3.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4922",
|
||||||
|
"X-RateLimit-Reset": "{{testStartDate offset='3 seconds' format='unix'}}",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"858224998ac7d1fd6dcd43f73d375297\"",
|
||||||
|
"Last-Modified": "Thu, 06 Feb 2020 18:33:43 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "repo",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CC37:2605:3FADC:4EA8C:5E3C5C02"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "574da117-6845-46d8-b2c1-4415546ca670",
|
||||||
|
"persistent": true,
|
||||||
|
"scenarioName": "scenario-1-repos-github-api-test-org-temp-testHandler_Fail",
|
||||||
|
"requiredScenarioState": "scenario-1-repos-github-api-test-org-temp-testHandler_Fail-2",
|
||||||
|
"insertionIndex": 3
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
|
||||||
"name": "user",
|
|
||||||
"request": {
|
|
||||||
"url": "/user",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "user-a60baf84-5b5c-4f86-af3d-cab0d609c7b2.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4930",
|
|
||||||
"X-RateLimit-Reset": "{{now offset='3 seconds' format='unix'}}",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"1cb30f031c67c499473b3aad01c7f7a5\"",
|
|
||||||
"Last-Modified": "Thu, 06 Feb 2020 17:29:39 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CC37:2605:3F884:4E941:5E3C5BFC"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 1
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
||||||
|
"name": "user",
|
||||||
|
"request": {
|
||||||
|
"url": "/user",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "user-1.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4930",
|
||||||
|
"X-RateLimit-Reset": "{{now offset='3 seconds' format='unix'}}",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"1cb30f031c67c499473b3aad01c7f7a5\"",
|
||||||
|
"Last-Modified": "Thu, 06 Feb 2020 17:29:39 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CC37:2605:3F884:4E941:5E3C5BFC"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 1
|
||||||
|
}
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "574da117-6845-46d8-b2c1-4415546ca670",
|
|
||||||
"name": "repos_github-api-test-org_temp-testratelimithandler_fail",
|
|
||||||
"request": {
|
|
||||||
"url": "/repos/github-api-test-org/temp-testHandler_Fail",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "repos_github-api-test-org_temp-testratelimithandler_fail-574da117-6845-46d8-b2c1-4415546ca670.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4922",
|
|
||||||
"X-RateLimit-Reset": "{{testStartDate offset='3 seconds' format='unix'}}",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"858224998ac7d1fd6dcd43f73d375297\"",
|
|
||||||
"Last-Modified": "Thu, 06 Feb 2020 18:33:43 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "repo",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CC37:2605:3FADC:4EA8C:5E3C5C02"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "574da117-6845-46d8-b2c1-4415546ca670",
|
|
||||||
"persistent": true,
|
|
||||||
"scenarioName": "scenario-1-repos-github-api-test-org-temp-testHandler_Fail",
|
|
||||||
"requiredScenarioState": "scenario-1-repos-github-api-test-org-temp-testHandler_Fail-2",
|
|
||||||
"insertionIndex": 3
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"id": "574da117-6845-46d8-b2c1-4415546ca670",
|
||||||
|
"name": "repos_github-api-test-org_temp-testratelimithandler_fail",
|
||||||
|
"request": {
|
||||||
|
"url": "/repos/github-api-test-org/temp-testHandler_Fail",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "repos_github-api-test-org_temp-testratelimithandler_fail-3.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4922",
|
||||||
|
"X-RateLimit-Reset": "{{testStartDate offset='3 seconds' format='unix'}}",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"858224998ac7d1fd6dcd43f73d375297\"",
|
||||||
|
"Last-Modified": "Thu, 06 Feb 2020 18:33:43 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "repo",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CC37:2605:3FADC:4EA8C:5E3C5C02"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "574da117-6845-46d8-b2c1-4415546ca670",
|
||||||
|
"persistent": true,
|
||||||
|
"scenarioName": "scenario-1-repos-github-api-test-org-temp-testHandler_Fail",
|
||||||
|
"requiredScenarioState": "scenario-1-repos-github-api-test-org-temp-testHandler_Fail-2",
|
||||||
|
"insertionIndex": 3
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
|
||||||
"name": "user",
|
|
||||||
"request": {
|
|
||||||
"url": "/user",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "user-a60baf84-5b5c-4f86-af3d-cab0d609c7b2.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4930",
|
|
||||||
"X-RateLimit-Reset": "{{now offset='3 seconds' format='unix'}}",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"1cb30f031c67c499473b3aad01c7f7a5\"",
|
|
||||||
"Last-Modified": "Thu, 06 Feb 2020 17:29:39 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CC37:2605:3F884:4E941:5E3C5BFC"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 1
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
||||||
|
"name": "user",
|
||||||
|
"request": {
|
||||||
|
"url": "/user",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "user-1.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4930",
|
||||||
|
"X-RateLimit-Reset": "{{now offset='3 seconds' format='unix'}}",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"1cb30f031c67c499473b3aad01c7f7a5\"",
|
||||||
|
"Last-Modified": "Thu, 06 Feb 2020 17:29:39 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CC37:2605:3F884:4E941:5E3C5BFC"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 1
|
||||||
|
}
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "574da117-6845-46d8-b2c1-4415546ca670",
|
|
||||||
"name": "repos_github-api-test-org_temp-testHandler_Wait",
|
|
||||||
"request": {
|
|
||||||
"url": "/repos/github-api-test-org/temp-testHandler_Wait",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "repos_github-api-test-org_temp-testratelimithandler_fail-574da117-6845-46d8-b2c1-4415546ca670.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4922",
|
|
||||||
"X-RateLimit-Reset": "{{testStartDate offset='3 seconds' format='unix'}}",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"858224998ac7d1fd6dcd43f73d375297\"",
|
|
||||||
"Last-Modified": "Thu, 06 Feb 2020 18:33:43 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "repo",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CC37:2605:3FADC:4EA8C:5E3C5C02"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "574da117-6845-46d8-b2c1-4415546ca670",
|
|
||||||
"persistent": true,
|
|
||||||
"scenarioName": "scenario-1-repos-github-api-test-org-temp-testHandler_Wait",
|
|
||||||
"requiredScenarioState": "scenario-1-repos-github-api-test-org-temp-testHandler_Wait-2",
|
|
||||||
"insertionIndex": 3
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"id": "574da117-6845-46d8-b2c1-4415546ca670",
|
||||||
|
"name": "repos_github-api-test-org_temp-testHandler_Wait",
|
||||||
|
"request": {
|
||||||
|
"url": "/repos/github-api-test-org/temp-testHandler_Wait",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "repos_github-api-test-org_temp-testratelimithandler_fail-3.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4922",
|
||||||
|
"X-RateLimit-Reset": "{{testStartDate offset='3 seconds' format='unix'}}",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"858224998ac7d1fd6dcd43f73d375297\"",
|
||||||
|
"Last-Modified": "Thu, 06 Feb 2020 18:33:43 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "repo",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CC37:2605:3FADC:4EA8C:5E3C5C02"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "574da117-6845-46d8-b2c1-4415546ca670",
|
||||||
|
"persistent": true,
|
||||||
|
"scenarioName": "scenario-1-repos-github-api-test-org-temp-testHandler_Wait",
|
||||||
|
"requiredScenarioState": "scenario-1-repos-github-api-test-org-temp-testHandler_Wait-2",
|
||||||
|
"insertionIndex": 3
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
|
||||||
"name": "user",
|
|
||||||
"request": {
|
|
||||||
"url": "/user",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "user-a60baf84-5b5c-4f86-af3d-cab0d609c7b2.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4930",
|
|
||||||
"X-RateLimit-Reset": "{{now offset='3 seconds' format='unix'}}",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"1cb30f031c67c499473b3aad01c7f7a5\"",
|
|
||||||
"Last-Modified": "Thu, 06 Feb 2020 17:29:39 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CC37:2605:3F884:4E941:5E3C5BFC"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 1
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
||||||
|
"name": "user",
|
||||||
|
"request": {
|
||||||
|
"url": "/user",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "user-1.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4930",
|
||||||
|
"X-RateLimit-Reset": "{{now offset='3 seconds' format='unix'}}",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"1cb30f031c67c499473b3aad01c7f7a5\"",
|
||||||
|
"Last-Modified": "Thu, 06 Feb 2020 17:29:39 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CC37:2605:3F884:4E941:5E3C5BFC"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 1
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
|
||||||
"name": "user",
|
|
||||||
"request": {
|
|
||||||
"url": "/user",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "user-a60baf84-5b5c-4f86-af3d-cab0d609c7b2.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4930",
|
|
||||||
"X-RateLimit-Reset": "{{now offset='3 seconds' format='unix'}}",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"1cb30f031c67c499473b3aad01c7f7a5\"",
|
|
||||||
"Last-Modified": "Thu, 06 Feb 2020 17:29:39 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CC37:2605:3F884:4E941:5E3C5BFC"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 1
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
||||||
|
"name": "user",
|
||||||
|
"request": {
|
||||||
|
"url": "/user",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "user-1.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "{{now timezone='GMT' format='EEE, dd MMM yyyy HH:mm:ss z'}}",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4930",
|
||||||
|
"X-RateLimit-Reset": "{{now offset='3 seconds' format='unix'}}",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"1cb30f031c67c499473b3aad01c7f7a5\"",
|
||||||
|
"Last-Modified": "Thu, 06 Feb 2020 17:29:39 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CC37:2605:3F884:4E941:5E3C5BFC"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "a60baf84-5b5c-4f86-af3d-cab0d609c7b2",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 1
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "db8eacb0-947c-4677-9780-1c1d1b8383eb",
|
|
||||||
"name": "repos_github-api_github-api",
|
|
||||||
"request": {
|
|
||||||
"url": "/repos/github-api/github-api",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "repos_github-api_github-api-db8eacb0-947c-4677-9780-1c1d1b8383eb.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:28:28 GMT",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4352",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"c1a01d01a6354d93b3cc6098e0b2d047\"",
|
|
||||||
"Last-Modified": "Fri, 25 Oct 2019 01:32:16 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "repo",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CAD0:98FF:9ED63E:BB8EED:5DB3A13B"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "db8eacb0-947c-4677-9780-1c1d1b8383eb",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 2
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "db8eacb0-947c-4677-9780-1c1d1b8383eb",
|
||||||
|
"name": "repos_github-api_github-api",
|
||||||
|
"request": {
|
||||||
|
"url": "/repos/github-api/github-api",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "repos_github-api_github-api-2.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "Sat, 26 Oct 2019 01:28:28 GMT",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4352",
|
||||||
|
"X-RateLimit-Reset": "1572055286",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"c1a01d01a6354d93b3cc6098e0b2d047\"",
|
||||||
|
"Last-Modified": "Fri, 25 Oct 2019 01:32:16 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "repo",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CAD0:98FF:9ED63E:BB8EED:5DB3A13B"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "db8eacb0-947c-4677-9780-1c1d1b8383eb",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 2
|
||||||
|
}
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "6408bcc8-3cd2-4e1a-a25b-a9fdc81972e8",
|
|
||||||
"name": "repos_github-api_github-api_git_blobs_a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
|
||||||
"request": {
|
|
||||||
"url": "/repos/github-api/github-api/git/blobs/a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "application/vnd.github.v3.raw"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "repos_github-api_github-api_git_blobs_a12243f2fc5b8c2ba47dd677d0b0c7583539584d-6408bcc8-3cd2-4e1a-a25b-a9fdc81972e8.txt",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:28:28 GMT",
|
|
||||||
"Content-Type": "text/plain; charset=iso-8859-1",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4351",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"ffa971e80b5300a0fc0164a3114acb0f\"",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "github.v3; param=VERSION.raw",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CAD0:98FF:9ED64E:BB8F10:5DB3A13C"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "6408bcc8-3cd2-4e1a-a25b-a9fdc81972e8",
|
|
||||||
"persistent": true,
|
|
||||||
"scenarioName": "scenario-1-repos-github-api-github-api-git-blobs-a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
|
||||||
"requiredScenarioState": "Started",
|
|
||||||
"newScenarioState": "scenario-1-repos-github-api-github-api-git-blobs-a12243f2fc5b8c2ba47dd677d0b0c7583539584d-2",
|
|
||||||
"insertionIndex": 3
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"id": "6408bcc8-3cd2-4e1a-a25b-a9fdc81972e8",
|
||||||
|
"name": "repos_github-api_github-api_git_blobs_a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
||||||
|
"request": {
|
||||||
|
"url": "/repos/github-api/github-api/git/blobs/a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "application/vnd.github.v3.raw"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "repos_github-api_github-api_git_blobs_a12243f2fc5b8c2ba47dd677d0b0c7583539584d-3.txt",
|
||||||
|
"headers": {
|
||||||
|
"Date": "Sat, 26 Oct 2019 01:28:28 GMT",
|
||||||
|
"Content-Type": "text/plain; charset=iso-8859-1",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4351",
|
||||||
|
"X-RateLimit-Reset": "1572055286",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"ffa971e80b5300a0fc0164a3114acb0f\"",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "github.v3; param=VERSION.raw",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CAD0:98FF:9ED64E:BB8F10:5DB3A13C"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "6408bcc8-3cd2-4e1a-a25b-a9fdc81972e8",
|
||||||
|
"persistent": true,
|
||||||
|
"scenarioName": "scenario-1-repos-github-api-github-api-git-blobs-a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
||||||
|
"requiredScenarioState": "Started",
|
||||||
|
"newScenarioState": "scenario-1-repos-github-api-github-api-git-blobs-a12243f2fc5b8c2ba47dd677d0b0c7583539584d-2",
|
||||||
|
"insertionIndex": 3
|
||||||
|
}
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "72e1ca23-1f03-45b5-90a2-e6dd6467b2f9",
|
|
||||||
"name": "repos_github-api_github-api_git_blobs_a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
|
||||||
"request": {
|
|
||||||
"url": "/repos/github-api/github-api/git/blobs/a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "repos_github-api_github-api_git_blobs_a12243f2fc5b8c2ba47dd677d0b0c7583539584d-72e1ca23-1f03-45b5-90a2-e6dd6467b2f9.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:28:28 GMT",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4350",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"89459bc4c8c6c982a48ccd6cb6060fff\"",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CAD0:98FF:9ED65A:BB8F1C:5DB3A13C"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "72e1ca23-1f03-45b5-90a2-e6dd6467b2f9",
|
|
||||||
"persistent": true,
|
|
||||||
"scenarioName": "scenario-1-repos-github-api-github-api-git-blobs-a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
|
||||||
"requiredScenarioState": "scenario-1-repos-github-api-github-api-git-blobs-a12243f2fc5b8c2ba47dd677d0b0c7583539584d-2",
|
|
||||||
"insertionIndex": 4
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"id": "72e1ca23-1f03-45b5-90a2-e6dd6467b2f9",
|
||||||
|
"name": "repos_github-api_github-api_git_blobs_a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
||||||
|
"request": {
|
||||||
|
"url": "/repos/github-api/github-api/git/blobs/a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "repos_github-api_github-api_git_blobs_a12243f2fc5b8c2ba47dd677d0b0c7583539584d-4.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "Sat, 26 Oct 2019 01:28:28 GMT",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4350",
|
||||||
|
"X-RateLimit-Reset": "1572055286",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"89459bc4c8c6c982a48ccd6cb6060fff\"",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CAD0:98FF:9ED65A:BB8F1C:5DB3A13C"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "72e1ca23-1f03-45b5-90a2-e6dd6467b2f9",
|
||||||
|
"persistent": true,
|
||||||
|
"scenarioName": "scenario-1-repos-github-api-github-api-git-blobs-a12243f2fc5b8c2ba47dd677d0b0c7583539584d",
|
||||||
|
"requiredScenarioState": "scenario-1-repos-github-api-github-api-git-blobs-a12243f2fc5b8c2ba47dd677d0b0c7583539584d-2",
|
||||||
|
"insertionIndex": 4
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "8996d059-e95f-4604-a534-b734e99d9e15",
|
|
||||||
"name": "user",
|
|
||||||
"request": {
|
|
||||||
"url": "/user",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "user-8996d059-e95f-4604-a534-b734e99d9e15.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:28:27 GMT",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4354",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"8c3d3dcf6fc5f9edaf26c902295396e5\"",
|
|
||||||
"Last-Modified": "Tue, 24 Sep 2019 19:32:29 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CAD0:98FF:9ED62C:BB8EE6:5DB3A13B"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "8996d059-e95f-4604-a534-b734e99d9e15",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 1
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "8996d059-e95f-4604-a534-b734e99d9e15",
|
||||||
|
"name": "user",
|
||||||
|
"request": {
|
||||||
|
"url": "/user",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "user-1.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "Sat, 26 Oct 2019 01:28:27 GMT",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4354",
|
||||||
|
"X-RateLimit-Reset": "1572055286",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"8c3d3dcf6fc5f9edaf26c902295396e5\"",
|
||||||
|
"Last-Modified": "Tue, 24 Sep 2019 19:32:29 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CAD0:98FF:9ED62C:BB8EE6:5DB3A13B"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "8996d059-e95f-4604-a534-b734e99d9e15",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 1
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "448d3f92-8488-4c5c-a81b-ca22a6039b39",
|
|
||||||
"name": "repos_jenkinsci_jenkins",
|
|
||||||
"request": {
|
|
||||||
"url": "/repos/jenkinsci/jenkins",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "repos_jenkinsci_jenkins-448d3f92-8488-4c5c-a81b-ca22a6039b39.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:27:32 GMT",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4434",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"bc93de689b79708d9501fd02bc1f7696\"",
|
|
||||||
"Last-Modified": "Sat, 26 Oct 2019 01:07:22 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "repo",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CA8F:3649:E327A7:1091CF2:5DB3A103"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "448d3f92-8488-4c5c-a81b-ca22a6039b39",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 2
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "448d3f92-8488-4c5c-a81b-ca22a6039b39",
|
||||||
|
"name": "repos_jenkinsci_jenkins",
|
||||||
|
"request": {
|
||||||
|
"url": "/repos/jenkinsci/jenkins",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "repos_jenkinsci_jenkins-2.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "Sat, 26 Oct 2019 01:27:32 GMT",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4434",
|
||||||
|
"X-RateLimit-Reset": "1572055286",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"bc93de689b79708d9501fd02bc1f7696\"",
|
||||||
|
"Last-Modified": "Sat, 26 Oct 2019 01:07:22 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "repo",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CA8F:3649:E327A7:1091CF2:5DB3A103"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "448d3f92-8488-4c5c-a81b-ca22a6039b39",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 2
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "7e1b6c60-f829-4e6a-a1e5-089cebc4e1c7",
|
|
||||||
"name": "repos_jenkinsci_jenkins_contents_core",
|
|
||||||
"request": {
|
|
||||||
"url": "/repos/jenkinsci/jenkins/contents/core",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "repos_jenkinsci_jenkins_contents_core-7e1b6c60-f829-4e6a-a1e5-089cebc4e1c7.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:27:32 GMT",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4433",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"64e666d1755b0fc334c6c5d6a7ddeb2948f8313b\"",
|
|
||||||
"Last-Modified": "Sat, 26 Oct 2019 01:07:22 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CA8F:3649:E327B9:1091D1B:5DB3A104"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "7e1b6c60-f829-4e6a-a1e5-089cebc4e1c7",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 3
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "7e1b6c60-f829-4e6a-a1e5-089cebc4e1c7",
|
||||||
|
"name": "repos_jenkinsci_jenkins_contents_core",
|
||||||
|
"request": {
|
||||||
|
"url": "/repos/jenkinsci/jenkins/contents/core",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "repos_jenkinsci_jenkins_contents_core-3.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "Sat, 26 Oct 2019 01:27:32 GMT",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4433",
|
||||||
|
"X-RateLimit-Reset": "1572055286",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"64e666d1755b0fc334c6c5d6a7ddeb2948f8313b\"",
|
||||||
|
"Last-Modified": "Sat, 26 Oct 2019 01:07:22 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CA8F:3649:E327B9:1091D1B:5DB3A104"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "7e1b6c60-f829-4e6a-a1e5-089cebc4e1c7",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 3
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "0566ab8b-d260-47cb-a6e6-fafa6fc2836c",
|
|
||||||
"name": "repos_jenkinsci_jenkins_contents_core_src",
|
|
||||||
"request": {
|
|
||||||
"url": "/repos/jenkinsci/jenkins/contents/core/src?ref=master",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "repos_jenkinsci_jenkins_contents_core_src-0566ab8b-d260-47cb-a6e6-fafa6fc2836c.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:27:32 GMT",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4432",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"64e666d1755b0fc334c6c5d6a7ddeb2948f8313b\"",
|
|
||||||
"Last-Modified": "Sat, 26 Oct 2019 01:07:22 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CA8F:3649:E327C7:1091D2B:5DB3A104"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "0566ab8b-d260-47cb-a6e6-fafa6fc2836c",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 4
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "0566ab8b-d260-47cb-a6e6-fafa6fc2836c",
|
||||||
|
"name": "repos_jenkinsci_jenkins_contents_core_src",
|
||||||
|
"request": {
|
||||||
|
"url": "/repos/jenkinsci/jenkins/contents/core/src?ref=master",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "repos_jenkinsci_jenkins_contents_core_src-4.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "Sat, 26 Oct 2019 01:27:32 GMT",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4432",
|
||||||
|
"X-RateLimit-Reset": "1572055286",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"64e666d1755b0fc334c6c5d6a7ddeb2948f8313b\"",
|
||||||
|
"Last-Modified": "Sat, 26 Oct 2019 01:07:22 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CA8F:3649:E327C7:1091D2B:5DB3A104"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "0566ab8b-d260-47cb-a6e6-fafa6fc2836c",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 4
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "0cdbd9dc-1c6f-42f5-a4b5-9d5472b2a56b",
|
|
||||||
"name": "user",
|
|
||||||
"request": {
|
|
||||||
"url": "/user",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "user-0cdbd9dc-1c6f-42f5-a4b5-9d5472b2a56b.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:27:31 GMT",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4436",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"8c3d3dcf6fc5f9edaf26c902295396e5\"",
|
|
||||||
"Last-Modified": "Tue, 24 Sep 2019 19:32:29 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CA8F:3649:E32786:1091CE0:5DB3A103"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "0cdbd9dc-1c6f-42f5-a4b5-9d5472b2a56b",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 1
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "8636c5bc-5f1d-45cf-8182-9e7926d5231e",
|
|
||||||
"name": "user",
|
|
||||||
"request": {
|
|
||||||
"url": "/user",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "user-8636c5bc-5f1d-45cf-8182-9e7926d5231e.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:27:46 GMT",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4398",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"8c3d3dcf6fc5f9edaf26c902295396e5\"",
|
|
||||||
"Last-Modified": "Tue, 24 Sep 2019 19:32:29 GMT",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CAB4:5F2B:EE3A33:1187E2D:5DB3A112"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "8636c5bc-5f1d-45cf-8182-9e7926d5231e",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 1
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"id": "8636c5bc-5f1d-45cf-8182-9e7926d5231e",
|
||||||
|
"name": "user",
|
||||||
|
"request": {
|
||||||
|
"url": "/user",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "user-1.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "Sat, 26 Oct 2019 01:27:46 GMT",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4398",
|
||||||
|
"X-RateLimit-Reset": "1572055286",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"8c3d3dcf6fc5f9edaf26c902295396e5\"",
|
||||||
|
"Last-Modified": "Tue, 24 Sep 2019 19:32:29 GMT",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CAB4:5F2B:EE3A33:1187E2D:5DB3A112"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "8636c5bc-5f1d-45cf-8182-9e7926d5231e",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 1
|
||||||
|
}
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "29d7ac4b-573b-4044-a2b8-470ac1bf6335",
|
|
||||||
"name": "user_memberships_orgs",
|
|
||||||
"request": {
|
|
||||||
"url": "/user/memberships/orgs",
|
|
||||||
"method": "GET",
|
|
||||||
"headers": {
|
|
||||||
"Accept": {
|
|
||||||
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"bodyFileName": "user_memberships_orgs-29d7ac4b-573b-4044-a2b8-470ac1bf6335.json",
|
|
||||||
"headers": {
|
|
||||||
"Date": "Sat, 26 Oct 2019 01:27:46 GMT",
|
|
||||||
"Content-Type": "application/json; charset=utf-8",
|
|
||||||
"Server": "GitHub.com",
|
|
||||||
"Status": "200 OK",
|
|
||||||
"X-RateLimit-Limit": "5000",
|
|
||||||
"X-RateLimit-Remaining": "4396",
|
|
||||||
"X-RateLimit-Reset": "1572055286",
|
|
||||||
"Cache-Control": "private, max-age=60, s-maxage=60",
|
|
||||||
"Vary": [
|
|
||||||
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
|
||||||
"Accept-Encoding"
|
|
||||||
],
|
|
||||||
"ETag": "W/\"421157c0a61f3834ed23839360e0441a\"",
|
|
||||||
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
|
||||||
"X-Accepted-OAuth-Scopes": "admin:org, read:org, repo, user, write:org",
|
|
||||||
"X-GitHub-Media-Type": "unknown, github.v3",
|
|
||||||
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
|
||||||
"X-Frame-Options": "deny",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
"X-XSS-Protection": "1; mode=block",
|
|
||||||
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
|
||||||
"Content-Security-Policy": "default-src 'none'",
|
|
||||||
"X-GitHub-Request-Id": "CAB4:5F2B:EE3A4F:1187E42:5DB3A112"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uuid": "29d7ac4b-573b-4044-a2b8-470ac1bf6335",
|
|
||||||
"persistent": true,
|
|
||||||
"insertionIndex": 2
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
"id": "29d7ac4b-573b-4044-a2b8-470ac1bf6335",
|
||||||
|
"name": "user_memberships_orgs",
|
||||||
|
"request": {
|
||||||
|
"url": "/user/memberships/orgs",
|
||||||
|
"method": "GET",
|
||||||
|
"headers": {
|
||||||
|
"Accept": {
|
||||||
|
"equalTo": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": 200,
|
||||||
|
"bodyFileName": "user_memberships_orgs-2.json",
|
||||||
|
"headers": {
|
||||||
|
"Date": "Sat, 26 Oct 2019 01:27:46 GMT",
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
"Server": "GitHub.com",
|
||||||
|
"Status": "200 OK",
|
||||||
|
"X-RateLimit-Limit": "5000",
|
||||||
|
"X-RateLimit-Remaining": "4396",
|
||||||
|
"X-RateLimit-Reset": "1572055286",
|
||||||
|
"Cache-Control": "private, max-age=60, s-maxage=60",
|
||||||
|
"Vary": [
|
||||||
|
"Accept, Authorization, Cookie, X-GitHub-OTP",
|
||||||
|
"Accept-Encoding"
|
||||||
|
],
|
||||||
|
"ETag": "W/\"421157c0a61f3834ed23839360e0441a\"",
|
||||||
|
"X-OAuth-Scopes": "admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, repo, user, write:discussion",
|
||||||
|
"X-Accepted-OAuth-Scopes": "admin:org, read:org, repo, user, write:org",
|
||||||
|
"X-GitHub-Media-Type": "unknown, github.v3",
|
||||||
|
"Access-Control-Expose-Headers": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
|
||||||
|
"X-Frame-Options": "deny",
|
||||||
|
"X-Content-Type-Options": "nosniff",
|
||||||
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
"Referrer-Policy": "origin-when-cross-origin, strict-origin-when-cross-origin",
|
||||||
|
"Content-Security-Policy": "default-src 'none'",
|
||||||
|
"X-GitHub-Request-Id": "CAB4:5F2B:EE3A4F:1187E42:5DB3A112"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uuid": "29d7ac4b-573b-4044-a2b8-470ac1bf6335",
|
||||||
|
"persistent": true,
|
||||||
|
"insertionIndex": 2
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user