diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -11,7 +11,7 @@ from node import * 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 @@ class localrepository(object): 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 @@ class localrepository(object): 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 @@ class localrepository(object): 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: