Merge "Add paths_only projection to the recursive tree JSON API"
diff --git a/BUILD b/BUILD
index 9782c01..a60423a 100644
--- a/BUILD
+++ b/BUILD
@@ -3,7 +3,9 @@
 pkg_war(
     name = "gitiles",
     context = ["//resources/com/google/gitiles:webassets"],
+    exclude_jar_prefixes = ["libjgit.jar"],
     libs = [
+        "@jgit//org.eclipse.jgit:jgit-stamped",
         "//lib/jetty:server",
         "//lib/jetty:servlet",
         "//lib:slf4j-simple",
diff --git a/external_deps.lock.json b/external_deps.lock.json
index c0f6c6d..a10b138 100755
--- a/external_deps.lock.json
+++ b/external_deps.lock.json
@@ -19,8 +19,6 @@
     "com.google.truth:truth": -790731381,
     "com.googlecode.javaewah:JavaEWAH": 1917029137,
     "com.ibm.icu:icu4j": -802150924,
-    "com.jcraft:jsch": 1133842314,
-    "com.jcraft:jzlib": 864660349,
     "commons-codec:commons-codec": -1724312797,
     "commons-io:commons-io": 1226199767,
     "commons-logging:commons-logging": -916690979,
@@ -33,6 +31,7 @@
     "net.java.dev.jna:jna": -867910362,
     "net.java.dev.jna:jna-platform": -561312286,
     "net.sf.jopt-simple:jopt-simple": 906822697,
+    "org.apache.ant:ant": 51716534,
     "org.apache.commons:commons-compress": -1289113474,
     "org.apache.commons:commons-lang3": 109544183,
     "org.apache.commons:commons-math3": -1738699872,
@@ -127,10 +126,6 @@
     "com.googlecode.javaewah:JavaEWAH:jar:sources": 1003442530,
     "com.ibm.icu:icu4j": -1725310050,
     "com.ibm.icu:icu4j:jar:sources": 163265109,
-    "com.jcraft:jsch": 1084501210,
-    "com.jcraft:jsch:jar:sources": -586408740,
-    "com.jcraft:jzlib": -1423321085,
-    "com.jcraft:jzlib:jar:sources": 1440827148,
     "com.sun.jdmk:jmxtools": 2035346891,
     "com.sun.jmx:jmxri": 2035346891,
     "commons-codec:commons-codec": -28659539,
@@ -170,6 +165,10 @@
     "net.java.dev.jna:jna:jar:sources": -902150228,
     "net.sf.jopt-simple:jopt-simple": -1677351973,
     "net.sf.jopt-simple:jopt-simple:jar:sources": 1072431863,
+    "org.apache.ant:ant": -431447101,
+    "org.apache.ant:ant-launcher": -333622244,
+    "org.apache.ant:ant-launcher:jar:sources": -77100552,
+    "org.apache.ant:ant:jar:sources": 389240804,
     "org.apache.commons:commons-compress": 2043911487,
     "org.apache.commons:commons-compress:jar:sources": -1888643111,
     "org.apache.commons:commons-lang3": -850748327,
@@ -441,20 +440,6 @@
       },
       "version": "78.2"
     },
-    "com.jcraft:jsch": {
-      "shasums": {
-        "jar": "d492b15a6d2ea3f1cc39c422c953c40c12289073dbe8360d98c0f6f9ec74fc44",
-        "sources": "e01ff2d282aa1b492bbb6187b3e363cd20a6ef51a6f23ae0ec4be179570a8480"
-      },
-      "version": "0.1.55"
-    },
-    "com.jcraft:jzlib": {
-      "shasums": {
-        "jar": "89b1360f407381bf61fde411019d8cbd009ebb10cff715f3669017a031027560",
-        "sources": "35ebd67941ce7024e6e7d80b60a4252a9687fa0f909a7079ac904bef6c1658cf"
-      },
-      "version": "1.1.3"
-    },
     "com.sun.jdmk:jmxtools": {
       "shasums": {
         "jar": null
@@ -599,6 +584,20 @@
       },
       "version": "5.0.4"
     },
