##// END OF EJS Templates
replace filehandle version of wwrite with wwritedata
replace filehandle version of wwrite with wwritedata

File last commit:

r4001:dda03b2d default
r4005:656e06ee default
Show More
dirstate.py
529 lines | 17.4 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 *
Matt Mackall
Simplify i18n imports
r3891 from i18n import _
Matt Mackall
Replace demandload with new demandimport
r3877 import 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
Matt Mackall
dirstate: add copies function...
r3154 self.copymap = {}
mpm@selenic.com
Break apart hg.py...
r1089 self.ignorefunc = None
def wjoin(self, f):
return os.path.join(self.root, f)
def getcwd(self):
cwd = os.getcwd()
if cwd == self.root: return ''
Thomas Arendsen Hein
issue228: Fix repositories at the filesystem root (/ or C:\)...
r3665 # self.root ends with a path separator if self.root is '/' or 'C:\'
common_prefix_len = len(self.root)
if not self.root.endswith(os.sep):
common_prefix_len += 1
return cwd[common_prefix_len:]
mpm@selenic.com
Break apart hg.py...
r1089
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.'''
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
Matt Mackall
dirstate: add copies function...
r3154 copymap = self.copymap
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 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')
Matt Mackall
dirstate: add copies function...
r3154 copymap[f] = c
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 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()
Matt Mackall
dirstate: add copies function...
r3154 self.copymap[dest] = source
mpm@selenic.com
Break apart hg.py...
r1089
def copied(self, file):
Matt Mackall
dirstate: add copies function...
r3154 return self.copymap.get(file, None)
def copies(self):
return self.copymap
mpm@selenic.com
Break apart hg.py...
r1089
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)
Thomas Arendsen Hein
Whitespace/Tab cleanup
r3223
Vadim Gelfer
fix issue 322....
r2953 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
Benoit Boissinot
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
r3607 def checkinterfering(self, files):
Vadim Gelfer
fix issue 322....
r2953 def prefixes(f):
for c in strutil.rfindall(f, '/'):
yield f[:c]
self.lazyread()
self.initdirs()
seendirs = {}
for f in files:
Benoit Boissinot
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
r3607 # shadows
Vadim Gelfer
fix issue 322....
r2953 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
Benoit Boissinot
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
r3607 # disallowed
if '\r' in f or '\n' in f:
raise util.Abort(_("'\\n' and '\\r' disallowed in filenames"))
Vadim Gelfer
fix issue 322....
r2953
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()
Benoit Boissinot
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
r3607 self.checkinterfering(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)
Matt Mackall
dirstate: add copies function...
r3154 if self.copymap.has_key(f):
del self.copymap[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 = {}
Matt Mackall
dirstate: add copies function...
r3154 self.copymap = {}
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()
Matt Mackall
Start using manifestflags methods
r2832 for f in files:
if files.execf(f):
Benoit Boissinot
remove unnecessary call to umask
r3842 self.map[f] = ('n', 0777, -1, 0)
Benoit Boissinot
add 'debugrebuildstate' to rebuild the dirstate from a given revision...
r1755 else:
Benoit Boissinot
remove unnecessary call to umask
r3842 self.map[f] = ('n', 0666, -1, 0)
Benoit Boissinot
add 'debugrebuildstate' to rebuild the dirstate from a given revision...
r1755 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):
Matt Mackall
symlinks: don't complain about symlinks
r4001 if stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode):
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 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_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
Matt Mackall
simplify dirstate walking...
r3529 def walk(self, files=None, match=util.always, badmatch=None):
# filter out the stat
for src, f, st in self.statwalk(files, match, badmatch=badmatch):
yield src, f
def statwalk(self, files=None, match=util.always, ignored=False,
Vadim Gelfer
small changes to revert command....
r2042 badmatch=None):
Matt Mackall
simplify dirstate walking...
r3529 '''
walk recursively through the directory tree, finding all files
matched by the match function
results are yielded in a tuple (src, filename, st), where src
is one of:
'f' the file was found in the directory tree
'm' the file was only in the dirstate and not in the tree
Matt Mackall
improve walk docstrings
r3532 'b' file was not found and matched badmatch
Matt Mackall
simplify dirstate walking...
r3529 and st is the stat result if the file was found in the directory.
'''
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]
Matt Mackall
simplify dirstate walking...
r3529 dc = self.map.copy()
else:
Matt Mackall
small refactoring of path normalization in dirstate.statwalk
r3536 files = util.unique(files)
mpm@selenic.com
Break apart hg.py...
r1089 dc = self.filterfiles(files)
Matt Mackall
simplify dirstate walking...
r3529 def imatch(file_):
Matt Mackall
Simplify ignore logic in dirstate.walk...
r3534 if 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
Matt Mackall
Simplify ignore logic in dirstate.walk...
r3534 if ignored: imatch = match
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):
Matt Mackall
Simplify ignore logic in dirstate.walk...
r3534 ds = util.pconvert(os.path.join(nd, f +'/'))
Matt Mackall
simplify dirstate walking...
r3529 if imatch(ds):
mason@suse.com
Optimize dirstate walking...
r1183 work.append(p)
Matt Mackall
simplify dirstate walking...
r3529 if imatch(np) and np in dc:
Christian Boos
Fix walkhelper on windows....
r1562 yield 'm', np, st
Matt Mackall
simplify dirstate walking...
r3529 elif imatch(np):
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 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()
Matt Mackall
small refactoring of path normalization in dirstate.statwalk
r3536 for ff in files:
nf = util.normpath(ff)
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 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))
Matt Mackall
Simplify ignore logic in dirstate.walk...
r3534 elif badmatch and badmatch(ff) and imatch(nf):
Vadim Gelfer
small changes to revert command....
r2042 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:
Matt Mackall
small refactoring of path normalization in dirstate.statwalk
r3536 if not seen(nf) and match(nf):
Benoit Boissinot
don't print anything about file of unsupported type unless...
r1527 if self.supported_type(ff, st, verbose=True):
Matt Mackall
small refactoring of path normalization in dirstate.statwalk
r3536 yield 'f', nf, st
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 elif ff in dc:
Matt Mackall
small refactoring of path normalization in dirstate.statwalk
r3536 yield 'm', nf, st
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:
Matt Mackall
simplify dirstate walking...
r3529 if not seen(k) and imatch(k):
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)
Alexis S. L. Carvalho
dirstate.py: when comparing mtimes, use only the integer part....
r2962 elif time != int(st.st_mtime):
Benoit Boissinot
rewrote changes function in dirstate to use generic walk code...
r1471 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)