Mercurial > hg
comparison hgext/rebase.py @ 22905:63e889cc610d
rebase: move duplicatecopies next to merge
This is preparation for removing open-coded rebase/graft operations.
As a side-effect, this exposes proper renames in the working copy when
there are conflicts, which shows up in test-shelve.t.
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 13 Oct 2014 17:55:45 -0500 |
parents | 722117c8e023 |
children | 75d0edb68b41 |
comparison
equal
deleted
inserted
replaced
22904:baa3cfa03a83 | 22905:63e889cc610d |
---|---|
373 repo.ui.debug('resuming interrupted rebase\n') | 373 repo.ui.debug('resuming interrupted rebase\n') |
374 else: | 374 else: |
375 try: | 375 try: |
376 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), | 376 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), |
377 'rebase') | 377 'rebase') |
378 stats = rebasenode(repo, rev, p1, state, collapsef) | 378 stats = rebasenode(repo, rev, p1, state, collapsef, |
379 target) | |
379 if stats and stats[3] > 0: | 380 if stats and stats[3] > 0: |
380 raise error.InterventionRequired( | 381 raise error.InterventionRequired( |
381 _('unresolved conflicts (see hg ' | 382 _('unresolved conflicts (see hg ' |
382 'resolve, then hg rebase --continue)')) | 383 'resolve, then hg rebase --continue)')) |
383 finally: | 384 finally: |
384 ui.setconfig('ui', 'forcemerge', '', 'rebase') | 385 ui.setconfig('ui', 'forcemerge', '', 'rebase') |
385 if collapsef: | |
386 copies.duplicatecopies(repo, rev, target) | |
387 else: | |
388 # If we're not using --collapse, we need to | |
389 # duplicate copies between the revision we're | |
390 # rebasing and its first parent, but *not* | |
391 # duplicate any copies that have already been | |
392 # performed in the destination. | |
393 p1rev = repo[rev].p1().rev() | |
394 copies.duplicatecopies(repo, rev, p1rev, skiprev=target) | |
395 if not collapsef: | 386 if not collapsef: |
396 merging = repo[p2].rev() != nullrev | 387 merging = repo[p2].rev() != nullrev |
397 editform = cmdutil.mergeeditform(merging, 'rebase') | 388 editform = cmdutil.mergeeditform(merging, 'rebase') |
398 editor = cmdutil.getcommiteditor(editform=editform, **opts) | 389 editor = cmdutil.getcommiteditor(editform=editform, **opts) |
399 newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn, | 390 newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn, |
533 except util.Abort: | 524 except util.Abort: |
534 # Invalidate the previous setparents | 525 # Invalidate the previous setparents |
535 repo.dirstate.invalidate() | 526 repo.dirstate.invalidate() |
536 raise | 527 raise |
537 | 528 |
538 def rebasenode(repo, rev, p1, state, collapse): | 529 def rebasenode(repo, rev, p1, state, collapse, target): |
539 'Rebase a single revision' | 530 'Rebase a single revision' |
540 # Merge phase | 531 # Merge phase |
541 # Update to target and merge it with local | 532 # Update to target and merge it with local |
542 if repo['.'].rev() != repo[p1].rev(): | 533 if repo['.'].rev() != repo[p1].rev(): |
543 repo.ui.debug(" update to %d:%s\n" % (repo[p1].rev(), repo[p1])) | 534 repo.ui.debug(" update to %d:%s\n" % (repo[p1].rev(), repo[p1])) |
590 '(rebasenode called wrong)') | 581 '(rebasenode called wrong)') |
591 if base is not None: | 582 if base is not None: |
592 repo.ui.debug(" detach base %d:%s\n" % (repo[base].rev(), repo[base])) | 583 repo.ui.debug(" detach base %d:%s\n" % (repo[base].rev(), repo[base])) |
593 # When collapsing in-place, the parent is the common ancestor, we | 584 # When collapsing in-place, the parent is the common ancestor, we |
594 # have to allow merging with it. | 585 # have to allow merging with it. |
595 return merge.update(repo, rev, True, True, False, base, collapse, | 586 stats = merge.update(repo, rev, True, True, False, base, collapse, |
596 labels=['dest', 'source']) | 587 labels=['dest', 'source']) |
588 if collapse: | |
589 copies.duplicatecopies(repo, rev, target) | |
590 else: | |
591 # If we're not using --collapse, we need to | |
592 # duplicate copies between the revision we're | |
593 # rebasing and its first parent, but *not* | |
594 # duplicate any copies that have already been | |
595 # performed in the destination. | |
596 p1rev = repo[rev].p1().rev() | |
597 copies.duplicatecopies(repo, rev, p1rev, skiprev=target) | |
598 return stats | |
597 | 599 |
598 def nearestrebased(repo, rev, state): | 600 def nearestrebased(repo, rev, state): |
599 """return the nearest ancestors of rev in the rebase result""" | 601 """return the nearest ancestors of rev in the rebase result""" |
600 rebased = [r for r in state if state[r] > nullmerge] | 602 rebased = [r for r in state if state[r] > nullmerge] |
601 candidates = repo.revs('max(%ld and (::%d))', rebased, rev) | 603 candidates = repo.revs('max(%ld and (::%d))', rebased, rev) |