Mercurial > hg
comparison hgext/phabricator.py @ 42449:c19d259fd6ad
phabricator: use parents.set to always set dependencies
Now that Mercurial's Phabricator instance has been updated to a version that
supports the parents.set transaction on revision.edit we can use that to set
dependency relationships in patch stacks instead of abusing the summary.
This has the advantage that we can use it on every `phabsend` so commit
reordering is picked up without spamming changes like abusing the summary would,
and using parents.set will clear previous parents unlike parents.add.
Differential Revision: https://phab.mercurial-scm.org/D6514
author | Ian Moody <moz-ian@perix.co.uk> |
---|---|
date | Wed, 12 Jun 2019 17:22:37 +0100 |
parents | f33d3ee110da |
children | c17e6a3e7356 |
comparison
equal
deleted
inserted
replaced
42448:1314c0bb6b24 | 42449:c19d259fd6ad |
---|---|
429 }, | 429 }, |
430 }), | 430 }), |
431 } | 431 } |
432 callconduit(ctx.repo().ui, b'differential.setdiffproperty', params) | 432 callconduit(ctx.repo().ui, b'differential.setdiffproperty', params) |
433 | 433 |
434 def createdifferentialrevision(ctx, revid=None, parentrevid=None, oldnode=None, | 434 def createdifferentialrevision(ctx, revid=None, parentrevphid=None, |
435 olddiff=None, actions=None, comment=None): | 435 oldnode=None, olddiff=None, actions=None, |
436 comment=None): | |
436 """create or update a Differential Revision | 437 """create or update a Differential Revision |
437 | 438 |
438 If revid is None, create a new Differential Revision, otherwise update | 439 If revid is None, create a new Differential Revision, otherwise update |
439 revid. If parentrevid is not None, set it as a dependency. | 440 revid. If parentrevphid is not None, set it as a dependency. |
440 | 441 |
441 If oldnode is not None, check if the patch content (without commit message | 442 If oldnode is not None, check if the patch content (without commit message |
442 and metadata) has changed before creating another diff. | 443 and metadata) has changed before creating another diff. |
443 | 444 |
444 If actions is not None, they will be appended to the transaction. | 445 If actions is not None, they will be appended to the transaction. |
463 # pushers could know the correct node metadata. | 464 # pushers could know the correct node metadata. |
464 assert olddiff | 465 assert olddiff |
465 diff = olddiff | 466 diff = olddiff |
466 writediffproperties(ctx, diff) | 467 writediffproperties(ctx, diff) |
467 | 468 |
468 # Use a temporary summary to set dependency. There might be better ways but | 469 # Set the parent Revision every time, so commit re-ordering is picked-up |
469 # I cannot find them for now. But do not do that if we are updating an | 470 if parentrevphid: |
470 # existing revision (revid is not None) since that introduces visible | 471 transactions.append({b'type': b'parents.set', |
471 # churns (someone edited "Summary" twice) on the web page. | 472 b'value': [parentrevphid]}) |
472 if parentrevid and revid is None: | |
473 summary = b'Depends on D%d' % parentrevid | |
474 transactions += [{b'type': b'summary', b'value': summary}, | |
475 {b'type': b'summary', b'value': b' '}] | |
476 | 473 |
477 if actions: | 474 if actions: |
478 transactions += actions | 475 transactions += actions |
479 | 476 |
480 # Parse commit message and update related fields. | 477 # Parse commit message and update related fields. |
581 actions.append({b'type': b'reviewers.add', b'value': phids}) | 578 actions.append({b'type': b'reviewers.add', b'value': phids}) |
582 | 579 |
583 drevids = [] # [int] | 580 drevids = [] # [int] |
584 diffmap = {} # {newnode: diff} | 581 diffmap = {} # {newnode: diff} |
585 | 582 |
586 # Send patches one by one so we know their Differential Revision IDs and | 583 # Send patches one by one so we know their Differential Revision PHIDs and |
587 # can provide dependency relationship | 584 # can provide dependency relationship |
588 lastrevid = None | 585 lastrevphid = None |
589 for rev in revs: | 586 for rev in revs: |
590 ui.debug(b'sending rev %d\n' % rev) | 587 ui.debug(b'sending rev %d\n' % rev) |
591 ctx = repo[rev] | 588 ctx = repo[rev] |
592 | 589 |
593 # Get Differential Revision ID | 590 # Get Differential Revision ID |
594 oldnode, olddiff, revid = oldmap.get(ctx.node(), (None, None, None)) | 591 oldnode, olddiff, revid = oldmap.get(ctx.node(), (None, None, None)) |
595 if oldnode != ctx.node() or opts.get(b'amend'): | 592 if oldnode != ctx.node() or opts.get(b'amend'): |
596 # Create or update Differential Revision | 593 # Create or update Differential Revision |
597 revision, diff = createdifferentialrevision( | 594 revision, diff = createdifferentialrevision( |
598 ctx, revid, lastrevid, oldnode, olddiff, actions, | 595 ctx, revid, lastrevphid, oldnode, olddiff, actions, |
599 opts.get(b'comment')) | 596 opts.get(b'comment')) |
600 diffmap[ctx.node()] = diff | 597 diffmap[ctx.node()] = diff |
601 newrevid = int(revision[b'object'][b'id']) | 598 newrevid = int(revision[b'object'][b'id']) |
599 newrevphid = revision[b'object'][b'phid'] | |
602 if revid: | 600 if revid: |
603 action = b'updated' | 601 action = b'updated' |
604 else: | 602 else: |
605 action = b'created' | 603 action = b'created' |
606 | 604 |
610 if not m or int(m.group(r'id')) != newrevid: | 608 if not m or int(m.group(r'id')) != newrevid: |
611 tagname = b'D%d' % newrevid | 609 tagname = b'D%d' % newrevid |
612 tags.tag(repo, tagname, ctx.node(), message=None, user=None, | 610 tags.tag(repo, tagname, ctx.node(), message=None, user=None, |
613 date=None, local=True) | 611 date=None, local=True) |
614 else: | 612 else: |
615 # Nothing changed. But still set "newrevid" so the next revision | 613 # Nothing changed. But still set "newrevphid" so the next revision |
616 # could depend on this one. | 614 # could depend on this one and "newrevid" for the summary line. |
615 newrevphid = querydrev(repo, str(revid))[0][b'phid'] | |
617 newrevid = revid | 616 newrevid = revid |
618 action = b'skipped' | 617 action = b'skipped' |
619 | 618 |
620 actiondesc = ui.label( | 619 actiondesc = ui.label( |
621 {b'created': _(b'created'), | 620 {b'created': _(b'created'), |
626 nodedesc = ui.label(bytes(ctx), b'phabricator.node') | 625 nodedesc = ui.label(bytes(ctx), b'phabricator.node') |
627 desc = ui.label(ctx.description().split(b'\n')[0], b'phabricator.desc') | 626 desc = ui.label(ctx.description().split(b'\n')[0], b'phabricator.desc') |
628 ui.write(_(b'%s - %s - %s: %s\n') % (drevdesc, actiondesc, nodedesc, | 627 ui.write(_(b'%s - %s - %s: %s\n') % (drevdesc, actiondesc, nodedesc, |
629 desc)) | 628 desc)) |
630 drevids.append(newrevid) | 629 drevids.append(newrevid) |
631 lastrevid = newrevid | 630 lastrevphid = newrevphid |
632 | 631 |
633 # Update commit messages and remove tags | 632 # Update commit messages and remove tags |
634 if opts.get(b'amend'): | 633 if opts.get(b'amend'): |
635 unfi = repo.unfiltered() | 634 unfi = repo.unfiltered() |
636 drevs = callconduit(ui, b'differential.query', {b'ids': drevids}) | 635 drevs = callconduit(ui, b'differential.query', {b'ids': drevids}) |