-
Notifications
You must be signed in to change notification settings - Fork 735
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add option to fork default branch only (#1995)
* add only fork default branch * Remove owner validation in fork builder tests * update fork tests from personal to org account * improve test coverage * remove mockito test * improve more test coverage * mvn spotless:apply * change sleep method scope * Update src/test/java/org/kohsuke/github/GHRepositoryForkBuilderTest.java * Update src/test/java/org/kohsuke/github/GHRepositoryForkBuilderTest.java * Update src/test/java/org/kohsuke/github/GHRepositoryForkBuilderTest.java * Update src/test/java/org/kohsuke/github/GHRepositoryForkBuilderTest.java * Cleanup extra test files --------- Co-authored-by: Liam Newman <[email protected]>
- Loading branch information
1 parent
8714d1b
commit d37839b
Showing
80 changed files
with
9,386 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
144 changes: 144 additions & 0 deletions
144
src/main/java/org/kohsuke/github/GHRepositoryForkBuilder.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
package org.kohsuke.github; | ||
|
||
import java.io.IOException; | ||
import java.io.InterruptedIOException; | ||
|
||
/** | ||
* A builder pattern object for creating a fork of a repository. | ||
* | ||
* @see GHRepository#createFork() GHRepository#createFork()GHRepository#createFork() | ||
* @see <a href="https://docs.github.com/en/rest/repos/forks#create-a-fork">Repository fork API</a> | ||
*/ | ||
public class GHRepositoryForkBuilder { | ||
private final GHRepository repo; | ||
private final Requester req; | ||
private String organization; | ||
private String name; | ||
private Boolean defaultBranchOnly; | ||
|
||
static int FORK_RETRY_INTERVAL = 3000; | ||
|
||
/** | ||
* Instantiates a new Gh repository fork builder. | ||
* | ||
* @param repo | ||
* the repository | ||
*/ | ||
GHRepositoryForkBuilder(GHRepository repo) { | ||
this.repo = repo; | ||
this.req = repo.root().createRequest(); | ||
} | ||
|
||
/** | ||
* Sets whether to fork only the default branch. | ||
* | ||
* @param defaultBranchOnly | ||
* the default branch only | ||
* @return the gh repository fork builder | ||
*/ | ||
public GHRepositoryForkBuilder defaultBranchOnly(boolean defaultBranchOnly) { | ||
this.defaultBranchOnly = defaultBranchOnly; | ||
return this; | ||
} | ||
|
||
/** | ||
* Specifies the target organization for the fork. | ||
* | ||
* @param organization | ||
* the organization | ||
* @return the gh repository fork builder | ||
*/ | ||
public GHRepositoryForkBuilder organization(GHOrganization organization) { | ||
this.organization = organization.getLogin(); | ||
return this; | ||
} | ||
|
||
/** | ||
* Sets a custom name for the forked repository. | ||
* | ||
* @param name | ||
* the desired repository name | ||
* @return the builder | ||
*/ | ||
public GHRepositoryForkBuilder name(String name) { | ||
this.name = name; | ||
return this; | ||
} | ||
|
||
/** | ||
* Creates the fork with the specified parameters. | ||
* | ||
* @return the gh repository | ||
* @throws IOException | ||
* the io exception | ||
*/ | ||
public GHRepository create() throws IOException { | ||
if (defaultBranchOnly != null) { | ||
req.with("default_branch_only", defaultBranchOnly); | ||
} | ||
if (organization != null) { | ||
req.with("organization", organization); | ||
} | ||
if (name != null) { | ||
req.with("name", name); | ||
} | ||
|
||
req.method("POST").withUrlPath(repo.getApiTailUrl("forks")).send(); | ||
|
||
// this API is asynchronous. we need to wait for a bit | ||
for (int i = 0; i < 10; i++) { | ||
GHRepository r = lookupForkedRepository(); | ||
if (r != null) { | ||
return r; | ||
} | ||
sleep(FORK_RETRY_INTERVAL); | ||
} | ||
throw new IOException(createTimeoutMessage()); | ||
} | ||
|
||
private GHRepository lookupForkedRepository() throws IOException { | ||
String repoName = name != null ? name : repo.getName(); | ||
|
||
if (organization != null) { | ||
return repo.root().getOrganization(organization).getRepository(repoName); | ||
} | ||
return repo.root().getMyself().getRepository(repoName); | ||
} | ||
|
||
/** | ||
* Sleep. | ||
* | ||
* @param millis | ||
* the millis | ||
* @throws IOException | ||
* the io exception | ||
*/ | ||
void sleep(int millis) throws IOException { | ||
try { | ||
Thread.sleep(millis); | ||
} catch (InterruptedException e) { | ||
throw (IOException) new InterruptedIOException().initCause(e); | ||
} | ||
} | ||
|
||
/** | ||
* Create timeout message string. | ||
* | ||
* @return the string | ||
*/ | ||
String createTimeoutMessage() { | ||
StringBuilder message = new StringBuilder(repo.getFullName()); | ||
message.append(" was forked"); | ||
|
||
if (organization != null) { | ||
message.append(" into ").append(organization); | ||
} | ||
|
||
if (name != null) { | ||
message.append(" with name ").append(name); | ||
} | ||
|
||
message.append(" but can't find the new repository"); | ||
return message.toString(); | ||
} | ||
} |
Oops, something went wrong.