view tests/test-amend-patch.t @ 3661:61fdd25542a6

patch: offer the user a chance to fix the patch if it fails to apply The experience is still not great, but better than purely dropping the changes.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 11 Apr 2018 07:23:34 +0200
parents f018656ca3bf
children e5ba6531503e c464abfd7f9d
line wrap: on
line source

** 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.