mercurial/localrepo.py
changeset 1998 65cc17ae9649
parent 1995 2da2d46862fb
child 2016 ff5c9a92f556
child 2019 ced2d3620f95
--- a/mercurial/localrepo.py	Fri Mar 24 15:19:08 2006 +0100
+++ b/mercurial/localrepo.py	Fri Mar 24 09:08:12 2006 -0800
@@ -11,7 +11,7 @@
 from i18n import gettext as _
 from demandload import *
 demandload(globals(), "re lock transaction tempfile stat mdiff errno ui")
-demandload(globals(), "changegroup")
+demandload(globals(), "appendfile changegroup")
 
 class localrepository(object):
     def __del__(self):
@@ -1343,10 +1343,10 @@
 
         def csmap(x):
             self.ui.debug(_("add changeset %s\n") % short(x))
-            return self.changelog.count()
+            return cl.count()
 
         def revmap(x):
-            return self.changelog.rev(x)
+            return cl.rev(x)
 
         if not source:
             return
@@ -1357,23 +1357,29 @@
 
         tr = self.transaction()
 
-        oldheads = len(self.changelog.heads())
+        # write changelog and manifest data to temp files so
+        # concurrent readers will not see inconsistent view
+        cl = appendfile.appendchangelog(self.opener)
+
+        oldheads = len(cl.heads())
 
         # pull off the changeset group
         self.ui.status(_("adding changesets\n"))
-        co = self.changelog.tip()
+        co = cl.tip()
         chunkiter = changegroup.chunkiter(source)
-        cn = self.changelog.addgroup(chunkiter, csmap, tr, 1) # unique
-        cnr, cor = map(self.changelog.rev, (cn, co))
+        cn = cl.addgroup(chunkiter, csmap, tr, 1) # unique
+        cnr, cor = map(cl.rev, (cn, co))
         if cn == nullid:
             cnr = cor
         changesets = cnr - cor
 
+        mf = appendfile.appendmanifest(self.opener)
+
         # pull off the manifest group
         self.ui.status(_("adding manifests\n"))
-        mm = self.manifest.tip()
+        mm = mf.tip()
         chunkiter = changegroup.chunkiter(source)
-        mo = self.manifest.addgroup(chunkiter, revmap, tr)
+        mo = mf.addgroup(chunkiter, revmap, tr)
 
         # process the files
         self.ui.status(_("adding file changes\n"))
@@ -1389,6 +1395,15 @@
             revisions += fl.count() - o
             files += 1
 
+        # write order here is important so concurrent readers will see
+        # consistent view of repo
+        mf.writedata()
+        cl.writedata()
+
+        # make changelog and manifest see real files again
+        self.changelog = changelog.changelog(self.opener)
+        self.manifest = manifest.manifest(self.opener)
+
         newheads = len(self.changelog.heads())
         heads = ""
         if oldheads and newheads > oldheads: