diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt index 1db27d5a39..2f4c46c598 100644 --- a/Documentation/dev-plugins.txt +++ b/Documentation/dev-plugins.txt @@ -2241,7 +2241,8 @@ public class MyWeblinkPlugin implements PatchSetWebLink { private String imageUrl = "http://placehold.it/16x16.gif"; @Override - public WebLinkInfo getPatchSetWebLink(String projectName, String commit) { + public WebLinkInfo getPatchSetWebLink(String projectName, String commit, + String subject, String branchName) { return new WebLinkInfo(name, imageUrl, String.format(placeHolderUrlProjectCommit, project, commit), diff --git a/java/com/google/gerrit/extensions/webui/ParentWebLink.java b/java/com/google/gerrit/extensions/webui/ParentWebLink.java index dfc970d5b0..2176e78090 100644 --- a/java/com/google/gerrit/extensions/webui/ParentWebLink.java +++ b/java/com/google/gerrit/extensions/webui/ParentWebLink.java @@ -30,10 +30,13 @@ public interface ParentWebLink extends WebLink { * *

* - * @param projectName Name of the project - * @param commit Commit sha1 of the parent revision + * @param projectName name of the project + * @param commit commit sha1 of the parent revision + * @param subject first line of the commit message + * @param branchName target branch of the change * @return WebLinkInfo that links to parent commit in external service, null if there should be no * link. */ - WebLinkInfo getParentWebLink(String projectName, String commit); + WebLinkInfo getParentWebLink( + String projectName, String commit, String subject, String branchName); } diff --git a/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java b/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java index 93fe8e105c..b8ba5c4402 100644 --- a/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java +++ b/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java @@ -30,10 +30,13 @@ public interface PatchSetWebLink extends WebLink { * *

* - * @param projectName Name of the project - * @param commit Commit of the patch set + * @param projectName name of the project + * @param commit commit of the patch set + * @param subject first line of the commit message + * @param branchName target branch of the change * @return WebLinkInfo that links to patch set in external service, null if there should be no * link. */ - WebLinkInfo getPatchSetWebLink(String projectName, String commit); + WebLinkInfo getPatchSetWebLink( + String projectName, String commit, String subject, String branchName); } diff --git a/java/com/google/gerrit/server/WebLinks.java b/java/com/google/gerrit/server/WebLinks.java index 88b0b215ad..47ba32556b 100644 --- a/java/com/google/gerrit/server/WebLinks.java +++ b/java/com/google/gerrit/server/WebLinks.java @@ -86,19 +86,29 @@ public class WebLinks { /** * @param project Project name. * @param commit SHA1 of commit. + * @param subject subject of the commit. + * @param branchName branch of the commit. * @return Links for patch sets. */ - public ImmutableList getPatchSetLinks(Project.NameKey project, String commit) { - return filterLinks(patchSetLinks, webLink -> webLink.getPatchSetWebLink(project.get(), commit)); + public ImmutableList getPatchSetLinks( + Project.NameKey project, String commit, String subject, String branchName) { + return filterLinks( + patchSetLinks, + webLink -> webLink.getPatchSetWebLink(project.get(), commit, subject, branchName)); } /** * @param project Project name. * @param revision SHA1 of the parent revision. + * @param subject subject of the parent revision. + * @param branchName branch of the revision (and parent revision). * @return Links for patch sets. */ - public ImmutableList getParentLinks(Project.NameKey project, String revision) { - return filterLinks(parentLinks, webLink -> webLink.getParentWebLink(project.get(), revision)); + public ImmutableList getParentLinks( + Project.NameKey project, String revision, String subject, String branchName) { + return filterLinks( + parentLinks, + webLink -> webLink.getParentWebLink(project.get(), revision, subject, branchName)); } /** diff --git a/java/com/google/gerrit/server/change/RevisionJson.java b/java/com/google/gerrit/server/change/RevisionJson.java index 414107f16f..90caea0e7d 100644 --- a/java/com/google/gerrit/server/change/RevisionJson.java +++ b/java/com/google/gerrit/server/change/RevisionJson.java @@ -164,7 +164,12 @@ public class RevisionJson { * RevWalk and assumes it is backed by an open repository. */ public CommitInfo getCommitInfo( - Project.NameKey project, RevWalk rw, RevCommit commit, boolean addLinks, boolean fillCommit) + Project.NameKey project, + RevWalk rw, + RevCommit commit, + boolean addLinks, + boolean fillCommit, + String branchName) throws IOException { CommitInfo info = new CommitInfo(); if (fillCommit) { @@ -177,7 +182,8 @@ public class RevisionJson { info.message = commit.getFullMessage(); if (addLinks) { - ImmutableList links = webLinks.getPatchSetLinks(project, commit.name()); + ImmutableList links = + webLinks.getPatchSetLinks(project, commit.name(), commit.getShortMessage(), branchName); info.webLinks = links.isEmpty() ? null : links; } @@ -187,7 +193,8 @@ public class RevisionJson { i.commit = parent.name(); i.subject = parent.getShortMessage(); if (addLinks) { - ImmutableList parentLinks = webLinks.getParentLinks(project, parent.name()); + ImmutableList parentLinks = + webLinks.getParentLinks(project, parent.name(), parent.getShortMessage(), branchName); i.webLinks = parentLinks.isEmpty() ? null : parentLinks; } info.parents.add(i); @@ -288,11 +295,12 @@ public class RevisionJson { String rev = in.commitId().name(); RevCommit commit = rw.parseCommit(ObjectId.fromString(rev)); rw.parseBody(commit); + String branchName = cd.change().getDest().branch(); if (setCommit) { - out.commit = getCommitInfo(project, rw, commit, has(WEB_LINKS), fillCommit); + out.commit = getCommitInfo(project, rw, commit, has(WEB_LINKS), fillCommit, branchName); } if (addFooters) { - Ref ref = repo.exactRef(cd.change().getDest().branch()); + Ref ref = repo.exactRef(branchName); RevCommit mergeTip = null; if (ref != null) { mergeTip = rw.parseCommit(ref.getObjectId()); diff --git a/java/com/google/gerrit/server/config/GitwebConfig.java b/java/com/google/gerrit/server/config/GitwebConfig.java index b5f09fd772..3340a52292 100644 --- a/java/com/google/gerrit/server/config/GitwebConfig.java +++ b/java/com/google/gerrit/server/config/GitwebConfig.java @@ -327,8 +327,10 @@ public class GitwebConfig { } @Override - public WebLinkInfo getPatchSetWebLink(String projectName, String commit) { + public WebLinkInfo getPatchSetWebLink( + String projectName, String commit, String subject, String branchName) { if (revision != null) { + // subject and branchName are not needed, hence not used. return link( revision .replace("project", encode(projectName)) @@ -339,9 +341,10 @@ public class GitwebConfig { } @Override - public WebLinkInfo getParentWebLink(String projectName, String commit) { + public WebLinkInfo getParentWebLink( + String projectName, String commit, String subject, String branchName) { // For Gitweb treat parent revision links the same as patch set links - return getPatchSetWebLink(projectName, commit); + return getPatchSetWebLink(projectName, commit, subject, branchName); } @Override diff --git a/java/com/google/gerrit/server/restapi/change/GetCommit.java b/java/com/google/gerrit/server/restapi/change/GetCommit.java index 21a08dcd23..d76ce041f6 100644 --- a/java/com/google/gerrit/server/restapi/change/GetCommit.java +++ b/java/com/google/gerrit/server/restapi/change/GetCommit.java @@ -58,7 +58,13 @@ public class GetCommit implements RestReadView { rw.parseBody(commit); CommitInfo info = json.create(ImmutableSet.of()) - .getCommitInfo(rsrc.getProject(), rw, commit, addLinks, true); + .getCommitInfo( + rsrc.getProject(), + rw, + commit, + addLinks, + /* fillCommit= */ true, + rsrc.getChange().getDest().branch()); Response r = Response.ok(info); if (rsrc.isCacheable()) { r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); diff --git a/java/com/google/gerrit/server/restapi/change/GetMergeList.java b/java/com/google/gerrit/server/restapi/change/GetMergeList.java index 0c67fd639c..f0639b51f8 100644 --- a/java/com/google/gerrit/server/restapi/change/GetMergeList.java +++ b/java/com/google/gerrit/server/restapi/change/GetMergeList.java @@ -81,7 +81,14 @@ public class GetMergeList implements RestReadView { List result = new ArrayList<>(commits.size()); RevisionJson changeJson = json.create(ImmutableSet.of()); for (RevCommit c : commits) { - result.add(changeJson.getCommitInfo(rsrc.getProject(), rw, c, addLinks, true)); + result.add( + changeJson.getCommitInfo( + rsrc.getProject(), + rw, + c, + addLinks, + /* fillCommit= */ true, + rsrc.getChange().getDest().branch())); } return createResponse(rsrc, result); } diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java index f59fba04f3..d108fea137 100644 --- a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java +++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java @@ -91,6 +91,7 @@ import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.entities.Account; import com.google.gerrit.entities.AccountGroup; import com.google.gerrit.entities.Address; +import com.google.gerrit.entities.BranchNameKey; import com.google.gerrit.entities.Change; import com.google.gerrit.entities.LabelFunction; import com.google.gerrit.entities.LabelType; @@ -154,6 +155,7 @@ import com.google.gerrit.server.ChangeMessagesUtil; import com.google.gerrit.server.StarredChangesUtil; import com.google.gerrit.server.change.ChangeResource; import com.google.gerrit.server.change.testing.TestChangeETagComputation; +import com.google.gerrit.server.git.ChangeMessageModifier; import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gerrit.server.index.change.ChangeIndex; import com.google.gerrit.server.index.change.ChangeIndexCollection; @@ -2922,14 +2924,19 @@ public class ChangeIT extends AbstractDaemonTest { public void customCommitFooters() throws Exception { PushOneCommit.Result change = createChange(); ChangeInfo actual; - try (Registration registration = - extensionRegistry - .newRegistration() - .add( - (newCommitMessage, original, mergeTip, destination) -> { - assertThat(original.getName()).isNotEqualTo(mergeTip.getName()); - return newCommitMessage + "Custom: " + destination.branch(); - })) { + ChangeMessageModifier link = + new ChangeMessageModifier() { + @Override + public String onSubmit( + String newCommitMessage, + RevCommit original, + RevCommit mergeTip, + BranchNameKey destination) { + assertThat(original.getName()).isNotEqualTo(mergeTip.getName()); + return newCommitMessage + "Custom: " + destination.branch(); + } + }; + try (Registration registration = extensionRegistry.newRegistration().add(link)) { actual = gApi.changes().id(change.getChangeId()).get(ALL_REVISIONS, COMMIT_FOOTERS); } List footers = diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java index 839b0519cf..7662a54618 100644 --- a/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java +++ b/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java @@ -1573,7 +1573,8 @@ public class RevisionIT extends AbstractDaemonTest { PatchSetWebLink link = new PatchSetWebLink() { @Override - public WebLinkInfo getPatchSetWebLink(String projectName, String commit) { + public WebLinkInfo getPatchSetWebLink( + String projectName, String commit, String subject, String branchName) { return expectedWebLinkInfo; } };