diff -r 5095059340dc -r 7504a7325e4c mercurial/localrepo.py --- a/mercurial/localrepo.py Thu May 21 10:27:45 2015 -0700 +++ b/mercurial/localrepo.py Thu May 21 10:41:06 2015 -0700 @@ -1755,28 +1755,40 @@ return util.hooks() def stream_in(self, remote, remotereqs): + # Save remote branchmap. We will use it later + # to speed up branchcache creation + rbranchmap = None + if remote.capable("branchmap"): + rbranchmap = remote.branchmap() + + fp = remote.stream_out() + l = fp.readline() + try: + resp = int(l) + except ValueError: + raise error.ResponseError( + _('unexpected response from remote server:'), l) + if resp == 1: + raise util.Abort(_('operation forbidden by server')) + elif resp == 2: + raise util.Abort(_('locking the remote repository failed')) + elif resp != 0: + raise util.Abort(_('the server sent an unknown error code')) + + self.applystreamclone(remotereqs, rbranchmap, fp) + return len(self.heads()) + 1 + + def applystreamclone(self, remotereqs, remotebranchmap, fp): + """Apply stream clone data to this repository. + + "remotereqs" is a set of requirements to handle the incoming data. + "remotebranchmap" is the result of a branchmap lookup on the remote. It + can be None. + "fp" is a file object containing the raw stream data, suitable for + feeding into exchange.consumestreamclone. + """ lock = self.lock() try: - # Save remote branchmap. We will use it later - # to speed up branchcache creation - rbranchmap = None - if remote.capable("branchmap"): - rbranchmap = remote.branchmap() - - fp = remote.stream_out() - l = fp.readline() - try: - resp = int(l) - except ValueError: - raise error.ResponseError( - _('unexpected response from remote server:'), l) - if resp == 1: - raise util.Abort(_('operation forbidden by server')) - elif resp == 2: - raise util.Abort(_('locking the remote repository failed')) - elif resp != 0: - raise util.Abort(_('the server sent an unknown error code')) - exchange.consumestreamclone(self, fp) # new requirements = old non-format requirements + @@ -1787,10 +1799,10 @@ self._applyopenerreqs() self._writerequirements() - if rbranchmap: + if remotebranchmap: rbheads = [] closed = [] - for bheads in rbranchmap.itervalues(): + for bheads in remotebranchmap.itervalues(): rbheads.extend(bheads) for h in bheads: r = self.changelog.rev(h) @@ -1801,7 +1813,7 @@ if rbheads: rtiprev = max((int(self.changelog.rev(node)) for node in rbheads)) - cache = branchmap.branchcache(rbranchmap, + cache = branchmap.branchcache(remotebranchmap, self[rtiprev].node(), rtiprev, closednodes=closed) @@ -1814,7 +1826,6 @@ cache.write(rview) break self.invalidate() - return len(self.heads()) + 1 finally: lock.release()