##// END OF EJS Templates
merge: move calculateupdates() before applyupdated()...
Martin von Zweigbergk -
r23385:91c24457 default
parent child Browse files
Show More
@@ -522,6 +522,105 b' def manifestmerge(repo, wctx, p2, pa, br'
522
522
523 return actions
523 return actions
524
524
525 def calculateupdates(repo, wctx, mctx, ancestors, branchmerge, force, partial,
526 acceptremote, followcopies):
527 "Calculate the actions needed to merge mctx into wctx using ancestors"
528
529 if len(ancestors) == 1: # default
530 actions = manifestmerge(repo, wctx, mctx, ancestors[0],
531 branchmerge, force,
532 partial, acceptremote, followcopies)
533
534 else: # only when merge.preferancestor=* - the default
535 repo.ui.note(
536 _("note: merging %s and %s using bids from ancestors %s\n") %
537 (wctx, mctx, _(' and ').join(str(anc) for anc in ancestors)))
538
539 # Call for bids
540 fbids = {} # mapping filename to bids (action method to list af actions)
541 for ancestor in ancestors:
542 repo.ui.note(_('\ncalculating bids for ancestor %s\n') % ancestor)
543 actions = manifestmerge(repo, wctx, mctx, ancestor,
544 branchmerge, force,
545 partial, acceptremote, followcopies)
546 for m, l in sorted(actions.items()):
547 for a in l:
548 f, args, msg = a
549 repo.ui.debug(' %s: %s -> %s\n' % (f, msg, m))
550 if f in fbids:
551 d = fbids[f]
552 if m in d:
553 d[m].append(a)
554 else:
555 d[m] = [a]
556 else:
557 fbids[f] = {m: [a]}
558
559 # Pick the best bid for each file
560 repo.ui.note(_('\nauction for merging merge bids\n'))
561 actions = dict((m, []) for m in actions.keys())
562 for f, bids in sorted(fbids.items()):
563 # bids is a mapping from action method to list af actions
564 # Consensus?
565 if len(bids) == 1: # all bids are the same kind of method
566 m, l = bids.items()[0]
567 if util.all(a == l[0] for a in l[1:]): # len(bids) is > 1
568 repo.ui.note(" %s: consensus for %s\n" % (f, m))
569 actions[m].append(l[0])
570 continue
571 # If keep is an option, just do it.
572 if 'k' in bids:
573 repo.ui.note(" %s: picking 'keep' action\n" % f)
574 actions['k'].append(bids['k'][0])
575 continue
576 # If there are gets and they all agree [how could they not?], do it.
577 if 'g' in bids:
578 ga0 = bids['g'][0]
579 if util.all(a == ga0 for a in bids['g'][1:]):
580 repo.ui.note(" %s: picking 'get' action\n" % f)
581 actions['g'].append(ga0)
582 continue
583 # TODO: Consider other simple actions such as mode changes
584 # Handle inefficient democrazy.
585 repo.ui.note(_(' %s: multiple bids for merge action:\n') % f)
586 for m, l in sorted(bids.items()):
587 for _f, args, msg in l:
588 repo.ui.note(' %s -> %s\n' % (msg, m))
589 # Pick random action. TODO: Instead, prompt user when resolving
590 m, l = bids.items()[0]
591 repo.ui.warn(_(' %s: ambiguous merge - picked %s action\n') %
592 (f, m))
593 actions[m].append(l[0])
594 continue
595 repo.ui.note(_('end of auction\n\n'))
596
597 # Prompt and create actions. TODO: Move this towards resolve phase.
598 for f, args, msg in actions['cd']:
599 if repo.ui.promptchoice(
600 _("local changed %s which remote deleted\n"
601 "use (c)hanged version or (d)elete?"
602 "$$ &Changed $$ &Delete") % f, 0):
603 actions['r'].append((f, None, "prompt delete"))
604 else:
605 actions['a'].append((f, None, "prompt keep"))
606 del actions['cd'][:]
607
608 for f, args, msg in actions['dc']:
609 flags, = args
610 if repo.ui.promptchoice(
611 _("remote changed %s which local deleted\n"
612 "use (c)hanged version or leave (d)eleted?"
613 "$$ &Changed $$ &Deleted") % f, 0) == 0:
614 actions['g'].append((f, (flags,), "prompt recreating"))
615 del actions['dc'][:]
616
617 if wctx.rev() is None:
618 ractions, factions = _forgetremoved(wctx, mctx, branchmerge)
619 actions['r'].extend(ractions)
620 actions['f'].extend(factions)
621
622 return actions
623
525 def batchremove(repo, actions):
624 def batchremove(repo, actions):
526 """apply removes to the working directory
625 """apply removes to the working directory
527
626
@@ -737,105 +836,6 b' def applyupdates(repo, actions, wctx, mc'
737
836
738 return updated, merged, removed, unresolved
837 return updated, merged, removed, unresolved
739
838
740 def calculateupdates(repo, wctx, mctx, ancestors, branchmerge, force, partial,
741 acceptremote, followcopies):
742 "Calculate the actions needed to merge mctx into wctx using ancestors"
743
744 if len(ancestors) == 1: # default
745 actions = manifestmerge(repo, wctx, mctx, ancestors[0],
746 branchmerge, force,
747 partial, acceptremote, followcopies)
748
749 else: # only when merge.preferancestor=* - the default
750 repo.ui.note(
751 _("note: merging %s and %s using bids from ancestors %s\n") %
752 (wctx, mctx, _(' and ').join(str(anc) for anc in ancestors)))
753
754 # Call for bids
755 fbids = {} # mapping filename to bids (action method to list af actions)
756 for ancestor in ancestors:
757 repo.ui.note(_('\ncalculating bids for ancestor %s\n') % ancestor)
758 actions = manifestmerge(repo, wctx, mctx, ancestor,
759 branchmerge, force,
760 partial, acceptremote, followcopies)
761 for m, l in sorted(actions.items()):
762 for a in l:
763 f, args, msg = a
764 repo.ui.debug(' %s: %s -> %s\n' % (f, msg, m))
765 if f in fbids:
766 d = fbids[f]
767 if m in d:
768 d[m].append(a)
769 else:
770 d[m] = [a]
771 else:
772 fbids[f] = {m: [a]}
773
774 # Pick the best bid for each file
775 repo.ui.note(_('\nauction for merging merge bids\n'))
776 actions = dict((m, []) for m in actions.keys())
777 for f, bids in sorted(fbids.items()):
778 # bids is a mapping from action method to list af actions
779 # Consensus?
780 if len(bids) == 1: # all bids are the same kind of method
781 m, l = bids.items()[0]
782 if util.all(a == l[0] for a in l[1:]): # len(bids) is > 1
783 repo.ui.note(" %s: consensus for %s\n" % (f, m))
784 actions[m].append(l[0])
785 continue
786 # If keep is an option, just do it.
787 if 'k' in bids:
788 repo.ui.note(" %s: picking 'keep' action\n" % f)
789 actions['k'].append(bids['k'][0])
790 continue
791 # If there are gets and they all agree [how could they not?], do it.
792 if 'g' in bids:
793 ga0 = bids['g'][0]
794 if util.all(a == ga0 for a in bids['g'][1:]):
795 repo.ui.note(" %s: picking 'get' action\n" % f)
796 actions['g'].append(ga0)
797 continue
798 # TODO: Consider other simple actions such as mode changes
799 # Handle inefficient democrazy.
800 repo.ui.note(_(' %s: multiple bids for merge action:\n') % f)
801 for m, l in sorted(bids.items()):
802 for _f, args, msg in l:
803 repo.ui.note(' %s -> %s\n' % (msg, m))
804 # Pick random action. TODO: Instead, prompt user when resolving
805 m, l = bids.items()[0]
806 repo.ui.warn(_(' %s: ambiguous merge - picked %s action\n') %
807 (f, m))
808 actions[m].append(l[0])
809 continue
810 repo.ui.note(_('end of auction\n\n'))
811
812 # Prompt and create actions. TODO: Move this towards resolve phase.
813 for f, args, msg in actions['cd']:
814 if repo.ui.promptchoice(
815 _("local changed %s which remote deleted\n"
816 "use (c)hanged version or (d)elete?"
817 "$$ &Changed $$ &Delete") % f, 0):
818 actions['r'].append((f, None, "prompt delete"))
819 else:
820 actions['a'].append((f, None, "prompt keep"))
821 del actions['cd'][:]
822
823 for f, args, msg in actions['dc']:
824 flags, = args
825 if repo.ui.promptchoice(
826 _("remote changed %s which local deleted\n"
827 "use (c)hanged version or leave (d)eleted?"
828 "$$ &Changed $$ &Deleted") % f, 0) == 0:
829 actions['g'].append((f, (flags,), "prompt recreating"))
830 del actions['dc'][:]
831
832 if wctx.rev() is None:
833 ractions, factions = _forgetremoved(wctx, mctx, branchmerge)
834 actions['r'].extend(ractions)
835 actions['f'].extend(factions)
836
837 return actions
838
839 def recordupdates(repo, actions, branchmerge):
839 def recordupdates(repo, actions, branchmerge):
840 "record merge actions to the dirstate"
840 "record merge actions to the dirstate"
841 # remove (must come first)
841 # remove (must come first)
General Comments 0
You need to be logged in to leave comments. Login now