Skip to content

Commit 3e60cf1

Browse files
Merge branch 'master' into migrate_to_junit5
# Conflicts: # src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigatorTest.java
2 parents 70b6e22 + 3626a62 commit 3e60cf1

19 files changed

+546
-16
lines changed

Jenkinsfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
buildPlugin(
66
useContainerAgent: true, // Set to `false` if you need to use Docker for containerized tests
77
configurations: [
8-
[platform: 'linux', jdk: 21],
9-
[platform: 'windows', jdk: 17],
8+
[platform: 'linux', jdk: 25],
9+
[platform: 'windows', jdk: 21],
1010
])

pom.xml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
<hpi.compatibleSinceVersion>2.2.0</hpi.compatibleSinceVersion>
3636
<!-- https://www.jenkins.io/doc/developer/plugin-development/choosing-jenkins-baseline/ -->
3737
<jenkins.baseline>2.504</jenkins.baseline>
38-
<jenkins.version>${jenkins.baseline}.1</jenkins.version>
38+
<jenkins.version>${jenkins.baseline}.3</jenkins.version>
3939
<spotless.check.skip>false</spotless.check.skip>
4040
<ban-junit4-imports.skip>false</ban-junit4-imports.skip>
4141
</properties>
@@ -45,7 +45,7 @@
4545
<dependency>
4646
<groupId>io.jenkins.tools.bom</groupId>
4747
<artifactId>bom-${jenkins.baseline}.x</artifactId>
48-
<version>5294.va_d2e144c80e1</version>
48+
<version>5543.vfd758c7c868d</version>
4949
<type>pom</type>
5050
<scope>import</scope>
5151
</dependency>
@@ -92,15 +92,11 @@
9292
<dependency>
9393
<groupId>io.jenkins</groupId>
9494
<artifactId>configuration-as-code</artifactId>
95-
<!-- TODO: remove when included in jenkins-bom via parent -->
96-
<version>1995.v540b_50a_eb_0c1</version>
9795
<scope>test</scope>
9896
</dependency>
9997
<dependency>
10098
<groupId>io.jenkins.configuration-as-code</groupId>
10199
<artifactId>test-harness</artifactId>
102-
<!-- TODO: remove when included in jenkins-bom via parent -->
103-
<version>1995.v540b_50a_eb_0c1</version>
104100
<scope>test</scope>
105101
</dependency>
106102
<dependency>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.jenkinsci.plugins.github_branch_source;
2+
3+
import edu.umd.cs.findbugs.annotations.Nullable;
4+
import hudson.model.Actionable;
5+
import hudson.model.Run;
6+
import jenkins.model.details.Detail;
7+
import jenkins.model.details.DetailGroup;
8+
import jenkins.scm.api.SCMDetailGroup;
9+
import jenkins.scm.api.metadata.ObjectMetadataAction;
10+
11+
public class GitHubBranchDetail extends Detail {
12+
public GitHubBranchDetail(Actionable object) {
13+
super(object);
14+
}
15+
16+
@Nullable
17+
@Override
18+
public String getIconClassName() {
19+
return "symbol-git-branch-outline plugin-ionicons-api";
20+
}
21+
22+
@Nullable
23+
@Override
24+
public String getDisplayName() {
25+
return getObjectMetadataAction().getObjectDisplayName();
26+
}
27+
28+
@Override
29+
public String getLink() {
30+
return getObjectMetadataAction().getObjectUrl();
31+
}
32+
33+
@Override
34+
public DetailGroup getGroup() {
35+
return SCMDetailGroup.get();
36+
}
37+
38+
private ObjectMetadataAction getObjectMetadataAction() {
39+
Run<?, ?> run = (Run<?, ?>) getObject();
40+
return run.getParent().getAction(ObjectMetadataAction.class);
41+
}
42+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package org.jenkinsci.plugins.github_branch_source;
2+
3+
import hudson.model.Actionable;
4+
import hudson.model.Run;
5+
import jenkins.model.details.Detail;
6+
import jenkins.model.details.DetailGroup;
7+
import jenkins.plugins.git.AbstractGitSCMSource;
8+
import jenkins.scm.api.SCMDetailGroup;
9+
import jenkins.scm.api.SCMRevision;
10+
import jenkins.scm.api.SCMRevisionAction;
11+
12+
public class GitHubCommitDetail extends Detail {
13+
public GitHubCommitDetail(Actionable object) {
14+
super(object);
15+
}
16+
17+
public String getIconClassName() {
18+
return "symbol-git-commit-outline plugin-ionicons-api";
19+
}
20+
21+
@Override
22+
public String getDisplayName() {
23+
SCMRevision revision = getRevision();
24+
25+
if (revision == null) {
26+
return null;
27+
}
28+
29+
if (revision instanceof AbstractGitSCMSource.SCMRevisionImpl abstractRevision) {
30+
return abstractRevision.getHash().substring(0, 7);
31+
}
32+
33+
if (revision instanceof PullRequestSCMRevision pullRequestSCMRevision) {
34+
return pullRequestSCMRevision.getPullHash().substring(0, 7);
35+
}
36+
37+
return null;
38+
}
39+
40+
@Override
41+
public String getLink() {
42+
SCMRevision revision = getRevision();
43+
44+
if (revision == null) {
45+
return null;
46+
}
47+
48+
if (revision instanceof AbstractGitSCMSource.SCMRevisionImpl abstractRevision) {
49+
return new GitHubRepositoryDetail(getObject()).getLink() + "/commit/" + abstractRevision.getHash();
50+
}
51+
52+
if (revision instanceof PullRequestSCMRevision pullRequestSCMRevision) {
53+
Run<?, ?> run = (Run<?, ?>) getObject();
54+
GitHubLink repoLink = run.getParent().getAction(GitHubLink.class);
55+
return repoLink.getUrl() + "/commits/" + pullRequestSCMRevision.getPullHash();
56+
}
57+
58+
return null;
59+
}
60+
61+
@Override
62+
public DetailGroup getGroup() {
63+
return SCMDetailGroup.get();
64+
}
65+
66+
private SCMRevision getRevision() {
67+
SCMRevisionAction scmRevisionAction = getObject().getAction(SCMRevisionAction.class);
68+
69+
if (scmRevisionAction == null) {
70+
return null;
71+
}
72+
73+
return scmRevisionAction.getRevision();
74+
}
75+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.jenkinsci.plugins.github_branch_source;
2+
3+
import edu.umd.cs.findbugs.annotations.NonNull;
4+
import hudson.Extension;
5+
import hudson.model.Run;
6+
import java.util.ArrayList;
7+
import java.util.Collections;
8+
import java.util.List;
9+
import jenkins.model.details.Detail;
10+
import jenkins.model.details.DetailFactory;
11+
import jenkins.scm.api.SCMRevision;
12+
import jenkins.scm.api.SCMRevisionAction;
13+
import jenkins.scm.api.SCMSource;
14+
15+
@Extension
16+
public final class GitHubDetailFactory extends DetailFactory<Run> {
17+
18+
@Override
19+
public Class<Run> type() {
20+
return Run.class;
21+
}
22+
23+
@NonNull
24+
@Override
25+
public List<? extends Detail> createFor(@NonNull Run target) {
26+
SCMSource src = SCMSource.SourceByItem.findSource(target.getParent());
27+
28+
// Don't add details for non-GitHub SCM sources
29+
if (!(src instanceof GitHubSCMSource)) {
30+
return Collections.emptyList();
31+
}
32+
33+
SCMRevisionAction scmRevisionAction = target.getAction(SCMRevisionAction.class);
34+
35+
if (scmRevisionAction == null) {
36+
return Collections.emptyList();
37+
}
38+
39+
List<Detail> details = new ArrayList<>();
40+
SCMRevision revision = scmRevisionAction.getRevision();
41+
42+
if (revision instanceof PullRequestSCMRevision) {
43+
details.add(new GitHubPullRequestDetail(target));
44+
} else {
45+
details.add(new GitHubBranchDetail(target));
46+
}
47+
48+
details.add(new GitHubCommitDetail(target));
49+
details.add(new GitHubRepositoryDetail(target));
50+
51+
return details;
52+
}
53+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.jenkinsci.plugins.github_branch_source;
2+
3+
import edu.umd.cs.findbugs.annotations.Nullable;
4+
import hudson.model.Actionable;
5+
import hudson.model.Run;
6+
import jenkins.model.details.Detail;
7+
import jenkins.model.details.DetailGroup;
8+
import jenkins.scm.api.SCMDetailGroup;
9+
import jenkins.scm.api.metadata.ObjectMetadataAction;
10+
11+
public class GitHubPullRequestDetail extends Detail {
12+
public GitHubPullRequestDetail(Actionable object) {
13+
super(object);
14+
}
15+
16+
@Nullable
17+
@Override
18+
public String getIconClassName() {
19+
return "symbol-git-pull-request-outline plugin-ionicons-api";
20+
}
21+
22+
@Nullable
23+
@Override
24+
public String getDisplayName() {
25+
return getObjectMetadataAction().getObjectDisplayName();
26+
}
27+
28+
@Override
29+
public String getLink() {
30+
return getObjectMetadataAction().getObjectUrl();
31+
}
32+
33+
@Override
34+
public DetailGroup getGroup() {
35+
return SCMDetailGroup.get();
36+
}
37+
38+
private ObjectMetadataAction getObjectMetadataAction() {
39+
Run<?, ?> run = (Run<?, ?>) getObject();
40+
return run.getParent().getAction(ObjectMetadataAction.class);
41+
}
42+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.jenkinsci.plugins.github_branch_source;
2+
3+
import edu.umd.cs.findbugs.annotations.Nullable;
4+
import hudson.model.Actionable;
5+
import hudson.model.Run;
6+
import jenkins.model.details.Detail;
7+
import jenkins.model.details.DetailGroup;
8+
import jenkins.scm.api.SCMDetailGroup;
9+
import jenkins.scm.api.SCMSource;
10+
11+
public class GitHubRepositoryDetail extends Detail {
12+
public GitHubRepositoryDetail(Actionable object) {
13+
super(object);
14+
}
15+
16+
@Nullable
17+
@Override
18+
public String getIconClassName() {
19+
return "symbol-logo-github plugin-ionicons-api";
20+
}
21+
22+
@Nullable
23+
@Override
24+
public String getDisplayName() {
25+
GitHubSCMSource source = getSCMSource();
26+
27+
if (source == null) {
28+
return null;
29+
}
30+
31+
return source.getRepoOwner() + "/" + source.getRepository();
32+
}
33+
34+
@Override
35+
public String getLink() {
36+
GitHubSCMSource source = getSCMSource();
37+
38+
if (source == null) {
39+
return null;
40+
}
41+
42+
return source.getRepositoryUrl();
43+
}
44+
45+
@Override
46+
public DetailGroup getGroup() {
47+
return SCMDetailGroup.get();
48+
}
49+
50+
private GitHubSCMSource getSCMSource() {
51+
var source = SCMSource.SourceByItem.findSource(((Run) getObject()).getParent());
52+
53+
if (source instanceof GitHubSCMSource githubSource) {
54+
return githubSource;
55+
}
56+
57+
return null;
58+
}
59+
}

src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@
6565
import java.util.Set;
6666
import java.util.logging.Level;
6767
import java.util.logging.Logger;
68+
import java.util.stream.Collectors;
69+
import java.util.stream.StreamSupport;
6870
import jenkins.model.Jenkins;
6971
import jenkins.plugins.git.traits.GitBrowserSCMSourceTrait;
7072
import jenkins.scm.api.SCMNavigator;
@@ -1134,8 +1136,25 @@ public void visitSources(SCMSourceObserver observer) throws IOException, Interru
11341136
} else {
11351137
repositories = org.listRepositories(100);
11361138
}
1139+
1140+
List<String> repoList = StreamSupport.stream(repositories.spliterator(), false)
1141+
.map(GHRepository::getName)
1142+
.collect(Collectors.toList());
1143+
1144+
String repoString = String.join(",", repoList);
1145+
1146+
listener.getLogger()
1147+
.println(GitHubConsoleNote.create(
1148+
System.currentTimeMillis(),
1149+
String.format("Found %d repositories: %s", repoList.size(), repoString)));
1150+
11371151
for (GHRepository repo : repositories) {
11381152
try {
1153+
listener.getLogger()
1154+
.println(GitHubConsoleNote.create(
1155+
System.currentTimeMillis(),
1156+
String.format("Processing repository: %s", repo.getName())));
1157+
11391158
if (repo.isArchived() && gitHubSCMNavigatorContext.isExcludeArchivedRepositories()) {
11401159
// exclude archived repositories
11411160
witness.record(repo.getName(), false);
@@ -1306,7 +1325,8 @@ private Iterable<GHRepository> searchRepositories(final GitHub github, final Git
13061325
if (!context.isExcludeForkedRepositories()) {
13071326
ghRepositorySearchBuilder.q("fork:true");
13081327
}
1309-
return ghRepositorySearchBuilder.list().withPageSize(100);
1328+
ghRepositorySearchBuilder.q("sort:name-asc");
1329+
return ghRepositorySearchBuilder.list().withPageSize(100).asList();
13101330
}
13111331

13121332
private GHOrganization getGhOrganization(final GitHub github) throws IOException {
@@ -1696,7 +1716,7 @@ public void afterSave(@NonNull SCMNavigatorOwner owner) {
16961716
} finally {
16971717
Connector.release(hub);
16981718
}
1699-
} catch (IOException e) {
1719+
} catch (Exception e) {
17001720
DescriptorImpl.LOGGER.log(Level.WARNING, e.getMessage(), e);
17011721
}
17021722
}

0 commit comments

Comments
 (0)