tree_entry_interesting: a pathspec only matches at directory boundary
authorBjörn Steinbrink <B.Steinbrink@gmx.de>
Tue, 31 Mar 2009 15:05:01 +0000 (17:05 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 2 Apr 2009 02:35:16 +0000 (19:35 -0700)
Previously the code did a simple prefix match, which means that a
path in a directory "frotz/" would have matched with pathspec "f".

Signed-off-by: Björn Steinbrink <B.Steinbrink@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t4010-diff-pathspec.sh
tree-diff.c
index ad3d9e48454d2e72afce682df009cdaaee9ba3c5..4c4c8b1570c01721e8ac2c8d16837e68ecaa30f5 100755 (executable)
@@ -62,4 +62,12 @@ test_expect_success \
     'git diff-index --cached $tree -- file0/ >current &&
      compare_diff_raw current expected'
 
+test_expect_success 'diff-tree pathspec' '
+       tree2=$(git write-tree) &&
+       echo "$tree2" &&
+       git diff-tree -r --name-only $tree $tree2 -- pa path1/a >current &&
+       >expected &&
+       test_cmp expected current
+'
+
 test_done
index 9f67af6c1fbb9130962cd373d8e2ebecf543c640..b05d0f43555d28f872fd5225e6773eeb636ef302 100644 (file)
@@ -118,10 +118,16 @@ static int tree_entry_interesting(struct tree_desc *desc, const char *base, int
                                continue;
 
                        /*
-                        * The base is a subdirectory of a path which
-                        * was specified, so all of them are interesting.
+                        * If the base is a subdirectory of a path which
+                        * was specified, all of them are interesting.
                         */
-                       return 2;
+                       if (!matchlen ||
+                           base[matchlen] == '/' ||
+                           match[matchlen - 1] == '/')
+                               return 2;
+
+                       /* Just a random prefix match */
+                       continue;
                }
 
                /* Does the base match? */