Lists subdirectories at the top of the source tree Feature: Issue 158 Change-Id: I9799f30f727057599ce4ddea387070a03bb1d30a
diff --git a/java/com/google/gitiles/TreeSoyData.java b/java/com/google/gitiles/TreeSoyData.java index 1e4e4b7..e1aeb21 100644 --- a/java/com/google/gitiles/TreeSoyData.java +++ b/java/com/google/gitiles/TreeSoyData.java
@@ -41,6 +41,14 @@ */ private static final int MAX_SYMLINK_TARGET_LENGTH = 72; + private static final Map<String, Integer> TYPE_WEIGHT = + Map.of( + "TREE", 0, + "GITLINK", 1, + "SYMLINK", 2, + "REGULAR_FILE", 3, + "EXECUTABLE_FILE", 3); + /** * Maximum number of bytes to load from a blob that claims to be a symlink. If the blob is larger * than this byte limit it will be displayed as a binary file instead of as a symlink. @@ -65,6 +73,10 @@ return lastSlash >= 0 ? "..." + target.substring(lastSlash) : target; } + static int sortByType(Map<String, String> m1, Map<String, String> m2) { + return TYPE_WEIGHT.get(m1.get("type")).compareTo(TYPE_WEIGHT.get(m2.get("type"))); + } + private final ObjectReader reader; private final GitilesView view; private final Config cfg; @@ -90,7 +102,7 @@ throws MissingObjectException, IOException { ReadmeHelper readme = new ReadmeHelper(reader, view, MarkdownConfig.get(cfg), rootTree, requestUri); - List<Object> entries = Lists.newArrayList(); + List<Map<String, String>> entries = Lists.newArrayList(); GitilesView.Builder urlBuilder = GitilesView.path().copyFrom(view); while (tw.next()) { FileType type = FileType.forEntry(tw); @@ -129,6 +141,8 @@ entries.add(entry); } + entries.sort(TreeSoyData::sortByType); + Map<String, Object> data = Maps.newHashMapWithExpectedSize(3); data.put("sha", treeId.name()); data.put("entries", entries);
diff --git a/javatests/com/google/gitiles/PathServletTest.java b/javatests/com/google/gitiles/PathServletTest.java index 4311833..bebd98c 100644 --- a/javatests/com/google/gitiles/PathServletTest.java +++ b/javatests/com/google/gitiles/PathServletTest.java
@@ -64,8 +64,8 @@ assertThat(data).containsEntry("type", "TREE"); List<Map<String, ?>> entries = getTreeEntries(data); assertThat(entries).hasSize(2); - assertThat(entries.get(0).get("name")).isEqualTo("baz"); - assertThat(entries.get(1).get("name")).isEqualTo("foo/"); + assertThat(entries.get(0).get("name")).isEqualTo("foo/"); + assertThat(entries.get(1).get("name")).isEqualTo("baz"); data = buildData("/repo/+/master/foo"); assertThat(data).containsEntry("type", "TREE");
diff --git a/javatests/com/google/gitiles/TreeSoyDataTest.java b/javatests/com/google/gitiles/TreeSoyDataTest.java index 98d416a..cafe4e2 100644 --- a/javatests/com/google/gitiles/TreeSoyDataTest.java +++ b/javatests/com/google/gitiles/TreeSoyDataTest.java
@@ -17,8 +17,11 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.gitiles.TreeSoyData.getTargetDisplayName; import static com.google.gitiles.TreeSoyData.resolveTargetUrl; +import static com.google.gitiles.TreeSoyData.sortByType; import com.google.common.base.Strings; +import java.util.Map; +import java.util.HashMap; import org.eclipse.jgit.lib.ObjectId; import org.junit.Test; import org.junit.runner.RunWith; @@ -64,4 +67,25 @@ assertThat(resolveTargetUrl(view, "../../../../")).isNull(); assertThat(resolveTargetUrl(view, "../../a/../../..")).isNull(); } + + @Test + public void sortByTypeSortsCorrect() throws Exception { + Map<String, String> m1 = new HashMap<String, String>(); + Map<String, String> m2 = new HashMap<String, String>(); + Map<String, String> m3 = new HashMap<String, String>(); + Map<String, String> m4 = new HashMap<String, String>(); + Map<String, String> m5 = new HashMap<String, String>(); + m1.put("type", "TREE"); + m2.put("type", "TREE"); + m3.put("type", "SYMLINK"); + m4.put("type", "REGULAR_FILE"); + m5.put("type", "GITLINK"); + assertThat(sortByType(m1, m2)).isEqualTo(0); + assertThat(sortByType(m2, m3)).isEqualTo(-1); + assertThat(sortByType(m3, m4)).isEqualTo(-1); + assertThat(sortByType(m4, m1)).isEqualTo(1); + assertThat(sortByType(m1, m4)).isEqualTo(-1); + assertThat(sortByType(m5, m2)).isEqualTo(1); + assertThat(sortByType(m2, m5)).isEqualTo(-1); + } }