Markdown: render /+/foo.md as markdown Default to the rendered version of a markdown file when it is clicked on in a tree or navigated to using /+/ operator in URL. Change-Id: I385e6fb6fe2cfcddf6ef8b0d0f4192e920e848e5
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java index ae13a31..ddb0abf 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
@@ -244,6 +244,7 @@ return new RefServlet(accessFactory, renderer, timeCache); case REVISION: return new RevisionServlet(accessFactory, renderer, linkifier()); + case SHOW: case PATH: return new PathServlet(accessFactory, renderer, urls); case DIFF:
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java index 64c5177..b6223f4 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
@@ -61,6 +61,7 @@ REFS, REVISION, PATH, + SHOW, DIFF, LOG, DESCRIBE, @@ -108,6 +109,7 @@ case DOC: case ARCHIVE: case BLAME: + case SHOW: path = other.path; // Fallthrough. case REVISION: @@ -227,6 +229,7 @@ switch (type) { case PATH: case DIFF: + case SHOW: checkState(path != null, "cannot set null path on %s view", type); break; case BLAME: @@ -312,6 +315,7 @@ checkRevision(); break; case PATH: + case SHOW: checkPath(); break; case DIFF: @@ -417,6 +421,10 @@ return new Builder(Type.PATH); } + public static Builder show() { + return new Builder(Type.SHOW); + } + public static Builder diff() { return new Builder(Type.DIFF); } @@ -598,6 +606,10 @@ url.append(repositoryName).append("/+/").append(revision.getName()).append('/') .append(path); break; + case SHOW: + url.append(repositoryName).append("/+show/").append(revision.getName()) + .append('/').append(path); + break; case DIFF: url.append(repositoryName).append("/+/"); if (isFirstParent(revision, oldRevision)) { @@ -625,7 +637,13 @@ .append(path); break; case DOC: - url.append(repositoryName).append("/+doc/").append(revision.getName()); + url.append(repositoryName); + if (path != null && path.endsWith(".md")) { + url.append("/+/"); + } else { + url.append("/+doc/"); + } + url.append(revision.getName()); if (path != null) { url.append('/').append(path); }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java index 99259d6..d8a0420 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
@@ -213,9 +213,15 @@ } if (result.getOldRevision() != null) { return parseDiffCommand(repoName, result); - } else { - return parseShowCommand(repoName, result); } + GitilesView.Builder b = parseShowCommand(repoName, result); + if (b != null && b.getPathPart() != null && b.getPathPart().endsWith(".md")) { + return GitilesView.doc() + .setRepositoryName(repoName) + .setRevision(result.getRevision()) + .setPathPart(result.getPath()); + } + return b; } private GitilesView.Builder parseBlameCommand(
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java index b6a1b82..e6d37a0 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
@@ -170,7 +170,7 @@ data.put("pageTitle", MoreObjects.firstNonNull( MarkdownUtil.getTitle(doc), view.getPathPart())); - data.put("sourceUrl", GitilesView.path().copyFrom(view).toUrl()); + data.put("sourceUrl", GitilesView.show().copyFrom(view).toUrl()); data.put("logUrl", GitilesView.log().copyFrom(view).toUrl()); data.put("blameUrl", GitilesView.blame().copyFrom(view).toUrl()); data.put("navbarHtml", new MarkdownToHtml(view).toSoyHtml(nav));
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java index 76e7c01..9e6ddd8 100644 --- a/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java +++ b/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java
@@ -264,6 +264,69 @@ } @Test + public void oneDocFileAuto() throws Exception { + ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234"); + GitilesView view = GitilesView.doc() + .copyFrom(HOST) + .setRepositoryName("foo/bar") + .setRevision(Revision.unpeeled("master", id)) + .setPathPart("/README.md") + .build(); + + assertEquals("/b", view.getServletPath()); + assertEquals(Type.DOC, view.getType()); + assertEquals("host", view.getHostName()); + assertEquals("foo/bar", view.getRepositoryName()); + assertEquals(id, view.getRevision().getId()); + assertEquals("master", view.getRevision().getName()); + assertEquals("README.md", view.getPathPart()); + assertTrue(HOST.getParameters().isEmpty()); + assertEquals("/b/foo/bar/+/master/README.md", view.toUrl()); + } + + @Test + public void oneDocTree() throws Exception { + ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234"); + GitilesView view = GitilesView.doc() + .copyFrom(HOST) + .setRepositoryName("foo/bar") + .setRevision(Revision.unpeeled("master", id)) + .setPathPart("/docs/") + .build(); + + assertEquals("/b", view.getServletPath()); + assertEquals(Type.DOC, view.getType()); + assertEquals("host", view.getHostName()); + assertEquals("foo/bar", view.getRepositoryName()); + assertEquals(id, view.getRevision().getId()); + assertEquals("master", view.getRevision().getName()); + assertEquals("docs", view.getPathPart()); + assertTrue(HOST.getParameters().isEmpty()); + assertEquals("/b/foo/bar/+doc/master/docs", view.toUrl()); + } + + @Test + public void showMarkdown() throws Exception { + ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234"); + GitilesView view = GitilesView.show() + .copyFrom(HOST) + .setRepositoryName("foo/bar") + .setRevision(Revision.unpeeled("master", id)) + .setPathPart("/README.md") + .build(); + + assertEquals("/b", view.getServletPath()); + assertEquals(Type.SHOW, view.getType()); + assertEquals("host", view.getHostName()); + assertEquals("foo/bar", view.getRepositoryName()); + assertEquals(id, view.getRevision().getId()); + assertEquals("master", view.getRevision().getName()); + assertEquals("README.md", view.getPathPart()); + assertTrue(HOST.getParameters().isEmpty()); + assertEquals("/b/foo/bar/+show/master/README.md", view.toUrl()); + } + + @Test public void multiplePathComponents() throws Exception { ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234"); GitilesView view = GitilesView.path()
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java index acec4eb..a3ae81a 100644 --- a/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java +++ b/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java
@@ -68,6 +68,8 @@ assertEquals(Type.REVISION, getView("/repo/+/" + hex.substring(0, 7)).getType()); assertEquals(Type.PATH, getView("/repo/+/master/").getType()); assertEquals(Type.PATH, getView("/repo/+/" + hex + "/").getType()); + assertEquals(Type.PATH, getView("/repo/+/" + hex + "/index.c").getType()); + assertEquals(Type.DOC, getView("/repo/+/" + hex + "/index.md").getType()); assertEquals(Type.DIFF, getView("/repo/+/master^..master").getType()); assertEquals(Type.DIFF, getView("/repo/+/master^..master/").getType()); assertEquals(Type.DIFF, getView("/repo/+/" + parent.name() + ".." + hex + "/").getType());