Mercurial > hg
view hgext/parentrevspec.py @ 8255:ea82a23cf887
util.rename: use temporary file name for rename-targets on windows
Use a temporary file name as target for a forced rename on Windows. The
target file name is not opened at any time; just renamed into and then
unlinked. Using a temporary instead of a static name is necessary since
otherwise a hg crash can leave the file lying around, blocking future
attempts at renaming.
author | Sune Foldager <cryo@cyanite.org> |
---|---|
date | Wed, 29 Apr 2009 09:30:28 +0200 |
parents | 1d54e2f6c0b7 |
children | 4a4c7f6a5912 |
line wrap: on
line source
# Mercurial extension to make it easy to refer to the parent of a revision # # Copyright (C) 2007 Alexis S. L. Carvalho <alexis@cecm.usp.br> # # This software may be used and distributed according to the terms # of the GNU General Public License, incorporated herein by reference. '''\ use suffixes to refer to ancestor revisions This extension allows you to use git-style suffixes to refer to the ancestors of a specific revision. For example, if you can refer to a revision as "foo", then: - foo^N = Nth parent of foo: foo^0 = foo foo^1 = first parent of foo foo^2 = second parent of foo foo^ = foo^1 - foo~N = Nth first grandparent of foo foo~0 = foo foo~1 = foo^1 = foo^ = first parent of foo foo~2 = foo^1^1 = foo^^ = first parent of first parent of foo ''' import mercurial.repo from mercurial import error def reposetup(ui, repo): if not repo.local(): return class parentrevspecrepo(repo.__class__): def lookup(self, key): try: _super = super(parentrevspecrepo, self) return _super.lookup(key) except error.RepoError: pass circ = key.find('^') tilde = key.find('~') if circ < 0 and tilde < 0: raise elif circ >= 0 and tilde >= 0: end = min(circ, tilde) else: end = max(circ, tilde) cl = self.changelog base = key[:end] try: node = _super.lookup(base) except error.RepoError: # eek - reraise the first error return _super.lookup(key) rev = cl.rev(node) suffix = key[end:] i = 0 while i < len(suffix): # foo^N => Nth parent of foo # foo^0 == foo # foo^1 == foo^ == 1st parent of foo # foo^2 == 2nd parent of foo if suffix[i] == '^': j = i + 1 p = cl.parentrevs(rev) if j < len(suffix) and suffix[j].isdigit(): j += 1 n = int(suffix[i+1:j]) if n > 2 or n == 2 and p[1] == -1: raise else: n = 1 if n: rev = p[n - 1] i = j # foo~N => Nth first grandparent of foo # foo~0 = foo # foo~1 = foo^1 == foo^ == 1st parent of foo # foo~2 = foo^1^1 == foo^^ == 1st parent of 1st parent of foo elif suffix[i] == '~': j = i + 1 while j < len(suffix) and suffix[j].isdigit(): j += 1 if j == i + 1: raise n = int(suffix[i+1:j]) for k in xrange(n): rev = cl.parentrevs(rev)[0] i = j else: raise return cl.node(rev) repo.__class__ = parentrevspecrepo