##// END OF EJS Templates
ignore: remove .hgignore from ignore list if nonexistent...
ignore: remove .hgignore from ignore list if nonexistent Previously we would always pass the root .hgignore path to the ignore parser. The parser then had to be aware that the first path was special, and not warn if it didn't exist. In preparation for making the ignore file parser more generically usable, let's make the parse logic not aware of this special case, and instead just not pass the root .hgignore in if it doesn't exist.

File last commit:

r25163:3139900f default
r25163:3139900f default
Show More
ignore.py
120 lines | 3.6 KiB | text/x-python | PythonLexer
Matt Mackall
dirstate: move ignore to its own file
r4609 # ignore.py - ignored file handling for mercurial
#
# Copyright 2007 Matt Mackall <mpm@selenic.com>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Matt Mackall
dirstate: move ignore to its own file
r4609
from i18n import _
Matt Mackall
match: change all users of util.matcher to match.match
r8566 import util, match
Simon Heimberg
separate import lines from mercurial and general python modules
r8312 import re
Matt Mackall
ignore: fix up comment parsing...
r5640
_commentre = None
Matt Mackall
dirstate: move ignore to its own file
r4609
Brendan Cully
ignore: separate pattern extraction from match compilation...
r9091 def ignorepats(lines):
'''parse lines (iterable) of .hgignore text, returning a tuple of
(patterns, parse errors). These patterns should be given to compile()
to be validated and converted into a match function.'''
syntaxes = {'re': 'relre:', 'regexp': 'relre:', 'glob': 'relglob:'}
syntax = 'relre:'
patterns = []
warnings = []
for line in lines:
Matt Mackall
ignore: fix up comment parsing...
r5640 if "#" in line:
global _commentre
if not _commentre:
_commentre = re.compile(r'((^|[^\\])(\\\\)*)#.*')
# remove comments prefixed by an even number of escapes
line = _commentre.sub(r'\1', line)
# fixup properly escaped comments that survived the above
line = line.replace("\\#", "#")
line = line.rstrip()
Brendan Cully
ignore: separate pattern extraction from match compilation...
r9091 if not line:
continue
if line.startswith('syntax:'):
s = line[7:].strip()
try:
syntax = syntaxes[s]
except KeyError:
warnings.append(_("ignoring invalid syntax '%s'") % s)
continue
Durham Goode
ignore: refactor syntax concatenation...
r25066
linesyntax = syntax
Brendan Cully
ignore: separate pattern extraction from match compilation...
r9091 for s, rels in syntaxes.iteritems():
if line.startswith(rels):
Durham Goode
ignore: refactor syntax concatenation...
r25066 linesyntax = rels
line = line[len(rels):]
Brendan Cully
ignore: separate pattern extraction from match compilation...
r9091 break
elif line.startswith(s+':'):
Durham Goode
ignore: refactor syntax concatenation...
r25066 linesyntax = rels
line = line[len(s) + 1:]
Brendan Cully
ignore: separate pattern extraction from match compilation...
r9091 break
Durham Goode
ignore: refactor syntax concatenation...
r25066 patterns.append(linesyntax + line)
Brendan Cully
ignore: separate pattern extraction from match compilation...
r9091
return patterns, warnings
Matt Mackall
dirstate: move ignore to its own file
r4609
Durham Goode
ignore: remove .hgignore from ignore list if nonexistent...
r25163 def readignorefile(filepath, warn):
Durham Goode
ignore: refactor file read into a function...
r25065 try:
pats = []
fp = open(filepath)
pats, warnings = ignorepats(fp)
fp.close()
for warning in warnings:
warn("%s: %s\n" % (filepath, warning))
except IOError, inst:
Durham Goode
ignore: remove .hgignore from ignore list if nonexistent...
r25163 warn(_("skipping unreadable ignore file '%s': %s\n") %
(filepath, inst.strerror))
Durham Goode
ignore: refactor file read into a function...
r25065 return pats
Bryan O'Sullivan
ignore: refactor ignore into two functions...
r18087 def readpats(root, files, warn):
'''return a dict mapping ignore-file-name to list-of-patterns'''
pats = {}
for f in files:
Bryan O'Sullivan
ignore: only read an ignore file once
r18088 if f in pats:
continue
Durham Goode
ignore: remove .hgignore from ignore list if nonexistent...
r25163 pats[f] = readignorefile(f, warn)
Durham Goode
ignore: refactor file read into a function...
r25065
Bryan O'Sullivan
ignore: process hgignore files in deterministic order...
r18089 return [(f, pats[f]) for f in files if f in pats]
Bryan O'Sullivan
ignore: refactor ignore into two functions...
r18087
Matt Mackall
dirstate: move ignore to its own file
r4609 def ignore(root, files, warn):
Brendan Cully
ignore: separate pattern extraction from match compilation...
r9091 '''return matcher covering patterns in 'files'.
Matt Mackall
dirstate: move ignore to its own file
r4609
the files parsed for patterns include:
.hgignore in the repository root
any additional files specified in the [ui] section of ~/.hgrc
trailing white space is dropped.
the escape character is backslash.
comments start with #.
empty lines are skipped.
lines can be of the following formats:
syntax: regexp # defaults following lines to non-rooted regexps
syntax: glob # defaults following lines to non-rooted globs
re:pattern # non-rooted regular expression
glob:pattern # non-rooted glob
pattern # pattern of the current default type'''
Bryan O'Sullivan
ignore: refactor ignore into two functions...
r18087 pats = readpats(root, files, warn)
Matt Mackall
dirstate: move ignore to its own file
r4609
allpats = []
Bryan O'Sullivan
ignore: process hgignore files in deterministic order...
r18089 for f, patlist in pats:
Martin Geisler
remove unnecessary list comprehensions...
r13412 allpats.extend(patlist)
Matt Mackall
dirstate: move ignore to its own file
r4609 if not allpats:
return util.never
try:
Matt Mackall
match: add some default args
r8567 ignorefunc = match.match(root, '', [], allpats)
Matt Mackall
dirstate: move ignore to its own file
r4609 except util.Abort:
# Re-raise an exception where the src is the right file
Bryan O'Sullivan
ignore: process hgignore files in deterministic order...
r18089 for f, patlist in pats:
Matt Mackall
match: change all users of util.matcher to match.match
r8566 try:
Matt Mackall
match: add some default args
r8567 match.match(root, '', [], patlist)
Matt Mackall
match: change all users of util.matcher to match.match
r8566 except util.Abort, inst:
raise util.Abort('%s: %s' % (f, inst[0]))
Matt Mackall
dirstate: move ignore to its own file
r4609
return ignorefunc