##// END OF EJS Templates
localrepo: add branchtip() method for faster single-branch lookups...
localrepo: add branchtip() method for faster single-branch lookups For the PyPy repo with 744 branches and 843 branch heads, this brings hg log -r default over NFS from: CallCount Recursive Total(ms) Inline(ms) module:lineno(function) 3249 0 1.3222 1.3222 <open> 3244 0 0.6211 0.6211 <method 'close' of 'file' objects> 3243 0 0.0800 0.0800 <method 'read' of 'file' objects> 3241 0 0.0660 0.0660 <method 'seek' of 'file' objects> 3905 0 0.0476 0.0476 <zlib.decompress> 3281 0 2.6756 0.0472 mercurial.changelog:182(read) +3281 0 2.5256 0.0453 +mercurial.revlog:881(revision) +3276 0 0.0389 0.0196 +mercurial.changelog:28(decodeextra) +6562 0 0.0123 0.0123 +<method 'split' of 'str' objects> +6562 0 0.0408 0.0073 +mercurial.encoding:61(tolocal) +3281 0 0.0054 0.0054 +<method 'index' of 'str' objects> 3241 0 2.2464 0.0456 mercurial.revlog:818(_loadchunk) +3241 0 0.6205 0.6205 +<method 'close' of 'file' objects> +3241 0 0.0765 0.0765 +<method 'read' of 'file' objects> +3241 0 0.0660 0.0660 +<method 'seek' of 'file' objects> +3241 0 1.4209 0.0135 +mercurial.store:374(__call__) +3241 0 0.0122 0.0107 +mercurial.revlog:810(_addchunk) 3281 0 2.5256 0.0453 mercurial.revlog:881(revision) +3280 0 0.0175 0.0175 +mercurial.revlog:305(rev) +3281 0 2.2819 0.0119 +mercurial.revlog:847(_chunkraw) +3281 0 0.0603 0.0083 +mercurial.revlog:945(_checkhash) +3281 0 0.0051 0.0051 +mercurial.revlog:349(flags) +3281 0 0.0040 0.0040 +<mercurial.mpatch.patches> 13682 0 0.0479 0.0248 <method 'decode' of 'str' objects> +7418 0 0.0228 0.0076 +encodings.utf_8:15(decode) +1 0 0.0003 0.0000 +encodings:71(search_function) 3248 0 1.3995 0.0246 mercurial.scmutil:218(__call__) +3248 0 1.3222 1.3222 +<open> +3248 0 0.0235 0.0184 +os.path:80(split) +3248 0 0.0084 0.0068 +mercurial.scmutil:92(__call__) Time: real 2.750 secs (user 0.680+0.000 sys 0.360+0.000) down to: CallCount Recursive Total(ms) Inline(ms) module:lineno(function) 55 31 0.0197 0.0163 <__import__> +1 0 0.0006 0.0002 +mercurial.context:8(<module>) +1 0 0.0042 0.0001 +mercurial.revlog:12(<module>) +1 0 0.0002 0.0001 +mercurial.match:8(<module>) +1 0 0.0003 0.0001 +mercurial.dirstate:7(<module>) +1 0 0.0057 0.0001 +mercurial.changelog:8(<module>) 1 0 0.0117 0.0032 mercurial.localrepo:525(_readbranchcache) +844 0 0.0015 0.0015 +<binascii.unhexlify> +845 0 0.0010 0.0010 +<method 'split' of 'str' objects> +843 0 0.0045 0.0009 +mercurial.encoding:61(tolocal) +843 0 0.0004 0.0004 +<method 'setdefault' of 'dict' objects> +1 0 0.0003 0.0003 +<method 'close' of 'file' objects> 3 0 0.0029 0.0029 <method 'read' of 'file' objects> 9 0 0.0018 0.0018 <open> 990 0 0.0017 0.0017 <binascii.unhexlify> 53 0 0.0016 0.0016 mercurial.demandimport:43(__init__) 862 0 0.0015 0.0015 <_codecs.utf_8_decode> 862 0 0.0037 0.0014 <method 'decode' of 'str' objects> +862 0 0.0023 0.0008 +encodings.utf_8:15(decode) 981 0 0.0011 0.0011 <method 'split' of 'str' objects> 861 0 0.0046 0.0009 mercurial.encoding:61(tolocal) +861 0 0.0037 0.0014 +<method 'decode' of 'str' objects> 862 0 0.0023 0.0008 encodings.utf_8:15(decode) +862 0 0.0015 0.0015 +<_codecs.utf_8_decode> 4 0 0.0008 0.0008 <method 'close' of 'file' objects> 179 154 0.0202 0.0004 mercurial.demandimport:83(__getattribute__) +36 11 0.0199 0.0003 +mercurial.demandimport:55(_load) +72 0 0.0001 0.0001 +mercurial.demandimport:83(__getattribute__) +36 0 0.0000 0.0000 +<getattr> 1 0 0.0015 0.0004 mercurial.tags:148(_readtagcache) Time: real 0.060 secs (user 0.030+0.000 sys 0.010+0.000)

