--- a/mercurial/dirstate.py Tue Apr 02 01:15:31 2013 -0500
+++ b/mercurial/dirstate.py Wed Apr 03 14:14:30 2013 -0500
@@ -154,11 +154,14 @@
def flagfunc(self, buildfallback):
if self._checklink and self._checkexec:
def f(x):
- p = self._join(x)
- if os.path.islink(p):
- return 'l'
- if util.isexec(p):
- return 'x'
+ try:
+ st = os.lstat(self._join(x))
+ if util.statislink(st):
+ return 'l'
+ if util.statisexec(st):
+ return 'x'
+ except OSError:
+ pass
return ''
return f
--- a/mercurial/posix.py Tue Apr 02 01:15:31 2013 -0500
+++ b/mercurial/posix.py Wed Apr 03 14:14:30 2013 -0500
@@ -557,3 +557,11 @@
if self.realpath != self.path:
okayifmissing(os.unlink, self.realpath)
okayifmissing(os.rmdir, os.path.dirname(self.realpath))
+
+def statislink(st):
+ '''check whether a stat result is a symlink'''
+ return st and stat.S_ISLNK(st.st_mode)
+
+def statisexec(st):
+ '''check whether a stat result is an executable file'''
+ return st and (st.st_mode & 0100 != 0)
--- a/mercurial/scmutil.py Tue Apr 02 01:15:31 2013 -0500
+++ b/mercurial/scmutil.py Wed Apr 03 14:14:30 2013 -0500
@@ -676,26 +676,32 @@
m.bad = lambda x, y: rejected.append(x)
ctx = repo[None]
- walkresults = repo.dirstate.walk(m, sorted(ctx.substate), True, False)
- for abs in sorted(walkresults):
- st = walkresults[abs]
- dstate = repo.dirstate[abs]
+ dirstate = repo.dirstate
+ walkresults = dirstate.walk(m, sorted(ctx.substate), True, False)
+ for abs, st in walkresults.iteritems():
+ dstate = dirstate[abs]
if dstate == '?' and audit_path.check(abs):
unknown.append(abs)
- if repo.ui.verbose or not m.exact(abs):
- rel = m.rel(abs)
- repo.ui.status(_('adding %s\n') % ((pats and rel) or abs))
- elif (dstate != 'r' and (not st or
- (stat.S_ISDIR(st.st_mode) and not stat.S_ISLNK(st.st_mode)))):
+ elif dstate != 'r' and not st:
deleted.append(abs)
- if repo.ui.verbose or not m.exact(abs):
- rel = m.rel(abs)
- repo.ui.status(_('removing %s\n') % ((pats and rel) or abs))
# for finding renames
elif dstate == 'r':
removed.append(abs)
elif dstate == 'a':
added.append(abs)
+
+ unknownset = set(unknown)
+ toprint = unknownset.copy()
+ toprint.update(deleted)
+ for abs in sorted(toprint):
+ if repo.ui.verbose or not m.exact(abs):
+ rel = m.rel(abs)
+ if abs in unknownset:
+ status = _('adding %s\n') % ((pats and rel) or abs)
+ else:
+ status = _('removing %s\n') % ((pats and rel) or abs)
+ repo.ui.status(status)
+
copies = {}
if similarity > 0:
for old, new, score in similar.findrenames(repo,
@@ -722,49 +728,6 @@
return 1
return 0
-def updatedir(ui, repo, patches, similarity=0):
- '''Update dirstate after patch application according to metadata'''
- if not patches:
- return []
- copies = []
- removes = set()
- cfiles = patches.keys()
- cwd = repo.getcwd()
- if cwd:
- cfiles = [util.pathto(repo.root, cwd, f) for f in patches.keys()]
- for f in patches:
- gp = patches[f]
- if not gp:
- continue
- if gp.op == 'RENAME':
- copies.append((gp.oldpath, gp.path))
- removes.add(gp.oldpath)
- elif gp.op == 'COPY':
- copies.append((gp.oldpath, gp.path))
- elif gp.op == 'DELETE':
- removes.add(gp.path)
-
- wctx = repo[None]
- for src, dst in copies:
- dirstatecopy(ui, repo, wctx, src, dst, cwd=cwd)
- if (not similarity) and removes:
- wctx.remove(sorted(removes), True)
-
- for f in patches:
- gp = patches[f]
- if gp and gp.mode:
- islink, isexec = gp.mode
- dst = repo.wjoin(gp.path)
- # patch won't create empty files
- if gp.op == 'ADD' and not os.path.lexists(dst):
- flags = (isexec and 'x' or '') + (islink and 'l' or '')
- repo.wwrite(gp.path, '', flags)
- util.setflags(dst, islink, isexec)
- addremove(repo, cfiles, similarity=similarity)
- files = patches.keys()
- files.extend([r for r in removes if r not in files])
- return sorted(files)
-
def dirstatecopy(ui, repo, wctx, src, dst, dryrun=False, cwd=None):
"""Update the dirstate to reflect the intent of copying src to dst. For
different reasons it might not end with dst being marked as copied from src.
--- a/mercurial/util.py Tue Apr 02 01:15:31 2013 -0500
+++ b/mercurial/util.py Wed Apr 03 14:14:30 2013 -0500
@@ -65,6 +65,8 @@
split = platform.split
sshargs = platform.sshargs
statfiles = getattr(osutil, 'statfiles', platform.statfiles)
+statisexec = platform.statisexec
+statislink = platform.statislink
termwidth = platform.termwidth
testpid = platform.testpid
umask = platform.umask
--- a/mercurial/windows.py Tue Apr 02 01:15:31 2013 -0500
+++ b/mercurial/windows.py Wed Apr 03 14:14:30 2013 -0500
@@ -337,3 +337,11 @@
pass
expandglobs = True
+
+def statislink(st):
+ '''check whether a stat result is a symlink'''
+ return False
+
+def statisexec(st):
+ '''check whether a stat result is an executable file'''
+ return False
--- a/setup.py Tue Apr 02 01:15:31 2013 -0500
+++ b/setup.py Wed Apr 03 14:14:30 2013 -0500
@@ -148,7 +148,7 @@
# fine, we don't want to load it anyway. Python may warn about
# a missing __init__.py in mercurial/locale, we also ignore that.
err = [e for e in err.splitlines()
- if not e.startswith(b('Not trusting file')) \
+ if not e.startswith(b('not trusting file')) \
and not e.startswith(b('warning: Not importing')) \
and not e.startswith(b('obsolete feature not enabled'))]
if err: