##// END OF EJS Templates
Fix memory leak when using hg commands over http repositories...
Fix memory leak when using hg commands over http repositories When using hg commands over an http repository in a long running process, a httphandler instance is leaked for each command, because of a loop handler.parent -> OpenerDirector and OpenerDirector.handlers -> handler which is not handled by Python's gc. Discussion on #mercurial concluded that removing the __del__ method solved the problem.

File last commit:

r10282:08a0f04b default
r12391:ca5fd84d stable
Show More
parentrevspec.py
96 lines | 3.1 KiB | text/x-python | PythonLexer
Alexis S. L. Carvalho
Add parentrevspec extension
r5194 # 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>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Martin Geisler
add blank line after copyright notices and after header
r8228
Cédric Duval
extensions: improve the consistency of synopses...
r8894 '''interpret suffixes to refer to ancestor revisions
Alexis S. L. Carvalho
Add parentrevspec extension
r5194
Martin Geisler
parentrevspec: wrap docstrings at 70 characters
r9268 This extension allows you to use git-style suffixes to refer to the
ancestors of a specific revision.
Alexis S. L. Carvalho
Add parentrevspec extension
r5194
Martin Geisler
parentrevspec: change list to a literal block
r9213 For example, if you can refer to a revision as "foo", then::
Alexis S. L. Carvalho
Add parentrevspec extension
r5194
Martin Geisler
parentrevspec: change list to a literal block
r9213 foo^N = Nth parent of foo
Alexis S. L. Carvalho
Add parentrevspec extension
r5194 foo^0 = foo
foo^1 = first parent of foo
foo^2 = second parent of foo
foo^ = foo^1
Martin Geisler
parentrevspec: change list to a literal block
r9213 foo~N = Nth first grandparent of foo
Alexis S. L. Carvalho
Add parentrevspec extension
r5194 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
'''
Matt Mackall
error: move repo errors...
r7637 from mercurial import error
Alexis S. L. Carvalho
Add parentrevspec extension
r5194
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)
Matt Mackall
error: move repo errors...
r7637 except error.RepoError:
Alexis S. L. Carvalho
Add parentrevspec extension
r5194 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)
Matt Mackall
error: move repo errors...
r7637 except error.RepoError:
Alexis S. L. Carvalho
Add parentrevspec extension
r5194 # 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
Matt Mackall
many, many trivial check-code fixups
r10282 n = int(suffix[i + 1:j])
Alexis S. L. Carvalho
Add parentrevspec extension
r5194 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
Matt Mackall
many, many trivial check-code fixups
r10282 n = int(suffix[i + 1:j])
Alexis S. L. Carvalho
Add parentrevspec extension
r5194 for k in xrange(n):
rev = cl.parentrevs(rev)[0]
i = j
else:
raise
return cl.node(rev)
repo.__class__ = parentrevspecrepo