summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2012-10-15 08:24:36 +0200
committerJunio C Hamano <gitster@pobox.com>2012-10-15 23:57:16 +0200
commita3ea4d7199870595eb3a264c4b41e725b4417bc2 (patch)
tree1bc77270441107a427f64b43040da7fc5d426ef1
parentexclude: split basename matching code into a separate function (diff)
downloadgit-a3ea4d7199870595eb3a264c4b41e725b4417bc2.tar.xz
git-a3ea4d7199870595eb3a264c4b41e725b4417bc2.zip
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>
-rw-r--r--dir.c2
-rwxr-xr-xt/t3001-ls-files-others-exclude.sh6
2 files changed, 7 insertions, 1 deletions
diff --git a/dir.c b/dir.c
index d9b5561466..22d0b7b726 100644
--- a/dir.c
+++ b/dir.c
@@ -585,7 +585,7 @@ int excluded_from_list(const char *pathname,
namelen -= prefix;
}
- if (!namelen || !fnmatch_icase(exclude, name, FNM_PATHNAME))
+ if (!fnmatch_icase(exclude, name, FNM_PATHNAME))
return to_exclude;
}
return -1; /* undecided */
diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh
index c8fe978267..dc2f0458fd 100755
--- a/t/t3001-ls-files-others-exclude.sh
+++ b/t/t3001-ls-files-others-exclude.sh
@@ -214,4 +214,10 @@ test_expect_success 'subdirectory ignore (l1)' '
test_cmp expect actual
'
+test_expect_success 'pattern matches prefix completely' '
+ : >expect &&
+ git ls-files -i -o --exclude "/three/a.3[abc]" >actual &&
+ test_cmp expect actual
+'
+
test_done