Merge branch 'nd/tree-walk-path-exclusion'
authorJunio C Hamano <gitster@pobox.com>
Tue, 13 Nov 2018 13:37:28 +0000 (22:37 +0900)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Nov 2018 13:37:28 +0000 (22:37 +0900)
Pathspec matching against a tree object were buggy when negative
pathspec elements were involved, which has been fixed.

* nd/tree-walk-path-exclusion:
tree-walk.c: fix overoptimistic inclusion in :(exclude) matching

1  2 
tree-walk.c
diff --combined tree-walk.c
index 77b37f36fa1bc8fae48231d35514b88d51902488,108cdc8a7a1a58b65cb9724f46f98d505e64352f..79bafbd1a23c4a9e20ec623c084778904c534be7
@@@ -2,7 -2,6 +2,7 @@@
  #include "tree-walk.h"
  #include "unpack-trees.h"
  #include "dir.h"
 +#include "object-store.h"
  #include "tree.h"
  #include "pathspec.h"
  
@@@ -27,9 -26,8 +27,9 @@@ static int decode_tree_entry(struct tre
  {
        const char *path;
        unsigned int mode, len;
 +      const unsigned hashsz = the_hash_algo->rawsz;
  
 -      if (size < 23 || buf[size - 21]) {
 +      if (size < hashsz + 3 || buf[size - (hashsz + 1)]) {
                strbuf_addstr(err, _("too-short tree object"));
                return -1;
        }
@@@ -1107,7 -1105,7 +1107,7 @@@ enum interesting tree_entry_interesting
         *   5  |  file |    1     |    1     |   0
         *   6  |  file |    1     |    2     |   0
         *   7  |  file |    2     |   -1     |   2
-        *   8  |  file |    2     |    0     |   2
+        *   8  |  file |    2     |    0     |   1
         *   9  |  file |    2     |    1     |   0
         *  10  |  file |    2     |    2     |  -1
         * -----+-------+----------+----------+-------
         *  15  |  dir  |    1     |    1     |   1 (*)
         *  16  |  dir  |    1     |    2     |   0
         *  17  |  dir  |    2     |   -1     |   2
-        *  18  |  dir  |    2     |    0     |   2
+        *  18  |  dir  |    2     |    0     |   1
         *  19  |  dir  |    2     |    1     |   1 (*)
         *  20  |  dir  |    2     |    2     |  -1
         *
  
        negative = do_match(entry, base, base_offset, ps, 1);
  
-       /* #3, #4, #7, #8, #13, #14, #17, #18 */
+       /* #8, #18 */
+       if (positive == all_entries_interesting &&
+           negative == entry_not_interesting)
+               return entry_interesting;
+       /* #3, #4, #7, #13, #14, #17 */
        if (negative <= entry_not_interesting)
                return positive;