mercurial/exchange.py
changeset 27883 4f4b80b3f2bf
parent 27751 a40e2f7fe49d
child 27938 cabac7dfc621
equal deleted inserted replaced
27882:319b0bf6ecc9 27883:4f4b80b3f2bf
   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.