Patchwork [4,of,4] histedit: add an experimental base action

login
register
mail settings
Submitter Mateusz Kwapich
Date Nov. 13, 2015, 1:45 a.m.
Message ID <acc298b9a0c810bc0e25.1447379159@mitrandir-mbp1.dhcp.thefacebook.com>
Download mbox | patch
Permalink /patch/11391/
State Superseded
Commit d50ff8f4891f098582a5bfbb713c57dfbf0b208f
Delegated to: Augie Fackler
Headers show

Comments

Mateusz Kwapich - Nov. 13, 2015, 1:45 a.m.
# HG changeset patch
# User Mateusz Kwapich <mitrandir@fb.com>
# Date 1447376221 28800
#      Thu Nov 12 16:57:01 2015 -0800
# Node ID acc298b9a0c810bc0e253749d58fa73cecc7abe3
# Parent  0f16f4e0ea312ecffa03128e55ac65dd38e7909c
histedit: add an experimental base action

This is a first (very simple) version of the histedit base action.
It works well in common usecases like rebasing the whole stack and
spliting the stack.

I don't see any obvious edge cases - but probably there is more that one.
That's why I want to keep it behind experimental config knob for now.
Augie Fackler - Nov. 17, 2015, 6:58 p.m.
On Thu, Nov 12, 2015 at 05:45:59PM -0800, Mateusz Kwapich wrote:
> # HG changeset patch
> # User Mateusz Kwapich <mitrandir@fb.com>
> # Date 1447376221 28800
> #      Thu Nov 12 16:57:01 2015 -0800
> # Node ID acc298b9a0c810bc0e253749d58fa73cecc7abe3
> # Parent  0f16f4e0ea312ecffa03128e55ac65dd38e7909c
> histedit: add an experimental base action
>
> This is a first (very simple) version of the histedit base action.
> It works well in common usecases like rebasing the whole stack and
> spliting the stack.
>
> I don't see any obvious edge cases - but probably there is more that one.
> That's why I want to keep it behind experimental config knob for now.
>
> diff --git a/hgext/histedit.py b/hgext/histedit.py
> --- a/hgext/histedit.py
> +++ b/hgext/histedit.py
> @@ -643,6 +643,23 @@
>              replacements.append((ich, (n,)))
>          return repo[n], replacements
>
> +class base(histeditaction):
> +    def constraints(self):
> +        return set(['forceother'])
> +
> +    def run(self):
> +        if self.repo['.'].node() != self.node:
> +            mergemod.update(self.repo, self.node, False, True, False)
> +            #                                     branchmerge, force, partial)
> +        return self.continueclean()
> +
> +    def continuedirty(self):
> +        abortdirty()
> +
> +    def continueclean(self):
> +        basectx = self.repo['.']
> +        return basectx, []
> +
>  class _multifold(fold):
>      """fold subclass used for when multiple folds happen in a row
>
> @@ -1278,3 +1295,5 @@
>      cmdutil.unfinishedstates.append(
>          ['histedit-state', False, True, _('histedit in progress'),
>           _("use 'hg histedit --continue' or 'hg histedit --abort'")])
> +    if ui.configbool("experimental", "histeditbase"):
> +        actiontable.update({'b': base, 'base': base})
> diff --git a/tests/test-histedit-base.t b/tests/test-histedit-base.t
> new file mode 100644
> --- /dev/null
> +++ b/tests/test-histedit-base.t

I'm -0 on the new test file, but I see why you did it. If nobody else
objects, feel encouraged to keep it.

> @@ -0,0 +1,263 @@
> +  $ . "$TESTDIR/histedit-helpers.sh"
> +
> +  $ cat >> $HGRCPATH <<EOF
> +  > [alias]
> +  > tglog = log -G --template "{rev}:{node}:{phase} '{desc}'\n"
> +  > [extensions]
> +  > histedit=
> +  > [experimental]
> +  > histeditbase=True
> +  > EOF

also should have a test that shows that base is rejected with this knob off

> +
> +Create repo a:
> +
> +  $ hg init a
> +  $ cd a
> +  $ hg unbundle "$TESTDIR/bundles/rebase.hg"
> +  adding changesets
> +  adding manifests
> +  adding file changes
> +  added 8 changesets with 7 changes to 7 files (+2 heads)
> +  (run 'hg heads' to see heads, 'hg merge' to merge)
> +  $ hg up tip
> +  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +
> +  $ hg tglog
> +  @  7:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
> +  |
> +  | o  6:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
> +  |/|
> +  o |  5:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
> +  | |
> +  | o  4:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
> +  |/
> +  | o  3:32af7686d403cf45b5d95f2d70cebea587ac806a:draft 'D'
> +  | |
> +  | o  2:5fddd98957c8a54a4d436dfe1da9d87f21a1b97b:draft 'C'
> +  | |
> +  | o  1:42ccdea3bb16d28e1848c95fe2e44c000f3f21b1:draft 'B'
> +  |/
> +  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
> +
> +
> +
> +Go to D
> +  $ hg update 3
> +  3 files updated, 0 files merged, 2 files removed, 0 files unresolved
> +edit the history to rebase B onto H
> +
> +
> +Rebase B onto H
> +  $ hg histedit 1 --commands - 2>&1 << EOF | fixbundle
> +  > base 02de42196ebe
> +  > pick 42ccdea3bb16 B
> +  > pick 5fddd98957c8 C
> +  > pick 32af7686d403 D
> +  > EOF
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +
> +  $ hg tglog
> +  @  7:0937e82309df47d14176ee15e45dbec5fbdef340:draft 'D'
> +  |
> +  o  6:f778d1cbddac4ab679d9983c9bb92e4c5e09e7fa:draft 'C'
> +  |
> +  o  5:3d41b7cc708545206213a842f96d812d2e73d818:draft 'B'
> +  |
> +  o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
> +  |
> +  | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
> +  |/|
> +  o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
> +  | |
> +  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
> +  |/
> +  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
> +
> +Rebase back and drop something
> +  $ hg histedit 5 --commands - 2>&1 << EOF | fixbundle
> +  > base cd010b8cd998
> +  > pick 3d41b7cc7085 B
> +  > drop f778d1cbddac C
> +  > pick 0937e82309df D
> +  > EOF
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +
> +  $ hg tglog
> +  @  6:476cc3e4168da2d036b141f7f7dcff7f8e3fe846:draft 'D'
> +  |
> +  o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
> +  |
> +  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
> +  | |
> +  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
> +  | |/|
> +  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
> +  |/ /
> +  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
> +  |/
> +  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
> +
> +Split stack
> +  $ hg histedit 5 --commands - 2>&1 << EOF | fixbundle
> +  > base cd010b8cd998
> +  > pick d273e35dcdf2 B
> +  > base cd010b8cd998
> +  > pick 476cc3e4168d D
> +  > EOF
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +
> +  $ hg tglog
> +  @  6:d7a6f907a822c4ce6f15662ae45a42aa46d3818a:draft 'D'
> +  |
> +  | o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
> +  |/
> +  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
> +  | |
> +  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
> +  | |/|
> +  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
> +  |/ /
> +  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
> +  |/
> +  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
> +
> +Abort
> +  $ echo x > B
> +  $ hg add B
> +  $ hg commit -m "X"
> +  $ hg tglog
> +  @  7:591369deedfdcbf57471e894999a70d7f676186d:draft 'X'
> +  |
> +  o  6:d7a6f907a822c4ce6f15662ae45a42aa46d3818a:draft 'D'
> +  |
> +  | o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
> +  |/
> +  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
> +  | |
> +  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
> +  | |/|
> +  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
> +  |/ /
> +  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
> +  |/
> +  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
> +
> +  $ hg histedit 6 --commands - 2>&1 << EOF | fixbundle
> +  > base d273e35dcdf2 B
> +  > drop d7a6f907a822 D
> +  > pick 591369deedfd X
> +  > EOF
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  merging B
> +  warning: conflicts while merging B! (edit, then use 'hg resolve --mark')
> +  Fix up the change and run hg histedit --continue
> +  $ hg histedit --abort | fixbundle
> +  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ hg tglog
> +  @  7:591369deedfdcbf57471e894999a70d7f676186d:draft 'X'
> +  |
> +  o  6:d7a6f907a822c4ce6f15662ae45a42aa46d3818a:draft 'D'
> +  |
> +  | o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
> +  |/
> +  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
> +  | |
> +  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
> +  | |/|
> +  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
> +  |/ /
> +  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
> +  |/
> +  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
> +
> +Continue
> +  $ hg histedit 6 --commands - 2>&1 << EOF | fixbundle
> +  > base d273e35dcdf2 B
> +  > drop d7a6f907a822 D
> +  > pick 591369deedfd X
> +  > EOF
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  merging B
> +  warning: conflicts while merging B! (edit, then use 'hg resolve --mark')
> +  Fix up the change and run hg histedit --continue
> +  $ echo b2 > B
> +  $ hg resolve --mark B
> +  (no more unresolved files)
> +  $ hg histedit --continue | fixbundle
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ hg tglog
> +  @  6:03772da75548bb42a8f1eacd8c91d0717a147fcd:draft 'X'
> +  |
> +  o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
> +  |
> +  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
> +  | |
> +  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
> +  | |/|
> +  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
> +  |/ /
> +  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
> +  |/
> +  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
> +
> +
> +base on a previously picked changeset
> +  $ echo i > i
> +  $ hg add i
> +  $ hg commit -m "I"
> +  $ echo j > j
> +  $ hg add j
> +  $ hg commit -m "J"
> +  $ hg tglog
> +  @  8:e8c55b19d366b335626e805484110d1d5f6f2ea3:draft 'J'
> +  |
> +  o  7:b2f90fd8aa85db5569e3cfc30cd1d7739546368e:draft 'I'
> +  |
> +  o  6:03772da75548bb42a8f1eacd8c91d0717a147fcd:draft 'X'
> +  |
> +  o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
> +  |
> +  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
> +  | |
> +  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
> +  | |/|
> +  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
> +  |/ /
> +  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
> +  |/
> +  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
> +
> +  $ hg histedit 5 --commands - 2>&1 << EOF | fixbundle
> +  > pick d273e35dcdf2 B
> +  > pick 03772da75548 X
> +  > base d273e35dcdf2 B
> +  > pick e8c55b19d366 J
> +  > base d273e35dcdf2 B
> +  > pick b2f90fd8aa85 I
> +  > EOF
> +  abort: may not use "base" with changesets within the edited list
> +  $ hg tglog
> +  @  8:e8c55b19d366b335626e805484110d1d5f6f2ea3:draft 'J'
> +  |
> +  o  7:b2f90fd8aa85db5569e3cfc30cd1d7739546368e:draft 'I'
> +  |
> +  o  6:03772da75548bb42a8f1eacd8c91d0717a147fcd:draft 'X'
> +  |
> +  o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
> +  |
> +  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
> +  | |
> +  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
> +  | |/|
> +  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
> +  |/ /
> +  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
> +  |/
> +  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
> +
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/hgext/histedit.py b/hgext/histedit.py
--- a/hgext/histedit.py
+++ b/hgext/histedit.py
@@ -643,6 +643,23 @@ 
             replacements.append((ich, (n,)))
         return repo[n], replacements
 
+class base(histeditaction):
+    def constraints(self):
+        return set(['forceother'])
+
+    def run(self):
+        if self.repo['.'].node() != self.node:
+            mergemod.update(self.repo, self.node, False, True, False)
+            #                                     branchmerge, force, partial)
+        return self.continueclean()
+
+    def continuedirty(self):
+        abortdirty()
+
+    def continueclean(self):
+        basectx = self.repo['.']
+        return basectx, []
+
 class _multifold(fold):
     """fold subclass used for when multiple folds happen in a row
 
