183 if f not in mctx: |
183 if f not in mctx: |
184 actions.append((f, "f", None, "forget removed")) |
184 actions.append((f, "f", None, "forget removed")) |
185 |
185 |
186 return actions |
186 return actions |
187 |
187 |
188 def manifestmerge(repo, wctx, p2, pa, branchmerge, force, partial): |
188 def manifestmerge(repo, wctx, p2, pa, branchmerge, force, partial, |
|
189 acceptremote=False): |
189 """ |
190 """ |
190 Merge p1 and p2 with ancestor pa and generate merge action list |
191 Merge p1 and p2 with ancestor pa and generate merge action list |
191 |
192 |
192 branchmerge and force are as passed in to update |
193 branchmerge and force are as passed in to update |
193 partial = function to filter file lists |
194 partial = function to filter file lists |
|
195 acceptremote = accept the incoming changes without prompting |
194 """ |
196 """ |
195 |
197 |
196 overwrite = force and not branchmerge |
198 overwrite = force and not branchmerge |
197 actions, copy, movewithdir = [], {}, {} |
199 actions, copy, movewithdir = [], {}, {} |
198 |
200 |
329 raise util.Abort(_("untracked files in working directory differ " |
331 raise util.Abort(_("untracked files in working directory differ " |
330 "from files in requested revision")) |
332 "from files in requested revision")) |
331 |
333 |
332 for f, m in sorted(prompts): |
334 for f, m in sorted(prompts): |
333 if m == "cd": |
335 if m == "cd": |
334 if repo.ui.promptchoice( |
336 if acceptremote: |
|
337 actions.append((f, "r", None, "remote delete")) |
|
338 elif repo.ui.promptchoice( |
335 _("local changed %s which remote deleted\n" |
339 _("local changed %s which remote deleted\n" |
336 "use (c)hanged version or (d)elete?") % f, |
340 "use (c)hanged version or (d)elete?") % f, |
337 (_("&Changed"), _("&Delete")), 0): |
341 (_("&Changed"), _("&Delete")), 0): |
338 actions.append((f, "r", None, "prompt delete")) |
342 actions.append((f, "r", None, "prompt delete")) |
339 else: |
343 else: |
340 actions.append((f, "a", None, "prompt keep")) |
344 actions.append((f, "a", None, "prompt keep")) |
341 elif m == "dc": |
345 elif m == "dc": |
342 if repo.ui.promptchoice( |
346 if acceptremote: |
|
347 actions.append((f, "g", (m2.flags(f),), "remote recreating")) |
|
348 elif repo.ui.promptchoice( |
343 _("remote changed %s which local deleted\n" |
349 _("remote changed %s which local deleted\n" |
344 "use (c)hanged version or leave (d)eleted?") % f, |
350 "use (c)hanged version or leave (d)eleted?") % f, |
345 (_("&Changed"), _("&Deleted")), 0) == 0: |
351 (_("&Changed"), _("&Deleted")), 0) == 0: |
346 actions.append((f, "g", (m2.flags(f),), "prompt recreating")) |
352 actions.append((f, "g", (m2.flags(f),), "prompt recreating")) |
347 else: assert False, m |
353 else: assert False, m |
510 ms.commit() |
516 ms.commit() |
511 progress(_updating, None, total=numupdates, unit=_files) |
517 progress(_updating, None, total=numupdates, unit=_files) |
512 |
518 |
513 return updated, merged, removed, unresolved |
519 return updated, merged, removed, unresolved |
514 |
520 |
515 def calculateupdates(repo, tctx, mctx, ancestor, branchmerge, force, partial): |
521 def calculateupdates(repo, tctx, mctx, ancestor, branchmerge, force, partial, |
|
522 acceptremote=False): |
516 "Calculate the actions needed to merge mctx into tctx" |
523 "Calculate the actions needed to merge mctx into tctx" |
517 actions = [] |
524 actions = [] |
518 folding = not util.checkcase(repo.path) |
525 folding = not util.checkcase(repo.path) |
519 if folding: |
526 if folding: |
520 # collision check is not needed for clean update |
527 # collision check is not needed for clean update |
524 else: |
531 else: |
525 _checkcollision(mctx, (tctx, ancestor)) |
532 _checkcollision(mctx, (tctx, ancestor)) |
526 actions += manifestmerge(repo, tctx, mctx, |
533 actions += manifestmerge(repo, tctx, mctx, |
527 ancestor, |
534 ancestor, |
528 branchmerge, force, |
535 branchmerge, force, |
529 partial) |
536 partial, acceptremote) |
530 if tctx.rev() is None: |
537 if tctx.rev() is None: |
531 actions += _forgetremoved(tctx, mctx, branchmerge) |
538 actions += _forgetremoved(tctx, mctx, branchmerge) |
532 return actions |
539 return actions |
533 |
540 |
534 def recordupdates(repo, actions, branchmerge): |
541 def recordupdates(repo, actions, branchmerge): |
600 |
607 |
601 node = the node to update to, or None if unspecified |
608 node = the node to update to, or None if unspecified |
602 branchmerge = whether to merge between branches |
609 branchmerge = whether to merge between branches |
603 force = whether to force branch merging or file overwriting |
610 force = whether to force branch merging or file overwriting |
604 partial = a function to filter file lists (dirstate not updated) |
611 partial = a function to filter file lists (dirstate not updated) |
605 mergeancestor = if false, merging with an ancestor (fast-forward) |
612 mergeancestor = whether it is merging with an ancestor. If true, |
606 is only allowed between different named branches. This flag |
613 we should accept the incoming changes for any prompts that occur. |
607 is used by rebase extension as a temporary fix and should be |
614 If false, merging with an ancestor (fast-forward) is only allowed |
608 avoided in general. |
615 between different named branches. This flag is used by rebase extension |
|
616 as a temporary fix and should be avoided in general. |
609 |
617 |
610 The table below shows all the behaviors of the update command |
618 The table below shows all the behaviors of the update command |
611 given the -c and -C or no options, whether the working directory |
619 given the -c and -C or no options, whether the working directory |
612 is dirty, whether a revision is specified, and the relationship of |
620 is dirty, whether a revision is specified, and the relationship of |
613 the parent rev to the target rev (linear, on the same named |
621 the parent rev to the target rev (linear, on the same named |
691 # Allow jumping branches if clean and specific rev given |
699 # Allow jumping branches if clean and specific rev given |
692 pa = p1 |
700 pa = p1 |
693 |
701 |
694 ### calculate phase |
702 ### calculate phase |
695 actions = calculateupdates(repo, wc, p2, pa, |
703 actions = calculateupdates(repo, wc, p2, pa, |
696 branchmerge, force, partial) |
704 branchmerge, force, partial, mergeancestor) |
697 |
705 |
698 ### apply phase |
706 ### apply phase |
699 if not branchmerge: # just jump to the new rev |
707 if not branchmerge: # just jump to the new rev |
700 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
708 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
701 if not partial: |
709 if not partial: |