comparison hgext/rebase.py @ 15917:e66084ef8449

rebase: fix phases movement Rebase now try to keep the phases of source changesets.
author Alain Leufroy <alain.leufroyATgmailMYDOTcom>
date Tue, 17 Jan 2012 09:12:14 +0100
parents 7d28d6a67dd3
children 4b088ae9d47a
comparison
equal deleted inserted replaced
15916:c96148346af8 15917:e66084ef8449
13 For more information: 13 For more information:
14 http://mercurial.selenic.com/wiki/RebaseExtension 14 http://mercurial.selenic.com/wiki/RebaseExtension
15 ''' 15 '''
16 16
17 from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks 17 from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks
18 from mercurial import extensions, patch, scmutil 18 from mercurial import extensions, patch, scmutil, phases
19 from mercurial.commands import templateopts 19 from mercurial.commands import templateopts
20 from mercurial.node import nullrev 20 from mercurial.node import nullrev
21 from mercurial.lock import release 21 from mercurial.lock import release
22 from mercurial.i18n import _ 22 from mercurial.i18n import _
23 import os, errno 23 import os, errno
370 extrafn(ctx, extra) 370 extrafn(ctx, extra)
371 # Commit might fail if unresolved files exist 371 # Commit might fail if unresolved files exist
372 newrev = repo.commit(text=commitmsg, user=ctx.user(), 372 newrev = repo.commit(text=commitmsg, user=ctx.user(),
373 date=ctx.date(), extra=extra, editor=editor) 373 date=ctx.date(), extra=extra, editor=editor)
374 repo.dirstate.setbranch(repo[newrev].branch()) 374 repo.dirstate.setbranch(repo[newrev].branch())
375 targetphase = max(ctx.phase(), phases.draft)
376 # retractboundary doesn't overwrite upper phase inherited from parent
377 newnode = repo[newrev].node()
378 phases.retractboundary(repo, targetphase, [newnode])
375 return newrev 379 return newrev
376 except util.Abort: 380 except util.Abort:
377 # Invalidate the previous setparents 381 # Invalidate the previous setparents
378 repo.dirstate.invalidate() 382 repo.dirstate.invalidate()
379 raise 383 raise
550 raise 554 raise
551 raise util.Abort(_('no rebase in progress')) 555 raise util.Abort(_('no rebase in progress'))
552 556
553 def abort(repo, originalwd, target, state): 557 def abort(repo, originalwd, target, state):
554 'Restore the repository to its original state' 558 'Restore the repository to its original state'
555 if set(repo.changelog.descendants(target)) - set(state.values()): 559 descendants = repo.changelog.descendants
560 ispublic = lambda r: repo._phaserev[r] == phases.public
561 if filter(ispublic, descendants(target)):
562 repo.ui.warn(_("warning: immutable rebased changeset detected, "
563 "can't abort\n"))
564 return -1
565 elif set(descendants(target)) - set(state.values()):
556 repo.ui.warn(_("warning: new changesets detected on target branch, " 566 repo.ui.warn(_("warning: new changesets detected on target branch, "
557 "can't abort\n")) 567 "can't abort\n"))
558 return -1 568 return -1
559 else: 569 else:
560 # Strip from the first rebased revision 570 # Strip from the first rebased revision