contrib/phabricator.py
changeset 33269 ead6749354e1
parent 33268 85391b95961d
child 33271 02299a28ba34
equal deleted inserted replaced
33268:85391b95961d 33269:ead6749354e1
   356 
   356 
   357     If stack is True, return a list of "Differential Revision dict"s in an
   357     If stack is True, return a list of "Differential Revision dict"s in an
   358     order that the latter ones depend on the former ones. Otherwise, return a
   358     order that the latter ones depend on the former ones. Otherwise, return a
   359     list of a unique "Differential Revision dict".
   359     list of a unique "Differential Revision dict".
   360     """
   360     """
       
   361     prefetched = {} # {id or phid: drev}
       
   362     def fetch(params):
       
   363         """params -> single drev or None"""
       
   364         key = (params.get(r'ids') or params.get(r'phids') or [None])[0]
       
   365         if key in prefetched:
       
   366             return prefetched[key]
       
   367         # Otherwise, send the request. If we're fetching a stack, be smarter
       
   368         # and fetch more ids in one batch, even if it could be unnecessary.
       
   369         batchparams = params
       
   370         if stack and len(params.get(r'ids', [])) == 1:
       
   371             i = int(params[r'ids'][0])
       
   372             # developer config: phabricator.batchsize
       
   373             batchsize = repo.ui.configint('phabricator', 'batchsize', 12)
       
   374             batchparams = {'ids': range(max(1, i - batchsize), i + 1)}
       
   375         drevs = callconduit(repo, 'differential.query', batchparams)
       
   376         # Fill prefetched with the result
       
   377         for drev in drevs:
       
   378             prefetched[drev[r'phid']] = drev
       
   379             prefetched[int(drev[r'id'])] = drev
       
   380         if key not in prefetched:
       
   381             raise error.Abort(_('cannot get Differential Revision %r') % params)
       
   382         return prefetched[key]
       
   383 
   361     result = []
   384     result = []
   362     queue = [params]
   385     queue = [params]
   363     while queue:
   386     while queue:
   364         params = queue.pop()
   387         params = queue.pop()
   365         drevs = callconduit(repo, 'differential.query', params)
   388         drev = fetch(params)
   366         if len(drevs) != 1:
       
   367             raise error.Abort(_('cannot get Differential Revision %r') % params)
       
   368         drev = drevs[0]
       
   369         result.append(drev)
   389         result.append(drev)
   370         if stack:
   390         if stack:
   371             auxiliary = drev.get(r'auxiliary', {})
   391             auxiliary = drev.get(r'auxiliary', {})
   372             depends = auxiliary.get(r'phabricator:depends-on', [])
   392             depends = auxiliary.get(r'phabricator:depends-on', [])
   373             for phid in depends:
   393             for phid in depends: