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)