Merge branch 'jk/daemon-path-ok-check-truncation' into maint
[gitweb.git] / cache-tree.c
index ddf0cc9f9aa51f577b0d1a764ebc3e0a318fe1ba..f28b1f45a49b842c2f7a372b0c0c595bebc56b5d 100644 (file)
@@ -319,12 +319,13 @@ static int update_one(struct cache_tree *it,
        i = 0;
        while (i < entries) {
                const struct cache_entry *ce = cache[i];
-               struct cache_tree_sub *sub;
+               struct cache_tree_sub *sub = NULL;
                const char *path, *slash;
                int pathlen, entlen;
                const unsigned char *sha1;
                unsigned mode;
                int expected_missing = 0;
+               int contains_ita = 0;
 
                path = ce->name;
                pathlen = ce_namelen(ce);
@@ -341,7 +342,8 @@ static int update_one(struct cache_tree *it,
                        i += sub->count;
                        sha1 = sub->cache_tree->sha1;
                        mode = S_IFDIR;
-                       if (sub->cache_tree->entry_count < 0) {
+                       contains_ita = sub->cache_tree->entry_count < 0;
+                       if (contains_ita) {
                                to_invalidate = 1;
                                expected_missing = 1;
                        }
@@ -375,11 +377,17 @@ static int update_one(struct cache_tree *it,
                 * they are not part of generated trees. Invalidate up
                 * to root to force cache-tree users to read elsewhere.
                 */
-               if (ce_intent_to_add(ce)) {
+               if (!sub && ce_intent_to_add(ce)) {
                        to_invalidate = 1;
                        continue;
                }
 
+               /*
+                * "sub" can be an empty tree if all subentries are i-t-a.
+                */
+               if (contains_ita && !hashcmp(sha1, EMPTY_TREE_SHA1_BIN))
+                       continue;
+
                strbuf_grow(&buffer, entlen + 100);
                strbuf_addf(&buffer, "%o %.*s%c", mode, entlen, path + baselen, '\0');
                strbuf_add(&buffer, sha1, 20);