diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
index 0ef0aec56090e67983d4ab4810e51c24a67f07b2_bWVyY3VyaWFsL2NoYW5nZWdyb3VwLnB5..04176eaf911b79c07a79b29bef39f9ded868b4d7_bWVyY3VyaWFsL2NoYW5nZWdyb3VwLnB5 100644
--- a/mercurial/changegroup.py
+++ b/mercurial/changegroup.py
@@ -287,6 +287,18 @@
                     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 @@
 
             # 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):