13 |
13 |
14 from node import nullid |
14 from node import nullid |
15 from i18n import _ |
15 from i18n import _ |
16 import os, tempfile, shutil |
16 import os, tempfile, shutil |
17 import changegroup, util, mdiff, discovery, cmdutil, scmutil, exchange |
17 import changegroup, util, mdiff, discovery, cmdutil, scmutil, exchange |
18 import localrepo, changelog, manifest, filelog, revlog, error, phases |
18 import localrepo, changelog, manifest, filelog, revlog, error, phases, bundle2 |
19 |
19 |
20 class bundlerevlog(revlog.revlog): |
20 class bundlerevlog(revlog.revlog): |
21 def __init__(self, opener, indexfile, bundle, linkmapper): |
21 def __init__(self, opener, indexfile, bundle, linkmapper): |
22 # How it works: |
22 # How it works: |
23 # To retrieve a revision, we need to know the offset of the revision in |
23 # To retrieve a revision, we need to know the offset of the revision in |
236 f = self.vfs.open(self.tempfile, mode="rb") |
236 f = self.vfs.open(self.tempfile, mode="rb") |
237 self.bundlefile = self.bundle = exchange.readbundle(ui, f, |
237 self.bundlefile = self.bundle = exchange.readbundle(ui, f, |
238 bundlename, |
238 bundlename, |
239 self.vfs) |
239 self.vfs) |
240 |
240 |
|
241 if isinstance(self.bundle, bundle2.unbundle20): |
|
242 cgparts = [part for part in self.bundle.iterparts() |
|
243 if (part.type == 'b2x:changegroup') |
|
244 and (part.params.get('version', '01') |
|
245 in changegroup.packermap)] |
|
246 |
|
247 if not cgparts: |
|
248 raise util.Abort('No changegroups found') |
|
249 version = cgparts[0].params.get('version', '01') |
|
250 cgparts = [p for p in cgparts |
|
251 if p.params.get('version', '01') == version] |
|
252 if len(cgparts) > 1: |
|
253 raise NotImplementedError("Can't process multiple changegroups") |
|
254 part = cgparts[0] |
|
255 |
|
256 part.seek(0) |
|
257 self.bundle = changegroup.packermap[version][1](part, 'UN') |
|
258 |
241 # dict with the mapping 'filename' -> position in the bundle |
259 # dict with the mapping 'filename' -> position in the bundle |
242 self.bundlefilespos = {} |
260 self.bundlefilespos = {} |
243 |
261 |
244 self.firstnewrev = self.changelog.repotiprev + 1 |
262 self.firstnewrev = self.changelog.repotiprev + 1 |
245 phases.retractboundary(self, None, phases.draft, |
263 phases.retractboundary(self, None, phases.draft, |