[PATCH 1 of 7] histedit: simplify computation of `newchildren` during --continue
Augie Fackler
raf at durin42.com
Mon Oct 1 13:19:23 CDT 2012
On Sep 27, 2012, at 6:07 PM, Pierre-Yves David <pierre-yves.david at ens-lyon.org> wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
> # Date 1348786765 -7200
> # Node ID b1a3a0b12fcfe273781e8534b06d5dce260b3b93
> # Parent 5c89e7fa5bc20597080494aea43a09903e9e7a6a
> histedit: simplify computation of `newchildren` during --continue
>
> We are now checking for any changesets between the previous `parentctx` and the
> current working directory parent. If the current working directory parent is
> inconsistent, we abort.
>
> This change is useful as it simplify the --continue process, easing upcoming
> changes.
>
> diff --git a/hgext/histedit.py b/hgext/histedit.py
> --- a/hgext/histedit.py
> +++ b/hgext/histedit.py
> @@ -550,21 +550,19 @@
>
> def bootstrapcontinue(ui, repo, parentctx, existing, replacemap, rules,
> tmpnodes, created, replaced, opts):
> - currentparent, wantnull = repo.dirstate.parents()
> - # existing is the list of revisions initially considered by
> - # histedit. Here we use it to list new changesets, descendants
> - # of parentctx without an 'existing' changeset in-between. We
> - # also have to exclude 'existing' changesets which were
> - # previously dropped.
> - descendants = set(c.node() for c in
> - repo.set('(%d::) - %d', parentctx, parentctx))
> - notdropped = set(n for n in existing if n in descendants and
> - (n not in replacemap or replacemap[n] in descendants))
> - # Discover any nodes the user has added in the interim. We can
> - # miss changesets which were dropped and recreated the same.
> - newchildren = list(c.node() for c in repo.set(
> - 'sort(%ln - (%ln or %ln::))', descendants, existing, notdropped))
> action, currentnode = rules.pop(0)
> + # is there any new commit between the expected parent and "."
> + # XXX does not take non linear new change in account (but previous
> + # XXX implementation didn't used them anyway
Perhaps we should abort here if that happens? Does that seem reasonable?
(This case never occurred to me.)
> + newchildren = [c.node() for c in repo.set('(%d::.)', parentctx)]
> + if not newchildren:
> + # `parentctxnode` should match but no result. This means that
> + # currentnode is not a descendant from parentctxnode.
> + msg = _('working directory parent is not a descendant of %s')
> + hint = _('update to proper revision and run "hg histedit '
> + '--continue" again')
> + raise util.Abort(msg % parentctx, hint=hint)
> + newchildren.pop(0) # remove parentctxnode
> if action in ('f', 'fold'):
> tmpnodes.extend(newchildren)
> else:
> 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
> @@ -66,6 +66,19 @@
> abort: Make changes as needed, you may commit or record as needed now.
> When you are finished, run hg histedit --continue to resume.
>
> +Go at a random point and try to continue
> +
> + $ hg id -n
> + 3+
> + $ hg up 0
> + 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
> + $ HGEDITOR='echo foobaz > ' hg histedit --continue
> + abort: working directory parent is not a descendant of 055a42cdd887
> + (update to proper revision and run "hg histedit --continue" again)
> + [255]
> + $ hg up 3
> + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +
> commit, then edit the revision
> $ hg ci -m 'wat'
> created new head
More information about the Mercurial-devel
mailing list