Set correct target url for symlinks When attemting to resolv targetUrl for a symlink dirname was calculated incorrectly. After removing all trailing slashes the index of the last '/' was calculated in an effort to get the dirname part from what was before this last slash. When attempting to remove the last slash and everything after it the index was unnecesarily decremented by one which lead to a faulty targetUrl and a faulty link to the symlink target in the UI. path = "foo/bar" lastSlashIndex = 3 dirPath = "foo/bar".substring(0, 3-1) => "fo" So if symlink "./foo/bar" had target "./foo/bar.md" the link to target would be "./fo/bar.md". Gitiles Bug: https://github.com/google/gitiles/issues/144 Change-Id: I14d6631b2ba7879ca66c091b90daf18e8763f314
diff --git a/java/com/google/gitiles/PathServlet.java b/java/com/google/gitiles/PathServlet.java index df24062..26de757 100644 --- a/java/com/google/gitiles/PathServlet.java +++ b/java/com/google/gitiles/PathServlet.java
@@ -578,7 +578,7 @@ } int lastSlash = path.lastIndexOf('/'); if (lastSlash > 0) { - return path.substring(0, lastSlash - 1); + return path.substring(0, lastSlash); } else if (lastSlash == 0) { return "/"; } else {
diff --git a/javatests/com/google/gitiles/PathServletTest.java b/javatests/com/google/gitiles/PathServletTest.java index 4311833..a32de9f 100644 --- a/javatests/com/google/gitiles/PathServletTest.java +++ b/javatests/com/google/gitiles/PathServletTest.java
@@ -149,23 +149,12 @@ @Test public void symlinkHtml() throws Exception { - final RevBlob link = repo.blob("foo"); - repo.branch("master") - .commit() - .add("foo", "contents") - .edit( - new PathEdit("bar") { - @Override - public void apply(DirCacheEntry ent) { - ent.setFileMode(FileMode.SYMLINK); - ent.setObjectId(link); - } - }) - .create(); + testSymlink("foo", "bar", "foo"); + } - Map<String, ?> data = buildData("/repo/+/master/bar"); - assertThat(data).containsEntry("type", "SYMLINK"); - assertThat(getBlobData(data)).containsEntry("target", "foo"); + @Test + public void relativeSymlinkHtml() throws Exception { + testSymlink("foo/bar", "foo/baz", "./bar"); } @Test @@ -410,6 +399,28 @@ assertThat(res.getHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo(null); } + private void testSymlink(String linkTarget, String linkName, String linkContent) + throws Exception { + final RevBlob linkBlob = repo.blob(linkContent); + repo.branch("master") + .commit() + .add(linkTarget, "contents") + .edit( + new PathEdit(linkName) { + @Override + public void apply(DirCacheEntry ent) { + ent.setFileMode(FileMode.SYMLINK); + ent.setObjectId(linkBlob); + } + }) + .create(); + + Map<String, ?> data = buildData("/repo/+/master/" + linkName); + assertThat(data).containsEntry("type", "SYMLINK"); + assertThat(getBlobData(data)).containsEntry("target", linkContent); + assertThat(getBlobData(data)).containsEntry("targetUrl", "/b/repo/+/master/" + linkTarget); + } + private Map<String, ?> getBlobData(Map<String, ?> data) { return ((Map<String, Map<String, ?>>) data).get("data"); }