hgext/rebase.py
changeset 35319 228916ca12b5
parent 35318 2bac2d836ce0
child 35320 d901a88891fe
equal deleted inserted replaced
35318:2bac2d836ce0 35319:228916ca12b5
   493                         ui.setconfig('ui', 'forcemerge', '', 'rebase')
   493                         ui.setconfig('ui', 'forcemerge', '', 'rebase')
   494                 if not self.collapsef:
   494                 if not self.collapsef:
   495                     merging = p2 != nullrev
   495                     merging = p2 != nullrev
   496                     editform = cmdutil.mergeeditform(merging, 'rebase')
   496                     editform = cmdutil.mergeeditform(merging, 'rebase')
   497                     editor = cmdutil.getcommiteditor(editform=editform, **opts)
   497                     editor = cmdutil.getcommiteditor(editform=editform, **opts)
   498                     newnode = concludenode(repo, rev, p1, p2,
   498                     if self.wctx.isinmemory():
   499                                            extrafn=_makeextrafn(self.extrafns),
   499                         newnode = concludememorynode(repo, rev, p1, p2,
   500                                            editor=editor,
   500                             wctx=self.wctx,
   501                                            keepbranches=self.keepbranchesf,
   501                             extrafn=_makeextrafn(self.extrafns),
   502                                            date=self.date)
   502                             editor=editor,
       
   503                             keepbranches=self.keepbranchesf,
       
   504                             date=self.date)
       
   505                         mergemod.mergestate.clean(repo)
       
   506                     else:
       
   507                         newnode = concludenode(repo, rev, p1, p2,
       
   508                             extrafn=_makeextrafn(self.extrafns),
       
   509                             editor=editor,
       
   510                             keepbranches=self.keepbranchesf,
       
   511                             date=self.date)
       
   512 
   503                     if newnode is None:
   513                     if newnode is None:
   504                         # If it ended up being a no-op commit, then the normal
   514                         # If it ended up being a no-op commit, then the normal
   505                         # merge state clean-up path doesn't happen, so do it
   515                         # merge state clean-up path doesn't happen, so do it
   506                         # here. Fix issue5494
   516                         # here. Fix issue5494
   507                         mergemod.mergestate.clean(repo)
   517                         mergemod.mergestate.clean(repo)
   550             revtoreuse = max(self.state)
   560             revtoreuse = max(self.state)
   551 
   561 
   552             dsguard = None
   562             dsguard = None
   553             if ui.configbool('rebase', 'singletransaction'):
   563             if ui.configbool('rebase', 'singletransaction'):
   554                 dsguard = dirstateguard.dirstateguard(repo, 'rebase')
   564                 dsguard = dirstateguard.dirstateguard(repo, 'rebase')
   555             with util.acceptintervention(dsguard):
   565             if self.inmemory:
   556                 newnode = concludenode(repo, revtoreuse, p1, self.external,
   566                 newnode = concludememorynode(repo, revtoreuse, p1,
   557                                        commitmsg=commitmsg,
   567                     self.external,
   558                                        extrafn=_makeextrafn(self.extrafns),
   568                     commitmsg=commitmsg,
   559                                        editor=editor,
   569                     extrafn=_makeextrafn(self.extrafns),
   560                                        keepbranches=self.keepbranchesf,
   570                     editor=editor,
   561                                        date=self.date)
   571                     keepbranches=self.keepbranchesf,
       
   572                     date=self.date, wctx=self.wctx)
       
   573             else:
       
   574                 with util.acceptintervention(dsguard):
       
   575                     newnode = concludenode(repo, revtoreuse, p1, self.external,
       
   576                         commitmsg=commitmsg,
       
   577                         extrafn=_makeextrafn(self.extrafns),
       
   578                         editor=editor,
       
   579                         keepbranches=self.keepbranchesf,
       
   580                         date=self.date)
   562             if newnode is not None:
   581             if newnode is not None:
   563                 newrev = repo[newnode].rev()
   582                 newrev = repo[newnode].rev()
   564                 for oldrev in self.state.iterkeys():
   583                 for oldrev in self.state.iterkeys():
   565                     self.state[oldrev] = newrev
   584                     self.state[oldrev] = newrev
   566 
   585 
   961         return parents.pop()
   980         return parents.pop()
   962     raise error.Abort(_('unable to collapse on top of %s, there is more '
   981     raise error.Abort(_('unable to collapse on top of %s, there is more '
   963                        'than one external parent: %s') %
   982                        'than one external parent: %s') %
   964                      (max(destancestors),
   983                      (max(destancestors),
   965                       ', '.join(str(p) for p in sorted(parents))))
   984                       ', '.join(str(p) for p in sorted(parents))))
       
   985 
       
   986 def concludememorynode(repo, rev, p1, p2, wctx=None,
       
   987                        commitmsg=None, editor=None, extrafn=None,
       
   988                        keepbranches=False, date=None):
       
   989     '''Commit the wd changes with parents p1 and p2. Reuse commit info from rev
       
   990     but also store useful information in extra.
       
   991     Return node of committed revision.'''
       
   992     ctx = repo[rev]
       
   993     if commitmsg is None:
       
   994         commitmsg = ctx.description()
       
   995     keepbranch = keepbranches and repo[p1].branch() != ctx.branch()
       
   996     extra = {'rebase_source': ctx.hex()}
       
   997     if extrafn:
       
   998         extrafn(ctx, extra)
       
   999 
       
  1000     destphase = max(ctx.phase(), phases.draft)
       
  1001     overrides = {('phases', 'new-commit'): destphase}
       
  1002     with repo.ui.configoverride(overrides, 'rebase'):
       
  1003         if keepbranch:
       
  1004             repo.ui.setconfig('ui', 'allowemptycommit', True)
       
  1005         # Replicates the empty check in ``repo.commit``.
       
  1006         if wctx.isempty() and not repo.ui.configbool('ui', 'allowemptycommit'):
       
  1007             return None
       
  1008 
       
  1009         if date is None:
       
  1010             date = ctx.date()
       
  1011 
       
  1012         # By convention, ``extra['branch']`` (set by extrafn) clobbers
       
  1013         # ``branch`` (used when passing ``--keepbranches``).
       
  1014         branch = repo[p1].branch()
       
  1015         if 'branch' in extra:
       
  1016             branch = extra['branch']
       
  1017 
       
  1018         memctx = wctx.tomemctx(commitmsg, parents=(p1, p2), date=date,
       
  1019             extra=extra, user=ctx.user(), branch=branch, editor=editor)
       
  1020         commitres = repo.commitctx(memctx)
       
  1021         wctx.clean() # Might be reused
       
  1022         return commitres
   966 
  1023 
   967 def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None,
  1024 def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None,
   968                  keepbranches=False, date=None):
  1025                  keepbranches=False, date=None):
   969     '''Commit the wd changes with parents p1 and p2. Reuse commit info from rev
  1026     '''Commit the wd changes with parents p1 and p2. Reuse commit info from rev
   970     but also store useful information in extra.
  1027     but also store useful information in extra.