Skip to content

Commit

Permalink
Merge pull request #534 from ajschmidt8/exclude-private
Browse files Browse the repository at this point in the history
Add `ExcludePrivateRepositoriesTrait`
  • Loading branch information
jtnord committed May 24, 2022
2 parents 14f9cef + 27aa7d9 commit d833b7c
Show file tree
Hide file tree
Showing 7 changed files with 139 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.jenkinsci.plugins.github_branch_source;

import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import jenkins.scm.api.trait.SCMNavigatorContext;
import jenkins.scm.api.trait.SCMNavigatorTrait;
import jenkins.scm.api.trait.SCMNavigatorTraitDescriptor;
import jenkins.scm.impl.trait.Selection;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;

/** A {@link Selection} trait that will restrict the discovery of repositories that are private. */
public class ExcludePrivateRepositoriesTrait extends SCMNavigatorTrait {

/** Constructor for stapler. */
@DataBoundConstructor
public ExcludePrivateRepositoriesTrait() {}

/** {@inheritDoc} */
@Override
protected void decorateContext(SCMNavigatorContext<?, ?> context) {
super.decorateContext(context);
GitHubSCMNavigatorContext ctx = (GitHubSCMNavigatorContext) context;
ctx.setExcludePrivateRepositories(true);
}

/** Exclude private repositories filter */
@Symbol("gitHubExcludePrivateRepositories")
@Extension
@Selection
public static class DescriptorImpl extends SCMNavigatorTraitDescriptor {

@Override
public Class<? extends SCMNavigatorContext> getContextClass() {
return GitHubSCMNavigatorContext.class;
}

@NonNull
@Override
public String getDisplayName() {
return Messages.ExcludePrivateRepositoriesTrait_displayName();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1030,6 +1030,16 @@ public void visitSources(SCMSourceObserver observer) throws IOException, Interru
System.currentTimeMillis(),
String.format(
"Skipping repository %s because it is public", repo.getName())));
} else if (repo.isPrivate()
&& gitHubSCMNavigatorContext.isExcludePrivateRepositories()) {
witness.record(repo.getName(), false);
listener
.getLogger()
.println(
GitHubConsoleNote.create(
System.currentTimeMillis(),
String.format(
"Skipping repository %s because it is private", repo.getName())));
} else if (gitHubSCMNavigatorContext.isExcludeForkedRepositories()
&& repo.getSource() != null) {
witness.record(repo.getName(), false);
Expand Down Expand Up @@ -1125,6 +1135,17 @@ public void visitSources(SCMSourceObserver observer) throws IOException, Interru
String.format(
"Skipping repository %s because it is public", repo.getName())));

} else if (repo.isPrivate()
&& gitHubSCMNavigatorContext.isExcludePrivateRepositories()) {
witness.record(repo.getName(), false);
listener
.getLogger()
.println(
GitHubConsoleNote.create(
System.currentTimeMillis(),
String.format(
"Skipping repository %s because it is private", repo.getName())));

} else if (gitHubSCMNavigatorContext.isExcludeForkedRepositories()
&& repo.getSource() != null) {
witness.record(repo.getName(), false);
Expand Down Expand Up @@ -1353,6 +1374,16 @@ public void visitSource(String sourceName, SCMSourceObserver observer)
System.currentTimeMillis(),
String.format(
"Skipping repository %s because it is public", repo.getName())));
} else if (repo.isPrivate()
&& gitHubSCMNavigatorContext.isExcludePrivateRepositories()) {
witness.record(repo.getName(), false);
listener
.getLogger()
.println(
GitHubConsoleNote.create(
System.currentTimeMillis(),
String.format(
"Skipping repository %s because it is private", repo.getName())));

} else if (gitHubSCMNavigatorContext.isExcludeForkedRepositories()
&& repo.getSource() != null) {
Expand Down Expand Up @@ -1435,6 +1466,16 @@ public void visitSource(String sourceName, SCMSourceObserver observer)
System.currentTimeMillis(),
String.format(
"Skipping repository %s because it is public", repo.getName())));
} else if (repo.isPrivate()
&& gitHubSCMNavigatorContext.isExcludePrivateRepositories()) {
witness.record(repo.getName(), false);
listener
.getLogger()
.println(
GitHubConsoleNote.create(
System.currentTimeMillis(),
String.format(
"Skipping repository %s because it is private", repo.getName())));
} else if (gitHubSCMNavigatorContext.isExcludeForkedRepositories()
&& repo.getSource() != null) {
witness.record(repo.getName(), false);
Expand Down Expand Up @@ -1513,6 +1554,16 @@ public void visitSource(String sourceName, SCMSourceObserver observer)
System.currentTimeMillis(),
String.format(
"Skipping repository %s because it is public", repo.getName())));
} else if (repo.isPrivate()
&& gitHubSCMNavigatorContext.isExcludePrivateRepositories()) {
witness.record(repo.getName(), false);
listener
.getLogger()
.println(
GitHubConsoleNote.create(
System.currentTimeMillis(),
String.format(
"Skipping repository %s because it is private", repo.getName())));

} else if (gitHubSCMNavigatorContext.isExcludeForkedRepositories()
&& repo.getSource() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ public class GitHubSCMNavigatorContext
/** If true, public repositories will be ignored. */
private boolean excludePublicRepositories;

/** If true, private repositories will be ignored. */
private boolean excludePrivateRepositories;

/** If true, forked repositories will be ignored. */
private boolean excludeForkedRepositories;

Expand Down Expand Up @@ -99,6 +102,11 @@ public boolean isExcludePublicRepositories() {
return excludePublicRepositories;
}

/** @return True if private repositories should be ignored, false if they should be included. */
public boolean isExcludePrivateRepositories() {
return excludePrivateRepositories;
}

/** @return True if forked repositories should be ignored, false if they should be included. */
public boolean isExcludeForkedRepositories() {
return excludeForkedRepositories;
Expand All @@ -114,6 +122,11 @@ public void setExcludePublicRepositories(boolean excludePublicRepositories) {
this.excludePublicRepositories = excludePublicRepositories;
}

/** @param excludePrivateRepositories Set true to exclude private repositories */
public void setExcludePrivateRepositories(boolean excludePrivateRepositories) {
this.excludePrivateRepositories = excludePrivateRepositories;
}

/** @param excludeForkedRepositories Set true to exclude archived repositories */
public void setExcludeForkedRepositories(boolean excludeForkedRepositories) {
this.excludeForkedRepositories = excludeForkedRepositories;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core">
</j:jelly>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
Exclude GitHub repositories that are private. If set, no jobs will be created for private repositories.
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ TagDiscoveryTrait.authorityDisplayName=Trust origin tags
TagDiscoveryTrait.displayName=Discover tags
ExcludeArchivedRepositoriesTrait.displayName=Exclude archived repositories
ExcludePublicRepositoriesTrait.displayName=Exclude public repositories
ExcludePrivateRepositoriesTrait.displayName=Exclude private repositories
ExcludeForkedRepositoriesTrait.displayName=Exclude repositories that are forks of another repository

GitHubSCMNavigator.general=General
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,19 @@ public void fetchOneRepo_ExcludingPublic() throws Exception {
assertThat(projectNames, containsInAnyOrder("yolo-private"));
}

@Test
public void fetchOneRepo_ExcludingPrivate() throws Exception {
setCredentials(Collections.singletonList(credentials));
navigator = navigatorForRepoOwner("stephenc", credentials.getId());
navigator.setTraits(Collections.singletonList(new ExcludePrivateRepositoriesTrait()));
final Set<String> projectNames = new HashSet<>();
final SCMSourceObserver observer = getObserver(projectNames);

navigator.visitSources(SCMSourceObserver.filter(observer, "yolo"));

assertThat(projectNames, containsInAnyOrder("yolo"));
}

@Test
public void fetchOneRepo_ExcludingForked() throws Exception {
setCredentials(Collections.singletonList(credentials));
Expand Down Expand Up @@ -371,6 +384,17 @@ public void fetchRepos_BelongingToOrg_ExcludingPublic() throws Exception {
assertThat(projectNames, containsInAnyOrder("yolo-private"));
}

@Test
public void fetchRepos_BelongingToOrg_ExcludingPrivate() throws Exception {
navigator.setTraits(Collections.singletonList(new ExcludePrivateRepositoriesTrait()));
final Set<String> projectNames = new HashSet<>();
final SCMSourceObserver observer = getObserver(projectNames);

navigator.visitSources(SCMSourceObserver.filter(observer, "basic", "advanced", "yolo-private"));

assertThat(projectNames, containsInAnyOrder("basic", "advanced"));
}

@Test
public void fetchRepos_BelongingToUser() throws Exception {
navigator = navigatorForRepoOwner("stephenc", null);
Expand Down

0 comments on commit d833b7c

Please sign in to comment.