evolve: create a new commit instead of amending one of the divergents
This patch changes the behavior of evolve command while resolving
content-divergence to create a new commit instead of amending one of the
divergent ones.
In past, I have made this change, backed out this change and now today again I
am doing this change, so let's dive in some history.
Using cmdrewrite.amend() was never a good option as that requires hack to delete
the evolvestate and also gives us less control over things. We can't make the
commit on top of different parents as that of content-divergent ones. Due to all
these, I first made this change to create a new commit instead of amending one.
But, after few days, there was flakiness observed in the tests and turned out
that we need to do some dirstate dance as repo.dirstate.setparents() does not
always fix the dirstate. That flakiness was a blocker for progress at that time
and we decided to switch to amend back so that we can have things working with
some hacks and we can later fix the implementation part.
Now, yesterday while tackling resolving content-divergence of a stack which is
as follows:
C1 C2
| |
B1 B2
| |
A1 A2
\/
base
where, A1-A2, B1-B2, C1-C2 are content-divergent with each other. Now we can
resolve A1-A2 very well because they have the same parent and let's say that
resolution leads to A3.
Now, we want to resolve B1-B2 and make the new resolution commit on top of A3 so
that we can end up something like:
C3
|
B3
|
A3
|
base
however, amending one of the divergent changesets, it's not possible to create a
commit on a different parent like A3 here without some relocation. We should
prevent relocation as that may leads to some conflicts and should change the
parent before committing.
So, looking ahead, we can't move with using amend as still using that we will
need some relocation hacks making code ugly and prone to bad behaviors, bugs.
Let's change back to creating a new commit so that we can move forward in a good
way.
About repo.dirstate.setparents() not setting the dirstate, I have researched
yesterday night about how we can do that and found out that we can use
cmdrewrite._uncommitdirstate() here. Expect upcoming patches to improve the
documentation of that function.
There are lot of test changes because of change in hash but there is no behavior
change. The only behavior change is in test-evolve-abort-contentdiv.t which is
nice because creating a new commit helps us in stripping that while aborting.
We have a lot of testing of content-divergence and no behavior change gives
enough confidence for making this change.
I reviewed the patch carefully to make sure there is no behavior change and I
suggest reviewer to do the same.
** Test for the `--patch` flag for `hg amend` command **
Setup
$ cat >> $HGRCPATH << EOF
> [alias]
> glog = log -GT "{rev}:{node|short} {desc}\n ({bookmarks}) {phase}"
> [diff]
> git = 1
> [extensions]
> EOF
$ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
Reposetup
$ hg init repo
$ cd repo
$ echo foo > a
$ hg ci -Aqm "added a"
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID f7ad4196431346de3c33c52e75374fba45e04313
# Parent 0000000000000000000000000000000000000000
added a
diff --git a/a b/a
new file mode 100644
--- /dev/null
+++ b/a
@@ -0,0 +1,1 @@
+foo
Testing of just changing the diff, not the patch metadata
==========================================================
Testing the normal case
-----------------------
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID f7ad4196431346de3c33c52e75374fba45e04313
> # Parent 0000000000000000000000000000000000000000
> added a
> diff --git a/a b/a
> new file mode 100644
> --- /dev/null
> +++ b/a
> @@ -0,0 +1,1 @@
> +Gello
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
Making sure the amended commit is correct
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID af624b221c0c0bec5d74e2650180dd3eddcb7c42
# Parent 0000000000000000000000000000000000000000
added a
diff --git a/a b/a
new file mode 100644
--- /dev/null
+++ b/a
@@ -0,0 +1,1 @@
+Gello
$ hg glog
@ 1:af624b221c0c added a
() draft
Obsolsence history is fine
$ hg obslog -p -r .
@ af624b221c0c (1) added a
|
x f7ad41964313 (0) added a
rewritten(content) as af624b221c0c using amend by test (Thu Jan 01 00:00:00 1970 +0000)
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,1 @@
-foo
+Gello
Diff and status are good too
$ hg diff
$ hg status
? editor.sh
$ cat a
Gello
Dirstate parents should be correctly set
$ hg parents
changeset: 1:af624b221c0c
tag: tip
parent: -1:000000000000
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: added a
Trying to amend with a wrong patch
----------------------------------
Having context which was is not present
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID c6ba250efbf73e671f2ca24b79db2c178ccbfff9
> # Parent 0000000000000000000000000000000000000000
> added a
> diff --git a/a b/a
> new file mode 100644
> --- /dev/null
> +++ b/a
> @@ -0,0 +1,1 @@
> I was not there before!
> +Gello
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
failed to apply edited patch: bad hunk #1 @@ -0,0 +1,1 @@
(1 0 1 1)
try to fix the patch (yn)? y
abort: patch unchanged
[255]
Having deletions which dont exists
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID af624b221c0c0bec5d74e2650180dd3eddcb7c42
> # Parent 0000000000000000000000000000000000000000
> added a
> diff --git a/a b/a
> new file mode 100644
> --- /dev/null
> +++ b/a
> @@ -0,0 +1,1 @@
> -I was not deleted before!
> +Gello
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
failed to apply edited patch: bad hunk #1 @@ -0,0 +1,1 @@
(1 0 1 1)
try to fix the patch (yn)? y
abort: patch unchanged
[255]
Changing the file mode using amend --patch
------------------------------------------
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID af624b221c0c0bec5d74e2650180dd3eddcb7c42
> # Parent 0000000000000000000000000000000000000000
> added a
> diff --git a/a b/a
> new file mode 100755
> --- /dev/null
> +++ b/a
> @@ -0,0 +1,1 @@
> +Gello
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp --git
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 3a99e4b7ac73da799e20ae56914e3dd5b1a22d4d
# Parent 0000000000000000000000000000000000000000
added a
diff --git a/a b/a
new file mode 100755
--- /dev/null
+++ b/a
@@ -0,0 +1,1 @@
+Gello
Changing the file using amend --patch
-------------------------------------
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 3a99e4b7ac73da799e20ae56914e3dd5b1a22d4d
> # Parent 0000000000000000000000000000000000000000
> added a
> diff --git a/changedfile b/changedfile
> new file mode 100755
> --- /dev/null
> +++ b/changedfile
> @@ -0,0 +1,1 @@
> +Gello
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID fc57c20be380f2878f4db139dad66d6cfb42ec62
# Parent 0000000000000000000000000000000000000000
added a
diff --git a/changedfile b/changedfile
new file mode 100755
--- /dev/null
+++ b/changedfile
@@ -0,0 +1,1 @@
+Gello
$ hg status
? editor.sh
$ ls
changedfile
editor.sh
Handling both deletions and additions
-------------------------------------
$ echo foobar > changedfile
$ hg ci -m "foobar to changedfile"
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 7969f70ffb81c3a6eee2d4f2f7032b694ce05349
# Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
foobar to changedfile
diff --git a/changedfile b/changedfile
--- a/changedfile
+++ b/changedfile
@@ -1,1 +1,1 @@
-Gello
+foobar
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 7969f70ffb81c3a6eee2d4f2f7032b694ce05349
> # Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
> foobar to changedfile
> diff --git a/changedfile b/changedfile
> --- a/changedfile
> +++ b/changedfile
> @@ -1,1 +1,1 @@
> -Gello
> +foobar
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
abort: nothing changed
[255]
Cannot change lines which are deleted
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 7969f70ffb81c3a6eee2d4f2f7032b694ce05349
> # Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
> foobar to changedfile
> diff --git a/changedfile b/changedfile
> --- a/changedfile
> +++ b/changedfile
> @@ -1,1 +1,1 @@
> -Hello
> +foobar
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
patching file changedfile
Hunk #1 FAILED at 0
failed to apply edited patch: patch failed to apply
try to fix the patch (yn)? y
abort: patch unchanged
[255]
Add more addition to the patch
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 7969f70ffb81c3a6eee2d4f2f7032b694ce05349
> # Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
> foobar to changedfile
> diff --git a/changedfile b/changedfile
> --- a/changedfile
> +++ b/changedfile
> @@ -1,1 +1,2 @@
> -Gello
> +foobar
> +babar
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 5d54400acb70b88f07128a1df497ed794b0b177b
# Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
foobar to changedfile
diff --git a/changedfile b/changedfile
--- a/changedfile
+++ b/changedfile
@@ -1,1 +1,2 @@
-Gello
+foobar
+babar
$ cat changedfile
foobar
babar
Introduce files which were not there
------------------------------------
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 5d54400acb70b88f07128a1df497ed794b0b177b
> # Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
> foobar to changedfile
> diff --git a/changedfile b/changedfile
> --- a/changedfile
> +++ b/changedfile
> @@ -1,1 +1,2 @@
> -Gello
> +foobar
> +babar
> diff --git a/a b/a
> new file mode 100755
> --- /dev/null
> +++ b/a
> @@ -0,0 +1,1 @@
> +Gello
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID c3e29c061982c94418ce141d521434d6da76cd46
# Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
foobar to changedfile
diff --git a/a b/a
new file mode 100755
--- /dev/null
+++ b/a
@@ -0,0 +1,1 @@
+Gello
diff --git a/changedfile b/changedfile
--- a/changedfile
+++ b/changedfile
@@ -1,1 +1,2 @@
-Gello
+foobar
+babar
Delete files which were not deleted in the first place
------------------------------------------------------
$ echo Hello >> a
$ hg ci -m "hello to a"
$ hg glog
@ 7:3d62c45a1699 hello to a
| () draft
o 6:c3e29c061982 foobar to changedfile
| () draft
o 3:fc57c20be380 added a
() draft
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 3d62c45a1699b11c7ecae573f013601712f2cc5f
> # Parent c3e29c061982c94418ce141d521434d6da76cd46
> hello to a
> diff --git a/a b/a
> --- a/a
> +++ b/a
> @@ -1,1 +1,2 @@
> Gello
> +Hello
> diff --git a/changedfile b/changedfile
> deleted file mode 100755
> --- a/changedfile
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -foobar
> -babar
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID c9875799c53fb862c0dbaf01500459c9397373a4
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,2 @@
Gello
+Hello
diff --git a/changedfile b/changedfile
deleted file mode 100755
--- a/changedfile
+++ /dev/null
@@ -1,2 +0,0 @@
-foobar
-babar
$ hg status
? editor.sh
$ cat changedfile
cat: changedfile: No such file or directory
[1]
Testing sercret phase preservation during `hg amend --patch`
------------------------------------------------------------
$ hg phase -r . --secret --force
$ hg phase -r .
8: secret
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID c9875799c53fb862c0dbaf01500459c9397373a4
> # Parent c3e29c061982c94418ce141d521434d6da76cd46
> hello to a
> diff --git a/a b/a
> --- a/a
> +++ b/a
> @@ -1,1 +1,3 @@
> Gello
> +Hello
> +mello
> diff --git a/changedfile b/changedfile
> deleted file mode 100755
> --- a/changedfile
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -foobar
> -babar
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 4414485658e719a1f3d5e58bc8b2412385aa1592
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Hello
+mello
diff --git a/changedfile b/changedfile
deleted file mode 100755
--- a/changedfile
+++ /dev/null
@@ -1,2 +0,0 @@
-foobar
-babar
$ hg phase -r .
9: secret
Testing bookmark movement on amend --patch
------------------------------------------
$ hg bookmark foo
$ hg glog
@ 9:4414485658e7 hello to a
| (foo) secret
o 6:c3e29c061982 foobar to changedfile
| () draft
o 3:fc57c20be380 added a
() draft
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 4414485658e719a1f3d5e58bc8b2412385aa1592
> # Parent c3e29c061982c94418ce141d521434d6da76cd46
> hello to a
> diff --git a/a b/a
> --- a/a
> +++ b/a
> @@ -1,1 +1,3 @@
> Gello
> +Hello
> +bello
> diff --git a/changedfile b/changedfile
> deleted file mode 100755
> --- a/changedfile
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -foobar
> -babar
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 36454bda1fdb8e2e4fe07bb084eef378e29cba74
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Hello
+bello
diff --git a/changedfile b/changedfile
deleted file mode 100755
--- a/changedfile
+++ /dev/null
@@ -1,2 +0,0 @@
-foobar
-babar
$ hg glog
@ 10:36454bda1fdb hello to a
| (foo) secret
o 6:c3e29c061982 foobar to changedfile
| () draft
o 3:fc57c20be380 added a
() draft
Trying to amend --patch a public changeset
------------------------------------------
$ hg phase -r . --public
$ hg glog
@ 10:36454bda1fdb hello to a
| (foo) public
o 6:c3e29c061982 foobar to changedfile
| () public
o 3:fc57c20be380 added a
() public
$ HGEDITOR=cat hg amend --patch
abort: cannot amend public changesets: 36454bda1fdb
(see 'hg help phases' for details)
[255]
$ hg phase -r . --draft --force
Trying on a dirty working directory
-------------------------------------
$ echo bar > bar
$ hg add bar
$ HGEDITOR=cat hg amend --patch
abort: uncommitted changes
[255]
$ hg revert --all
forgetting bar
Trying to pass filenames, only mentioned file names should be popped up in
editor and rest should stay in the commit as they were
--------------------------------------------------------------------------
Checking the we pop-up with the files which were mentioned
$ HGEDITOR=cat hg amend --patch changedfile
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 36454bda1fdb8e2e4fe07bb084eef378e29cba74
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/changedfile b/changedfile
deleted file mode 100755
--- a/changedfile
+++ /dev/null
@@ -1,2 +0,0 @@
-foobar
-babar
abort: nothing changed
[255]
$ HGEDITOR=cat hg amend --patch a
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 36454bda1fdb8e2e4fe07bb084eef378e29cba74
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Hello
+bello
abort: nothing changed
[255]
$ HGEDITOR=cat hg amend --patch changedfile a
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 36454bda1fdb8e2e4fe07bb084eef378e29cba74
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Hello
+bello
diff --git a/changedfile b/changedfile
deleted file mode 100755
--- a/changedfile
+++ /dev/null
@@ -1,2 +0,0 @@
-foobar
-babar
abort: patch unchanged
[255]
$ HGEDITOR=cat hg amend --patch doesnotexists
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 36454bda1fdb8e2e4fe07bb084eef378e29cba74
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
abort: nothing changed
[255]
Changing only one file
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 36454bda1fdb8e2e4fe07bb084eef378e29cba74
> # Parent c3e29c061982c94418ce141d521434d6da76cd46
> hello to a
> diff --git a/a b/a
> --- a/a
> +++ b/a
> @@ -1,1 +1,3 @@
> Gello
> +Hello
> +betto
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch a
file 'a' should be amended, rest of them should remain unchanged
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID ea175dcc4ee38c106db157975e006b4092444c65
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Hello
+betto
diff --git a/changedfile b/changedfile
deleted file mode 100755
--- a/changedfile
+++ /dev/null
@@ -1,2 +0,0 @@
-foobar
-babar
$ hg status
? bar
? editor.sh
$ hg diff
Testing again with file 'changedfile'
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID ea175dcc4ee38c106db157975e006b4092444c65
> # Parent c3e29c061982c94418ce141d521434d6da76cd46
> hello to a
> diff --git a/changedfile b/changedfile
> --- a/changedfile
> +++ b/changedfile
> @@ -1,2 +1,1 @@
> foobar
> -babar
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch changedfile
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 0e64d76c3519308c398a28192cb095d48b29aede
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Hello
+betto
diff --git a/changedfile b/changedfile
--- a/changedfile
+++ b/changedfile
@@ -1,2 +1,1 @@
foobar
-babar
$ hg diff
$ hg status
? bar
? editor.sh
Dropping a file from commit by removing related hunks
------------------------------------------------------
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User test
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 0e64d76c3519308c398a28192cb095d48b29aede
> # Parent c3e29c061982c94418ce141d521434d6da76cd46
> hello to a
> diff --git a/a b/a
> --- a/a
> +++ b/a
> @@ -1,1 +1,3 @@
> Gello
> +Kello
> +betto
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 944e9f65fa55fdb2de98577c9d8ab30de0927d8e
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Kello
+betto
The part which was dropped from the patch will not be there in working directory
too
$ hg diff
$ hg status
? bar
? editor.sh
Changing metadata of a patch by editing patch content
======================================================
Changing user
-------------
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User RandomUser
> # Date 0 0
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 944e9f65fa55fdb2de98577c9d8ab30de0927d8e
> # Parent c3e29c061982c94418ce141d521434d6da76cd46
> hello to a
> diff --git a/a b/a
> --- a/a
> +++ b/a
> @@ -1,1 +1,3 @@
> Gello
> +Kello
> +betto
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User RandomUser
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 5ded18a8c333a55da4b0e051162457cfe5d85558
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Kello
+betto
Changing Date
-------------
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User RandomUser
> # Date 123456 1200
> # Thu Jan 01 00:00:00 1970 +0000
> # Node ID 944e9f65fa55fdb2de98577c9d8ab30de0927d8e
> # Parent c3e29c061982c94418ce141d521434d6da76cd46
> hello to a
> diff --git a/a b/a
> --- a/a
> +++ b/a
> @@ -1,1 +1,3 @@
> Gello
> +Kello
> +betto
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User RandomUser
# Date 123456 1200
# Fri Jan 02 09:57:36 1970 -0020
# Node ID e2312ddcd8756665075a60bd05431ddca3c45050
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Kello
+betto
Changing branch
---------------
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User RandomUser
> # Date 123456 1200
> # Thu Jan 01 00:00:00 1970 +0000
> # Branch stable
> # Node ID 944e9f65fa55fdb2de98577c9d8ab30de0927d8e
> # Parent c3e29c061982c94418ce141d521434d6da76cd46
> hello to a
> diff --git a/a b/a
> --- a/a
> +++ b/a
> @@ -1,1 +1,3 @@
> Gello
> +Kello
> +betto
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User RandomUser
# Date 123456 1200
# Fri Jan 02 09:57:36 1970 -0020
# Branch stable
# Node ID ddc61a4058687b2dd4a316f4b5fe7d52a35b702a
# Parent c3e29c061982c94418ce141d521434d6da76cd46
hello to a
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,3 @@
Gello
+Kello
+betto
Changing parent (this should be fun)
------------------------------------
$ hg glog
@ 16:ddc61a405868 hello to a
| (foo) draft
o 6:c3e29c061982 foobar to changedfile
| () public
o 3:fc57c20be380 added a
() public
$ hg log -r .^^ -T '{node}'
fc57c20be380f2878f4db139dad66d6cfb42ec62 (no-eol)
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User RandomUser
> # Date 123456 1200
> # Thu Jan 01 00:00:00 1970 +0000
> # Branch stable
> # Node ID 944e9f65fa55fdb2de98577c9d8ab30de0927d8e
> # Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
> hello to a
> diff --git a/a b/a
> --- a/a
> +++ b/a
> @@ -1,1 +1,3 @@
> Gello
> +Kello
> +betto
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User RandomUser
# Date 123456 1200
# Fri Jan 02 09:57:36 1970 -0020
# Branch stable
# Node ID b763f7cb2302f2efa1275e2a9202655872c9567f
# Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
hello to a
diff --git a/a b/a
new file mode 100755
--- /dev/null
+++ b/a
@@ -0,0 +1,3 @@
+Gello
+Kello
+betto
$ hg glog
@ 17:b763f7cb2302 hello to a
| (foo) draft
| o 6:c3e29c061982 foobar to changedfile
|/ () public
o 3:fc57c20be380 added a
() public
Changing the commit desciption
-------------------------------
$ cat > editor.sh <<EOF
> #!/bin/sh
> cat > \$1 <<ENDOF
> # HG changeset patch
> # User RandomUser
> # Date 123456 1200
> # Thu Jan 01 00:00:00 1970 +0000
> # Branch stable
> # Node ID 944e9f65fa55fdb2de98577c9d8ab30de0927d8e
> # Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
> I am a message which is testing change of message
> diff --git a/a b/a
> new file mode 100755
> --- /dev/null
> +++ b/a
> @@ -0,0 +1,3 @@
> +Gello
> +Kello
> +betto
> ENDOF
> EOF
$ HGEDITOR="sh ./editor.sh" hg amend --patch
$ hg exp
# HG changeset patch
# User RandomUser
# Date 123456 1200
# Fri Jan 02 09:57:36 1970 -0020
# Branch stable
# Node ID f14ecd7121e63915ac93edbad7f60f605e62dd52
# Parent fc57c20be380f2878f4db139dad66d6cfb42ec62
I am a message which is testing change of message
diff --git a/a b/a
new file mode 100755
--- /dev/null
+++ b/a
@@ -0,0 +1,3 @@
+Gello
+Kello
+betto
Changing the Node ID of the patch
---------------------------------
Nothing happens in that case we dont care about the node ID. Look the above 3-4
tests to realize I was testing that too.