Skip to content

Add GitHub branch and pull request info to the 'Details' widget #826

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 23 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion 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.479</jenkins.baseline>
<jenkins.version>${jenkins.baseline}.1</jenkins.version>
<jenkins.version>2.498</jenkins.version>
<useBeta>true</useBeta>
<spotless.check.skip>false</spotless.check.skip>
</properties>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
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.SCMHead;
import jenkins.scm.api.SCMRevision;
import jenkins.scm.api.SCMRevisionAction;
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";
}

@Nullable
@Override
public String getDisplayName() {
SCMRevisionAction scmRevisionAction = getObject().getAction(SCMRevisionAction.class);
SCMRevision revision = scmRevisionAction.getRevision();

if (revision instanceof PullRequestSCMRevision pullRequestSCMRevision) {
PullRequestSCMHead head = (PullRequestSCMHead) pullRequestSCMRevision.getHead();
return head.getSourceBranch();
}

SCMHead head = revision.getHead();
return head.getName();
}

@Override
public String getLink() {
var run = (Run<?, ?>) getObject();
ObjectMetadataAction action = run.getParent().getAction(ObjectMetadataAction.class);
return action.getObjectUrl();
}

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

Check warning on line 48 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 lines

Lines 15-48 are not covered by tests
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
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.SCMRevision;
import jenkins.scm.api.SCMRevisionAction;
import jenkins.scm.api.SCMSource;

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

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

@Override
public String getDisplayName() {
SCMRevisionAction scmRevisionAction = getObject().getAction(SCMRevisionAction.class);
SCMRevision revision = scmRevisionAction.getRevision();

if (revision instanceof AbstractGitSCMSource.SCMRevisionImpl abstractRevision) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

potentially belongs in the Git plugin? and then this plugin only handles the pull request one?

Although not sure if you could figure out the link from there, maybe you can though?

return abstractRevision.getHash().substring(0, 7);
} else if (revision instanceof PullRequestSCMRevision pullRequestSCMRevision) {
return pullRequestSCMRevision.getPullHash().substring(0, 7);
}

return null;
}

@Override
public String getLink() {
SCMRevisionAction scmRevisionAction = getObject().getAction(SCMRevisionAction.class);
SCMRevision revision = scmRevisionAction.getRevision();

if (revision instanceof AbstractGitSCMSource.SCMRevisionImpl abstractRevision) {
GitHubSCMSource src = (GitHubSCMSource) SCMSource.SourceByItem.findSource(((Run) getObject()).getParent());

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

// TODO - ends with .git
return src.getRepositoryUrl() + "/commit/" + abstractRevision.getHash();
} else if (revision instanceof PullRequestSCMRevision pullRequestSCMRevision) {
var 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 60 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 14-60 are not covered by tests
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
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;

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

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

@NonNull
@Override
public List<? extends Detail> createFor(@NonNull Run target) {
SCMRevisionAction scmRevisionAction = target.getAction(SCMRevisionAction.class);
if (scmRevisionAction == null) {
return Collections.emptyList();
}

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;

Check warning on line 43 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 lines

Lines 15-43 are not covered by tests
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
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.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() {
var run = (Run<?, ?>) getObject();
ObjectMetadataAction action = run.getParent().getAction(ObjectMetadataAction.class);
return action.getObjectDisplayName();
}

@Override
public String getLink() {
var run = (Run<?, ?>) getObject();
GitHubLink repoLink = run.getParent().getAction(GitHubLink.class);
return repoLink.getUrl();
}

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

Check warning on line 38 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 12-38 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.SCMSource;

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

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

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

if (!(source instanceof GitHubSCMSource)) {
return null;
}

return (GitHubSCMSource) source;
}

@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;
}

// TODO - Has .git on the end
return source.getRepositoryUrl();
}

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

Check warning on line 57 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 lines

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

import hudson.Extension;
import hudson.ExtensionList;
import jenkins.model.details.DetailGroup;

// TODO - Should be moved to parent plugin
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be moved to scm-api I think?

@Extension(ordinal = -1)
public class ScmDetailGroup extends DetailGroup {

public static ScmDetailGroup get() {
return ExtensionList.lookupSingleton(ScmDetailGroup.class);

Check warning on line 12 in src/main/java/org/jenkinsci/plugins/github_branch_source/ScmDetailGroup.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 9-12 are not covered by tests
}
}