##// END OF EJS Templates
convert: keep branch switching merges with ancestors (issue3340)...
convert: keep branch switching merges with ancestors (issue3340) When running convert with a filemap, merge parents which are ancestors of other parents are ignored. This is hardly a problem when parents belong to the same branch, but the result could be confusing when named branches are involved. With: -o-a1-a2-a3... <- A \ \ b1-b2-b3...-m- <- B If all b* revisions are discarded, it is useful to preserve 'm' even if it is empty after filtering to record the branch switch. This patch makes filemap preserve "ancestor parents" if there is no "non-ancestor parent" on the same branch than the merge revision. Remarks: - I am not completely convinced by the reasons given above and those detailed by Matt in this thread: http://selenic.com/pipermail/mercurial-devel/2012-May/040627.html The properties we try to preserve are not clearly defined. That said, I know this patch already helped someone on IRC and the tests output look reasonable. - This is a new version of the original "convert: filemap must preserve fast-forward merges" patch. It has exactly the same output for 2 parents merges, the additional complexity is here to handle more than two parents.

File last commit:

r16688:cfb66829 default
r17103:5146de7b 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