diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
--- a/mercurial/changegroup.py
+++ b/mercurial/changegroup.py
@@ -287,6 +287,18 @@ class cg1unpacker(object):
                     pos = next
             yield closechunk()
 
+    def _unpackmanifests(self, repo, revmap, trp, prog, numchanges):
+        # We know that we'll never have more manifests than we had
+        # changesets.
+        self.callback = prog(_('manifests'), numchanges)
+        # 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.manifestheader()
+        repo.manifest.addgroup(self, revmap, trp)
+        repo.ui.progress(_('manifests'), None)
+
     def apply(self, repo, srctype, url, emptyok=False,
               targetphase=phases.draft, expectedtotal=None):
         """Add the changegroup returned by source.read() to this repo.
@@ -357,15 +369,7 @@ class cg1unpacker(object):
 
             # pull off the manifest group
             repo.ui.status(_("adding manifests\n"))
-            # manifests <= changesets
-            self.callback = prog(_('manifests'), changesets)
-            # 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.manifestheader()
-            repo.manifest.addgroup(self, revmap, trp)
-            repo.ui.progress(_('manifests'), None)
+            self._unpackmanifests(repo, revmap, trp, prog, changesets)
 
             needfiles = {}
             if repo.ui.configbool('server', 'validate', default=False):