Mercurial > hg-stable
changeset 18870:0f2eb3d16a1a
merge with crew
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 03 Apr 2013 14:14:30 -0500 |
parents | f02045645d12 (current diff) e8b4b139a545 (diff) |
children | 16b34391819d |
files | |
diffstat | 6 files changed, 45 insertions(+), 61 deletions(-) [+] |
line wrap: on
line diff
--- 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: