comparison mercurial/merge.py @ 45275:8e8d513941b4

merge: introduce 'commitinfo' in mergeresult commitinfo will be used to pass information which is required on commit phase from the merge phase. One common example is, merge chooses filenode from second parent and we need to tell commit to choose that. Right now this one and related cases are not very neatly implement and there is no clear line on how to pass on such information. Upcoming patches will try to work on in this area and make things easier. Differential Revision: https://phab.mercurial-scm.org/D8742
author Pulkit Goyal <7895pulkit@gmail.com>
date Tue, 14 Jul 2020 16:21:08 +0530
parents 0e18861f96ab
children cb6a72dc0511
comparison
equal deleted inserted replaced
45274:0e18861f96ab 45275:8e8d513941b4
544 ''''An object representing result of merging manifests. 544 ''''An object representing result of merging manifests.
545 545
546 It has information about what actions need to be performed on dirstate 546 It has information about what actions need to be performed on dirstate
547 mapping of divergent renames and other such cases. ''' 547 mapping of divergent renames and other such cases. '''
548 548
549 def __init__(self, actions, diverge, renamedelete): 549 def __init__(self, actions, diverge, renamedelete, commitinfo):
550 """ 550 """
551 actions: dict of filename as keys and action related info as values 551 actions: dict of filename as keys and action related info as values
552 diverge: mapping of source name -> list of dest name for 552 diverge: mapping of source name -> list of dest name for
553 divergent renames 553 divergent renames
554 renamedelete: mapping of source name -> list of destinations for files 554 renamedelete: mapping of source name -> list of destinations for files
555 deleted on one side and renamed on other. 555 deleted on one side and renamed on other.
556 commitinfo: dict containing data which should be used on commit
557 contains a filename -> info mapping
556 """ 558 """
557 559
558 self._actions = actions 560 self._actions = actions
559 self._diverge = diverge 561 self._diverge = diverge
560 self._renamedelete = renamedelete 562 self._renamedelete = renamedelete
563 self._commitinfo = commitinfo
561 564
562 @property 565 @property
563 def actions(self): 566 def actions(self):
564 return self._actions 567 return self._actions
565 568
568 return self._diverge 571 return self._diverge
569 572
570 @property 573 @property
571 def renamedelete(self): 574 def renamedelete(self):
572 return self._renamedelete 575 return self._renamedelete
576
577 @property
578 def commitinfo(self):
579 return self._commitinfo
573 580
574 def setactions(self, actions): 581 def setactions(self, actions):
575 self._actions = actions 582 self._actions = actions
576 583
577 584
606 ] 613 ]
607 614
608 branch_copies1 = copies.branch_copies() 615 branch_copies1 = copies.branch_copies()
609 branch_copies2 = copies.branch_copies() 616 branch_copies2 = copies.branch_copies()
610 diverge = {} 617 diverge = {}
618 # information from merge which is needed at commit time
619 # for example choosing filelog of which parent to commit
620 # TODO: use specific constants in future for this mapping
621 commitinfo = {}
611 if followcopies: 622 if followcopies:
612 branch_copies1, branch_copies2, diverge = copies.mergecopies( 623 branch_copies1, branch_copies2, diverge = copies.mergecopies(
613 repo, wctx, p2, pa 624 repo, wctx, p2, pa
614 ) 625 )
615 626
699 if branchmerge 710 if branchmerge
700 else mergestatemod.ACTION_GET, 711 else mergestatemod.ACTION_GET,
701 (fl2, False), 712 (fl2, False),
702 b'remote is newer', 713 b'remote is newer',
703 ) 714 )
715 if branchmerge:
716 commitinfo[f] = b'other'
704 elif nol and n2 == a: # remote only changed 'x' 717 elif nol and n2 == a: # remote only changed 'x'
705 actions[f] = ( 718 actions[f] = (
706 mergestatemod.ACTION_EXEC, 719 mergestatemod.ACTION_EXEC,
707 (fl2,), 720 (fl2,),
708 b'update permissions', 721 b'update permissions',
713 if branchmerge 726 if branchmerge
714 else mergestatemod.ACTION_GET, 727 else mergestatemod.ACTION_GET,
715 (fl1, False), 728 (fl1, False),
716 b'remote is newer', 729 b'remote is newer',
717 ) 730 )
731 if branchmerge:
732 commitinfo[f] = b'other'
718 else: # both changed something 733 else: # both changed something
719 actions[f] = ( 734 actions[f] = (
720 mergestatemod.ACTION_MERGE, 735 mergestatemod.ACTION_MERGE,
721 (f, f, f, False, pa.node()), 736 (f, f, f, False, pa.node()),
722 b'versions differ', 737 b'versions differ',
873 _filternarrowactions(narrowmatch, branchmerge, actions) 888 _filternarrowactions(narrowmatch, branchmerge, actions)
874 889
875 renamedelete = branch_copies1.renamedelete 890 renamedelete = branch_copies1.renamedelete
876 renamedelete.update(branch_copies2.renamedelete) 891 renamedelete.update(branch_copies2.renamedelete)
877 892
878 return mergeresult(actions, diverge, renamedelete) 893 return mergeresult(actions, diverge, renamedelete, commitinfo)
879 894
880 895
881 def _resolvetrivial(repo, wctx, mctx, ancestor, actions): 896 def _resolvetrivial(repo, wctx, mctx, ancestor, actions):
882 """Resolves false conflicts where the nodeid changed but the content 897 """Resolves false conflicts where the nodeid changed but the content
883 remained the same.""" 898 remained the same."""
1032 _(b' %s: ambiguous merge - picked %s action\n') % (f, m) 1047 _(b' %s: ambiguous merge - picked %s action\n') % (f, m)
1033 ) 1048 )
1034 actions[f] = l[0] 1049 actions[f] = l[0]
1035 continue 1050 continue
1036 repo.ui.note(_(b'end of auction\n\n')) 1051 repo.ui.note(_(b'end of auction\n\n'))
1037 mresult = mergeresult(actions, diverge, renamedelete) 1052 # TODO: think about commitinfo when bid merge is used
1053 mresult = mergeresult(actions, diverge, renamedelete, {})
1038 1054
1039 if wctx.rev() is None: 1055 if wctx.rev() is None:
1040 fractions = _forgetremoved(wctx, mctx, branchmerge) 1056 fractions = _forgetremoved(wctx, mctx, branchmerge)
1041 mresult.actions.update(fractions) 1057 mresult.actions.update(fractions)
1042 1058