Add Sub Navbar Support To Gitiles
This change allows subdirectories to specify their own navbars
only when the subnavbar markdown config is specified.
Resolves #148.
Change-Id: I2013bf5798a098f0340e3cf6a0ee91286432edc0
diff --git a/java/com/google/gitiles/doc/DocServlet.java b/java/com/google/gitiles/doc/DocServlet.java
index 1a4fce9..61adfe2 100644
--- a/java/com/google/gitiles/doc/DocServlet.java
+++ b/java/com/google/gitiles/doc/DocServlet.java
@@ -109,7 +109,7 @@
return;
}
- MarkdownFile navmd = findFile(rw, root, NAVBAR_MD);
+ MarkdownFile navmd = findNavbar(rw, root, path);
String curEtag = etag(srcmd, navmd);
if (etagMatch(req, curEtag)) {
res.setStatus(SC_NOT_MODIFIED);
@@ -167,6 +167,26 @@
return h.hash().toString();
}
+ private MarkdownFile findNavbar(RevWalk rw, RevTree root, String path)
+ throws IOException {
+ if (!Strings.isNullOrEmpty(path)) {
+ // Traverse up the path until we find a NAVBAR_MD.
+ StringBuilder pathRemaining = new StringBuilder(path);
+ while (pathRemaining.length() > 0) {
+ int lastPathSeparatorIndex = pathRemaining.lastIndexOf("/");
+ pathRemaining.setLength(lastPathSeparatorIndex + 1);
+ MarkdownFile navmd = findFile(rw, root, pathRemaining.toString() + NAVBAR_MD);
+ if (navmd != null) {
+ return navmd;
+ }
+ pathRemaining.setLength(Math.max(lastPathSeparatorIndex, 0));
+ }
+ return null;
+ }
+
+ return findFile(rw, root, NAVBAR_MD);
+ }
+
private void showDoc(
HttpServletRequest req,
HttpServletResponse res,
diff --git a/javatests/com/google/gitiles/doc/DocServletTest.java b/javatests/com/google/gitiles/doc/DocServletTest.java
index c27f0ba..782fc5c 100644
--- a/javatests/com/google/gitiles/doc/DocServletTest.java
+++ b/javatests/com/google/gitiles/doc/DocServletTest.java
@@ -58,6 +58,48 @@
}
@Test
+ public void simpleSubNavbar() throws Exception {
+ String rootNavbar =
+ "# Site Title\n\n* [Home](index.md)\n* [README](README.md)\n";
+ String subNavbar =
+ "# Subdir Title\n\n* [Sub Home](index.md)\n* [Sub README](README.md)\n";
+ repo.branch("master")
+ .commit()
+ .add("README.md", "# page\n\nof information.")
+ .add("navbar.md", rootNavbar)
+ .add("subdir/README.md", "# subdir page\n\nof information.")
+ .add("subdir/navbar.md", subNavbar)
+ .create();
+
+ String rootReadmeHtml = buildHtml("/repo/+doc/master/README.md");
+ assertThat(rootReadmeHtml).contains("<title>Site Title - page</title>");
+
+ assertThat(rootReadmeHtml).contains("<span class=\"Header-anchorTitle\">Site Title</span>");
+ assertThat(rootReadmeHtml).contains("<li><a href=\"/b/repo/+/master/index.md\">Home</a></li>");
+ assertThat(rootReadmeHtml)
+ .contains("<li><a href=\"/b/repo/+/master/README.md\">README</a></li>");
+ assertThat(rootReadmeHtml)
+ .contains("<h1><a class=\"h\" name=\"page\" href=\"#page\"><span></span></a>page</h1>");
+
+ String subdirReadmeHtml = buildHtml("/repo/+doc/master/subdir/README.md");
+ assertThat(subdirReadmeHtml).contains("<title>Subdir Title - subdir page</title>");
+
+ assertThat(subdirReadmeHtml).contains("<span class=\"Header-anchorTitle\">Subdir Title</span>");
+ assertThat(subdirReadmeHtml)
+ .contains("<li><a href=\"/b/repo/+/master/subdir/index.md\">Sub Home</a></li>");
+ assertThat(subdirReadmeHtml)
+ .contains("<li><a href=\"/b/repo/+/master/subdir/README.md\">Sub README</a></li>");
+ assertThat(subdirReadmeHtml)
+ .contains(
+ "<h1><a class=\"h\" name=\"subdir-page\" href=\"#subdir-page\"><span></span>"
+ + "</a>subdir page</h1>");
+ assertThat(subdirReadmeHtml)
+ .doesNotContain("<li><a href=\"/b/repo/+/master/index.md\">Home</a></li>");
+ assertThat(subdirReadmeHtml)
+ .doesNotContain("<li><a href=\"/b/repo/+/master/README.md\">README</a></li>");
+ }
+
+ @Test
public void dropsHtml() throws Exception {
String markdown =
"# B. Ad\n"