Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
22269dd
Init
janfaracik Jan 13, 2025
2972f60
Update pom.xml
janfaracik Jan 13, 2025
70a2ec0
Push
janfaracik Jan 13, 2025
6aab691
Update GitHubDetailFactory.java
janfaracik Jan 13, 2025
1a83038
Simplify
janfaracik Jan 13, 2025
e00614a
Update GitHubBranchDetail.java
janfaracik Jan 13, 2025
d9e54f5
Update GitHubBranchDetail.java
janfaracik Jan 13, 2025
84f30a8
Semi working
janfaracik Jan 13, 2025
c5ea7ac
Update GitHubRepositoryDetail.java
janfaracik Jan 13, 2025
bdc8c7c
Update GitHubRepositoryDetail.java
janfaracik Jan 13, 2025
95a0202
Update GitHubPullRequestDetail.java
janfaracik Jan 13, 2025
63816db
Rough null checks...
janfaracik Jan 13, 2025
461177d
Spotless
janfaracik Jan 13, 2025
c87badb
Tidy up
janfaracik Jan 13, 2025
c755701
Update GitHubBranchDetail.java
janfaracik Jan 13, 2025
8e25978
Fix a few things
janfaracik Jan 14, 2025
e66c0e3
Drop isApplicable
janfaracik Jan 14, 2025
2a57ab6
Update GitHubDetailFactory.java
janfaracik Jan 14, 2025
dafc5c4
Update GitHubDetailFactory.java
janfaracik Jan 14, 2025
d90b1a9
Push
janfaracik Jan 15, 2025
857feaa
Update pom.xml
janfaracik Feb 18, 2025
b2212c7
Merge branch 'master' into detail-widget
janfaracik Feb 18, 2025
9f37620
Update GitHubRepositoryDetail.java
janfaracik Feb 18, 2025
7f0e5bf
Merge branch 'master' into detail-widget
janfaracik Sep 24, 2025
f3f8e59
Push
janfaracik Sep 26, 2025
d01e501
Remove comments
janfaracik Sep 26, 2025
2abc5b2
Update group
janfaracik Sep 26, 2025
ab18842
Merge branch 'master' into detail-widget
timja Sep 29, 2025
24e27b7
Update pom.xml
timja Sep 29, 2025
24ab3d1
Refine code, add tests
janfaracik Oct 6, 2025
d48c6a0
Spotless
janfaracik Oct 6, 2025
1e546fd
Update GitHubRepositoryDetail.java
janfaracik Oct 6, 2025
43592e6
Merge branch 'master' into detail-widget
janfaracik Oct 6, 2025
da8130c
Refine
janfaracik Oct 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<hpi.compatibleSinceVersion>2.2.0</hpi.compatibleSinceVersion>
<!-- https://www.jenkins.io/doc/developer/plugin-development/choosing-jenkins-baseline/ -->
<jenkins.baseline>2.504</jenkins.baseline>
<jenkins.version>${jenkins.baseline}.1</jenkins.version>
<jenkins.version>${jenkins.baseline}.3</jenkins.version>
<spotless.check.skip>false</spotless.check.skip>
</properties>

Expand All @@ -44,7 +44,7 @@
<dependency>
<groupId>io.jenkins.tools.bom</groupId>
<artifactId>bom-${jenkins.baseline}.x</artifactId>
<version>5294.va_d2e144c80e1</version>
<version>5506.va_222b_131ec34</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.jenkinsci.plugins.github_branch_source;

import edu.umd.cs.findbugs.annotations.Nullable;
import hudson.model.Actionable;
import hudson.model.Run;
import jenkins.model.details.Detail;
import jenkins.model.details.DetailGroup;
import jenkins.scm.api.SCMDetailGroup;
import jenkins.scm.api.metadata.ObjectMetadataAction;

