##// END OF EJS Templates
strip: make repair.strip transactional to avoid repository corruption...
strip: make repair.strip transactional to avoid repository corruption Uses a transaction instance from the local repository to journal the truncation of revlog files, such that if a strip only partially completes, hg recover will be able to finish the truncate of all the files. The potential unbundling of changes that have been backed up to be restored later will, in case of an error, have to be unbundled manually. The difference is that it will be possible to recover the repository state so the unbundle can actually succeed.

File last commit:

r7622:4dd7b280 default
r8073:e8a28556 default
Show More
ignore.py
90 lines | 3.0 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>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
from i18n import _
Matt Mackall
ignore: fix up comment parsing...
r5640 import util, re
_commentre = None
Matt Mackall
dirstate: move ignore to its own file
r4609
def _parselines(fp):
for line in fp:
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()
Matt Mackall
dirstate: move ignore to its own file
r4609 if line:
yield line
def ignore(root, files, warn):
'''return the contents of .hgignore files as a list of patterns.
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'''
syntaxes = {'re': 'relre:', 'regexp': 'relre:', 'glob': 'relglob:'}
pats = {}
for f in files:
try:
pats[f] = []
fp = open(f)
syntax = 'relre:'
for line in _parselines(fp):
if line.startswith('syntax:'):
s = line[7:].strip()
try:
syntax = syntaxes[s]
except KeyError:
warn(_("%s: ignoring invalid syntax '%s'\n") % (f, s))
continue
pat = syntax + line
Dirkjan Ochtman
use dict.iteritems() rather than dict.items()...
r7622 for s, rels in syntaxes.iteritems():
Thomas Arendsen Hein
Fix re: and glob: patterns in .hgignore (reported by Brad Schick)...
r5029 if line.startswith(rels):
Matt Mackall
dirstate: move ignore to its own file
r4609 pat = line
break
Thomas Arendsen Hein
Fix re: and glob: patterns in .hgignore (reported by Brad Schick)...
r5029 elif line.startswith(s+':'):
pat = rels + line[len(s)+1:]
break
Matt Mackall
dirstate: move ignore to its own file
r4609 pats[f].append(pat)
except IOError, inst:
if f != files[0]:
warn(_("skipping unreadable ignore file '%s': %s\n") %
(f, inst.strerror))
allpats = []
[allpats.extend(patlist) for patlist in pats.values()]
if not allpats:
return util.never
try:
files, ignorefunc, anypats = (
util.matcher(root, inc=allpats, src='.hgignore'))
except util.Abort:
# Re-raise an exception where the src is the right file
Dirkjan Ochtman
use dict.iteritems() rather than dict.items()...
r7622 for f, patlist in pats.iteritems():
Matt Mackall
dirstate: move ignore to its own file
r4609 files, ignorefunc, anypats = (
util.matcher(root, inc=patlist, src=f))
return ignorefunc