[PATCH] histedit: make --keep work more like graft and use default phase for copies

Augie Fackler raf at durin42.com
Fri Nov 18 20:44:05 EST 2016


On Fri, Nov 18, 2016 at 05:16:06PM +0100, Mads Kiilerich wrote:
> # HG changeset patch
> # User Mads Kiilerich <madski at unity3d.com>
> # Date 1479485469 -3600
> #      Fri Nov 18 17:11:09 2016 +0100
> # Node ID 19ad769b648182e92a49015d85389fe2a8303c18
> # Parent  1156ec81f70907ff843ca30bb81b4ef59b9b7068
> histedit: make --keep work more like graft and use default phase for copies

queued, thanks

>
> diff --git a/hgext/histedit.py b/hgext/histedit.py
> --- a/hgext/histedit.py
> +++ b/hgext/histedit.py
> @@ -91,7 +91,8 @@ ones) until after it has completed all t
>  probably perform several strip operations when it's done. For the above example,
>  it had to run strip twice. Strip can be slow depending on a variety of factors,
>  so you might need to be a little patient. You can choose to keep the original
> -revisions by passing the ``--keep`` flag.
> +revisions by passing the ``--keep`` flag. This will work more like graft and
> +not preserve/copy the original phase.
>
>  The ``edit`` operation will drop you back to a command prompt,
>  allowing you to edit files freely, or even use ``hg record`` to commit
> @@ -466,7 +467,7 @@ class histeditaction(object):
>          rulectx = repo[self.node]
>
>          editor = self.commiteditor()
> -        commit = commitfuncfor(repo, rulectx)
> +        commit = commitfuncfor(repo, rulectx, self.state.keep)
>
>          commit(text=rulectx.description(), user=rulectx.user(),
>                 date=rulectx.date(), extra=rulectx.extra(), editor=editor)
> @@ -489,7 +490,7 @@ class histeditaction(object):
>              return ctx, []
>          return ctx, [(self.node, (ctx.node(),))]
>
> -def commitfuncfor(repo, src):
> +def commitfuncfor(repo, src, keep):
>      """Build a commit function for the replacement of <src>
>
>      This function ensure we apply the same treatment to all changesets.
> @@ -503,8 +504,9 @@ def commitfuncfor(repo, src):
>      def commitfunc(**kwargs):
>          phasebackup = repo.ui.backupconfig('phases', 'new-commit')
>          try:
> -            repo.ui.setconfig('phases', 'new-commit', phasemin,
> -                              'histedit')
> +            if not keep:
> +                repo.ui.setconfig('phases', 'new-commit', phasemin,
> +                                  'histedit')
>              extra = kwargs.get('extra', {}).copy()
>              extra['histedit_source'] = src.hex()
>              kwargs['extra'] = extra
> @@ -531,7 +533,7 @@ def applychanges(ui, repo, ctx, opts):
>              repo.ui.setconfig('ui', 'forcemerge', '', 'histedit')
>      return stats
>
> -def collapse(repo, first, last, commitopts, skipprompt=False):
> +def collapse(repo, first, last, commitopts, skipprompt=False, keep=False):
>      """collapse the set of revisions from first to last as new one.
>
>      Expected commit options are:
> @@ -545,7 +547,7 @@ def collapse(repo, first, last, commitop
>      if not ctxs:
>          return None
>      for c in ctxs:
> -        if not c.mutable():
> +        if not c.mutable() and not keep:
>              raise error.ParseError(
>                  _("cannot fold into public change %s") % node.short(c.node()))
>      base = first.parents()[0]
> @@ -669,16 +671,15 @@ class fold(histeditaction):
>              return
>          else:
>              c = repo[prev.node]
> -        if not c.mutable():
> +        if not c.mutable() and not self.state.keep:
>              raise error.ParseError(
>                  _("cannot fold into public change %s") % node.short(c.node()))
>
> -
>      def continuedirty(self):
>          repo = self.repo
>          rulectx = repo[self.node]
>
> -        commit = commitfuncfor(repo, rulectx)
> +        commit = commitfuncfor(repo, rulectx, self.state.keep)
>          commit(text='fold-temp-revision %s' % node.short(self.node),
>                 user=rulectx.user(), date=rulectx.date(),
>                 extra=rulectx.extra())
> @@ -752,9 +753,10 @@ class fold(histeditaction):
>          phasebackup = repo.ui.backupconfig('phases', 'new-commit')
>          try:
>              phasemin = max(ctx.phase(), oldctx.phase())
> -            repo.ui.setconfig('phases', 'new-commit', phasemin, 'histedit')
> +            if not self.state.keep:
> +                repo.ui.setconfig('phases', 'new-commit', phasemin, 'histedit')
>              n = collapse(repo, ctx, repo[newnode], commitopts,
> -                         skipprompt=self.skipprompt())
> +                         skipprompt=self.skipprompt(), keep=self.state.keep)
>          finally:
>              repo.ui.restoreconfig(phasebackup)
>          if n is None:
> diff --git a/tests/test-histedit-edit.t b/tests/test-histedit-edit.t
> --- a/tests/test-histedit-edit.t
> +++ b/tests/test-histedit-edit.t
> @@ -453,6 +453,7 @@ rollback should not work after a histedi
>    $ echo foo >> a
>    $ hg ci -m 'extend a'
>    $ hg phase --public 1
> +
>  Attempting to fold a change into a public change should not work:
>    $ cat > ../edit.sh <<EOF
>    > cat "\$1" | sed s/pick/fold/ > tmp
> @@ -480,3 +481,19 @@ Attempting to fold a change into a publi
>    #  f, fold = use commit, but combine it with the one above
>    #  r, roll = like fold, but discard this commit's description
>    #
> +
> +but it should work more like graft when using --keep
> +
> +  $ HGEDITOR="sh ../edit.sh" hg histedit 2 --keep
> +  saved backup bundle to $TESTTMP/r0/.hg/strip-backup/17b1aa9a4a0b-8d4a5be3-backup.hg (glob)
> +
> +  $ hg log -G -T '{rev} {node|short} {phase} {desc|firstline}'
> +  @  3 311eafe309d8 draft add b
> +  |
> +  | o  2 0012be4a27ea draft extend a
> +  | |
> +  | o  1 18aa70c8ad22 public add b
> +  |/
> +  o  0 0efcea34f18a public a
> +
> +
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list