# HG changeset patch # User FUJIWARA Katsunori # Date 1501866791 -32400 # Node ID cf982a23e15c70f01b54603e828f750f5c7b3e8e # Parent c560ed4d5a55542313fce18f9cdefc2d5eb9791c 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 diff --git a/hggit/gitdirstate.py b/hggit/gitdirstate.py --- a/hggit/gitdirstate.py +++ b/hggit/gitdirstate.py @@ -75,10 +75,10 @@ pats = [] if ignoremod: pats = ignore.readpats(root, files, warn) - for f, patlist in pats: - allpats.extend(patlist) else: - allpats.extend(['include:%s' % f for f in files]) + pats = [(f, ['include:%s' % f]) for f in files] + for f, patlist in pats: + allpats.extend(patlist) if extrapatterns: allpats.extend(extrapatterns) @@ -91,6 +91,10 @@ 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: diff --git a/tests/test-gitignore.t b/tests/test-gitignore.t --- a/tests/test-gitignore.t +++ b/tests/test-gitignore.t @@ -142,3 +142,22 @@ ? dir/bar ? foo ? foobar + +show pattern error in hgignore file as expected (issue197) +---------------------------------------------------------- + + $ cat > $TESTTMP/invalidhgignore < # invalid syntax in regexp + > foo( + > EOF + $ hg status --config ui.ignore=$TESTTMP/invalidhgignore + abort: $TESTTMP/invalidhgignore: invalid pattern (relre): foo( + [255] + + $ cat > .hgignore < # invalid syntax in regexp + > foo( + > EOF + $ hg status + abort: $TESTTMP/.hgignore: invalid pattern (relre): foo( + [255]