diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GitWebType.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GitWebType.java index 5ef6d6a071..063035c69f 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GitWebType.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GitWebType.java @@ -31,16 +31,18 @@ public class GitWebType { type.setProject("?p=${project}.git;a=summary"); type.setRevision("?p=${project}.git;a=commit;h=${commit}"); type.setBranch("?p=${project}.git;a=shortlog;h=${branch}"); + type.setRootTree("?p=${project}.git;a=tree;hb=${commit}"); + type.setFile("?p=${project}.git;hb=${commit};f=${file}"); type.setFileHistory("?p=${project}.git;a=history;hb=${branch};f=${file}"); - } else if (name.equalsIgnoreCase("cgit")) { type = new GitWebType(); type.setLinkName("cgit"); type.setProject("${project}.git/summary"); type.setRevision("${project}.git/commit/?id=${commit}"); type.setBranch("${project}.git/log/?h=${branch}"); + type.setRootTree("${project}.git/tree/?h=${commit}"); + type.setFile("${project}.git/tree/${file}?h=${commit}"); type.setFileHistory("${project}.git/log/${file}?h=${branch}"); - } else if (name.equalsIgnoreCase("custom")) { type = new GitWebType(); // The custom name is not defined, let's keep the old style of using GitWeb @@ -68,6 +70,12 @@ public class GitWebType { /** ParamertizedString for branch view url. */ private String branch; + /** ParamertizedString for root tree view url. */ + private String rootTree; + + /** ParamertizedString for file view url. */ + private String file; + /** ParamertizedString for file history view url. */ private String fileHistory; @@ -121,6 +129,24 @@ public class GitWebType { return revision; } + /** + * Get the String for root tree view. + * + * @return The String for root tree view + */ + public String getRootTree() { + return rootTree; + } + + /** + * Get the String for file view. + * + * @return The String for file view + */ + public String getFile() { + return file; + } + /** * Get the String for file history view. * @@ -183,6 +209,28 @@ public class GitWebType { } } + /** + * Set the pattern for root tree view. + * + * @param pattern The pattern for root tree view + */ + public void setRootTree(final String pattern) { + if (pattern != null && !pattern.isEmpty()) { + rootTree = pattern; + } + } + + /** + * Set the pattern for file view. + * + * @param pattern The pattern for file view + */ + public void setFile(final String pattern) { + if (pattern != null && !pattern.isEmpty()) { + file = pattern; + } + } + /** * Set the pattern for file history view. * diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GitwebLink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GitwebLink.java index 216395bb92..73feb766a4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GitwebLink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GitwebLink.java @@ -83,6 +83,18 @@ public class GitwebLink { return baseUrl + pattern.replace(p); } + public String toFile(String project, String commit, String file) { + Map p = new HashMap(); + p.put("project", encode(project)); + p.put("commit", encode(commit)); + p.put("file", encode(file)); + + ParameterizedString pattern = (file == null || file.isEmpty()) + ? new ParameterizedString(type.getRootTree()) + : new ParameterizedString(type.getFile()); + return baseUrl + pattern.replace(p); + } + public String toFileHistory(final Branch.NameKey branch, final String file) { ParameterizedString pattern = new ParameterizedString(type.getFileHistory()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java index 9292463195..2c136def4b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java @@ -16,14 +16,17 @@ package com.google.gerrit.client.diff; import com.google.gerrit.client.Dispatcher; import com.google.gerrit.client.Gerrit; +import com.google.gerrit.client.GitwebLink; import com.google.gerrit.client.changes.ChangeApi; import com.google.gerrit.client.changes.ChangeInfo; +import com.google.gerrit.client.changes.ChangeInfo.RevisionInfo; import com.google.gerrit.client.changes.ReviewInfo; import com.google.gerrit.client.changes.Util; import com.google.gerrit.client.patches.PatchUtil; import com.google.gerrit.client.rpc.CallbackGroup; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.NativeMap; +import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.client.rpc.RestApi; import com.google.gerrit.client.ui.InlineHyperlink; import com.google.gerrit.common.PageLinks; @@ -86,21 +89,32 @@ class Header extends Composite { this.patchSetId = patchSetId; this.path = path; - SafeHtml.setInnerHTML(filePath, formatPath(path)); + SafeHtml.setInnerHTML(filePath, formatPath(path, null, null)); up.setTargetHistoryToken(PageLinks.toChange( patchSetId.getParentKey(), base != null ? String.valueOf(base.get()) : null, String.valueOf(patchSetId.get()))); } - private static SafeHtml formatPath(String path) { + private static SafeHtml formatPath(String path, String project, String commit) { SafeHtmlBuilder b = new SafeHtmlBuilder(); if (Patch.COMMIT_MSG.equals(path)) { return b.append(Util.C.commitMessage()); } + GitwebLink gw = (project != null && commit != null) ? Gerrit.getGitwebLink() : null; int s = path.lastIndexOf('/') + 1; - b.append(path.substring(0, s)); + if (gw != null && s > 0) { + String base = path.substring(0, s - 1); + b.openAnchor() + .setAttribute("href", gw.toFile(project, commit, base)) + .setAttribute("title", gw.getLinkName()) + .append(base) + .closeAnchor() + .append('/'); + } else { + b.append(path.substring(0, s)); + } b.openElement("b"); b.append(path.substring(s)); b.closeElement("b"); @@ -159,6 +173,23 @@ class Header extends Composite { } void setChangeInfo(ChangeInfo info) { + GitwebLink gw = Gerrit.getGitwebLink(); + if (gw != null) { + for (RevisionInfo rev : Natives.asList(info.revisions().values())) { + if (rev._number() == patchSetId.get()) { + String c = rev.name(); + SafeHtml.setInnerHTML(filePath, formatPath(path, info.project(), c)); + SafeHtml.setInnerHTML(project, new SafeHtmlBuilder() + .openAnchor() + .setAttribute("href", gw.toFile(info.project(), c, "")) + .setAttribute("title", gw.getLinkName()) + .append(info.project()) + .closeAnchor()); + return; + } + } + } + project.setInnerText(info.project()); }