Link the tree of the filename in SideBySide2 to gitweb

It is often convenient to be able to see the files in the same
tree as the file being reviewed. Update the gitweb linker to
support linking to a specific revision and file.  Link the base
of the filename to the tree and link the project name to the root
tree.

Change-Id: I11a969e9b1d14ea4180699ae9c02a6a62147d3de
This commit is contained in:
Colby Ranger
2013-12-16 10:52:42 -08:00
parent 7c65557917
commit ac2f30c3e0
3 changed files with 96 additions and 5 deletions

View File

@@ -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.
*

View File

@@ -83,6 +83,18 @@ public class GitwebLink {
return baseUrl + pattern.replace(p);
}
public String toFile(String project, String commit, String file) {
Map<String, String> p = new HashMap<String, String>();
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());

View File

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