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 extends Detail> 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);
+ }
+}