comparison contrib/phabricator.py @ 33264:266321579c68

phabricator: add node and p1 to hg:meta property The "hg:meta" property is for extra metadata to reconstruct the patch. Previously it does not have node or parent information since I think by reading the patch again, the commit message will be mangled (like, added the "Differential Revision" line) and we cannot preserve the commit hash. However, the "parent" information could be useful. It could be helpful to locate the "base revision" so in case of a conflict applying the patch directly, we might be able to use 3-way merge to resolve it correctly. Note: "local:commits" is an existing "property" used by Phabricator that has the node and parent information. However, it lacks of timezone information and requires "author" and "authorEmail" to be separated. So we are using a different "property" - "hg:meta" to be distinguished from "local:commits".
author Jun Wu <quark@fb.com>
date Tue, 04 Jul 2017 16:36:48 -0700
parents ed61189763ef
children 95f658b558a3
comparison
equal deleted inserted replaced
33263:ed61189763ef 33264:266321579c68
194 'diff_id': diff[r'id'], 194 'diff_id': diff[r'id'],
195 'name': 'hg:meta', 195 'name': 'hg:meta',
196 'data': json.dumps({ 196 'data': json.dumps({
197 'user': ctx.user(), 197 'user': ctx.user(),
198 'date': '%d %d' % ctx.date(), 198 'date': '%d %d' % ctx.date(),
199 'node': ctx.hex(),
200 'parent': ctx.p1().hex(),
199 }), 201 }),
200 } 202 }
201 callconduit(ctx.repo(), 'differential.setdiffproperty', params) 203 callconduit(ctx.repo(), 'differential.setdiffproperty', params)
202 204
203 def createdifferentialrevision(ctx, revid=None, parentrevid=None): 205 def createdifferentialrevision(ctx, revid=None, parentrevid=None):
290 ctx.description().split('\n')[0])) 292 ctx.description().split('\n')[0]))
291 lastrevid = newrevid 293 lastrevid = newrevid
292 294
293 _summaryre = re.compile('^Summary:\s*', re.M) 295 _summaryre = re.compile('^Summary:\s*', re.M)
294 296
297 # Map from "hg:meta" keys to header understood by "hg import". The order is
298 # consistent with "hg export" output.
299 _metanamemap = util.sortdict([(r'user', 'User'), (r'date', 'Date'),
300 (r'node', 'Node ID'), (r'parent', 'Parent ')])
301
295 def readpatch(repo, params, recursive=False): 302 def readpatch(repo, params, recursive=False):
296 """generate plain-text patch readable by 'hg import' 303 """generate plain-text patch readable by 'hg import'
297 304
298 params is passed to "differential.query". If recursive is True, also return 305 params is passed to "differential.query". If recursive is True, also return
299 dependent patches. 306 dependent patches.
314 header = '# HG changeset patch\n' 321 header = '# HG changeset patch\n'
315 322
316 # Remove potential empty "Summary:" 323 # Remove potential empty "Summary:"
317 desc = _summaryre.sub('', desc) 324 desc = _summaryre.sub('', desc)
318 325
319 # Try to preserve metadata (user, date) from hg:meta property 326 # Try to preserve metadata from hg:meta property. Write hg patch headers
327 # that can be read by the "import" command. See patchheadermap and extract
328 # in mercurial/patch.py for supported headers.
320 diffs = callconduit(repo, 'differential.querydiffs', {'ids': [diffid]}) 329 diffs = callconduit(repo, 'differential.querydiffs', {'ids': [diffid]})
321 props = diffs[str(diffid)][r'properties'] # could be empty list or dict 330 props = diffs[str(diffid)][r'properties'] # could be empty list or dict
322 if props and r'hg:meta' in props: 331 if props and r'hg:meta' in props:
323 meta = props[r'hg:meta'] 332 meta = props[r'hg:meta']
324 for k, v in meta.items(): 333 for k in _metanamemap.keys():
325 header += '# %s %s\n' % (k.capitalize(), v) 334 if k in meta:
335 header += '# %s %s\n' % (_metanamemap[k], meta[k])
326 336
327 patch = ('%s%s\n%s') % (header, desc, body) 337 patch = ('%s%s\n%s') % (header, desc, body)
328 338
329 # Check dependencies 339 # Check dependencies
330 if recursive: 340 if recursive: