184 return bundle2.getunbundler(ui, fh, magicstring=magic + version) |
184 return bundle2.getunbundler(ui, fh, magicstring=magic + version) |
185 elif version == 'S1': |
185 elif version == 'S1': |
186 return streamclone.streamcloneapplier(fh) |
186 return streamclone.streamcloneapplier(fh) |
187 else: |
187 else: |
188 raise error.Abort(_('%s: unknown bundle version %s') % (fname, version)) |
188 raise error.Abort(_('%s: unknown bundle version %s') % (fname, version)) |
|
189 |
|
190 def getbundlespec(ui, fh): |
|
191 """Infer the bundlespec from a bundle file handle. |
|
192 |
|
193 The input file handle is seeked and the original seek position is not |
|
194 restored. |
|
195 """ |
|
196 def speccompression(alg): |
|
197 for k, v in _bundlespeccompressions.items(): |
|
198 if v == alg: |
|
199 return k |
|
200 return None |
|
201 |
|
202 b = readbundle(ui, fh, None) |
|
203 if isinstance(b, changegroup.cg1unpacker): |
|
204 alg = b._type |
|
205 if alg == '_truncatedBZ': |
|
206 alg = 'BZ' |
|
207 comp = speccompression(alg) |
|
208 if not comp: |
|
209 raise error.Abort(_('unknown compression algorithm: %s') % alg) |
|
210 return '%s-v1' % comp |
|
211 elif isinstance(b, bundle2.unbundle20): |
|
212 if 'Compression' in b.params: |
|
213 comp = speccompression(b.params['Compression']) |
|
214 if not comp: |
|
215 raise error.Abort(_('unknown compression algorithm: %s') % comp) |
|
216 else: |
|
217 comp = 'none' |
|
218 |
|
219 version = None |
|
220 for part in b.iterparts(): |
|
221 if part.type == 'changegroup': |
|
222 version = part.params['version'] |
|
223 if version in ('01', '02'): |
|
224 version = 'v2' |
|
225 else: |
|
226 raise error.Abort(_('changegroup version %s does not have ' |
|
227 'a known bundlespec') % version, |
|
228 hint=_('try upgrading your Mercurial ' |
|
229 'client')) |
|
230 |
|
231 if not version: |
|
232 raise error.Abort(_('could not identify changegroup version in ' |
|
233 'bundle')) |
|
234 |
|
235 return '%s-%s' % (comp, version) |
|
236 elif isinstance(b, streamclone.streamcloneapplier): |
|
237 requirements = streamclone.readbundle1header(fh)[2] |
|
238 params = 'requirements=%s' % ','.join(sorted(requirements)) |
|
239 return 'none-packed1;%s' % urllib.quote(params) |
|
240 else: |
|
241 raise error.Abort(_('unknown bundle type: %s') % b) |
189 |
242 |
190 def buildobsmarkerspart(bundler, markers): |
243 def buildobsmarkerspart(bundler, markers): |
191 """add an obsmarker part to the bundler with <markers> |
244 """add an obsmarker part to the bundler with <markers> |
192 |
245 |
193 No part is created if markers is empty. |
246 No part is created if markers is empty. |