Mercurial > public > mercurial-scm > hg
comparison mercurial/merge.py @ 18330:b717f49833a2
merge: rename list of actions from action to actions
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Wed, 09 Jan 2013 00:01:33 +0100 |
parents | eb6ca96f4dd0 |
children | e68cec5e28b0 |
comparison
equal
deleted
inserted
replaced
18329:eb6ca96f4dd0 | 18330:b717f49833a2 |
---|---|
160 If we're merging, and the other revision has removed a file | 160 If we're merging, and the other revision has removed a file |
161 that is not present in the working directory, we need to mark it | 161 that is not present in the working directory, we need to mark it |
162 as removed. | 162 as removed. |
163 """ | 163 """ |
164 | 164 |
165 action = [] | 165 actions = [] |
166 state = branchmerge and 'r' or 'f' | 166 state = branchmerge and 'r' or 'f' |
167 for f in wctx.deleted(): | 167 for f in wctx.deleted(): |
168 if f not in mctx: | 168 if f not in mctx: |
169 action.append((f, state)) | 169 actions.append((f, state)) |
170 | 170 |
171 if not branchmerge: | 171 if not branchmerge: |
172 for f in wctx.removed(): | 172 for f in wctx.removed(): |
173 if f not in mctx: | 173 if f not in mctx: |
174 action.append((f, "f")) | 174 actions.append((f, "f")) |
175 | 175 |
176 return action | 176 return actions |
177 | 177 |
178 def manifestmerge(repo, p1, p2, pa, overwrite, partial): | 178 def manifestmerge(repo, p1, p2, pa, overwrite, partial): |
179 """ | 179 """ |
180 Merge p1 and p2 with ancestor pa and generate merge action list | 180 Merge p1 and p2 with ancestor pa and generate merge action list |
181 | 181 |
209 return n | 209 return n |
210 return '' # flag was cleared | 210 return '' # flag was cleared |
211 | 211 |
212 def act(msg, m, f, *args): | 212 def act(msg, m, f, *args): |
213 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) | 213 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) |
214 action.append((f, m) + args) | 214 actions.append((f, m) + args) |
215 | 215 |
216 action, copy, movewithdir = [], {}, {} | 216 actions, copy, movewithdir = [], {}, {} |
217 | 217 |
218 if overwrite: | 218 if overwrite: |
219 pa = p1 | 219 pa = p1 |
220 elif pa == p2: # backwards | 220 elif pa == p2: # backwards |
221 pa = p1.p1() | 221 pa = p1.p1() |
313 _("remote changed %s which local deleted\n" | 313 _("remote changed %s which local deleted\n" |
314 "use (c)hanged version or leave (d)eleted?") % f, | 314 "use (c)hanged version or leave (d)eleted?") % f, |
315 (_("&Changed"), _("&Deleted")), 0) == 0: | 315 (_("&Changed"), _("&Deleted")), 0) == 0: |
316 act("prompt recreating", "g", f, m2.flags(f)) | 316 act("prompt recreating", "g", f, m2.flags(f)) |
317 | 317 |
318 return action | 318 return actions |
319 | 319 |
320 def actionkey(a): | 320 def actionkey(a): |
321 return a[1] == "r" and -1 or 0, a | 321 return a[1] == "r" and -1 or 0, a |
322 | 322 |
323 def applyupdates(repo, action, wctx, mctx, actx, overwrite): | 323 def applyupdates(repo, actions, wctx, mctx, actx, overwrite): |
324 """apply the merge action list to the working directory | 324 """apply the merge action list to the working directory |
325 | 325 |
326 wctx is the working copy context | 326 wctx is the working copy context |
327 mctx is the context to be merged into the working copy | 327 mctx is the context to be merged into the working copy |
328 actx is the context of the common ancestor | 328 actx is the context of the common ancestor |
333 | 333 |
334 updated, merged, removed, unresolved = 0, 0, 0, 0 | 334 updated, merged, removed, unresolved = 0, 0, 0, 0 |
335 ms = mergestate(repo) | 335 ms = mergestate(repo) |
336 ms.reset(wctx.p1().node()) | 336 ms.reset(wctx.p1().node()) |
337 moves = [] | 337 moves = [] |
338 action.sort(key=actionkey) | 338 actions.sort(key=actionkey) |
339 | 339 |
340 # prescan for merges | 340 # prescan for merges |
341 for a in action: | 341 for a in actions: |
342 f, m = a[:2] | 342 f, m = a[:2] |
343 if m == "m": # merge | 343 if m == "m": # merge |
344 f2, fd, flags, move = a[2:] | 344 f2, fd, flags, move = a[2:] |
345 if f == '.hgsubstate': # merged internally | 345 if f == '.hgsubstate': # merged internally |
346 continue | 346 continue |
367 if os.path.lexists(repo.wjoin(f)): | 367 if os.path.lexists(repo.wjoin(f)): |
368 repo.ui.debug("removing %s\n" % f) | 368 repo.ui.debug("removing %s\n" % f) |
369 audit(f) | 369 audit(f) |
370 os.unlink(repo.wjoin(f)) | 370 os.unlink(repo.wjoin(f)) |
371 | 371 |
372 numupdates = len(action) | 372 numupdates = len(actions) |
373 for i, a in enumerate(action): | 373 for i, a in enumerate(actions): |
374 f, m = a[:2] | 374 f, m = a[:2] |
375 repo.ui.progress(_('updating'), i + 1, item=f, total=numupdates, | 375 repo.ui.progress(_('updating'), i + 1, item=f, total=numupdates, |
376 unit=_('files')) | 376 unit=_('files')) |
377 if f and f[0] == "/": | 377 if f and f[0] == "/": |
378 continue | 378 continue |
450 | 450 |
451 return updated, merged, removed, unresolved | 451 return updated, merged, removed, unresolved |
452 | 452 |
453 def calculateupdates(repo, tctx, mctx, ancestor, branchmerge, force, partial): | 453 def calculateupdates(repo, tctx, mctx, ancestor, branchmerge, force, partial): |
454 "Calculate the actions needed to merge mctx into tctx" | 454 "Calculate the actions needed to merge mctx into tctx" |
455 action = [] | 455 actions = [] |
456 folding = not util.checkcase(repo.path) | 456 folding = not util.checkcase(repo.path) |
457 if folding: | 457 if folding: |
458 # collision check is not needed for clean update | 458 # collision check is not needed for clean update |
459 if (not branchmerge and | 459 if (not branchmerge and |
460 (force or not tctx.dirty(missing=True, branch=False))): | 460 (force or not tctx.dirty(missing=True, branch=False))): |
462 else: | 462 else: |
463 _checkcollision(mctx, (tctx, ancestor)) | 463 _checkcollision(mctx, (tctx, ancestor)) |
464 if not force: | 464 if not force: |
465 _checkunknown(repo, tctx, mctx) | 465 _checkunknown(repo, tctx, mctx) |
466 if tctx.rev() is None: | 466 if tctx.rev() is None: |
467 action += _forgetremoved(tctx, mctx, branchmerge) | 467 actions += _forgetremoved(tctx, mctx, branchmerge) |
468 action += manifestmerge(repo, tctx, mctx, | 468 actions += manifestmerge(repo, tctx, mctx, |
469 ancestor, | 469 ancestor, |
470 force and not branchmerge, | 470 force and not branchmerge, |
471 partial) | 471 partial) |
472 return action | 472 return actions |
473 | 473 |
474 def recordupdates(repo, action, branchmerge): | 474 def recordupdates(repo, actions, branchmerge): |
475 "record merge actions to the dirstate" | 475 "record merge actions to the dirstate" |
476 | 476 |
477 for a in action: | 477 for a in actions: |
478 f, m = a[:2] | 478 f, m = a[:2] |
479 if m == "r": # remove | 479 if m == "r": # remove |
480 if branchmerge: | 480 if branchmerge: |
481 repo.dirstate.remove(f) | 481 repo.dirstate.remove(f) |
482 else: | 482 else: |
630 else: | 630 else: |
631 # Allow jumping branches if clean and specific rev given | 631 # Allow jumping branches if clean and specific rev given |
632 pa = p1 | 632 pa = p1 |
633 | 633 |
634 ### calculate phase | 634 ### calculate phase |
635 action = calculateupdates(repo, wc, p2, pa, branchmerge, force, partial) | 635 actions = calculateupdates(repo, wc, p2, pa, |
636 branchmerge, force, partial) | |
636 | 637 |
637 ### apply phase | 638 ### apply phase |
638 if not branchmerge: # just jump to the new rev | 639 if not branchmerge: # just jump to the new rev |
639 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' | 640 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
640 if not partial: | 641 if not partial: |
641 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) | 642 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) |
642 | 643 |
643 stats = applyupdates(repo, action, wc, p2, pa, overwrite) | 644 stats = applyupdates(repo, actions, wc, p2, pa, overwrite) |
644 | 645 |
645 if not partial: | 646 if not partial: |
646 repo.setparents(fp1, fp2) | 647 repo.setparents(fp1, fp2) |
647 recordupdates(repo, action, branchmerge) | 648 recordupdates(repo, actions, branchmerge) |
648 if not branchmerge: | 649 if not branchmerge: |
649 repo.dirstate.setbranch(p2.branch()) | 650 repo.dirstate.setbranch(p2.branch()) |
650 finally: | 651 finally: |
651 wlock.release() | 652 wlock.release() |
652 | 653 |