##// END OF EJS Templates
fix issue 322....
fix issue 322. do not allow to add files that shadow files or directories already in dirstate.

File last commit:

r2953:3d554784 default
r2953:3d554784 default
Show More
dirstate.py
533 lines | 17.8 KiB | text/x-python | PythonLexer
mpm@selenic.com
Break apart hg.py...
r1089 """
dirstate.py - working directory tracking for mercurial
Vadim Gelfer
update copyrights.
r2859 Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
mpm@selenic.com
Break apart hg.py...
r1089
This software may be used and distributed according to the terms
of the GNU General Public License, incorporated herein by reference.
"""
mpm@selenic.com
Adjust some imports
r1094 from node import *
Benoit Boissinot
i18n first part: make '_' available for files who need it
r1400 from i18n import gettext as _
mpm@selenic.com
Break apart hg.py...
r1089 from demandload import *
Vadim Gelfer
fix issue 322....
r2953 demandload(globals(), "struct os time bisect stat strutil util re errno")
mpm@selenic.com
Break apart hg.py...
r1089
Eric Hopper
Convert all classes to new-style classes by deriving them from object.
r1559 class dirstate(object):
Benoit Boissinot
dirstate: refactor the dirstate binary format, remove magic numbers
r2393 format = ">cllll"
mpm@selenic.com
Break apart hg.py...
r1089 def __init__(self, opener, ui, root):
self.opener = opener
self.root = root
self.dirty = 0
self.ui = ui
self.map = None
self.pl = None
Vadim Gelfer
fix issue 322....
r2953 self.dirs = None
mpm@selenic.com
Break apart hg.py...
r1089 self.copies = {}
self.ignorefunc = None
mason@suse.com
Optimize dirstate walking...
r1183 self.blockignore = False
mpm@selenic.com
Break apart hg.py...
r1089
def wjoin(self, f):
return os.path.join(self.root, f)
def getcwd(self):
cwd = os.getcwd()
if cwd == self.root: return ''
return cwd[len(self.root) + 1:]
Bryan O'Sullivan
Switch to new syntax for .hgignore files....
r1270 def hgignore(self):
mcmillen@cs.cmu.edu
Implementation of per-user .hgignore....
r2003 '''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
Bryan O'Sullivan
Switch to new syntax for .hgignore files....
r1270
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:'}
def parselines(fp):
for line in fp:
escape = False
for i in xrange(len(line)):
if escape: escape = False
elif line[i] == '\\': escape = True
elif line[i] == '#': break
line = line[:i].rstrip()
if line: yield line
mcmillen@cs.cmu.edu
Add warning if user-configured hgignore file isn't found
r2004 repoignore = self.wjoin('.hgignore')
files = [repoignore]
mcmillen@cs.cmu.edu
Implementation of per-user .hgignore....
r2003 files.extend(self.ui.hgignorefiles())
mcmillen@cs.cmu.edu
On error parsing hgignore file, print the correct filename.
r2005 pats = {}
mcmillen@cs.cmu.edu
Implementation of per-user .hgignore....
r2003 for f in files:
try:
mcmillen@cs.cmu.edu
On error parsing hgignore file, print the correct filename.
r2005 pats[f] = []
mcmillen@cs.cmu.edu
Implementation of per-user .hgignore....
r2003 fp = open(f)
syntax = 'relre:'
for line in parselines(fp):
if line.startswith('syntax:'):
s = line[7:].strip()
try:
syntax = syntaxes[s]
except KeyError:
self.ui.warn(_("%s: ignoring invalid "
"syntax '%s'\n") % (f, s))
continue
pat = syntax + line
for s in syntaxes.values():
if line.startswith(s):
pat = line
break
mcmillen@cs.cmu.edu
On error parsing hgignore file, print the correct filename.
r2005 pats[f].append(pat)
Thomas Arendsen Hein
Show reason why an ignore file can't be read and state that it is skipped.
r2006 except IOError, inst:
mcmillen@cs.cmu.edu
Add warning if user-configured hgignore file isn't found
r2004 if f != repoignore:
Thomas Arendsen Hein
Show reason why an ignore file can't be read and state that it is skipped.
r2006 self.ui.warn(_("skipping unreadable ignore file"
" '%s': %s\n") % (f, inst.strerror))
Bryan O'Sullivan
Switch to new syntax for .hgignore files....
r1270 return pats
def ignore(self, fn):
mcmillen@cs.cmu.edu
Implementation of per-user .hgignore....
r2003 '''default match function used by dirstate and
localrepository. this honours the repository .hgignore file
and any other files specified in the [ui] section of .hgrc.'''
mason@suse.com
Optimize dirstate walking...
r1183 if self.blockignore:
return False
mpm@selenic.com
Break apart hg.py...
r1089 if not self.ignorefunc:
Bryan O'Sullivan
Fix ignore regression....
r1271 ignore = self.hgignore()
Thomas Arendsen Hein
Don't ignore everything if all hgignore files are empty.
r2008 allpats = []
[allpats.extend(patlist) for patlist in ignore.values()]
if allpats:
mcmillen@cs.cmu.edu
On error parsing hgignore file, print the correct filename.
r2005 try:
files, self.ignorefunc, anypats = (
util.matcher(self.root, inc=allpats, src='.hgignore'))
except util.Abort:
# Re-raise an exception where the src is the right file
for f, patlist in ignore.items():
files, self.ignorefunc, anypats = (
util.matcher(self.root, inc=patlist, src=f))
Bryan O'Sullivan
Fix ignore regression....
r1271 else:
self.ignorefunc = util.never
Bryan O'Sullivan
Switch to new syntax for .hgignore files....
r1270 return self.ignorefunc(fn)
mpm@selenic.com
Break apart hg.py...
r1089
def __del__(self):
if self.dirty:
self.write()
def __getitem__(self, key):
try:
return self.map[key]
except TypeError:
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 self.lazyread()
mpm@selenic.com
Break apart hg.py...
r1089 return self[key]
def __contains__(self, key):
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 self.lazyread()
mpm@selenic.com
Break apart hg.py...
r1089 return key in self.map
def parents(self):
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 self.lazyread()
mpm@selenic.com
Break apart hg.py...
r1089 return self.pl
def markdirty(self):
if not self.dirty:
self.dirty = 1
def setparents(self, p1, p2=nullid):
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 self.lazyread()
mpm@selenic.com
Break apart hg.py...
r1089 self.markdirty()
self.pl = p1, p2
def state(self, key):
try:
return self[key][0]
except KeyError:
return "?"
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 def lazyread(self):
if self.map is None:
self.read()
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 def parse(self, st):
mpm@selenic.com
Break apart hg.py...
r1089 self.pl = [st[:20], st[20: 40]]
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 # deref fields so they will be local in loop
map = self.map
copies = self.copies
format = self.format
unpack = struct.unpack
mpm@selenic.com
Break apart hg.py...
r1089 pos = 40
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 e_size = struct.calcsize(format)
mpm@selenic.com
Break apart hg.py...
r1089 while pos < len(st):
Vadim Gelfer
dirstate: speed up inner loop of read.
r2425 newpos = pos + e_size
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 e = unpack(format, st[pos:newpos])
mpm@selenic.com
Break apart hg.py...
r1089 l = e[4]
Vadim Gelfer
dirstate: speed up inner loop of read.
r2425 pos = newpos
newpos = pos + l
f = st[pos:newpos]
mpm@selenic.com
Break apart hg.py...
r1089 if '\0' in f:
f, c = f.split('\0')
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 copies[f] = c
map[f] = e[:4]
Vadim Gelfer
dirstate: speed up inner loop of read.
r2425 pos = newpos
mpm@selenic.com
Break apart hg.py...
r1089
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 def read(self):
self.map = {}
self.pl = [nullid, nullid]
try:
st = self.opener("dirstate").read()
if st:
self.parse(st)
except IOError, err:
if err.errno != errno.ENOENT: raise
mpm@selenic.com
Break apart hg.py...
r1089 def copy(self, source, dest):
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 self.lazyread()
mpm@selenic.com
Break apart hg.py...
r1089 self.markdirty()
self.copies[dest] = source
def copied(self, file):
return self.copies.get(file, None)
Vadim Gelfer
fix issue 322....
r2953 def initdirs(self):
if self.dirs is None:
self.dirs = {}
for f in self.map:
self.updatedirs(f, 1)
def updatedirs(self, path, delta):
if self.dirs is not None:
for c in strutil.findall(path, '/'):
pc = path[:c]
self.dirs.setdefault(pc, 0)
self.dirs[pc] += delta
def checkshadows(self, files):
def prefixes(f):
for c in strutil.rfindall(f, '/'):
yield f[:c]
self.lazyread()
self.initdirs()
seendirs = {}
for f in files:
if self.dirs.get(f):
raise util.Abort(_('directory named %r already in dirstate') %
f)
for d in prefixes(f):
if d in seendirs:
break
if d in self.map:
raise util.Abort(_('file named %r already in dirstate') %
d)
seendirs[d] = True
mpm@selenic.com
Break apart hg.py...
r1089 def update(self, files, state, **kw):
''' current states:
n normal
m needs merging
r marked for removal
a marked for addition'''
if not files: return
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 self.lazyread()
mpm@selenic.com
Break apart hg.py...
r1089 self.markdirty()
Vadim Gelfer
fix issue 322....
r2953 if state == "a":
self.initdirs()
self.checkshadows(files)
mpm@selenic.com
Break apart hg.py...
r1089 for f in files:
if state == "r":
self.map[f] = ('r', 0, 0, 0)
Vadim Gelfer
fix issue 322....
r2953 self.updatedirs(f, -1)
mpm@selenic.com
Break apart hg.py...
r1089 else:
Vadim Gelfer
fix issue 322....
r2953 if state == "a":
self.updatedirs(f, 1)
Benoit Boissinot
use self.{w,}join when possible
r1510 s = os.lstat(self.wjoin(f))
mpm@selenic.com
Break apart hg.py...
r1089 st_size = kw.get('st_size', s.st_size)
st_mtime = kw.get('st_mtime', s.st_mtime)
self.map[f] = (state, s.st_mode, st_size, st_mtime)
mpm@selenic.com
fix some rename/copy bugs...
r1117 if self.copies.has_key(f):
del self.copies[f]
mpm@selenic.com
Break apart hg.py...
r1089
def forget(self, files):
if not files: return
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 self.lazyread()
mpm@selenic.com
Break apart hg.py...
r1089 self.markdirty()
Vadim Gelfer
fix issue 322....
r2953 self.initdirs()
mpm@selenic.com
Break apart hg.py...
r1089 for f in files:
try:
del self.map[f]
Vadim Gelfer
fix issue 322....
r2953 self.updatedirs(f, -1)
mpm@selenic.com
Break apart hg.py...
r1089 except KeyError:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 self.ui.warn(_("not in dirstate: %s!\n") % f)
mpm@selenic.com
Break apart hg.py...
r1089 pass
def clear(self):
self.map = {}
Benoit Boissinot
add 'debugrebuildstate' to rebuild the dirstate from a given revision...
r1755 self.copies = {}
Vadim Gelfer
fix issue 322....
r2953 self.dirs = None
Benoit Boissinot
add 'debugrebuildstate' to rebuild the dirstate from a given revision...
r1755 self.markdirty()
def rebuild(self, parent, files):
self.clear()
umask = os.umask(0)
os.umask(umask)
Matt Mackall
Start using manifestflags methods
r2832 for f in files:
if files.execf(f):
Benoit Boissinot
add 'debugrebuildstate' to rebuild the dirstate from a given revision...
r1755 self.map[f] = ('n', ~umask, -1, 0)
else:
self.map[f] = ('n', ~umask & 0666, -1, 0)
self.pl = (parent, nullid)
mpm@selenic.com
Break apart hg.py...
r1089 self.markdirty()
def write(self):
Benoit Boissinot
only write the dirstate when something changed
r1794 if not self.dirty:
return
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 st = self.opener("dirstate", "w", atomic=True)
mpm@selenic.com
Break apart hg.py...
r1089 st.write("".join(self.pl))
for f, e in self.map.items():
c = self.copied(f)
if c:
f = f + "\0" + c
Benoit Boissinot
dirstate: refactor the dirstate binary format, remove magic numbers
r2393 e = struct.pack(self.format, e[0], e[1], e[2], e[3], len(f))
mpm@selenic.com
Break apart hg.py...
r1089 st.write(e + f)
self.dirty = 0
def filterfiles(self, files):
ret = {}
unknown = []
for x in files:
twaldmann@thinkmo.de
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
r1541 if x == '.':
mpm@selenic.com
Break apart hg.py...
r1089 return self.map.copy()
if x not in self.map:
unknown.append(x)
else:
ret[x] = self.map[x]
if not unknown:
return ret
b = self.map.keys()
b.sort()
blen = len(b)
for x in unknown:
Benoit Boissinot
simplify filterfiles when filtering based on a directory...
r2486 bs = bisect.bisect(b, "%s%s" % (x, '/'))
mpm@selenic.com
Break apart hg.py...
r1089 while bs < blen:
s = b[bs]
Brendan Cully
filterfiles: Search as long as the target is a prefix of current....
r2485 if len(s) > len(x) and s.startswith(x):
Benoit Boissinot
simplify filterfiles when filtering based on a directory...
r2486 ret[s] = self.map[s]
mpm@selenic.com
Break apart hg.py...
r1089 else:
break
bs += 1
return ret
Benoit Boissinot
don't print anything about file of unsupported type unless...
r1527 def supported_type(self, f, st, verbose=False):
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 if stat.S_ISREG(st.st_mode):
return True
if verbose:
kind = 'unknown'
if stat.S_ISCHR(st.st_mode): kind = _('character device')
elif stat.S_ISBLK(st.st_mode): kind = _('block device')
elif stat.S_ISFIFO(st.st_mode): kind = _('fifo')
elif stat.S_ISLNK(st.st_mode): kind = _('symbolic link')
elif stat.S_ISSOCK(st.st_mode): kind = _('socket')
elif stat.S_ISDIR(st.st_mode): kind = _('directory')
self.ui.warn(_('%s: unsupported file type (type is %s)\n') % (
util.pathto(self.getcwd(), f),
kind))
return False
Vadim Gelfer
small changes to revert command....
r2042 def statwalk(self, files=None, match=util.always, dc=None, ignored=False,
badmatch=None):
Benoit Boissinot
add dirstate.lazyread, write atomically the dirstate...
r1529 self.lazyread()
mpm@selenic.com
Break apart hg.py...
r1089
# walk all files by default
if not files:
files = [self.root]
if not dc:
dc = self.map.copy()
elif not dc:
dc = self.filterfiles(files)
Benoit Boissinot
fix warnings from pychecker (unused variables and shadowing)
r1749 def statmatch(file_, stat):
file_ = util.pconvert(file_)
Thomas Arendsen Hein
New option -i/--ignored for 'hg status' to show ignored files....
r2022 if not ignored and file_ not in dc and self.ignore(file_):
mason@suse.com
Optimize dirstate walking...
r1183 return False
Benoit Boissinot
fix warnings from pychecker (unused variables and shadowing)
r1749 return match(file_)
mpm@selenic.com
Fix Windows status problem from new dirstate walk code
r1224
Vadim Gelfer
small changes to revert command....
r2042 return self.walkhelper(files=files, statmatch=statmatch, dc=dc,
badmatch=badmatch)
mason@suse.com
Optimize dirstate walking...
r1183
Vadim Gelfer
small changes to revert command....
r2042 def walk(self, files=None, match=util.always, dc=None, badmatch=None):
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 # filter out the stat
Vadim Gelfer
small changes to revert command....
r2042 for src, f, st in self.statwalk(files, match, dc, badmatch=badmatch):
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 yield src, f
mason@suse.com
Optimize dirstate walking...
r1183 # walk recursively through the directory tree, finding all files
# matched by the statmatch function
mpm@selenic.com
Fix Windows status problem from new dirstate walk code
r1224 #
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 # results are yielded in a tuple (src, filename, st), where src
# is one of:
mason@suse.com
Optimize dirstate walking...
r1183 # 'f' the file was found in the directory tree
# 'm' the file was only in the dirstate and not in the tree
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 # and st is the stat result if the file was found in the directory.
mason@suse.com
Optimize dirstate walking...
r1183 #
# dc is an optional arg for the current dirstate. dc is not modified
# directly by this function, but might be modified by your statmatch call.
#
Vadim Gelfer
small changes to revert command....
r2042 def walkhelper(self, files, statmatch, dc, badmatch=None):
Benoit Boissinot
self.root == '/': prefix length computation out of the loop...
r2671 # self.root may end with a path separator when self.root == '/'
common_prefix_len = len(self.root)
if not self.root.endswith('/'):
common_prefix_len += 1
mason@suse.com
Optimize dirstate walking...
r1183 # recursion free walker, faster than os.walk.
def findfiles(s):
work = [s]
while work:
top = work.pop()
names = os.listdir(top)
names.sort()
# nd is the top of the repository dir tree
Benoit Boissinot
self.root == '/': prefix length computation out of the loop...
r2671 nd = util.normpath(top[common_prefix_len:])
Vadim Gelfer
support nested repositories....
r2061 if nd == '.':
nd = ''
else:
Vadim Gelfer
benoit asked for comment to make avoid of recursive repo clearer.
r2063 # do not recurse into a repo contained in this
# one. use bisect to find .hg directory so speed
# is good on big directory.
Vadim Gelfer
support nested repositories....
r2061 hg = bisect.bisect_left(names, '.hg')
if hg < len(names) and names[hg] == '.hg':
if os.path.isdir(os.path.join(top, '.hg')):
continue
mason@suse.com
Optimize dirstate walking...
r1183 for f in names:
Christian Boos
Fix walkhelper on windows....
r1562 np = util.pconvert(os.path.join(nd, f))
mason@suse.com
Optimize dirstate walking...
r1183 if seen(np):
continue
p = os.path.join(top, f)
mpm@selenic.com
Fix dangling symlink bug in dirstate walk code
r1228 # don't trip over symlinks
st = os.lstat(p)
mason@suse.com
Optimize dirstate walking...
r1183 if stat.S_ISDIR(st.st_mode):
ds = os.path.join(nd, f +'/')
if statmatch(ds, st):
work.append(p)
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 if statmatch(np, st) and np in dc:
Christian Boos
Fix walkhelper on windows....
r1562 yield 'm', np, st
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 elif statmatch(np, st):
if self.supported_type(np, st):
Christian Boos
Fix walkhelper on windows....
r1562 yield 'f', np, st
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 elif np in dc:
Christian Boos
Fix walkhelper on windows....
r1562 yield 'm', np, st
Benoit Boissinot
add a check for filetype when walking
r1392
mpm@selenic.com
Break apart hg.py...
r1089 known = {'.hg': 1}
def seen(fn):
if fn in known: return True
known[fn] = 1
mason@suse.com
Optimize dirstate walking...
r1183
# step one, find all files that match our criteria
files.sort()
for ff in util.unique(files):
Benoit Boissinot
use self.{w,}join when possible
r1510 f = self.wjoin(ff)
mason@suse.com
Optimize dirstate walking...
r1183 try:
mpm@selenic.com
dirstate: two more stat -> lstat changes
r1230 st = os.lstat(f)
mason@suse.com
Optimize dirstate walking...
r1183 except OSError, inst:
Benoit Boissinot
Re: [PATCH 2 of 3] remove walk warning about nonexistent files...
r1564 nf = util.normpath(ff)
found = False
for fn in dc:
if nf == fn or (fn.startswith(nf) and fn[len(nf)] == '/'):
found = True
break
if not found:
Vadim Gelfer
small changes to revert command....
r2042 if inst.errno != errno.ENOENT or not badmatch:
self.ui.warn('%s: %s\n' % (
util.pathto(self.getcwd(), ff),
inst.strerror))
elif badmatch and badmatch(ff) and statmatch(ff, None):
yield 'b', ff, None
mason@suse.com
Optimize dirstate walking...
r1183 continue
if stat.S_ISDIR(st.st_mode):
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 cmp1 = (lambda x, y: cmp(x[1], y[1]))
Benoit Boissinot
fix warnings from pychecker (unused variables and shadowing)
r1749 sorted_ = [ x for x in findfiles(f) ]
sorted_.sort(cmp1)
for e in sorted_:
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 yield e
Benoit Boissinot
add a check for filetype when walking
r1392 else:
mason@suse.com
Optimize dirstate walking...
r1183 ff = util.normpath(ff)
if seen(ff):
mpm@selenic.com
Break apart hg.py...
r1089 continue
mason@suse.com
Optimize dirstate walking...
r1183 self.blockignore = True
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 if statmatch(ff, st):
Benoit Boissinot
don't print anything about file of unsupported type unless...
r1527 if self.supported_type(ff, st, verbose=True):
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 yield 'f', ff, st
elif ff in dc:
yield 'm', ff, st
mason@suse.com
Optimize dirstate walking...
r1183 self.blockignore = False
mpm@selenic.com
Break apart hg.py...
r1089
mason@suse.com
Optimize dirstate walking...
r1183 # step two run through anything left in the dc hash and yield
# if we haven't already seen it
ks = dc.keys()
ks.sort()
for k in ks:
if not seen(k) and (statmatch(k, None)):
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 yield 'm', k, None
mpm@selenic.com
Break apart hg.py...
r1089
Vadim Gelfer
status: add -c (clean) and -A (all files) options...
r2661 def status(self, files=None, match=util.always, list_ignored=False,
list_clean=False):
Thomas Arendsen Hein
New option -i/--ignored for 'hg status' to show ignored files....
r2022 lookup, modified, added, unknown, ignored = [], [], [], [], []
Vadim Gelfer
status: add -c (clean) and -A (all files) options...
r2661 removed, deleted, clean = [], [], []
mpm@selenic.com
Break apart hg.py...
r1089
Vadim Gelfer
status: add -c (clean) and -A (all files) options...
r2661 for src, fn, st in self.statwalk(files, match, ignored=list_ignored):
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 try:
Benoit Boissinot
fix warnings from pychecker (unused variables and shadowing)
r1749 type_, mode, size, time = self[fn]
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 except KeyError:
Vadim Gelfer
status: add -c (clean) and -A (all files) options...
r2661 if list_ignored and self.ignore(fn):
Thomas Arendsen Hein
New option -i/--ignored for 'hg status' to show ignored files....
r2022 ignored.append(fn)
else:
unknown.append(fn)
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 continue
Benoit Boissinot
fix dirstate.change: it should walk ignored files
r1476 if src == 'm':
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 nonexistent = True
if not st:
try:
Vadim Gelfer
dirstate: fix call to os.lstat when st is None
r2429 st = os.lstat(self.wjoin(fn))
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 except OSError, inst:
if inst.errno != errno.ENOENT:
raise
st = None
# We need to re-check that it is a valid file
if st and self.supported_type(fn, st):
nonexistent = False
Benoit Boissinot
fix dirstate.change: it should walk ignored files
r1476 # XXX: what to do with file no longer present in the fs
# who are not removed in the dirstate ?
Benoit Boissinot
fix warnings from pychecker (unused variables and shadowing)
r1749 if nonexistent and type_ in "nm":
Benoit Boissinot
fix dirstate.change: it should walk ignored files
r1476 deleted.append(fn)
continue
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 # check the common case first
Benoit Boissinot
fix warnings from pychecker (unused variables and shadowing)
r1749 if type_ == 'n':
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 if not st:
Vadim Gelfer
replace os.stat with os.lstat in some where.
r2448 st = os.lstat(self.wjoin(fn))
Benoit Boissinot
add 'debugrebuildstate' to rebuild the dirstate from a given revision...
r1755 if size >= 0 and (size != st.st_size
or (mode ^ st.st_mode) & 0100):
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 modified.append(fn)
elif time != st.st_mtime:
lookup.append(fn)
Vadim Gelfer
status: add -c (clean) and -A (all files) options...
r2661 elif list_clean:
clean.append(fn)
Benoit Boissinot
fix warnings from pychecker (unused variables and shadowing)
r1749 elif type_ == 'm':
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 modified.append(fn)
Benoit Boissinot
fix warnings from pychecker (unused variables and shadowing)
r1749 elif type_ == 'a':
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 added.append(fn)
Benoit Boissinot
fix warnings from pychecker (unused variables and shadowing)
r1749 elif type_ == 'r':
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 removed.append(fn)
mason@suse.com
Optimize dirstate walking...
r1183
Vadim Gelfer
status: add -c (clean) and -A (all files) options...
r2661 return (lookup, modified, added, removed, deleted, unknown, ignored,
clean)