diff --git a/contrib/shrink-revlog.py b/contrib/shrink-revlog.py --- a/contrib/shrink-revlog.py +++ b/contrib/shrink-revlog.py @@ -117,8 +117,7 @@ def writerevs(ui, r1, r2, order, tr): try: group = util.chunkbuffer(r1.group(order, lookup, progress)) - chunkiter = changegroup.chunkiter(group) - r2.addgroup(chunkiter, unlookup, tr) + r2.addgroup(group.chunks(), unlookup, tr) finally: ui.progress(_('writing'), None) diff --git a/mercurial/bundlerepo.py b/mercurial/bundlerepo.py --- a/mercurial/bundlerepo.py +++ b/mercurial/bundlerepo.py @@ -33,7 +33,7 @@ class bundlerevlog(revlog.revlog): self.bundle = bundle self.basemap = {} def chunkpositer(): - for chunk in changegroup.chunkiter(bundle): + for chunk in bundle.chunks(): pos = bundle.tell() yield chunk, pos - len(chunk) n = len(self) @@ -226,11 +226,11 @@ class bundlerepository(localrepo.localre if not self.bundlefilespos: self.bundle.seek(self.filestart) while 1: - chunk = changegroup.getchunk(self.bundle) + chunk = self.bundle.chunk() if not chunk: break self.bundlefilespos[chunk] = self.bundle.tell() - for c in changegroup.chunkiter(self.bundle): + for c in self.bundle.chunks(): pass if f[0] == '/': diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py --- a/mercurial/changegroup.py +++ b/mercurial/changegroup.py @@ -150,6 +150,10 @@ class unbundle10(object): return self._stream.seek(pos) def tell(self): return self._stream.tell() + def chunks(self, progress=None): + return chunkiter(self, progress) + def chunk(self): + return getchunk(self) class headerlessfixup(object): def __init__(self, fh, h): diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1644,6 +1644,9 @@ class localrepository(repo.repository): if not source: return 0 + if not hasattr(source, 'chunk'): + source = changegroup.unbundle10(source, 'UN') + self.hook('prechangegroup', throw=True, source=srctype, url=url) changesets = files = revisions = 0 @@ -1671,8 +1674,8 @@ class localrepository(repo.repository): total=self.total) self.count += 1 pr = prog() - chunkiter = changegroup.chunkiter(source, progress=pr) - if cl.addgroup(chunkiter, csmap, trp) is None and not emptyok: + if (cl.addgroup(source.chunks(pr), csmap, trp) is None + and not emptyok): raise util.Abort(_("received changelog group is empty")) clend = len(cl) changesets = clend - clstart @@ -1686,12 +1689,11 @@ class localrepository(repo.repository): pr.step = _('manifests') pr.count = 1 pr.total = changesets # manifests <= changesets - chunkiter = changegroup.chunkiter(source, progress=pr) # no need to check for empty manifest group here: # if the result of the merge of 1 and 2 is the same in 3 and 4, # no new manifest will be created and the manifest group will # be empty during the pull - self.manifest.addgroup(chunkiter, revmap, trp) + self.manifest.addgroup(source.chunks(pr), revmap, trp) self.ui.progress(_('manifests'), None) needfiles = {} @@ -1710,15 +1712,14 @@ class localrepository(repo.repository): pr.count = 1 pr.total = efiles while 1: - f = changegroup.getchunk(source) + f = source.chunk() if not f: break self.ui.debug("adding %s revisions\n" % f) pr() fl = self.file(f) o = len(fl) - chunkiter = changegroup.chunkiter(source) - if fl.addgroup(chunkiter, revmap, trp) is None: + if fl.addgroup(source.chunks(), revmap, trp) is None: raise util.Abort(_("received file revlog group is empty")) revisions += len(fl) - o files += 1