Comments
Patch
@@ -77,9 +77,17 @@ def ignorepats(ui, root, filepath):
# The ignore file is inside the repo, so make its patterns
# relative to its location.
if linesyntax == 'relre:':
- message = _('cannot use sub-ignore files that use regular '
- 'expressions')
- raise util.Abort(message)
+ if ui.configbool('ui', 'allowregexsubignores'):
+ if line[0] == '^':
+ line = '^%s\/(?:%s)' % (re.escape(subdir), line[1:])
+ else:
+ line = '^%s\/.*(?:%s)' % (re.escape(subdir), line)
+ else:
+ message = _('cannot use sub-ignore files that use regular '
+ 'expressions')
+ hint = _('set ui.allowregexsubignores=True if you know '
+ 'your regexs can be wrapped as "^subdir\/(?:XXX)"')
+ raise util.Abort(message, hint=hint)
elif linesyntax == 'relglob:':
line = '%s/*%s' % (subdir, line)
patterns.append(linesyntax + line)
@@ -189,12 +189,20 @@ Check including sub-ignores with regexs
$ echo "regexp:f.le1" > dir1/.hgignore
$ hg debugignore
abort: cannot use sub-ignore files that use regular expressions
+ (set ui.allowregexsubignores=True if you know your regexs can be wrapped as "^subdir\/(?:XXX)")
[255]
- $ echo "" > dir1/.hgignore
+ $ cat >> .hg/hgrc <<EOF
+ > [ui]
+ > allowregexsubignores=True
+ > EOF
$ hg debugignore
- (?:(?:|.*/)dir2\/[^/]*file[^/]*2(?:/|$))
+ (?:^dir1\/.*(?:f.le1)|(?:|.*/)dir2\/[^/]*file[^/]*2(?:/|$))
+
+ $ hg status | grep -v hgignore
+ ? dir1/file2
+ ? dir2/file1
Check multiple levels of sub-ignores
@@ -204,11 +212,9 @@ Check multiple levels of sub-ignores
$ echo "glob:fil*3" >> dir1/subdir/.hgignore
$ hg debugignore
- (?:(?:|.*/)dir1\/subdir\/[^/]*fil[^/]*3(?:/|$)|(?:|.*/)dir2\/[^/]*file[^/]*2(?:/|$))
+ (?:^dir1\/.*(?:f.le1)|(?:|.*/)dir1\/subdir\/[^/]*fil[^/]*3(?:/|$)|(?:|.*/)dir2\/[^/]*file[^/]*2(?:/|$))
$ hg status | grep -v hgignore
- ? dir1/file1
? dir1/file2
- ? dir1/subdir/subfile1
? dir1/subdir/subfile4
? dir2/file1