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

t/t6132-pathspec-exclude.sh
tree-walk.c
index eb829fce97dc7067cbb502b9f5fd2b14c4e74e10..2462b19ddd35eea986bbe0cdc62806bc455c06d8 100755 (executable)
@@ -194,4 +194,21 @@ test_expect_success 'multiple exclusions' '
        test_cmp expect actual
 '
 
+test_expect_success 't_e_i() exclude case #8' '
+       git init case8 &&
+       (
+               cd case8 &&
+               echo file >file1 &&
+               echo file >file2 &&
+               git add file1 file2 &&
+               git commit -m twofiles &&
+               git grep -l file HEAD :^file2 >actual &&
+               echo HEAD:file1 >expected &&
+               test_cmp expected actual &&
+               git grep -l file HEAD :^file1 >actual &&
+               echo HEAD:file2 >expected &&
+               test_cmp expected actual
+       )
+'
+
 test_done
index 77b37f36fa1bc8fae48231d35514b88d51902488..79bafbd1a23c4a9e20ec623c084778904c534be7 100644 (file)
@@ -1107,7 +1107,7 @@ enum interesting tree_entry_interesting(const struct name_entry *entry,
         *   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
         * -----+-------+----------+----------+-------
@@ -1118,7 +1118,7 @@ enum interesting tree_entry_interesting(const struct name_entry *entry,
         *  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
         *
@@ -1134,7 +1134,12 @@ enum interesting tree_entry_interesting(const struct name_entry *entry,
 
        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;