Avoid IllegalArgumentException when auto-diving in root paths The checkArgument() call in GitilesView.getBreadcrumbs(List<Boolean>) is intended to avoid programmer error due to the subtle relationship between hasSingleTree and the view's path. In fact, the check was incorrectly failing when browsing root paths like "/+/master/". Change the check to fix that case. Change-Id: I1a1f8b57d5d16b45ec4da32afaf2009936486787
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 d5ac93b..1239ac7 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
@@ -533,7 +533,9 @@ } StringBuilder cur = new StringBuilder(); List<String> parts = ImmutableList.copyOf(PATH_SPLITTER.omitEmptyStrings().split(path)); - checkArgument(hasSingleTree == null || hasSingleTree.size() == parts.size() - 1, + checkArgument(hasSingleTree == null + || (parts.isEmpty() && hasSingleTree.isEmpty()) + || hasSingleTree.size() == parts.size() - 1, "hasSingleTree has wrong number of entries"); for (int i = 0; i < parts.size(); i++) { String part = parts.get(i);
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 b2b435a..1d143ae 100644 --- a/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java +++ b/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java
@@ -554,6 +554,25 @@ view.getBreadcrumbs(ImmutableList.of(true, false, false))); } + public void testBreadcrumbsHasSingleTreeRootPath() throws Exception { + ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234"); + GitilesView view = GitilesView.path() + .copyFrom(HOST) + .setRepositoryName("foo/bar") + .setRevision(Revision.unpeeled("master", id)) + .setTreePath("") + .build(); + + assertEquals("/b/foo/bar/+/master/", view.toUrl()); + assertEquals( + ImmutableList.of( + breadcrumb("host", "/b/?format=HTML"), + breadcrumb("foo/bar", "/b/foo/bar/"), + breadcrumb("master", "/b/foo/bar/+/master"), + breadcrumb(".", "/b/foo/bar/+/master/")), + view.getBreadcrumbs(ImmutableList.<Boolean> of())); + } + private static ImmutableMap<String, String> breadcrumb(String text, String url) { return ImmutableMap.of("text", text, "url", url); }