D3754: graft: introduce --abort flag to abort interrupted graft

yuja (Yuya Nishihara) phabricator at mercurial-scm.org
Sat Jun 16 10:04:25 EDT 2018


yuja added a comment.


  > +def _abortgraft(ui, repo, graftstate):
  >  +    """abort the interrupted graft and rollbacks to the state before interrupted
  >  +    graft"""
  >  +    if not graftstate.exists():
  >  +        raise error.Abort(_("no interrupted graft to abort"))
  >  +    statedata = _readgraftstate(repo, graftstate)
  >  +    startnode = statedata.get('startnode')
  >  +    if not startnode:
  >  +        # and old graft state which does not have all the data required to abort
  >  +        # the graft
  >  +        raise error.Abort(_("cannot abort using an old graftstate"))
  >  +    newnodes = statedata.get('newnodes')
  >  +    hg.updaterepo(repo, startnode, True)
  >  +    if newnodes:
  
  It's probably better to not updating to the startnode if we can't strip
  grafted revisions.
  
  > +        newnodes = [repo[r].rev() for r in newnodes]
  >  +
  >  +        # checking that none of the newnodes turned public or is public
  >  +        immutable = [c for c in newnodes if not repo[c].mutable()]
  >  +        if immutable:
  >  +            repo.ui.warn(_("cannot clean up public changesets %s\n")
  >  +                         % ','.join(bytes(repo[r]) for r in immutable),
  >  +                         hint=_("see 'hg help phases' for details"))
  >  +
  >  +        # checking that no new nodes are created on top of grafted revs
  >  +        desc = set(repo.changelog.descendants(newnodes))
  >  +        if desc - set(newnodes):
  >  +            repo.ui.warn(_("new changesets detected on destination "
  >  +                           "branch, can't strip\n"))
  >  +
  >  +        with repo.wlock(), repo.lock():
  >  +            # stripping the new nodes created
  >  +            strippoints = [c.node() for c in repo.set("roots(%ld)", newnodes)]
  >  +            repair.strip(repo.ui, repo, strippoints, False)
  >  +
  >  +    ui.write(_("graft aborted\nworking directory is now at %s\n")
  >  +             % repo[startnode].hex()[:12])
  >  +    graftstate.delete()
  >  +    return 0
  
  This looks quite similar to rebase.abort(). Can we factor out a common part?
  Maybe it's time to add a new module for rebase/graft thingy.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D3754

To: pulkit, #hg-reviewers
Cc: yuja, mercurial-devel


More information about the Mercurial-devel mailing list