File last commit:

r16688:cfb66829 default
r16719:e7bf09ac default
Show More
sshrepo.py
236 lines | 7.0 KiB | text/x-python | PythonLexer
mpm@selenic.com
sshrepo: adjust file comment
r1096 # sshrepo.py - ssh repository proxy class for mercurial
mpm@selenic.com
Break apart hg.py...
r1089 #
Vadim Gelfer
update copyrights.
r2859 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
mpm@selenic.com
Break apart hg.py...
r1089 #
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.
mpm@selenic.com
Break apart hg.py...
r1089
Mads Kiilerich
sshrepo: don't quote obviously safe strings (issue2983)...
r15622 import re
Matt Mackall
Simplify i18n imports
r3891 from i18n import _
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 import util, error, wireproto
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
remoterepo: no longer needed...
r6313 class remotelock(object):
def __init__(self, repo):
self.repo = repo
def release(self):
self.repo.unlock()
self.repo = None
def __del__(self):
if self.repo:
self.release()
Mads Kiilerich
ssh: quote remote paths (issue2983)
r15581 def _serverquote(s):
'''quote a string for the remote shell ... which we assume is sh'''
Thomas Arendsen Hein
sshrepo: add more safe characters (issue2983)...
r15624 if re.match('[a-zA-Z0-9@%_+=:,./-]*$', s):
Mads Kiilerich
sshrepo: don't quote obviously safe strings (issue2983)...
r15622 return s
Mads Kiilerich
ssh: quote remote paths (issue2983)
r15581 return "'%s'" % s.replace("'", "'\\''")
Matt Mackall
protocol: move basic ssh client commands to wirerepository
r11586 class sshrepository(wireproto.wirerepository):
Martin Geisler
localrepo, sshrepo: use Boolean create argument in __init__
r14363 def __init__(self, ui, path, create=False):
Vadim Gelfer
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks...
r2673 self._url = path
mpm@selenic.com
Break apart hg.py...
r1089 self.ui = ui
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 self.pipeo = self.pipei = self.pipee = None
mpm@selenic.com
Break apart hg.py...
r1089
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 u = util.url(path, parsequery=False, parsefragment=False)
Brodie Rao
httprepo/sshrepo: use url.url...
r13819 if u.scheme != 'ssh' or not u.host or u.path is None:
Matt Mackall
protocol: convert some ssh abort calls
r11590 self._abort(error.RepoError(_("couldn't parse location %s") % path))
mpm@selenic.com
Break apart hg.py...
r1089
Brodie Rao
httprepo/sshrepo: use url.url...
r13819 self.user = u.user
if u.passwd is not None:
Adrian Buehlmann
sshrepo: catch passwords in ssh urls...
r13464 self._abort(error.RepoError(_("password in URL not supported")))
Brodie Rao
httprepo/sshrepo: use url.url...
r13819 self.host = u.host
self.port = u.port
self.path = u.path or "."
mpm@selenic.com
Break apart hg.py...
r1089
sshcmd = self.ui.config("ui", "ssh", "ssh")
remotecmd = self.ui.config("ui", "remotecmd", "hg")
Sean Meiners
Added ability to clone from a local repository to a (new) remote one....
r2549
Steve Borho
win32: fix ssh://host:port when using Plink...
r5644 args = util.sshargs(sshcmd, self.host, self.user, self.port)
Sean Meiners
Added ability to clone from a local repository to a (new) remote one....
r2549 if create:
Mads Kiilerich
ssh: quote remote paths (issue2983)
r15581 cmd = '%s %s %s' % (sshcmd, args,
util.shellquote("%s init %s" %
(_serverquote(remotecmd), _serverquote(self.path))))
Martin Geisler
i18n: mark strings for translation in Mercurial
r6953 ui.note(_('running %s\n') % cmd)
Alexis S. L. Carvalho
sshrepo: fix Windows command quoting
r5292 res = util.system(cmd)
Sean Meiners
Added ability to clone from a local repository to a (new) remote one....
r2549 if res != 0:
Matt Mackall
protocol: convert some ssh abort calls
r11590 self._abort(error.RepoError(_("could not create remote repo")))
Sean Meiners
Added ability to clone from a local repository to a (new) remote one....
r2549
self.validate_repo(ui, sshcmd, args, remotecmd)
Vadim Gelfer
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks...
r2673 def url(self):
return self._url
Sean Meiners
Added ability to clone from a local repository to a (new) remote one....
r2549 def validate_repo(self, ui, sshcmd, args, remotecmd):
Benoit Boissinot
sshrepo: flush stderr before connecting to the hg server
r3034 # cleanup up previous run
self.cleanup()
Mads Kiilerich
ssh: quote remote paths (issue2983)
r15581 cmd = '%s %s %s' % (sshcmd, args,
util.shellquote("%s -R %s serve --stdio" %
(_serverquote(remotecmd), _serverquote(self.path))))
ui.note(_('running %s\n') % cmd)
Alexis S. L. Carvalho
sshrepo: fix Windows command quoting
r5292 cmd = util.quotecommand(cmd)
Martin Geisler
util: remove ignored mode argument in popen[23]
r8339 self.pipeo, self.pipei, self.pipee = util.popen3(cmd)
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
ssh: skip noise generated by remote shell...
r2028 # skip any noise generated by remote shell
Matt Mackall
protocol: clean up call-like functions in http and ssh clients
r11589 self._callstream("hello")
r = self._callstream("between", pairs=("%s-%s" % ("0"*40, "0"*40)))
Matt Mackall
ssh: gather initial output so we can do capability detection
r2420 lines = ["", "dummy"]
Thomas Arendsen Hein
Show remote ssh noise only with --debug and increase the limit to 500 lines....
r2046 max_noise = 500
Matt Mackall
ssh: gather initial output so we can do capability detection
r2420 while lines[-1] and max_noise:
l = r.readline()
Matt Mackall
ssh: skip noise generated by remote shell...
r2028 self.readerr()
Matt Mackall
ssh: gather initial output so we can do capability detection
r2420 if lines[-1] == "1\n" and l == "\n":
Matt Mackall
ssh: skip noise generated by remote shell...
r2028 break
Matt Mackall
ssh: gather initial output so we can do capability detection
r2420 if l:
Martin Geisler
do not attempt to translate ui.debug output
r9467 ui.debug("remote: ", l)
Matt Mackall
ssh: gather initial output so we can do capability detection
r2420 lines.append(l)
Thomas Arendsen Hein
Don't enter an endless loop if remote hg doesn't answer, show remote noise....
r2040 max_noise -= 1
else:
Brodie Rao
cleanup: eradicate long lines
r16683 self._abort(error.RepoError(_('no suitable response from '
'remote hg')))
Matt Mackall
ssh: skip noise generated by remote shell...
r2028
Martin Geisler
util: use built-in set and frozenset...
r8150 self.capabilities = set()
Matt Mackall
replace various uses of list.reverse()
r8210 for l in reversed(lines):
Matt Mackall
ssh: add capability detection at startup...
r2421 if l.startswith("capabilities:"):
Bryan O'Sullivan
Turn capabilities into a mutable set, instead of a fixed tuple.
r5258 self.capabilities.update(l[:-1].split(":")[1].split())
Matt Mackall
ssh: add capability detection at startup...
r2421 break
mpm@selenic.com
Break apart hg.py...
r1089 def readerr(self):
Martin Geisler
check-code: flag 0/1 used as constant Boolean expression
r14494 while True:
Vadim Gelfer
fix file handling bugs on windows....
r2176 size = util.fstat(self.pipee).st_size
Matt Mackall
many, many trivial check-code fixups
r10282 if size == 0:
break
Dan Villiom Podlaski Christiansen
sshrepo: don't use readline() on the stderr pipe...
r13084 s = self.pipee.read(size)
if not s:
Matt Mackall
many, many trivial check-code fixups
r10282 break
Dan Villiom Podlaski Christiansen
sshrepo: don't use readline() on the stderr pipe...
r13084 for l in s.splitlines():
self.ui.status(_("remote: "), l, '\n')
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
protocol: move basic ssh client commands to wirerepository
r11586 def _abort(self, exception):
self.cleanup()
raise exception
Benoit Boissinot
sshrepo: flush stderr before connecting to the hg server
r3034 def cleanup(self):
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 if self.pipeo is None:
return
self.pipeo.close()
self.pipei.close()
mpm@selenic.com
Break apart hg.py...
r1089 try:
Matt Mackall
Partially revert ssh change so we read all of remote ssh stream
r1358 # read the error descriptor until EOF
for l in self.pipee:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 self.ui.status(_("remote: "), l)
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 except (IOError, ValueError):
mpm@selenic.com
Break apart hg.py...
r1089 pass
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 self.pipee.close()
mpm@selenic.com
Break apart hg.py...
r1089
Benoit Boissinot
sshrepo: flush stderr before connecting to the hg server
r3034 __del__ = cleanup
Matt Mackall
protocol: clean up call-like functions in http and ssh clients
r11589 def _callstream(self, cmd, **args):
Martin Geisler
do not attempt to translate ui.debug output
r9467 self.ui.debug("sending %s command\n" % cmd)
mpm@selenic.com
Break apart hg.py...
r1089 self.pipeo.write("%s\n" % cmd)
Peter Arrenbrecht
wireproto: fix handling of '*' args for HTTP and SSH
r13721 _func, names = wireproto.commands[cmd]
keys = names.split()
wireargs = {}
for k in keys:
if k == '*':
wireargs['*'] = args
break
else:
wireargs[k] = args[k]
del args[k]
for k, v in sorted(wireargs.iteritems()):
mpm@selenic.com
Break apart hg.py...
r1089 self.pipeo.write("%s %d\n" % (k, len(v)))
Peter Arrenbrecht
wireproto: fix handling of '*' args for HTTP and SSH
r13721 if isinstance(v, dict):
for dk, dv in v.iteritems():
self.pipeo.write("%s %d\n" % (dk, len(dv)))
self.pipeo.write(dv)
else:
self.pipeo.write(v)
mpm@selenic.com
Break apart hg.py...
r1089 self.pipeo.flush()
return self.pipei
Matt Mackall
protocol: clean up call-like functions in http and ssh clients
r11589 def _call(self, cmd, **args):
self._callstream(cmd, **args)
Alexis S. L. Carvalho
sshrepo: be more careful while reading data...
r5978 return self._recv()
Matt Mackall
protocol: unify client unbundle support...
r11592 def _callpush(self, cmd, fp, **args):
r = self._call(cmd, **args)
if r:
return '', r
Martin Geisler
check-code: flag 0/1 used as constant Boolean expression
r14494 while True:
Matt Mackall
protocol: unify client unbundle support...
r11592 d = fp.read(4096)
if not d:
break
self._send(d)
self._send("", flush=True)
r = self._recv()
if r:
return '', r
return self._recv(), ''
Matt Mackall
protocol: unify client changegroup methods
r11591 def _decompress(self, stream):
return stream
Alexis S. L. Carvalho
sshrepo: be more careful while reading data...
r5978 def _recv(self):
l = self.pipei.readline()
Andrew Pritchard
wireproto: add out-of-band error class to allow remote repo to report errors...
r15017 if l == '\n':
err = []
while True:
line = self.pipee.readline()
if line == '-\n':
break
err.extend([line])
if len(err) > 0:
# strip the trailing newline added to the last line server-side
err[-1] = err[-1][:-1]
self._abort(error.OutOfBandError(*err))
mpm@selenic.com
Break apart hg.py...
r1089 self.readerr()
try:
l = int(l)
Idan Kamara
eliminate various naked except clauses
r14004 except ValueError:
Matt Mackall
protocol: convert some ssh abort calls
r11590 self._abort(error.ResponseError(_("unexpected response:"), l))
Alexis S. L. Carvalho
sshrepo: be more careful while reading data...
r5978 return self.pipei.read(l)
def _send(self, data, flush=False):
self.pipeo.write("%d\n" % len(data))
if data:
self.pipeo.write(data)
if flush:
self.pipeo.flush()
self.readerr()
mpm@selenic.com
Break apart hg.py...
r1089
def lock(self):
Matt Mackall
protocol: clean up call-like functions in http and ssh clients
r11589 self._call("lock")
mpm@selenic.com
Break apart hg.py...
r1089 return remotelock(self)
def unlock(self):
Matt Mackall
protocol: clean up call-like functions in http and ssh clients
r11589 self._call("unlock")
mpm@selenic.com
Break apart hg.py...
r1089
Peter Arrenbrecht
sshrepo: fix addchangegroup's signature...
r14537 def addchangegroup(self, cg, source, url, lock=None):
Greg Ward
push: document return values between various repo methods....
r11153 '''Send a changegroup to the remote server. Return an integer
similar to unbundle(). DEPRECATED, since it requires locking the
remote.'''
Matt Mackall
protocol: clean up call-like functions in http and ssh clients
r11589 d = self._call("addchangegroup")
mpm@selenic.com
Break apart hg.py...
r1089 if d:
Matt Mackall
protocol: convert some ssh abort calls
r11590 self._abort(error.RepoError(_("push refused: %s") % d))
Martin Geisler
check-code: flag 0/1 used as constant Boolean expression
r14494 while True:
mpm@selenic.com
Break apart hg.py...
r1089 d = cg.read(4096)
Alexis S. L. Carvalho
sshrepo: be more careful while reading data...
r5978 if not d:
break
mpm@selenic.com
Break apart hg.py...
r1089 self.pipeo.write(d)
self.readerr()
self.pipeo.flush()
self.readerr()
Alexis S. L. Carvalho
sshrepo: be more careful while reading data...
r5978 r = self._recv()
Vadim Gelfer
add merge command. means same thing as "update -m"....
r2019 if not r:
return 1
Alexis S. L. Carvalho
sshrepo: be more careful while reading data...
r5978 try:
return int(r)
Idan Kamara
eliminate various naked except clauses
r14004 except ValueError:
Matt Mackall
protocol: convert some ssh abort calls
r11590 self._abort(error.ResponseError(_("unexpected response:"), r))
Vadim Gelfer
add support for streaming clone....
r2612
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 instance = sshrepository