##// END OF EJS Templates
phabricator: teach `getoldnodedrevmap()` to handle folded reviews...
Matt Harbison -
r45136:5f9c917e default
parent child Browse files
Show More
@@ -483,18 +483,23 b' def getoldnodedrevmap(repo, nodelist):'
483 alldiffs = callconduit(
483 alldiffs = callconduit(
484 unfi.ui, b'differential.querydiffs', {b'revisionIDs': drevs}
484 unfi.ui, b'differential.querydiffs', {b'revisionIDs': drevs}
485 )
485 )
486 getnode = lambda d: bin(getdiffmeta(d).get(b'node', b'')) or None
486
487 def getnodes(d, precset):
488 # Ignore other nodes that were combined into the Differential
489 # that aren't predecessors of the current local node.
490 return [n for n in getlocalcommits(d) if n in precset]
491
487 for newnode, (force, precset, drev) in toconfirm.items():
492 for newnode, (force, precset, drev) in toconfirm.items():
488 diffs = [
493 diffs = [
489 d for d in alldiffs.values() if int(d[b'revisionID']) == drev
494 d for d in alldiffs.values() if int(d[b'revisionID']) == drev
490 ]
495 ]
491
496
492 # "precursors" as known by Phabricator
497 # local predecessors known by Phabricator
493 phprecset = {getnode(d) for d in diffs}
498 phprecset = {n for d in diffs for n in getnodes(d, precset)}
494
499
495 # Ignore if precursors (Phabricator and local repo) do not overlap,
500 # Ignore if precursors (Phabricator and local repo) do not overlap,
496 # and force is not set (when commit message says nothing)
501 # and force is not set (when commit message says nothing)
497 if not force and not bool(phprecset & precset):
502 if not force and not phprecset:
498 tagname = b'D%d' % drev
503 tagname = b'D%d' % drev
499 tags.tag(
504 tags.tag(
500 repo,
505 repo,
@@ -519,7 +524,20 b' def getoldnodedrevmap(repo, nodelist):'
519 oldnode = lastdiff = None
524 oldnode = lastdiff = None
520 if diffs:
525 if diffs:
521 lastdiff = max(diffs, key=lambda d: int(d[b'id']))
526 lastdiff = max(diffs, key=lambda d: int(d[b'id']))
522 oldnode = getnode(lastdiff)
527 oldnodes = getnodes(lastdiff, precset)
528
529 # If this commit was the result of `hg fold` after submission,
530 # and now resubmitted with --fold, the easiest thing to do is
531 # to leave the node clear. This only results in creating a new
532 # diff for the _same_ Differential Revision if this commit is
533 # the first or last in the selected range.
534 # If this commit is the result of `hg split` in the same
535 # scenario, there is a single oldnode here (and multiple
536 # newnodes mapped to it). That makes it the same as the normal
537 # case, as the edges of the newnode range cleanly maps to one
538 # oldnode each.
539 if len(oldnodes) == 1:
540 oldnode = oldnodes[0]
523 if oldnode and not has_node(oldnode):
541 if oldnode and not has_node(oldnode):
524 oldnode = None
542 oldnode = None
525
543
@@ -1667,6 +1685,21 b' def get_amended_desc(drev, ctx, folded):'
1667 return _differentialrevisiondescre.sub(uri, ctx.description())
1685 return _differentialrevisiondescre.sub(uri, ctx.description())
1668
1686
1669
1687
1688 def getlocalcommits(diff):
1689 """get the set of local commits from a diff object
1690
1691 See ``getdiffmeta()`` for an example diff object.
1692 """
1693 props = diff.get(b'properties') or {}
1694 commits = props.get(b'local:commits') or {}
1695 if len(commits) > 1:
1696 return {bin(c) for c in commits.keys()}
1697
1698 # Storing the diff metadata predates storing `local:commits`, so continue
1699 # to use that in the --no-fold case.
1700 return {bin(getdiffmeta(diff).get(b'node', b'')) or None}
1701
1702
1670 def getdiffmeta(diff):
1703 def getdiffmeta(diff):
1671 """get commit metadata (date, node, user, p1) from a diff object
1704 """get commit metadata (date, node, user, p1) from a diff object
1672
1705
General Comments 0
You need to be logged in to leave comments. Login now