@@ -1278,3 +1295,5 @@ 
     cmdutil.unfinishedstates.append(
         ['histedit-state', False, True, _('histedit in progress'),
          _("use 'hg histedit --continue' or 'hg histedit --abort'")])
+    if ui.configbool("experimental", "histeditbase"):
+        actiontable.update({'b': base, 'base': base})
diff --git a/tests/test-histedit-base.t b/tests/test-histedit-base.t
new file mode 100644
--- /dev/null
+++ b/tests/test-histedit-base.t
@@ -0,0 +1,263 @@ 
+  $ . "$TESTDIR/histedit-helpers.sh"
+
+  $ cat >> $HGRCPATH <<EOF
+  > [alias]
+  > tglog = log -G --template "{rev}:{node}:{phase} '{desc}'\n"
+  > [extensions]
+  > histedit=
+  > [experimental]
+  > histeditbase=True
+  > EOF
+
+Create repo a:
+
+  $ hg init a
+  $ cd a
+  $ hg unbundle "$TESTDIR/bundles/rebase.hg"
+  adding changesets
+  adding manifests
+  adding file changes
+  added 8 changesets with 7 changes to 7 files (+2 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg up tip
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+  $ hg tglog
+  @  7:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
+  |
+  | o  6:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
+  |/|
+  o |  5:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
+  | |
+  | o  4:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
+  |/
+  | o  3:32af7686d403cf45b5d95f2d70cebea587ac806a:draft 'D'
+  | |
+  | o  2:5fddd98957c8a54a4d436dfe1da9d87f21a1b97b:draft 'C'
+  | |
+  | o  1:42ccdea3bb16d28e1848c95fe2e44c000f3f21b1:draft 'B'
+  |/
+  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
+  
+
+
+Go to D
+  $ hg update 3
+  3 files updated, 0 files merged, 2 files removed, 0 files unresolved
+edit the history to rebase B onto H
+
+
+Rebase B onto H
+  $ hg histedit 1 --commands - 2>&1 << EOF | fixbundle
+  > base 02de42196ebe
+  > pick 42ccdea3bb16 B
+  > pick 5fddd98957c8 C
+  > pick 32af7686d403 D
+  > EOF
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+  $ hg tglog
+  @  7:0937e82309df47d14176ee15e45dbec5fbdef340:draft 'D'
+  |
+  o  6:f778d1cbddac4ab679d9983c9bb92e4c5e09e7fa:draft 'C'
+  |
+  o  5:3d41b7cc708545206213a842f96d812d2e73d818:draft 'B'
+  |
+  o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
+  |
+  | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
+  |/|
+  o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
+  | |
+  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
+  |/
+  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
+  
+Rebase back and drop something
+  $ hg histedit 5 --commands - 2>&1 << EOF | fixbundle
+  > base cd010b8cd998
+  > pick 3d41b7cc7085 B
+  > drop f778d1cbddac C
+  > pick 0937e82309df D
+  > EOF
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+  $ hg tglog
+  @  6:476cc3e4168da2d036b141f7f7dcff7f8e3fe846:draft 'D'
+  |
+  o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
+  |
+  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
+  | |
+  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
+  | |/|
+  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
+  |/ /
+  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
+  |/
+  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
+  
+Split stack
+  $ hg histedit 5 --commands - 2>&1 << EOF | fixbundle
+  > base cd010b8cd998
+  > pick d273e35dcdf2 B
+  > base cd010b8cd998
+  > pick 476cc3e4168d D
+  > EOF
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+  $ hg tglog
+  @  6:d7a6f907a822c4ce6f15662ae45a42aa46d3818a:draft 'D'
+  |
+  | o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
+  |/
+  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
+  | |
+  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
+  | |/|
+  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
+  |/ /
+  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
+  |/
+  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
+  
+Abort
+  $ echo x > B
+  $ hg add B
+  $ hg commit -m "X"
+  $ hg tglog
+  @  7:591369deedfdcbf57471e894999a70d7f676186d:draft 'X'
+  |
+  o  6:d7a6f907a822c4ce6f15662ae45a42aa46d3818a:draft 'D'
+  |
+  | o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
+  |/
+  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
+  | |
+  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
+  | |/|
+  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
+  |/ /
+  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
+  |/
+  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
+  
+  $ hg histedit 6 --commands - 2>&1 << EOF | fixbundle
+  > base d273e35dcdf2 B
+  > drop d7a6f907a822 D
+  > pick 591369deedfd X
+  > EOF
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  merging B
+  warning: conflicts while merging B! (edit, then use 'hg resolve --mark')
+  Fix up the change and run hg histedit --continue
+  $ hg histedit --abort | fixbundle
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg tglog
+  @  7:591369deedfdcbf57471e894999a70d7f676186d:draft 'X'
+  |
+  o  6:d7a6f907a822c4ce6f15662ae45a42aa46d3818a:draft 'D'
+  |
+  | o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
+  |/
+  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
+  | |
+  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
+  | |/|
+  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
+  |/ /
+  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
+  |/
+  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
+  
+Continue
+  $ hg histedit 6 --commands - 2>&1 << EOF | fixbundle
+  > base d273e35dcdf2 B
+  > drop d7a6f907a822 D
+  > pick 591369deedfd X
+  > EOF
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  merging B
+  warning: conflicts while merging B! (edit, then use 'hg resolve --mark')
+  Fix up the change and run hg histedit --continue
+  $ echo b2 > B
+  $ hg resolve --mark B
+  (no more unresolved files)
+  $ hg histedit --continue | fixbundle
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg tglog
+  @  6:03772da75548bb42a8f1eacd8c91d0717a147fcd:draft 'X'
+  |
+  o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
+  |
+  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
+  | |
+  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
+  | |/|
+  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
+  |/ /
+  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
+  |/
+  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
+  
+
+base on a previously picked changeset
+  $ echo i > i
+  $ hg add i
+  $ hg commit -m "I"
+  $ echo j > j
+  $ hg add j
+  $ hg commit -m "J"
+  $ hg tglog
+  @  8:e8c55b19d366b335626e805484110d1d5f6f2ea3:draft 'J'
+  |
+  o  7:b2f90fd8aa85db5569e3cfc30cd1d7739546368e:draft 'I'
+  |
+  o  6:03772da75548bb42a8f1eacd8c91d0717a147fcd:draft 'X'
+  |
+  o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
+  |
+  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
+  | |
+  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
+  | |/|
+  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
+  |/ /
+  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
+  |/
+  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
+  
+  $ hg histedit 5 --commands - 2>&1 << EOF | fixbundle
+  > pick d273e35dcdf2 B
+  > pick 03772da75548 X
+  > base d273e35dcdf2 B
+  > pick e8c55b19d366 J
+  > base d273e35dcdf2 B
+  > pick b2f90fd8aa85 I
+  > EOF
+  abort: may not use "base" with changesets within the edited list
+  $ hg tglog
+  @  8:e8c55b19d366b335626e805484110d1d5f6f2ea3:draft 'J'
+  |
+  o  7:b2f90fd8aa85db5569e3cfc30cd1d7739546368e:draft 'I'
+  |
+  o  6:03772da75548bb42a8f1eacd8c91d0717a147fcd:draft 'X'
+  |
+  o  5:d273e35dcdf21a7eb305192ef2e362887cd0a6f8:draft 'B'
+  |
+  | o  4:02de42196ebee42ef284b6780a87cdc96e8eaab6:draft 'H'
+  | |
+  | | o  3:eea13746799a9e0bfd88f29d3c2e9dc9389f524f:draft 'G'
+  | |/|
+  | o |  2:24b6387c8c8cae37178880f3fa95ded3cb1cf785:draft 'F'
+  |/ /
+  | o  1:9520eea781bcca16c1e15acc0ba14335a0e8e5ba:draft 'E'
+  |/
+  o  0:cd010b8cd998f3981a5a8115f94f8da4ab506089:draft 'A'
+