+    "org.apache.ant:ant": {
+      "shasums": {
+        "jar": "763acda4a69588c9ea8817a952851ff0c2fc4bffa1d081c2565dc407f29d5794",
+        "sources": "817ebf06c0a01d5d59cae996815b154b7b7172d40d75304f39ab107e8133c0d6"
+      },
+      "version": "1.10.15"
+    },
+    "org.apache.ant:ant-launcher": {
+      "shasums": {
+        "jar": "5c8551990307a032336d98ddaed549a39a689f07d4d4c6b950601bf22b3d6a1b",
+        "sources": "ab774b88172f80beb0e11e697adbab13e8436b4c959bef51d5dba44f1d192d72"
+      },
+      "version": "1.10.15"
+    },
     "org.apache.commons:commons-compress": {
       "shasums": {
         "jar": "e1522945218456f3649a39bc4afd70ce4bd466221519dba7d378f2141a4642ca",
@@ -1044,6 +1043,9 @@
     "net.java.dev.jna:jna-platform": [
       "net.java.dev.jna:jna"
     ],
+    "org.apache.ant:ant": [
+      "org.apache.ant:ant-launcher"
+    ],
     "org.apache.commons:commons-compress": [
       "commons-codec:commons-codec",
       "commons-io:commons-io",
@@ -1417,15 +1419,6 @@
       "com.ibm.icu.text",
       "com.ibm.icu.util"
     ],
-    "com.jcraft:jsch": [
-      "com.jcraft.jsch",
-      "com.jcraft.jsch.jce",
-      "com.jcraft.jsch.jcraft",
-      "com.jcraft.jsch.jgss"
-    ],
-    "com.jcraft:jzlib": [
-      "com.jcraft.jzlib"
-    ],
     "commons-codec:commons-codec": [
       "org.apache.commons.codec",
       "org.apache.commons.codec.binary",
@@ -1636,6 +1629,73 @@
       "joptsimple.internal",
       "joptsimple.util"
     ],
+    "org.apache.ant:ant": [
+      "org.apache.tools.ant",
+      "org.apache.tools.ant.attribute",
+      "org.apache.tools.ant.dispatch",
+      "org.apache.tools.ant.filters",
+      "org.apache.tools.ant.filters.util",
+      "org.apache.tools.ant.helper",
+      "org.apache.tools.ant.input",
+      "org.apache.tools.ant.listener",
+      "org.apache.tools.ant.loader",
+      "org.apache.tools.ant.property",
+      "org.apache.tools.ant.taskdefs",
+      "org.apache.tools.ant.taskdefs.compilers",
+      "org.apache.tools.ant.taskdefs.condition",
+      "org.apache.tools.ant.taskdefs.cvslib",
+      "org.apache.tools.ant.taskdefs.email",
+      "org.apache.tools.ant.taskdefs.launcher",
+      "org.apache.tools.ant.taskdefs.modules",
+      "org.apache.tools.ant.taskdefs.optional",
+      "org.apache.tools.ant.taskdefs.optional.ccm",
+      "org.apache.tools.ant.taskdefs.optional.clearcase",
+      "org.apache.tools.ant.taskdefs.optional.depend",
+      "org.apache.tools.ant.taskdefs.optional.depend.constantpool",
+      "org.apache.tools.ant.taskdefs.optional.ejb",
+      "org.apache.tools.ant.taskdefs.optional.extension",
+      "org.apache.tools.ant.taskdefs.optional.extension.resolvers",
+      "org.apache.tools.ant.taskdefs.optional.i18n",
+      "org.apache.tools.ant.taskdefs.optional.j2ee",
+      "org.apache.tools.ant.taskdefs.optional.javacc",
+      "org.apache.tools.ant.taskdefs.optional.javah",
+      "org.apache.tools.ant.taskdefs.optional.jlink",
+      "org.apache.tools.ant.taskdefs.optional.jsp",
+      "org.apache.tools.ant.taskdefs.optional.jsp.compilers",
+      "org.apache.tools.ant.taskdefs.optional.native2ascii",
+      "org.apache.tools.ant.taskdefs.optional.net",
+      "org.apache.tools.ant.taskdefs.optional.pvcs",
+      "org.apache.tools.ant.taskdefs.optional.script",
+      "org.apache.tools.ant.taskdefs.optional.sos",
+      "org.apache.tools.ant.taskdefs.optional.testing",
+      "org.apache.tools.ant.taskdefs.optional.unix",
+      "org.apache.tools.ant.taskdefs.optional.vss",
+      "org.apache.tools.ant.taskdefs.optional.windows",
+      "org.apache.tools.ant.taskdefs.rmic",
+      "org.apache.tools.ant.types",
+      "org.apache.tools.ant.types.mappers",
+      "org.apache.tools.ant.types.optional",
+      "org.apache.tools.ant.types.optional.depend",
+      "org.apache.tools.ant.types.resources",
+      "org.apache.tools.ant.types.resources.comparators",
+      "org.apache.tools.ant.types.resources.selectors",
+      "org.apache.tools.ant.types.selectors",
+      "org.apache.tools.ant.types.selectors.modifiedselector",
+      "org.apache.tools.ant.types.spi",
+      "org.apache.tools.ant.util",
+      "org.apache.tools.ant.util.depend",
+      "org.apache.tools.ant.util.facade",
+      "org.apache.tools.ant.util.java15",
+      "org.apache.tools.ant.util.optional",
+      "org.apache.tools.ant.util.regexp",
+      "org.apache.tools.bzip2",
+      "org.apache.tools.mail",
+      "org.apache.tools.tar",
+      "org.apache.tools.zip"
+    ],
+    "org.apache.ant:ant-launcher": [
+      "org.apache.tools.ant.launch"
+    ],
     "org.apache.commons:commons-compress": [
       "org.apache.commons.compress",
       "org.apache.commons.compress.archivers",
@@ -2784,10 +2844,6 @@
       "com.googlecode.javaewah:JavaEWAH:jar:sources",
       "com.ibm.icu:icu4j",
       "com.ibm.icu:icu4j:jar:sources",
-      "com.jcraft:jsch",
-      "com.jcraft:jsch:jar:sources",
-      "com.jcraft:jzlib",
-      "com.jcraft:jzlib:jar:sources",
       "commons-codec:commons-codec",
       "commons-codec:commons-codec:jar:sources",
       "commons-io:commons-io",
@@ -2824,6 +2880,10 @@
       "net.java.dev.jna:jna:jar:sources",
       "net.sf.jopt-simple:jopt-simple",
       "net.sf.jopt-simple:jopt-simple:jar:sources",
+      "org.apache.ant:ant",
+      "org.apache.ant:ant-launcher",
+      "org.apache.ant:ant-launcher:jar:sources",
+      "org.apache.ant:ant:jar:sources",
       "org.apache.commons:commons-compress",
       "org.apache.commons:commons-compress:jar:sources",
       "org.apache.commons:commons-lang3",
diff --git a/javatests/com/google/gitiles/DiffServletTest.java b/javatests/com/google/gitiles/DiffServletTest.java
index 295418e..5d59a67 100644
--- a/javatests/com/google/gitiles/DiffServletTest.java
+++ b/javatests/com/google/gitiles/DiffServletTest.java
@@ -49,6 +49,8 @@
                 + " href=\"/b/repo/+/%s/foo\">b/foo</a>",
             c1.name(), c2.name());
     assertThat(actual).contains(diffHeader);
+    assertThat(actual).contains("<span class=\"Diff-change\"> foo</span>");
+    assertThat(actual).contains("<span class=\"Diff-insert\">+contents</span>");
   }
 
   @Test
diff --git a/javatests/com/google/gitiles/ThemeTest.java b/javatests/com/google/gitiles/ThemeTest.java
index 7e91a65..4b8cf5d 100644
--- a/javatests/com/google/gitiles/ThemeTest.java
+++ b/javatests/com/google/gitiles/ThemeTest.java
@@ -15,8 +15,10 @@
 package com.google.gitiles;
 
 import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
 
+import com.google.common.io.Resources;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
 import org.eclipse.jgit.junit.TestRepository;
@@ -130,6 +132,19 @@
     assertThemeElementsPresent(html);
   }
 
