gitdirstate: show pattern error in hgignore file as expected

Before this revision, invalid pattern in hgignore file causes
unintentional failure for UnboundLocalError of ignorefunc, if hggit is
used with Mercurial 3.5 or later.

In such case:

  - checking source of invalid pattern at failure uses "pats" list for
    hgignore files, but

  - "pats" list is empty, if ignoremod is None (= Mercurial 3.5 or later)

  - therefore, checking with matchmod.match() overlooks invalid pattern

Then, "return ignorefunc" is executed without assignment to
ignorefunc, and causes UnboundLocalError.

To show pattern error in hgignore file as expected even with Mercurial
3.5 or later, this revision puts '(FILE, ["include: FILE"])' tuples
into "pats" (to avoid code duplication, putting into allpats is
shared, too).

This makes checking source of invalid pattern at failure work as
expected for hgignore files.

Fixes #197
This commit is contained in:
FUJIWARA Katsunori 2017-08-05 02:13:11 +09:00
parent 526b8c018c
commit 1af26da10d
2 changed files with 26 additions and 3 deletions

View File

@ -75,10 +75,10 @@ def gignore(root, files, warn, extrapatterns=None):
pats = []
if ignoremod:
pats = ignore.readpats(root, files, warn)
else:
pats = [(f, ['include:%s' % f]) for f in files]
for f, patlist in pats:
allpats.extend(patlist)
else:
allpats.extend(['include:%s' % f for f in files])
if extrapatterns:
allpats.extend(extrapatterns)
@ -91,6 +91,10 @@ def gignore(root, files, warn, extrapatterns=None):
try:
matchmod.match(root, '', [], patlist)
except util.Abort, inst:
if not ignoremod:
# in this case, patlist is ['include: FILE'], and
# inst[0] should already include FILE
raise
raise util.Abort('%s: %s' % (f, inst[0]))
if extrapatterns:
try:

View File

@ -142,3 +142,22 @@ directory) otherwise, a rogue .gitignore could slow down a hg-only repo
? dir/bar
? foo
? foobar
show pattern error in hgignore file as expected (issue197)
----------------------------------------------------------
$ cat > $TESTTMP/invalidhgignore <<EOF
> # invalid syntax in regexp
> foo(
> EOF
$ hg status --config ui.ignore=$TESTTMP/invalidhgignore
abort: $TESTTMP/invalidhgignore: invalid pattern (relre): foo(
[255]
$ cat > .hgignore <<EOF
> # invalid syntax in regexp
> foo(
> EOF
$ hg status
abort: $TESTTMP/.hgignore: invalid pattern (relre): foo(
[255]