hgext/uncommit.py
changeset 35200 9e339c97fabb
parent 35183 9dadcb99cc17
child 35244 98f97eb20597
equal deleted inserted replaced
35199:80bb15769c73 35200:9e339c97fabb
   210     `hg amend` (e.g. files modified as part of an amend will be
   210     `hg amend` (e.g. files modified as part of an amend will be
   211     marked as modified `hg status`)
   211     marked as modified `hg status`)
   212     """
   212     """
   213 
   213 
   214     unfi = repo.unfiltered()
   214     unfi = repo.unfiltered()
   215 
       
   216     # identify the commit from which to unamend
       
   217     curctx = repo['.']
       
   218 
       
   219     with repo.wlock(), repo.lock(), repo.transaction('unamend'):
   215     with repo.wlock(), repo.lock(), repo.transaction('unamend'):
       
   216 
       
   217         # identify the commit from which to unamend
       
   218         curctx = repo['.']
       
   219 
   220         if not curctx.mutable():
   220         if not curctx.mutable():
   221             raise error.Abort(_('cannot unamend public changesets'))
   221             raise error.Abort(_('cannot unamend public changesets'))
   222 
   222 
   223         # identify the commit to which to unamend
   223         # identify the commit to which to unamend
   224         markers = list(predecessormarkers(curctx))
   224         markers = list(predecessormarkers(curctx))
   233             raise error.Abort(_("cannot unamend a changeset with children"))
   233             raise error.Abort(_("cannot unamend a changeset with children"))
   234 
   234 
   235         # add an extra so that we get a new hash
   235         # add an extra so that we get a new hash
   236         # note: allowing unamend to undo an unamend is an intentional feature
   236         # note: allowing unamend to undo an unamend is an intentional feature
   237         extras = predctx.extra()
   237         extras = predctx.extra()
   238         extras['unamend_source'] = curctx.node()
   238         extras['unamend_source'] = curctx.hex()
   239 
   239 
   240         def filectxfn(repo, ctx_, path):
   240         def filectxfn(repo, ctx_, path):
   241             try:
   241             try:
   242                 return predctx.filectx(path)
   242                 return predctx.filectx(path)
   243             except KeyError:
   243             except KeyError:
   257         overrides = {('phases', 'new-commit'): commitphase}
   257         overrides = {('phases', 'new-commit'): commitphase}
   258         with repo.ui.configoverride(overrides, 'uncommit'):
   258         with repo.ui.configoverride(overrides, 'uncommit'):
   259             newprednode = repo.commitctx(newctx)
   259             newprednode = repo.commitctx(newctx)
   260 
   260 
   261         newpredctx = repo[newprednode]
   261         newpredctx = repo[newprednode]
   262 
       
   263         changedfiles = []
       
   264         wctx = repo[None]
       
   265         wm = wctx.manifest()
       
   266         cm = newpredctx.manifest()
       
   267         dirstate = repo.dirstate
   262         dirstate = repo.dirstate
   268         diff = cm.diff(wm)
       
   269         changedfiles.extend(diff.iterkeys())
       
   270 
   263 
   271         with dirstate.parentchange():
   264         with dirstate.parentchange():
   272             dirstate.setparents(newprednode, node.nullid)
   265             dirstate.setparents(newprednode, node.nullid)
   273             s = repo.status(predctx, curctx)
   266             s = repo.status(predctx, curctx)
   274             _fixdirstate(repo, curctx, newpredctx, s)
   267             _fixdirstate(repo, curctx, newpredctx, s)