exclude: fix a bug in prefix compare optimization
When "namelen" becomes zero at this stage, we have matched the fixed part, but whether it actually matches the pattern still depends on the pattern in "exclude". As demonstrated in t3001, path "three/a.3" exists and it matches the "three/a.3" part in pattern "three/a.3[abc]", but that does not mean a true match. Don't be too optimistic and let fnmatch() do the job. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Nguyễn Thái Ngọc Duy committed
Oct 15, 2012 at 13:24 UTC
a3ea4d7199870595eb3a264c4b41e725b4417bc2
2 files changed
+7
-1
dir.c
+1
-1
@@ -585,7 +585,7 @@ int excluded_from_list(const char *pathname,
585
namelen -= prefix;
586
}
587
588
- if (!namelen || !fnmatch_icase(exclude, name, FNM_PATHNAME))
588
+ if (!fnmatch_icase(exclude, name, FNM_PATHNAME))
589
return to_exclude;
590
}
591
return -1; /* undecided */
t/t3001-ls-files-others-exclude.sh
+6
@@ -214,4 +214,10 @@ test_expect_success 'subdirectory ignore (l1)' '
214
test_cmp expect actual
215
'
216
217
+test_expect_success 'pattern matches prefix completely' '
218
+ : >expect &&
219
+ git ls-files -i -o --exclude "/three/a.3[abc]" >actual &&
220
+ test_cmp expect actual
221
+'
222
+
223
test_done