##// END OF EJS Templates
convert: fix /dev/null redirections under Windows
convert: fix /dev/null redirections under Windows

File last commit:

r5210:90d9ec0d default
r5220:9d7052f1 default
Show More
dirstate.py
502 lines | 16.0 KiB | text/x-python | PythonLexer
mpm@selenic.com
Break apart hg.py...
r1089 """
dirstate.py - working directory tracking for mercurial
Thomas Arendsen Hein
Updated copyright notices and add "and others" to "hg version"
r4635 Copyright 2005-2007 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
dirstate: move ignore to its own file
r4609 import struct, os, time, bisect, stat, strutil, util, re, errno, ignore
Bryan O'Sullivan
dirstate: speed up write by 50%.
r4374 import cStringIO
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
dirstate: simplify state()
r4610 _unknown = ('?', 0, 0, 0)
_format = ">cllll"
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
mpm@selenic.com
Break apart hg.py...
r1089 def __init__(self, opener, ui, root):
Matt Mackall
dirstate: hide internal vars...
r4614 self._opener = opener
self._root = root
Matt Mackall
dirstate: simplify dirty handling
r4612 self._dirty = 0
Alexis S. L. Carvalho
add dirstate._dirtypl variable...
r4952 self._dirtypl = 0
Matt Mackall
dirstate: hide internal vars...
r4614 self._ui = ui
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
dirstate: use getattr rather than lazyread
r4603 def __getattr__(self, name):
Matt Mackall
dirstate: hide internal vars...
r4614 if name == '_map':
Matt Mackall
dirstate: hide some more internals
r4615 self._read()
Matt Mackall
dirstate: hide internal vars...
r4614 return self._map
elif name == '_copymap':
Matt Mackall
dirstate: hide some more internals
r4615 self._read()
Matt Mackall
dirstate: hide internal vars...
r4614 return self._copymap
Matt Mackall
dirstate: lazify copymap, _branch, and _pl
r4604 elif name == '_branch':
try:
Thomas Arendsen Hein
Cleanup of whitespace, indentation and line continuation.
r4633 self._branch = (self._opener("branch").read().strip()
or "default")
Matt Mackall
dirstate: lazify copymap, _branch, and _pl
r4604 except IOError:
self._branch = "default"
return self._branch
Matt Mackall
dirstate: hide internal vars...
r4614 elif name == '_pl':
self._pl = [nullid, nullid]
Matt Mackall
dirstate: lazify copymap, _branch, and _pl
r4604 try:
Matt Mackall
dirstate: hide internal vars...
r4614 st = self._opener("dirstate").read(40)
Matt Mackall
dirstate: lazify copymap, _branch, and _pl
r4604 if len(st) == 40:
Matt Mackall
dirstate: hide internal vars...
r4614 self._pl = st[:20], st[20:40]
Matt Mackall
dirstate: lazify copymap, _branch, and _pl
r4604 except IOError, err:
if err.errno != errno.ENOENT: raise
Matt Mackall
dirstate: hide internal vars...
r4614 return self._pl
Matt Mackall
dirstate: hide some more internals
r4615 elif name == '_dirs':
self._dirs = {}
Matt Mackall
dirstate: hide internal vars...
r4614 for f in self._map:
Matt Mackall
dirstate: hide some more internals
r4615 self._incpath(f)
return self._dirs
Matt Mackall
dirstate: move ignore to its own file
r4609 elif name == '_ignore':
Matt Mackall
dirstate: pull ignore smarts out of ui
r4620 files = [self.wjoin('.hgignore')]
for name, path in self._ui.configitems("ui"):
if name == 'ignore' or name.startswith('ignore.'):
files.append(os.path.expanduser(path))
Matt Mackall
dirstate: hide internal vars...
r4614 self._ignore = ignore.ignore(self._root, files, self._ui.warn)
Matt Mackall
dirstate: move ignore to its own file
r4609 return self._ignore
Matt Mackall
dirstate: lazify and lambdafy _slash
r4611 elif name == '_slash':
Matt Mackall
dirstate: hide internal vars...
r4614 self._slash = self._ui.configbool('ui', 'slash') and os.sep != '/'
Matt Mackall
dirstate: lazify and lambdafy _slash
r4611 return self._slash
Matt Mackall
dirstate: use getattr rather than lazyread
r4603 else:
raise AttributeError, name
mpm@selenic.com
Break apart hg.py...
r1089 def wjoin(self, f):
Matt Mackall
dirstate: hide internal vars...
r4614 return os.path.join(self._root, f)
mpm@selenic.com
Break apart hg.py...
r1089
def getcwd(self):
cwd = os.getcwd()
Matt Mackall
dirstate: hide internal vars...
r4614 if cwd == self._root: return ''
# self._root ends with a path separator if self._root is '/' or 'C:\'
rootsep = self._root
Alexis S. L. Carvalho
Fix handling of paths when run outside the repo....
r4230 if not rootsep.endswith(os.sep):
rootsep += os.sep
if cwd.startswith(rootsep):
return cwd[len(rootsep):]
else:
# we're outside the repo. return an absolute path.
return cwd
mpm@selenic.com
Break apart hg.py...
r1089
Alexis S. L. Carvalho
Add dirstate.pathto and localrepo.pathto....
r4525 def pathto(self, f, cwd=None):
if cwd is None:
cwd = self.getcwd()
Matt Mackall
dirstate: hide internal vars...
r4614 path = util.pathto(self._root, cwd, f)
Alexis S. L. Carvalho
Add ui.slash hgrc setting...
r4527 if self._slash:
Matt Mackall
dirstate: lazify and lambdafy _slash
r4611 return path.replace(os.sep, '/')
Alexis S. L. Carvalho
Add ui.slash hgrc setting...
r4527 return path
Alexis S. L. Carvalho
Add dirstate.pathto and localrepo.pathto....
r4525
mpm@selenic.com
Break apart hg.py...
r1089 def __del__(self):
Matt Mackall
dirstate: simplify dirty handling
r4612 self.write()
mpm@selenic.com
Break apart hg.py...
r1089
def __getitem__(self, key):
Matt Mackall
dirstate: hide internal vars...
r4614 return self._map[key]
mpm@selenic.com
Break apart hg.py...
r1089
def __contains__(self, key):
Matt Mackall
dirstate: hide internal vars...
r4614 return key in self._map
def __iter__(self):
a = self._map.keys()
a.sort()
for x in a:
yield x
mpm@selenic.com
Break apart hg.py...
r1089
def parents(self):
Matt Mackall
dirstate: hide internal vars...
r4614 return self._pl
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
Move branch read/write to dirstate where it belongs
r4179 def branch(self):
return self._branch
mpm@selenic.com
Break apart hg.py...
r1089 def markdirty(self):
Matt Mackall
dirstate: simplify dirty handling
r4612 self._dirty = 1
mpm@selenic.com
Break apart hg.py...
r1089
def setparents(self, p1, p2=nullid):
self.markdirty()
Alexis S. L. Carvalho
add dirstate._dirtypl variable...
r4952 self._dirtypl = 1
Matt Mackall
dirstate: hide internal vars...
r4614 self._pl = p1, p2
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
Move branch read/write to dirstate where it belongs
r4179 def setbranch(self, branch):
self._branch = branch
Matt Mackall
dirstate: hide internal vars...
r4614 self._opener("branch", "w").write(branch + '\n')
Matt Mackall
Move branch read/write to dirstate where it belongs
r4179
mpm@selenic.com
Break apart hg.py...
r1089 def state(self, key):
Matt Mackall
dirstate: hide internal vars...
r4614 return self._map.get(key, ("?",))[0]
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
dirstate: hide some more internals
r4615 def _read(self):
Matt Mackall
dirstate: hide internal vars...
r4614 self._map = {}
self._copymap = {}
Alexis S. L. Carvalho
add dirstate._dirtypl variable...
r4952 if not self._dirtypl:
self._pl = [nullid, nullid]
Matt Mackall
dirstate: fold parse into read
r4607 try:
Matt Mackall
dirstate: hide internal vars...
r4614 st = self._opener("dirstate").read()
Matt Mackall
dirstate: fold parse into read
r4607 except IOError, err:
if err.errno != errno.ENOENT: raise
return
if not st:
return
Alexis S. L. Carvalho
add dirstate._dirtypl variable...
r4952 if not self._dirtypl:
self._pl = [st[:20], st[20: 40]]
mpm@selenic.com
Break apart hg.py...
r1089
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 # deref fields so they will be local in loop
Matt Mackall
dirstate: hide internal vars...
r4614 dmap = self._map
copymap = self._copymap
Vadim Gelfer
dirstate.read: make 15% faster....
r2427 unpack = struct.unpack
mpm@selenic.com
Break apart hg.py...
r1089 pos = 40
Matt Mackall
dirstate: simplify state()
r4610 e_size = struct.calcsize(_format)
Vadim Gelfer
dirstate.read: make 15% faster....
r2427
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
Matt Mackall
dirstate: simplify state()
r4610 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
Matt Mackall
dirstate: fold parse into read
r4607 dmap[f] = e[:4]
Vadim Gelfer
dirstate: speed up inner loop of read.
r2425 pos = newpos
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
localrepo and dirstate: rename reload to invalidate...
r4613 def invalidate(self):
Alexis S. L. Carvalho
dirstate: fix typo
r4656 for a in "_map _copymap _branch _pl _dirs _ignore".split():
Alexis S. L. Carvalho
dirstate.invalidate: avoid rebuilding _map...
r4953 if a in self.__dict__:
delattr(self, a)
Alexis S. L. Carvalho
dirstate.invalidate: clear dirty flag
r4657 self._dirty = 0
Bryan O'Sullivan
When reloading the dirstate, recompute ignore information if needed.
r4375
mpm@selenic.com
Break apart hg.py...
r1089 def copy(self, source, dest):
self.markdirty()
Matt Mackall
dirstate: hide internal vars...
r4614 self._copymap[dest] = source
mpm@selenic.com
Break apart hg.py...
r1089
def copied(self, file):
Matt Mackall
dirstate: hide internal vars...
r4614 return self._copymap.get(file, None)
Matt Mackall
dirstate: add copies function...
r3154
def copies(self):
Matt Mackall
dirstate: hide internal vars...
r4614 return self._copymap
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
dirstate: hide some more internals
r4615 def _incpath(self, path):
Matt Mackall
dirstate: lazify initdirs
r4605 for c in strutil.findall(path, '/'):
pc = path[:c]
Matt Mackall
dirstate: hide some more internals
r4615 self._dirs.setdefault(pc, 0)
self._dirs[pc] += 1
def _decpath(self, path):
for c in strutil.findall(path, '/'):
pc = path[:c]
self._dirs.setdefault(pc, 0)
self._dirs[pc] -= 1
Vadim Gelfer
fix issue 322....
r2953
Matt Mackall
dirstate: refactor checkinterfering
r4616 def _incpathcheck(self, f):
if '\r' in f or '\n' in f:
raise util.Abort(_("'\\n' and '\\r' disallowed in filenames"))
# shadows
if f in self._dirs:
raise util.Abort(_('directory named %r already in dirstate') % f)
for c in strutil.rfindall(f, '/'):
d = f[:c]
if d in self._dirs:
break
if d in self._map:
raise util.Abort(_('file named %r already in dirstate') % d)
self._incpath(f)
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
self.markdirty()
for f in files:
Matt Mackall
dirstate: refactor checkinterfering
r4616 if self._copymap.has_key(f):
del self._copymap[f]
mpm@selenic.com
Break apart hg.py...
r1089 if state == "r":
Matt Mackall
dirstate: hide internal vars...
r4614 self._map[f] = ('r', 0, 0, 0)
Matt Mackall
dirstate: hide some more internals
r4615 self._decpath(f)
Matt Mackall
dirstate: refactor checkinterfering
r4616 continue
mpm@selenic.com
Break apart hg.py...
r1089 else:
Vadim Gelfer
fix issue 322....
r2953 if state == "a":
Matt Mackall
dirstate: refactor checkinterfering
r4616 self._incpathcheck(f)
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)
Matt Mackall
dirstate: hide internal vars...
r4614 self._map[f] = (state, s.st_mode, st_size, st_mtime)
mpm@selenic.com
Break apart hg.py...
r1089
def forget(self, files):
if not files: return
self.markdirty()
for f in files:
try:
Matt Mackall
dirstate: hide internal vars...
r4614 del self._map[f]
Matt Mackall
dirstate: hide some more internals
r4615 self._decpath(f)
mpm@selenic.com
Break apart hg.py...
r1089 except KeyError:
Matt Mackall
dirstate: hide internal vars...
r4614 self._ui.warn(_("not in dirstate: %s!\n") % f)
mpm@selenic.com
Break apart hg.py...
r1089 pass
Alexis S. L. Carvalho
dirstate: fix rebuild; add a test...
r5065 def clear(self):
self._map = {}
self._copymap = {}
self._pl = [nullid, nullid]
self.markdirty()
Benoit Boissinot
add 'debugrebuildstate' to rebuild the dirstate from a given revision...
r1755 def rebuild(self, parent, files):
Alexis S. L. Carvalho
dirstate: fix rebuild; add a test...
r5065 self.clear()
Matt Mackall
Start using manifestflags methods
r2832 for f in files:
if files.execf(f):
Matt Mackall
dirstate: hide internal vars...
r4614 self._map[f] = ('n', 0777, -1, 0)
Benoit Boissinot
add 'debugrebuildstate' to rebuild the dirstate from a given revision...
r1755 else:
Matt Mackall
dirstate: hide internal vars...
r4614 self._map[f] = ('n', 0666, -1, 0)
self._pl = (parent, nullid)
mpm@selenic.com
Break apart hg.py...
r1089 self.markdirty()
def write(self):
Matt Mackall
dirstate: simplify dirty handling
r4612 if not self._dirty:
Benoit Boissinot
only write the dirstate when something changed
r1794 return
Bryan O'Sullivan
dirstate: speed up write by 50%.
r4374 cs = cStringIO.StringIO()
Matt Mackall
dirstate: hide internal vars...
r4614 cs.write("".join(self._pl))
for f, e in self._map.iteritems():
mpm@selenic.com
Break apart hg.py...
r1089 c = self.copied(f)
if c:
f = f + "\0" + c
Matt Mackall
dirstate: simplify state()
r4610 e = struct.pack(_format, e[0], e[1], e[2], e[3], len(f))
Bryan O'Sullivan
dirstate: speed up write by 50%.
r4374 cs.write(e)
cs.write(f)
Matt Mackall
dirstate: hide internal vars...
r4614 st = self._opener("dirstate", "w", atomictemp=True)
Bryan O'Sullivan
dirstate: speed up write by 50%.
r4374 st.write(cs.getvalue())
Alexis S. L. Carvalho
Use atomictemp files to write the dirstate....
r4507 st.rename()
Matt Mackall
dirstate: simplify dirty handling
r4612 self._dirty = 0
Alexis S. L. Carvalho
add dirstate._dirtypl variable...
r4952 self._dirtypl = 0
mpm@selenic.com
Break apart hg.py...
r1089
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 == '.':
Matt Mackall
dirstate: hide internal vars...
r4614 return self._map.copy()
if x not in self._map:
mpm@selenic.com
Break apart hg.py...
r1089 unknown.append(x)
else:
Matt Mackall
dirstate: hide internal vars...
r4614 ret[x] = self._map[x]
mpm@selenic.com
Break apart hg.py...
r1089
if not unknown:
return ret
Matt Mackall
dirstate: hide internal vars...
r4614 b = self._map.keys()
mpm@selenic.com
Break apart hg.py...
r1089 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):
Matt Mackall
dirstate: hide internal vars...
r4614 ret[s] = self._map[s]
mpm@selenic.com
Break apart hg.py...
r1089 else:
break
bs += 1
return ret
Matt Mackall
dirstate: hide some more internals
r4615 def _supported(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')
Matt Mackall
dirstate: hide internal vars...
r4614 self._ui.warn(_('%s: unsupported file type (type is %s)\n')
Thomas Arendsen Hein
Cleanup of whitespace, indentation and line continuation.
r4633 % (self.pathto(f), kind))
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 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,
Emanuele Aina
Yield directories in dirstate.statwalk()
r4146 badmatch=None, directories=False):
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
Emanuele Aina
Yield directories in dirstate.statwalk()
r4146 'd' the file is a directory of the tree
Matt Mackall
simplify dirstate walking...
r3529 '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.
'''
mpm@selenic.com
Break apart hg.py...
r1089
# walk all files by default
if not files:
Alexis S. L. Carvalho
statwalk: don't put self.root in the files list...
r4172 files = ['.']
Matt Mackall
dirstate: hide internal vars...
r4614 dc = self._map.copy()
Matt Mackall
simplify dirstate walking...
r3529 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
dirstate: move ignore to its own file
r4609 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
dirstate: move ignore to its own file
r4609 ignore = self._ignore
Alexis S. L. Carvalho
dirstate.statwalk: explicitly test for ignored directories...
r4193 if ignored:
imatch = match
ignore = util.never
Matt Mackall
Simplify ignore logic in dirstate.walk...
r3534
Matt Mackall
dirstate: hide internal vars...
r4614 # self._root may end with a path separator when self._root == '/'
common_prefix_len = len(self._root)
if not self._root.endswith(os.sep):
Benoit Boissinot
self.root == '/': prefix length computation out of the loop...
r2671 common_prefix_len += 1
mason@suse.com
Optimize dirstate walking...
r1183 # recursion free walker, faster than os.walk.
def findfiles(s):
work = [s]
Emanuele Aina
Yield directories in dirstate.statwalk()
r4146 if directories:
yield 'd', util.normpath(s[common_prefix_len:]), os.lstat(s)
mason@suse.com
Optimize dirstate walking...
r1183 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):
Alexis S. L. Carvalho
Pass normalized directory names to the ignore function...
r4254 if not ignore(np):
mason@suse.com
Optimize dirstate walking...
r1183 work.append(p)
Emanuele Aina
Yield directories in dirstate.statwalk()
r4146 if directories:
yield 'd', np, st
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):
Matt Mackall
dirstate: hide some more internals
r4615 if self._supported(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:
Thomas Arendsen Hein
Cleanup of whitespace, indentation and line continuation.
r4633 self._ui.warn('%s: %s\n' %
(self.pathto(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):
Matt Mackall
dirstate: hide some more internals
r4615 if self._supported(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:
Matt Mackall
dirstate: move ignore to its own file
r4609 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
Matt Mackall
dirstate: hide some more internals
r4615 if st and self._supported(fn, st):
Benoit Boissinot
fix handling of files of unsupported type in the walk code...
r1487 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))
Alexis S. L. Carvalho
dirstate.status: if a file is marked as copied, consider it modified...
r4677 if (size >= 0 and (size != st.st_size
or (mode ^ st.st_mode) & 0100)
or fn in self._copymap):
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)