Browse Source

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>
maint
Nguyễn Thái Ngọc Duy 12 years ago committed by Junio C Hamano
parent
commit
a3ea4d7199
  1. 2
      dir.c
  2. 6
      t/t3001-ls-files-others-exclude.sh

2
dir.c

@ -585,7 +585,7 @@ int excluded_from_list(const char *pathname, @@ -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 */

6
t/t3001-ls-files-others-exclude.sh

@ -214,4 +214,10 @@ test_expect_success 'subdirectory ignore (l1)' ' @@ -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

Loading…
Cancel
Save