+  @Test
+  public void diffChangeColorIsGreyNotYellow() throws Exception {
+    String css =
+        Resources.toString(
+            Resources.getResource(Renderer.class, "static/base.css"), UTF_8);
+    // Unchanged lines in unified diffs are formatted with class Diff-change.
+    // Ensure --diff-change resolves to grey in both light and dark modes instead of yellow.
+    assertThat(css).contains("--diff-change: #666;");
+    assertThat(css).contains("--diff-change: #9aa0a6;");
+    assertThat(css).doesNotContain("--diff-change: #960;");
+    assertThat(css).doesNotContain("--diff-change: #fdd663;");
+  }
+
   private static void assertThemeElementsPresent(String html) {
     assertThat(html).contains("id=\"gitiles-theme-toggle\"");
     assertThat(html).contains("Header-themeToggle");
diff --git a/modules/jgit b/modules/jgit
index 2bf2e4a..87eaf66 160000
--- a/modules/jgit
+++ b/modules/jgit
@@ -1 +1 @@
-Subproject commit 2bf2e4a32ef9347617a73ae739d08fc48c029989
+Subproject commit 87eaf6628b8ef58591382f15fa7e442639e1be91
diff --git a/resources/com/google/gitiles/static/base.css b/resources/com/google/gitiles/static/base.css
index d5054e7..8c21311 100644
--- a/resources/com/google/gitiles/static/base.css
+++ b/resources/com/google/gitiles/static/base.css
@@ -48,7 +48,7 @@
   --diff-hunk: #00c;
   --diff-delete: #c00;
   --diff-insert: #080;
-  --diff-change: #960;
+  --diff-change: #666;
   --diff-action-add: #060;
   --diff-action-delete: #600;
   --diff-action-rename: #006;
@@ -99,7 +99,7 @@
     --diff-hunk: #8ab4f8;
     --diff-delete: #f28b82;
     --diff-insert: #81c995;
-    --diff-change: #fdd663;
+    --diff-change: #9aa0a6;
     --diff-action-add: #81c995;
     --diff-action-delete: #f28b82;
     --diff-action-rename: #8ab4f8;
@@ -142,7 +142,7 @@
   --diff-hunk: #8ab4f8;
   --diff-delete: #f28b82;
   --diff-insert: #81c995;
-  --diff-change: #fdd663;
+  --diff-change: #9aa0a6;
   --diff-action-add: #81c995;
   --diff-action-delete: #f28b82;
   --diff-action-rename: #8ab4f8;