mercurial/wireproto.py
changeset 21646 ce25f465e572
parent 21631 9bafe09285f2
child 21651 3aae044408aa
equal deleted inserted replaced
21645:aed14bb165f3 21646:ce25f465e572
   188             .replace(':=', '=')
   188             .replace(':=', '=')
   189             .replace(':;', ';')
   189             .replace(':;', ';')
   190             .replace(':,', ',')
   190             .replace(':,', ',')
   191             .replace('::', ':'))
   191             .replace('::', ':'))
   192 
   192 
       
   193 # mapping of options accepted by getbundle and their types
       
   194 #
       
   195 # Meant to be extended by extensions. It is extensions responsibility to ensure
       
   196 # such options are properly processed in exchange.getbundle.
       
   197 #
       
   198 # supported types are:
       
   199 #
       
   200 # :nodes: list of binary nodes
       
   201 # :csv:   list of comma-separated values
       
   202 # :plain: string with no transformation needed.
       
   203 gboptsmap = {'heads':  'nodes',
       
   204              'common': 'nodes',
       
   205              'bundlecaps': 'csv'}
       
   206 
   193 # client side
   207 # client side
   194 
   208 
   195 class wirepeer(peer.peerrepository):
   209 class wirepeer(peer.peerrepository):
   196 
   210 
   197     def batch(self):
   211     def batch(self):
   323         heads = encodelist(heads)
   337         heads = encodelist(heads)
   324         f = self._callcompressable("changegroupsubset",
   338         f = self._callcompressable("changegroupsubset",
   325                                    bases=bases, heads=heads)
   339                                    bases=bases, heads=heads)
   326         return changegroupmod.unbundle10(f, 'UN')
   340         return changegroupmod.unbundle10(f, 'UN')
   327 
   341 
   328     def getbundle(self, source, heads=None, common=None, bundlecaps=None,
   342     def getbundle(self, source, **kwargs):
   329                   **kwargs):
       
   330         self.requirecap('getbundle', _('look up remote changes'))
   343         self.requirecap('getbundle', _('look up remote changes'))
   331         opts = {}
   344         opts = {}
   332         if heads is not None:
   345         for key, value in kwargs.iteritems():
   333             opts['heads'] = encodelist(heads)
   346             if value is None:
   334         if common is not None:
   347                 continue
   335             opts['common'] = encodelist(common)
   348             keytype = gboptsmap.get(key)
   336         if bundlecaps is not None:
   349             if keytype is None:
   337             opts['bundlecaps'] = ','.join(bundlecaps)
   350                 assert False, 'unexpected'
   338         opts.update(kwargs)
   351             elif keytype == 'nodes':
       
   352                 value = encodelist(value)
       
   353             elif keytype == 'csv':
       
   354                 value = ','.join(value)
       
   355             elif keytype != 'plain':
       
   356                 raise KeyError('unknown getbundle option type %s'
       
   357                                % keytype)
       
   358             opts[key] = value
   339         f = self._callcompressable("getbundle", **opts)
   359         f = self._callcompressable("getbundle", **opts)
       
   360         bundlecaps = kwargs.get('bundlecaps')
   340         if bundlecaps is not None and 'HG2X' in bundlecaps:
   361         if bundlecaps is not None and 'HG2X' in bundlecaps:
   341             return bundle2.unbundle20(self.ui, f)
   362             return bundle2.unbundle20(self.ui, f)
   342         else:
   363         else:
   343             return changegroupmod.unbundle10(f, 'UN')
   364             return changegroupmod.unbundle10(f, 'UN')
   344 
   365 
   625 # ensure such options are properly processed in exchange.getbundle.
   646 # ensure such options are properly processed in exchange.getbundle.
   626 gboptslist = ['heads', 'common', 'bundlecaps']
   647 gboptslist = ['heads', 'common', 'bundlecaps']
   627 
   648 
   628 @wireprotocommand('getbundle', '*')
   649 @wireprotocommand('getbundle', '*')
   629 def getbundle(repo, proto, others):
   650 def getbundle(repo, proto, others):
   630     opts = options('getbundle', gboptslist, others)
   651     opts = options('getbundle', gboptsmap.keys(), others)
   631     for k, v in opts.iteritems():
   652     for k, v in opts.iteritems():
   632         if k in ('heads', 'common'):
   653         keytype = gboptsmap[k]
       
   654         if keytype == 'nodes':
   633             opts[k] = decodelist(v)
   655             opts[k] = decodelist(v)
   634         elif k == 'bundlecaps':
   656         elif keytype == 'csv':
   635             opts[k] = set(v.split(','))
   657             opts[k] = set(v.split(','))
       
   658         elif keytype != 'plain':
       
   659             raise KeyError('unknown getbundle option type %s'
       
   660                            % keytype)
   636     cg = exchange.getbundle(repo, 'serve', **opts)
   661     cg = exchange.getbundle(repo, 'serve', **opts)
   637     return streamres(proto.groupchunks(cg))
   662     return streamres(proto.groupchunks(cg))
   638 
   663 
   639 @wireprotocommand('heads')
   664 @wireprotocommand('heads')
   640 def heads(repo, proto):
   665 def heads(repo, proto):