contrib/phabricator.py
changeset 33263 ed61189763ef
parent 33200 04cf9927f350
child 33264 266321579c68
equal deleted inserted replaced
33262:8e6f4939a69a 33263:ed61189763ef
   133         return None
   133         return None
   134     repophid = encoding.strtolocal(query[r'data'][0][r'phid'])
   134     repophid = encoding.strtolocal(query[r'data'][0][r'phid'])
   135     repo.ui.setconfig('phabricator', 'repophid', repophid)
   135     repo.ui.setconfig('phabricator', 'repophid', repophid)
   136     return repophid
   136     return repophid
   137 
   137 
   138 _differentialrevisionre = re.compile('\AD([1-9][0-9]*)\Z')
   138 _differentialrevisiontagre = re.compile('\AD([1-9][0-9]*)\Z')
       
   139 _differentialrevisiondescre = re.compile(
       
   140     '^Differential Revision:.*D([1-9][0-9]*)$', re.M)
   139 
   141 
   140 def getmapping(ctx):
   142 def getmapping(ctx):
   141     """return (node, associated Differential Revision ID) or (None, None)
   143     """return (node, associated Differential Revision ID) or (None, None)
   142 
   144 
   143     Examines all precursors and their tags. Tags with format like "D1234" are
   145     Examines all precursors and their tags. Tags with format like "D1234" are
   144     considered a match and the node with that tag, and the number after "D"
   146     considered a match and the node with that tag, and the number after "D"
   145     (ex. 1234) will be returned.
   147     (ex. 1234) will be returned.
       
   148 
       
   149     If tags are not found, examine commit message. The "Differential Revision:"
       
   150     line could associate this changeset to a Differential Revision.
   146     """
   151     """
   147     unfi = ctx.repo().unfiltered()
   152     unfi = ctx.repo().unfiltered()
   148     nodemap = unfi.changelog.nodemap
   153     nodemap = unfi.changelog.nodemap
       
   154 
       
   155     # Check tags like "D123"
   149     for n in obsolete.allprecursors(unfi.obsstore, [ctx.node()]):
   156     for n in obsolete.allprecursors(unfi.obsstore, [ctx.node()]):
   150         if n in nodemap:
   157         if n in nodemap:
   151             for tag in unfi.nodetags(n):
   158             for tag in unfi.nodetags(n):
   152                 m = _differentialrevisionre.match(tag)
   159                 m = _differentialrevisiontagre.match(tag)
   153                 if m:
   160                 if m:
   154                     return n, int(m.group(1))
   161                     return n, int(m.group(1))
       
   162 
       
   163     # Check commit message
       
   164     m = _differentialrevisiondescre.search(ctx.description())
       
   165     if m:
       
   166         return None, int(m.group(1))
       
   167 
   155     return None, None
   168     return None, None
   156 
   169 
   157 def getdiff(ctx, diffopts):
   170 def getdiff(ctx, diffopts):
   158     """plain-text diff without header (user, commit message, etc)"""
   171     """plain-text diff without header (user, commit message, etc)"""
   159     output = util.stringio()
   172     output = util.stringio()