mercurial/streamclone.py
changeset 26441 56527b886d1d
child 26442 ef8d27f53204
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/streamclone.py	Fri Oct 02 15:51:32 2015 -0700
@@ -0,0 +1,64 @@
+# streamclone.py - producing and consuming streaming repository data
+#
+# Copyright 2015 Gregory Szorc <gregory.szorc@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import absolute_import
+
+from . import (
+    branchmap,
+    exchange,
+)
+
+def applyremotedata(repo, remotereqs, remotebranchmap, fp):
+    """Apply stream clone data to a 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 = repo.lock()
+    try:
+        exchange.consumestreamclone(repo, fp)
+
+        # new requirements = old non-format requirements +
+        #                    new format-related remote requirements
+        # requirements from the streamed-in repository
+        repo.requirements = remotereqs | (
+                repo.requirements - repo.supportedformats)
+        repo._applyopenerreqs()
+        repo._writerequirements()
+
+        if remotebranchmap:
+            rbheads = []
+            closed = []
+            for bheads in remotebranchmap.itervalues():
+                rbheads.extend(bheads)
+                for h in bheads:
+                    r = repo.changelog.rev(h)
+                    b, c = repo.changelog.branchinfo(r)
+                    if c:
+                        closed.append(h)
+
+            if rbheads:
+                rtiprev = max((int(repo.changelog.rev(node))
+                        for node in rbheads))
+                cache = branchmap.branchcache(remotebranchmap,
+                                              repo[rtiprev].node(),
+                                              rtiprev,
+                                              closednodes=closed)
+                # Try to stick it as low as possible
+                # filter above served are unlikely to be fetch from a clone
+                for candidate in ('base', 'immutable', 'served'):
+                    rview = repo.filtered(candidate)
+                    if cache.validfor(rview):
+                        repo._branchcaches[candidate] = cache
+                        cache.write(rview)
+                        break
+        repo.invalidate()
+    finally:
+        lock.release()