hgext/rebase.py
branchstable
changeset 14884 c0ccd70df52c
parent 14635 217b7d83afc3
child 14897 b9daa5b7a3af
equal deleted inserted replaced
14882:bb2cffe81a94 14884:c0ccd70df52c
    12 
    12 
    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
    17 from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks
    18 from mercurial import extensions, copies, patch
    18 from mercurial import extensions, copies, patch
    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 _
   178 
   178 
   179         # Rebase
   179         # Rebase
   180         if not targetancestors:
   180         if not targetancestors:
   181             targetancestors = set(repo.changelog.ancestors(target))
   181             targetancestors = set(repo.changelog.ancestors(target))
   182             targetancestors.add(target)
   182             targetancestors.add(target)
       
   183 
       
   184         # Keep track of the current bookmarks in order to reset them later
       
   185         currentbookmarks = repo._bookmarks.copy()
   183 
   186 
   184         sortedstate = sorted(state)
   187         sortedstate = sorted(state)
   185         total = len(sortedstate)
   188         total = len(sortedstate)
   186         pos = 0
   189         pos = 0
   187         for rev in sortedstate:
   190         for rev in sortedstate:
   239                                   extrafn=extrafn)
   242                                   extrafn=extrafn)
   240 
   243 
   241         if 'qtip' in repo.tags():
   244         if 'qtip' in repo.tags():
   242             updatemq(repo, state, skipped, **opts)
   245             updatemq(repo, state, skipped, **opts)
   243 
   246 
       
   247         if currentbookmarks:
       
   248             # Nodeids are needed to reset bookmarks
       
   249             nstate = {}
       
   250             for k, v in state.iteritems():
       
   251                 if v != nullmerge:
       
   252                     nstate[repo[k].node()] = repo[v].node()
       
   253 
   244         if not keepf:
   254         if not keepf:
   245             # Remove no more useful revisions
   255             # Remove no more useful revisions
   246             rebased = [rev for rev in state if state[rev] != nullmerge]
   256             rebased = [rev for rev in state if state[rev] != nullmerge]
   247             if rebased:
   257             if rebased:
   248                 if set(repo.changelog.descendants(min(rebased))) - set(state):
   258                 if set(repo.changelog.descendants(min(rebased))) - set(state):
   249                     ui.warn(_("warning: new changesets detected "
   259                     ui.warn(_("warning: new changesets detected "
   250                               "on source branch, not stripping\n"))
   260                               "on source branch, not stripping\n"))
   251                 else:
   261                 else:
   252                     # backup the old csets by default
   262                     # backup the old csets by default
   253                     repair.strip(ui, repo, repo[min(rebased)].node(), "all")
   263                     repair.strip(ui, repo, repo[min(rebased)].node(), "all")
       
   264 
       
   265         if currentbookmarks:
       
   266             updatebookmarks(repo, nstate, currentbookmarks, **opts)
   254 
   267 
   255         clearstatus(repo)
   268         clearstatus(repo)
   256         ui.note(_("rebase completed\n"))
   269         ui.note(_("rebase completed\n"))
   257         if os.path.exists(repo.sjoin('undo')):
   270         if os.path.exists(repo.sjoin('undo')):
   258             util.unlinkpath(repo.sjoin('undo'))
   271             util.unlinkpath(repo.sjoin('undo'))
   398 
   411 
   399         # restore old series to preserve guards
   412         # restore old series to preserve guards
   400         mq.fullseries = original_series
   413         mq.fullseries = original_series
   401         mq.series_dirty = True
   414         mq.series_dirty = True
   402         mq.savedirty()
   415         mq.savedirty()
       
   416 
       
   417 def updatebookmarks(repo, nstate, originalbookmarks, **opts):
       
   418     'Move bookmarks to their correct changesets'
       
   419     current = repo._bookmarkcurrent
       
   420     for k, v in originalbookmarks.iteritems():
       
   421         if v in nstate:
       
   422             if nstate[v] != nullmerge:
       
   423                 # reset the pointer if the bookmark was moved incorrectly
       
   424                 if k != current:
       
   425                     repo._bookmarks[k] = nstate[v]
       
   426 
       
   427     bookmarks.write(repo)
   403 
   428 
   404 def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches,
   429 def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches,
   405                                                                 external):
   430                                                                 external):
   406     'Store the current status to allow recovery'
   431     'Store the current status to allow recovery'
   407     f = repo.opener("rebasestate", "w")
   432     f = repo.opener("rebasestate", "w")