public class GitHubBranchDetail extends Detail {
public GitHubBranchDetail(Actionable object) {
super(object);
}

@Nullable
@Override
public String getIconClassName() {
return "symbol-git-branch-outline plugin-ionicons-api";

Check warning on line 19 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubBranchDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 19 is not covered by tests
}

@Nullable
@Override
public String getDisplayName() {
return getObjectMetadataAction().getObjectDisplayName();
}

@Override
public String getLink() {
return getObjectMetadataAction().getObjectUrl();
}

@Override
public DetailGroup getGroup() {
return SCMDetailGroup.get();

Check warning on line 35 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubBranchDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 35 is not covered by tests
}

private ObjectMetadataAction getObjectMetadataAction() {
Run<?, ?> run = (Run<?, ?>) getObject();
return run.getParent().getAction(ObjectMetadataAction.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package org.jenkinsci.plugins.github_branch_source;

import hudson.model.Actionable;
import hudson.model.Run;
import jenkins.model.details.Detail;
import jenkins.model.details.DetailGroup;
import jenkins.plugins.git.AbstractGitSCMSource;
import jenkins.scm.api.SCMDetailGroup;
import jenkins.scm.api.SCMRevision;
import jenkins.scm.api.SCMRevisionAction;

public class GitHubCommitDetail extends Detail {
public GitHubCommitDetail(Actionable object) {
super(object);
}

public String getIconClassName() {
return "symbol-git-commit-outline plugin-ionicons-api";

Check warning on line 18 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubCommitDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 18 is not covered by tests
}

@Override
public String getDisplayName() {
SCMRevision revision = getRevision();

if (revision == null) {
return null;
}

if (revision instanceof AbstractGitSCMSource.SCMRevisionImpl abstractRevision) {
return abstractRevision.getHash().substring(0, 7);
}

if (revision instanceof PullRequestSCMRevision pullRequestSCMRevision) {

Check warning on line 33 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubCommitDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 33 is only partially covered, one branch is missing
return pullRequestSCMRevision.getPullHash().substring(0, 7);
}

return null;

Check warning on line 37 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubCommitDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 37 is not covered by tests
}

@Override
public String getLink() {
SCMRevision revision = getRevision();

if (revision == null) {
return null;
}

if (revision instanceof AbstractGitSCMSource.SCMRevisionImpl abstractRevision) {
return new GitHubRepositoryDetail(getObject()).getLink() + "/commit/" + abstractRevision.getHash();
}

if (revision instanceof PullRequestSCMRevision pullRequestSCMRevision) {

Check warning on line 52 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubCommitDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 52 is only partially covered, one branch is missing
Run<?, ?> run = (Run<?, ?>) getObject();
GitHubLink repoLink = run.getParent().getAction(GitHubLink.class);
return repoLink.getUrl() + "/commits/" + pullRequestSCMRevision.getPullHash();
}

return null;
}

@Override
public DetailGroup getGroup() {
return SCMDetailGroup.get();

Check warning on line 63 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubCommitDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 58-63 are not covered by tests
}

private SCMRevision getRevision() {
SCMRevisionAction scmRevisionAction = getObject().getAction(SCMRevisionAction.class);

if (scmRevisionAction == null) {
return null;
}

return scmRevisionAction.getRevision();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package org.jenkinsci.plugins.github_branch_source;

import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import hudson.model.Run;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import jenkins.model.details.Detail;
import jenkins.model.details.DetailFactory;
import jenkins.scm.api.SCMRevision;
import jenkins.scm.api.SCMRevisionAction;
import jenkins.scm.api.SCMSource;

@Extension
public final class GitHubDetailFactory extends DetailFactory<Run> {

@Override
public Class<Run> type() {
return Run.class;

Check warning on line 20 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubDetailFactory.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 20 is not covered by tests
}

@NonNull
@Override
public List<? extends Detail> createFor(@NonNull Run target) {
SCMSource src = SCMSource.SourceByItem.findSource(target.getParent());

// Don't add details for non-GitHub SCM sources
if (!(src instanceof GitHubSCMSource)) {
return Collections.emptyList();
}

SCMRevisionAction scmRevisionAction = target.getAction(SCMRevisionAction.class);

if (scmRevisionAction == null) {

Check warning on line 35 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubDetailFactory.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 35 is only partially covered, one branch is missing
return Collections.emptyList();

Check warning on line 36 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubDetailFactory.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 36 is not covered by tests
}

List<Detail> details = new ArrayList<>();
SCMRevision revision = scmRevisionAction.getRevision();

if (revision instanceof PullRequestSCMRevision) {
details.add(new GitHubPullRequestDetail(target));
} else {
details.add(new GitHubBranchDetail(target));
}

details.add(new GitHubCommitDetail(target));
details.add(new GitHubRepositoryDetail(target));

return details;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.jenkinsci.plugins.github_branch_source;

import edu.umd.cs.findbugs.annotations.Nullable;
import hudson.model.Actionable;
import hudson.model.Run;
import jenkins.model.details.Detail;
import jenkins.model.details.DetailGroup;
import jenkins.scm.api.SCMDetailGroup;
import jenkins.scm.api.metadata.ObjectMetadataAction;

public class GitHubPullRequestDetail extends Detail {
public GitHubPullRequestDetail(Actionable object) {
super(object);
}

@Nullable
@Override
public String getIconClassName() {
return "symbol-git-pull-request-outline plugin-ionicons-api";
}

@Nullable
@Override
public String getDisplayName() {
return getObjectMetadataAction().getObjectDisplayName();
}

@Override
public String getLink() {
return getObjectMetadataAction().getObjectUrl();
}

@Override
public DetailGroup getGroup() {
return SCMDetailGroup.get();
}

private ObjectMetadataAction getObjectMetadataAction() {
Run<?, ?> run = (Run<?, ?>) getObject();
return run.getParent().getAction(ObjectMetadataAction.class);

Check warning on line 40 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubPullRequestDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 19-40 are not covered by tests
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package org.jenkinsci.plugins.github_branch_source;

import edu.umd.cs.findbugs.annotations.Nullable;
import hudson.model.Actionable;
import hudson.model.Run;
import jenkins.model.details.Detail;
import jenkins.model.details.DetailGroup;
import jenkins.scm.api.SCMDetailGroup;
import jenkins.scm.api.SCMSource;

public class GitHubRepositoryDetail extends Detail {
public GitHubRepositoryDetail(Actionable object) {
super(object);
}

@Nullable
@Override
public String getIconClassName() {
return "symbol-logo-github plugin-ionicons-api";

Check warning on line 19 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubRepositoryDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 19 is not covered by tests
}

@Nullable
@Override
public String getDisplayName() {
GitHubSCMSource source = getSCMSource();

if (source == null) {
return null;
}

return source.getRepoOwner() + "/" + source.getRepository();
}

@Override
public String getLink() {
GitHubSCMSource source = getSCMSource();

if (source == null) {
return null;
}

return source.getRepositoryUrl();
}

@Override
public DetailGroup getGroup() {
return SCMDetailGroup.get();

Check warning on line 47 in src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubRepositoryDetail.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 47 is not covered by tests
}

private GitHubSCMSource getSCMSource() {
var source = SCMSource.SourceByItem.findSource(((Run) getObject()).getParent());

if (source instanceof GitHubSCMSource githubSource) {
return githubSource;
}

return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.jenkinsci.plugins.github_branch_source;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

import hudson.model.Job;
import hudson.model.Run;
import jenkins.scm.api.metadata.ObjectMetadataAction;
import org.junit.jupiter.api.Test;

class GitHubBranchDetailTest {

@Test
void displaysAsExpected() {
Run run = mock(Run.class);
Job job = mock(Job.class);
when(run.getParent()).thenReturn(job);
ObjectMetadataAction metadata = mock(ObjectMetadataAction.class);
when(metadata.getObjectDisplayName()).thenReturn("main");
when(metadata.getObjectUrl()).thenReturn("https://github.com/octo/hello-world/tree/main");
when(job.getAction(ObjectMetadataAction.class)).thenReturn(metadata);

GitHubBranchDetail detail = new GitHubBranchDetail(run);

assertEquals("main", detail.getDisplayName());
assertEquals("https://github.com/octo/hello-world/tree/main", detail.getLink());
}
}
Loading