##// END OF EJS Templates
obsolete: sort obsmarkers during exchange...
obsolete: sort obsmarkers during exchange Because bundle2 allows a more precise exchange of obsmarkers during pull, it sends them in a different order (previously unstable because of sets.) As a result, they are added to the repository in a different order. To stabilize the order and ensure tests are unchanged when moving from bundle1 to bundle2 we sort markers when exchanging them. In the long run, the obsstore will probably not use a linear storage.

File last commit:

r25066:e91b32d3 default
r25118:e632a242 default
Show More
ignore.py
122 lines | 3.7 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: refactor file read into a function...
r25065 def readignorefile(filepath, warn, skipwarning=False):
try:
pats = []
fp = open(filepath)
pats, warnings = ignorepats(fp)
fp.close()
for warning in warnings:
warn("%s: %s\n" % (filepath, warning))
except IOError, inst:
if not skipwarning:
warn(_("skipping unreadable ignore file '%s': %s\n") %
(filepath, inst.strerror))
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: refactor file read into a function...
r25065 skipwarning = f == files[0]
pats[f] = readignorefile(f, warn, skipwarning=skipwarning)
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