diff --git a/pom.xml b/pom.xml index f68d7ed06..6970a34e1 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ 2.2.0 2.479 - ${jenkins.baseline}.1 + 2.498 true false diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubBranchDetail.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubBranchDetail.java new file mode 100644 index 000000000..ab5b93cc2 --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubBranchDetail.java @@ -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(); + } +} diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubCommitDetail.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubCommitDetail.java new file mode 100644 index 000000000..1345f9fe4 --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubCommitDetail.java @@ -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) { + 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(); + } +} diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubDetailFactory.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubDetailFactory.java new file mode 100644 index 000000000..7ecc36e0a --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubDetailFactory.java @@ -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 { + + @Override + public Class type() { + return Run.class; + } + + @NonNull + @Override + public List createFor(@NonNull Run target) { + SCMRevisionAction scmRevisionAction = target.getAction(SCMRevisionAction.class); + if (scmRevisionAction == null) { + return Collections.emptyList(); + } + + List 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; + } +} diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubPullRequestDetail.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubPullRequestDetail.java new file mode 100644 index 000000000..ce5bd618f --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubPullRequestDetail.java @@ -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(); + } +} diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubRepositoryDetail.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubRepositoryDetail.java new file mode 100644 index 000000000..102083963 --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubRepositoryDetail.java @@ -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(); + } +} diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/ScmDetailGroup.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/ScmDetailGroup.java new file mode 100644 index 000000000..e6b5d625b --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/ScmDetailGroup.java @@ -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 +@Extension(ordinal = -1) +public class ScmDetailGroup extends DetailGroup { + + public static ScmDetailGroup get() { + return ExtensionList.lookupSingleton(ScmDetailGroup.class); + } +}