--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-split.t Sat Jun 24 23:03:41 2017 -0700
@@ -0,0 +1,525 @@
+#testcases obsstore-on obsstore-off
+
+ $ cat > $TESTTMP/editor.py <<EOF
+ > #!$PYTHON
+ > import os, sys
+ > path = os.path.join(os.environ['TESTTMP'], 'messages')
+ > messages = open(path).read().split('--\n')
+ > prompt = open(sys.argv[1]).read()
+ > sys.stdout.write(''.join('EDITOR: %s' % l for l in prompt.splitlines(True)))
+ > sys.stdout.flush()
+ > with open(sys.argv[1], 'w') as f:
+ > f.write(messages[0])
+ > with open(path, 'w') as f:
+ > f.write('--\n'.join(messages[1:]))
+ > EOF
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > drawdag=$TESTDIR/drawdag.py
+ > split=
+ > [ui]
+ > interactive=1
+ > [diff]
+ > git=1
+ > unified=0
+ > [alias]
+ > glog=log -G -T '{rev}:{node|short} {desc} {bookmarks}\n'
+ > EOF
+
+#if obsstore-on
+ $ cat >> $HGRCPATH <<EOF
+ > [experimental]
+ > evolution=all
+ > EOF
+#endif
+
+ $ hg init a
+ $ cd a
+
+Nothing to split
+
+ $ hg split
+ nothing to split
+ [1]
+
+ $ hg commit -m empty --config ui.allowemptycommit=1
+ $ hg split
+ abort: cannot split an empty revision
+ [255]
+
+ $ rm -rf .hg
+ $ hg init
+
+Cannot split working directory
+
+ $ hg split -r 'wdir()'
+ abort: cannot split working directory
+ [255]
+
+Generate some content
+
+ $ $TESTDIR/seq.py 1 5 >> a
+ $ hg ci -m a1 -A a -q
+ $ hg bookmark -i r1
+ $ sed 's/1/11/;s/3/33/;s/5/55/' a > b
+ $ mv b a
+ $ hg ci -m a2 -q
+ $ hg bookmark -i r2
+
+Cannot split a public changeset
+
+ $ hg phase --public -r 'all()'
+ $ hg split .
+ abort: cannot split public changeset
+ (see 'hg help phases' for details)
+ [255]
+
+ $ hg phase --draft -f -r 'all()'
+
+Cannot split while working directory is dirty
+
+ $ touch dirty
+ $ hg add dirty
+ $ hg split .
+ abort: uncommitted changes
+ [255]
+ $ hg forget dirty
+ $ rm dirty
+
+Split a head
+
+ $ cp -R . ../b
+ $ cp -R . ../c
+
+ $ hg bookmark r3
+
+ $ hg split 'all()'
+ abort: cannot split multiple revisions
+ [255]
+
+ $ runsplit() {
+ > cat > $TESTTMP/messages <<EOF
+ > split 1
+ > --
+ > split 2
+ > --
+ > split 3
+ > EOF
+ > cat <<EOF | hg split "$@"
+ > y
+ > y
+ > y
+ > y
+ > y
+ > y
+ > EOF
+ > }
+
+ $ HGEDITOR=false runsplit
+ diff --git a/a b/a
+ 1 hunks, 1 lines changed
+ examine changes to 'a'? [Ynesfdaq?] y
+
+ @@ -5,1 +5,1 @@ 4
+ -5
+ +55
+ record this change to 'a'? [Ynesfdaq?] y
+
+ transaction abort!
+ rollback completed
+ abort: edit failed: false exited with status 1
+ [255]
+ $ hg status
+
+ $ HGEDITOR="$PYTHON $TESTTMP/editor.py"
+ $ runsplit
+ diff --git a/a b/a
+ 1 hunks, 1 lines changed
+ examine changes to 'a'? [Ynesfdaq?] y
+
+ @@ -5,1 +5,1 @@ 4
+ -5
+ +55
+ record this change to 'a'? [Ynesfdaq?] y
+
+ EDITOR: HG: Splitting 1df0d5c5a3ab. Write commit message for the first split changeset.
+ EDITOR: a2
+ EDITOR:
+ EDITOR:
+ EDITOR: HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ EDITOR: HG: Leave message empty to abort commit.
+ EDITOR: HG: --
+ EDITOR: HG: user: test
+ EDITOR: HG: branch 'default'
+ EDITOR: HG: changed a
+ created new head
+ diff --git a/a b/a
+ 1 hunks, 1 lines changed
+ examine changes to 'a'? [Ynesfdaq?] y
+
+ @@ -3,1 +3,1 @@ 2
+ -3
+ +33
+ record this change to 'a'? [Ynesfdaq?] y
+
+ EDITOR: HG: Splitting 1df0d5c5a3ab. So far it has been split into:
+ EDITOR: HG: - e704349bd21b: split 1
+ EDITOR: HG: Write commit message for the next split changeset.
+ EDITOR: a2
+ EDITOR:
+ EDITOR:
+ EDITOR: HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ EDITOR: HG: Leave message empty to abort commit.
+ EDITOR: HG: --
+ EDITOR: HG: user: test
+ EDITOR: HG: branch 'default'
+ EDITOR: HG: changed a
+ diff --git a/a b/a
+ 1 hunks, 1 lines changed
+ examine changes to 'a'? [Ynesfdaq?] y
+
+ @@ -1,1 +1,1 @@
+ -1
+ +11
+ record this change to 'a'? [Ynesfdaq?] y
+
+ EDITOR: HG: Splitting 1df0d5c5a3ab. So far it has been split into:
+ EDITOR: HG: - e704349bd21b: split 1
+ EDITOR: HG: - a09ad58faae3: split 2
+ EDITOR: HG: Write commit message for the next split changeset.
+ EDITOR: a2
+ EDITOR:
+ EDITOR:
+ EDITOR: HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ EDITOR: HG: Leave message empty to abort commit.
+ EDITOR: HG: --
+ EDITOR: HG: user: test
+ EDITOR: HG: branch 'default'
+ EDITOR: HG: changed a
+ saved backup bundle to $TESTTMP/a/.hg/strip-backup/1df0d5c5a3ab-8341b760-split.hg (glob) (obsstore-off !)
+
+#if obsstore-off
+ $ hg bookmark
+ r1 0:a61bcde8c529
+ r2 3:00eebaf8d2e2
+ * r3 3:00eebaf8d2e2
+ $ hg glog -p
+ @ 3:00eebaf8d2e2 split 3 r2 r3
+ | diff --git a/a b/a
+ | --- a/a
+ | +++ b/a
+ | @@ -1,1 +1,1 @@
+ | -1
+ | +11
+ |
+ o 2:a09ad58faae3 split 2
+ | diff --git a/a b/a
+ | --- a/a
+ | +++ b/a
+ | @@ -3,1 +3,1 @@
+ | -3
+ | +33
+ |
+ o 1:e704349bd21b split 1
+ | diff --git a/a b/a
+ | --- a/a
+ | +++ b/a
+ | @@ -5,1 +5,1 @@
+ | -5
+ | +55
+ |
+ o 0:a61bcde8c529 a1 r1
+ diff --git a/a b/a
+ new file mode 100644
+ --- /dev/null
+ +++ b/a
+ @@ -0,0 +1,5 @@
+ +1
+ +2
+ +3
+ +4
+ +5
+
+#else
+ $ hg bookmark
+ r1 0:a61bcde8c529
+ r2 4:00eebaf8d2e2
+ * r3 4:00eebaf8d2e2
+ $ hg glog
+ @ 4:00eebaf8d2e2 split 3 r2 r3
+ |
+ o 3:a09ad58faae3 split 2
+ |
+ o 2:e704349bd21b split 1
+ |
+ o 0:a61bcde8c529 a1 r1
+
+#endif
+
+Split a head while working parent is not that head
+
+ $ cd $TESTTMP/b
+
+ $ hg up 0 -q
+ $ hg bookmark r3
+
+ $ runsplit tip >/dev/null
+
+#if obsstore-off
+ $ hg bookmark
+ r1 0:a61bcde8c529
+ r2 3:00eebaf8d2e2
+ * r3 0:a61bcde8c529
+ $ hg glog
+ o 3:00eebaf8d2e2 split 3 r2
+ |
+ o 2:a09ad58faae3 split 2
+ |
+ o 1:e704349bd21b split 1
+ |
+ @ 0:a61bcde8c529 a1 r1 r3
+
+#else
+ $ hg bookmark
+ r1 0:a61bcde8c529
+ r2 4:00eebaf8d2e2
+ * r3 0:a61bcde8c529
+ $ hg glog
+ o 4:00eebaf8d2e2 split 3 r2
+ |
+ o 3:a09ad58faae3 split 2
+ |
+ o 2:e704349bd21b split 1
+ |
+ @ 0:a61bcde8c529 a1 r1 r3
+
+#endif
+
+Split a non-head
+
+ $ cd $TESTTMP/c
+ $ echo d > d
+ $ hg ci -m d1 -A d
+ $ hg bookmark -i d1
+ $ echo 2 >> d
+ $ hg ci -m d2
+ $ echo 3 >> d
+ $ hg ci -m d3
+ $ hg bookmark -i d3
+ $ hg up '.^' -q
+ $ hg bookmark d2
+ $ cp -R . ../d
+
+ $ runsplit -r 1 | grep rebasing
+ rebasing 2:b5c5ea414030 "d1" (d1)
+ rebasing 3:f4a0a8d004cc "d2" (d2)
+ rebasing 4:777940761eba "d3" (d3)
+#if obsstore-off
+ $ hg bookmark
+ d1 4:c4b449ef030e
+ * d2 5:c9dd00ab36a3
+ d3 6:19f476bc865c
+ r1 0:a61bcde8c529
+ r2 3:00eebaf8d2e2
+ $ hg glog -p
+ o 6:19f476bc865c d3 d3
+ | diff --git a/d b/d
+ | --- a/d
+ | +++ b/d
+ | @@ -2,0 +3,1 @@
+ | +3
+ |
+ @ 5:c9dd00ab36a3 d2 d2
+ | diff --git a/d b/d
+ | --- a/d
+ | +++ b/d
+ | @@ -1,0 +2,1 @@
+ | +2
+ |
+ o 4:c4b449ef030e d1 d1
+ | diff --git a/d b/d
+ | new file mode 100644
+ | --- /dev/null
+ | +++ b/d
+ | @@ -0,0 +1,1 @@
+ | +d
+ |
+ o 3:00eebaf8d2e2 split 3 r2
+ | diff --git a/a b/a
+ | --- a/a
+ | +++ b/a
+ | @@ -1,1 +1,1 @@
+ | -1
+ | +11
+ |
+ o 2:a09ad58faae3 split 2
+ | diff --git a/a b/a
+ | --- a/a
+ | +++ b/a
+ | @@ -3,1 +3,1 @@
+ | -3
+ | +33
+ |
+ o 1:e704349bd21b split 1
+ | diff --git a/a b/a
+ | --- a/a
+ | +++ b/a
+ | @@ -5,1 +5,1 @@
+ | -5
+ | +55
+ |
+ o 0:a61bcde8c529 a1 r1
+ diff --git a/a b/a
+ new file mode 100644
+ --- /dev/null
+ +++ b/a
+ @@ -0,0 +1,5 @@
+ +1
+ +2
+ +3
+ +4
+ +5
+
+#else
+ $ hg bookmark
+ d1 8:c4b449ef030e
+ * d2 9:c9dd00ab36a3
+ d3 10:19f476bc865c
+ r1 0:a61bcde8c529
+ r2 7:00eebaf8d2e2
+ $ hg glog
+ o 10:19f476bc865c d3 d3
+ |
+ @ 9:c9dd00ab36a3 d2 d2
+ |
+ o 8:c4b449ef030e d1 d1
+ |
+ o 7:00eebaf8d2e2 split 3 r2
+ |
+ o 6:a09ad58faae3 split 2
+ |
+ o 5:e704349bd21b split 1
+ |
+ o 0:a61bcde8c529 a1 r1
+
+#endif
+
+Split a non-head without rebase
+
+ $ cd $TESTTMP/d
+#if obsstore-off
+ $ runsplit -r 1 --no-rebase
+ abort: cannot split changeset with children without rebase
+ [255]
+#else
+ $ runsplit -r 1 --no-rebase >/dev/null
+ $ hg bookmark
+ d1 2:b5c5ea414030
+ * d2 3:f4a0a8d004cc
+ d3 4:777940761eba
+ r1 0:a61bcde8c529
+ r2 7:00eebaf8d2e2
+
+ $ hg glog
+ o 7:00eebaf8d2e2 split 3 r2
+ |
+ o 6:a09ad58faae3 split 2
+ |
+ o 5:e704349bd21b split 1
+ |
+ | o 4:777940761eba d3 d3
+ | |
+ | @ 3:f4a0a8d004cc d2 d2
+ | |
+ | o 2:b5c5ea414030 d1 d1
+ | |
+ | x 1:1df0d5c5a3ab a2
+ |/
+ o 0:a61bcde8c529 a1 r1
+
+#endif
+
+Split a non-head with obsoleted descendants
+
+#if obsstore-on
+ $ hg init $TESTTMP/e
+ $ cd $TESTTMP/e
+ $ hg debugdrawdag <<'EOS'
+ > H I J
+ > | | |
+ > F G1 G2 # amend: G1 -> G2
+ > | | / # prune: F
+ > C D E
+ > \|/
+ > B
+ > |
+ > A
+ > EOS
+ $ eval `hg tags -T '{tag}={node}\n'`
+ $ rm .hg/localtags
+ $ hg split $B --config experimental.evolution=createmarkers
+ abort: split would leave orphaned changesets behind
+ [255]
+ $ cat > $TESTTMP/messages <<EOF
+ > Split B
+ > EOF
+ $ cat <<EOF | hg split $B
+ > y
+ > y
+ > EOF
+ diff --git a/B b/B
+ new file mode 100644
+ examine changes to 'B'? [Ynesfdaq?] y
+
+ @@ -0,0 +1,1 @@
+ +B
+ \ No newline at end of file
+ record this change to 'B'? [Ynesfdaq?] y
+
+ EDITOR: HG: Splitting 112478962961. Write commit message for the first split changeset.
+ EDITOR: B
+ EDITOR:
+ EDITOR:
+ EDITOR: HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ EDITOR: HG: Leave message empty to abort commit.
+ EDITOR: HG: --
+ EDITOR: HG: user: test
+ EDITOR: HG: branch 'default'
+ EDITOR: HG: added B
+ created new head
+ rebasing 2:26805aba1e60 "C"
+ rebasing 3:be0ef73c17ad "D"
+ rebasing 4:49cb92066bfd "E"
+ rebasing 7:97a6268cc7ef "G2"
+ rebasing 10:e2f1e425c0db "J"
+ $ hg glog -r 'sort(all(), topo)'
+ o 16:556c085f8b52 J
+ |
+ o 15:8761f6c9123f G2
+ |
+ o 14:a7aeffe59b65 E
+ |
+ | o 13:e1e914ede9ab D
+ |/
+ | o 12:01947e9b98aa C
+ |/
+ o 11:0947baa74d47 Split B
+ |
+ | o 9:88ede1d5ee13 I
+ | |
+ | x 6:af8cbf225b7b G1
+ | |
+ | x 3:be0ef73c17ad D
+ | |
+ | | o 8:74863e5b5074 H
+ | | |
+ | | x 5:ee481a2a1e69 F
+ | | |
+ | | x 2:26805aba1e60 C
+ | |/
+ | x 1:112478962961 B
+ |/
+ o 0:426bada5c675 A
+
+#endif