hgext/rebase.py
changeset 29478 007da66960a8
parent 29477 becc4c6eca42
child 29479 5d16ebe7b14f
equal deleted inserted replaced
29477:becc4c6eca42 29478:007da66960a8
   421                           (desc, repo[self.state[rev]]))
   421                           (desc, repo[self.state[rev]]))
   422 
   422 
   423         ui.progress(_('rebasing'), None)
   423         ui.progress(_('rebasing'), None)
   424         ui.note(_('rebase merging completed\n'))
   424         ui.note(_('rebase merging completed\n'))
   425 
   425 
       
   426     def _finishrebase(self):
       
   427         repo, ui, opts = self.repo, self.ui, self.opts
       
   428         if self.collapsef and not self.keepopen:
       
   429             p1, p2, _base = defineparents(repo, min(self.state),
       
   430                                           self.target, self.state,
       
   431                                           self.targetancestors,
       
   432                                           self.obsoletenotrebased)
       
   433             editopt = opts.get('edit')
       
   434             editform = 'rebase.collapse'
       
   435             if self.collapsemsg:
       
   436                 commitmsg = self.collapsemsg
       
   437             else:
       
   438                 commitmsg = 'Collapsed revision'
       
   439                 for rebased in self.state:
       
   440                     if rebased not in self.skipped and\
       
   441                        self.state[rebased] > nullmerge:
       
   442                         commitmsg += '\n* %s' % repo[rebased].description()
       
   443                 editopt = True
       
   444             editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
       
   445             revtoreuse = self.sortedstate[-1]
       
   446             newnode = concludenode(repo, revtoreuse, p1, self.external,
       
   447                                    commitmsg=commitmsg,
       
   448                                    extrafn=self.extrafn, editor=editor,
       
   449                                    keepbranches=self.keepbranchesf,
       
   450                                    date=self.date)
       
   451             if newnode is None:
       
   452                 newrev = self.target
       
   453             else:
       
   454                 newrev = repo[newnode].rev()
       
   455             for oldrev in self.state.iterkeys():
       
   456                 if self.state[oldrev] > nullmerge:
       
   457                     self.state[oldrev] = newrev
       
   458 
       
   459         if 'qtip' in repo.tags():
       
   460             updatemq(repo, self.state, self.skipped, **opts)
       
   461 
       
   462         if self.currentbookmarks:
       
   463             # Nodeids are needed to reset bookmarks
       
   464             nstate = {}
       
   465             for k, v in self.state.iteritems():
       
   466                 if v > nullmerge:
       
   467                     nstate[repo[k].node()] = repo[v].node()
       
   468                 elif v == revprecursor:
       
   469                     succ = self.obsoletenotrebased[k]
       
   470                     nstate[repo[k].node()] = repo[succ].node()
       
   471             # XXX this is the same as dest.node() for the non-continue path --
       
   472             # this should probably be cleaned up
       
   473             targetnode = repo[self.target].node()
       
   474 
       
   475         # restore original working directory
       
   476         # (we do this before stripping)
       
   477         newwd = self.state.get(self.originalwd, self.originalwd)
       
   478         if newwd == revprecursor:
       
   479             newwd = self.obsoletenotrebased[self.originalwd]
       
   480         elif newwd < 0:
       
   481             # original directory is a parent of rebase set root or ignored
       
   482             newwd = self.originalwd
       
   483         if newwd not in [c.rev() for c in repo[None].parents()]:
       
   484             ui.note(_("update back to initial working directory parent\n"))
       
   485             hg.updaterepo(repo, newwd, False)
       
   486 
       
   487         if not self.keepf:
       
   488             collapsedas = None
       
   489             if self.collapsef:
       
   490                 collapsedas = newnode
       
   491             clearrebased(ui, repo, self.state, self.skipped, collapsedas)
       
   492 
       
   493         with repo.transaction('bookmark') as tr:
       
   494             if self.currentbookmarks:
       
   495                 updatebookmarks(repo, targetnode, nstate,
       
   496                                 self.currentbookmarks, tr)
       
   497                 if self.activebookmark not in repo._bookmarks:
       
   498                     # active bookmark was divergent one and has been deleted
       
   499                     self.activebookmark = None
       
   500         clearstatus(repo)
       
   501         clearcollapsemsg(repo)
       
   502 
       
   503         ui.note(_("rebase completed\n"))
       
   504         util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
       
   505         if self.skipped:
       
   506             skippedlen = len(self.skipped)
       
   507             ui.note(_("%d revisions have been skipped\n") % skippedlen)
       
   508 
       
   509         if (self.activebookmark and
       
   510             repo['.'].node() == repo._bookmarks[self.activebookmark]):
       
   511                 bookmarks.activate(repo, self.activebookmark)
       
   512 
   426 @command('rebase',
   513 @command('rebase',
   427     [('s', 'source', '',
   514     [('s', 'source', '',
   428      _('rebase the specified changeset and descendants'), _('REV')),
   515      _('rebase the specified changeset and descendants'), _('REV')),
   429     ('b', 'base', '',
   516     ('b', 'base', '',
   430      _('rebase everything from branching point of specified changeset'),
   517      _('rebase everything from branching point of specified changeset'),
   586             retcode = rbsrt._preparenewrebase(dest, rebaseset)
   673             retcode = rbsrt._preparenewrebase(dest, rebaseset)
   587             if retcode is not None:
   674             if retcode is not None:
   588                 return retcode
   675                 return retcode
   589 
   676 
   590         rbsrt._performrebase()
   677         rbsrt._performrebase()
   591 
   678         rbsrt._finishrebase()
   592         if rbsrt.collapsef and not rbsrt.keepopen:
       
   593             p1, p2, _base = defineparents(repo, min(rbsrt.state),
       
   594                                           rbsrt.target, rbsrt.state,
       
   595                                           rbsrt.targetancestors,
       
   596                                           rbsrt.obsoletenotrebased)
       
   597             editopt = opts.get('edit')
       
   598             editform = 'rebase.collapse'
       
   599             if rbsrt.collapsemsg:
       
   600                 commitmsg = rbsrt.collapsemsg
       
   601             else:
       
   602                 commitmsg = 'Collapsed revision'
       
   603                 for rebased in rbsrt.state:
       
   604                     if rebased not in rbsrt.skipped and\
       
   605                        rbsrt.state[rebased] > nullmerge:
       
   606                         commitmsg += '\n* %s' % repo[rebased].description()
       
   607                 editopt = True
       
   608             editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
       
   609             revtoreuse = rbsrt.sortedstate[-1]
       
   610             newnode = concludenode(repo, revtoreuse, p1, rbsrt.external,
       
   611                                    commitmsg=commitmsg,
       
   612                                    extrafn=rbsrt.extrafn, editor=editor,
       
   613                                    keepbranches=rbsrt.keepbranchesf,
       
   614                                    date=rbsrt.date)
       
   615             if newnode is None:
       
   616                 newrev = rbsrt.target
       
   617             else:
       
   618                 newrev = repo[newnode].rev()
       
   619             for oldrev in rbsrt.state.iterkeys():
       
   620                 if rbsrt.state[oldrev] > nullmerge:
       
   621                     rbsrt.state[oldrev] = newrev
       
   622 
       
   623         if 'qtip' in repo.tags():
       
   624             updatemq(repo, rbsrt.state, rbsrt.skipped, **opts)
       
   625 
       
   626         if rbsrt.currentbookmarks:
       
   627             # Nodeids are needed to reset bookmarks
       
   628             nstate = {}
       
   629             for k, v in rbsrt.state.iteritems():
       
   630                 if v > nullmerge:
       
   631                     nstate[repo[k].node()] = repo[v].node()
       
   632                 elif v == revprecursor:
       
   633                     succ = rbsrt.obsoletenotrebased[k]
       
   634                     nstate[repo[k].node()] = repo[succ].node()
       
   635             # XXX this is the same as dest.node() for the non-continue path --
       
   636             # this should probably be cleaned up
       
   637             targetnode = repo[rbsrt.target].node()
       
   638 
       
   639         # restore original working directory
       
   640         # (we do this before stripping)
       
   641         newwd = rbsrt.state.get(rbsrt.originalwd, rbsrt.originalwd)
       
   642         if newwd == revprecursor:
       
   643             newwd = rbsrt.obsoletenotrebased[rbsrt.originalwd]
       
   644         elif newwd < 0:
       
   645             # original directory is a parent of rebase set root or ignored
       
   646             newwd = rbsrt.originalwd
       
   647         if newwd not in [c.rev() for c in repo[None].parents()]:
       
   648             ui.note(_("update back to initial working directory parent\n"))
       
   649             hg.updaterepo(repo, newwd, False)
       
   650 
       
   651         if not rbsrt.keepf:
       
   652             collapsedas = None
       
   653             if rbsrt.collapsef:
       
   654                 collapsedas = newnode
       
   655             clearrebased(ui, repo, rbsrt.state, rbsrt.skipped, collapsedas)
       
   656 
       
   657         with repo.transaction('bookmark') as tr:
       
   658             if rbsrt.currentbookmarks:
       
   659                 updatebookmarks(repo, targetnode, nstate,
       
   660                                 rbsrt.currentbookmarks, tr)
       
   661                 if rbsrt.activebookmark not in repo._bookmarks:
       
   662                     # active bookmark was divergent one and has been deleted
       
   663                     rbsrt.activebookmark = None
       
   664         clearstatus(repo)
       
   665         clearcollapsemsg(repo)
       
   666 
       
   667         ui.note(_("rebase completed\n"))
       
   668         util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
       
   669         if rbsrt.skipped:
       
   670             skippedlen = len(rbsrt.skipped)
       
   671             ui.note(_("%d revisions have been skipped\n") % skippedlen)
       
   672 
       
   673         if (rbsrt.activebookmark and
       
   674             repo['.'].node() == repo._bookmarks[rbsrt.activebookmark]):
       
   675                 bookmarks.activate(repo, rbsrt.activebookmark)
       
   676 
       
   677     finally:
   679     finally:
   678         release(lock, wlock)
   680         release(lock, wlock)
   679 
   681 
   680 def _definesets(ui, repo, destf=None, srcf=None, basef=None, revf=[],
   682 def _definesets(ui, repo, destf=None, srcf=None, basef=None, revf=[],
   681                 destspace=None):
   683                 destspace=None):