[PATCH 1 of 2] amend: add noise in extra to avoid creating obsolescence cycle (issue3664)

pierre-yves.david at logilab.fr pierre-yves.david at logilab.fr
Thu Oct 18 11:03:05 CDT 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1350575482 -7200
# Node ID 122ab0793ce25a8ada0895fca25d05dbde7326a3
# Parent  a1c4b21fc1b206f5cf386a8d9d5b5882aaa6807f
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)

Obsolescence cycle are bad and should be avoided as much as possible. The
current amend implemented touch changeset meta data as few as possible. This
make is easy for amend to result in the same node than a precursors. We add some
deterministic noise in extra to avoid this. In practice, the hex of the amended
changeset is stored in 'amend-from' extra key.

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1694,10 +1694,12 @@ def amend(ui, repo, commitfunc, old, ext
                 user = opts.get('user') or old.user()
                 date = opts.get('date') or old.date()
             if not message:
                 message = old.description()
 
+            extra['amend-from'] = old.hex()
+
             new = context.memctx(repo,
                                  parents=[base.node(), nullid],
                                  text=message,
                                  files=files,
                                  filectxfn=filectxfn,
diff --git a/tests/test-commit-amend.t b/tests/test-commit-amend.t
--- a/tests/test-commit-amend.t
+++ b/tests/test-commit-amend.t
@@ -18,36 +18,35 @@ Refuse to amend public csets:
   $ hg ci -Am 'base1'
 
 Nothing to amend:
 
   $ hg ci --amend
-  nothing changed
-  [1]
+  saved backup bundle to $TESTTMP/.hg/strip-backup/489edb5b847d-amend-backup.hg (glob)
 
   $ cat >> $HGRCPATH <<EOF
   > [hooks]
   > pretxncommit.foo = sh -c "echo \\"pretxncommit \$HG_NODE\\"; hg id -r \$HG_NODE"
   > EOF
 
 Amending changeset with changes in working dir:
 
   $ echo a >> a
   $ hg ci --amend -m 'amend base1'
-  pretxncommit 9cd25b479c51be2f4ed2c38e7abdf7ce67d8e0dc
-  9cd25b479c51 tip
-  saved backup bundle to $TESTTMP/.hg/strip-backup/489edb5b847d-amend-backup.hg (glob)
+  pretxncommit 375b7c6cee16eaccd8f3fc9de3959e21f54f28f3
+  375b7c6cee16 tip
+  saved backup bundle to $TESTTMP/.hg/strip-backup/70293cd2b10e-amend-backup.hg (glob)
   $ echo 'pretxncommit.foo = ' >> $HGRCPATH
   $ hg diff -c .
-  diff -r ad120869acf0 -r 9cd25b479c51 a
+  diff -r ad120869acf0 -r 375b7c6cee16 a
   --- a/a	Thu Jan 01 00:00:00 1970 +0000
   +++ b/a	Thu Jan 01 00:00:00 1970 +0000
   @@ -1,1 +1,3 @@
    a
   +a
   +a
   $ hg log
-  changeset:   1:9cd25b479c51
+  changeset:   1:375b7c6cee16
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     amend base1
   
@@ -60,48 +59,48 @@ Amending changeset with changes in worki
 Add new file:
 
   $ echo b > b
   $ hg ci --amend -Am 'amend base1 new file'
   adding b
-  saved backup bundle to $TESTTMP/.hg/strip-backup/9cd25b479c51-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/375b7c6cee16-amend-backup.hg (glob)
 
 Remove file that was added in amended commit:
 
   $ hg rm b
   $ hg ci --amend -m 'amend base1 remove new file'
-  saved backup bundle to $TESTTMP/.hg/strip-backup/e2bb3ecffd2f-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/ec38cdce6113-amend-backup.hg (glob)
 
   $ hg cat b
-  b: no such file in rev 664a9b2d60cd
+  b: no such file in rev 134e9d2ba669
   [1]
 
 No changes, just a different message:
 
   $ hg ci -v --amend -m 'no changes, new message'
-  amending changeset 664a9b2d60cd
-  copying changeset 664a9b2d60cd to ad120869acf0
+  amending changeset 134e9d2ba669
+  copying changeset 134e9d2ba669 to ad120869acf0
   a
-  stripping amended changeset 664a9b2d60cd
+  stripping amended changeset 134e9d2ba669
   1 changesets found
-  saved backup bundle to $TESTTMP/.hg/strip-backup/664a9b2d60cd-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/134e9d2ba669-amend-backup.hg (glob)
   1 changesets found
   adding branch
   adding changesets
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  committed changeset 1:ea6e356ff2ad
+  committed changeset 1:c4e7ebf4e23d
   $ hg diff -c .
-  diff -r ad120869acf0 -r ea6e356ff2ad a
+  diff -r ad120869acf0 -r c4e7ebf4e23d a
   --- a/a	Thu Jan 01 00:00:00 1970 +0000
   +++ b/a	Thu Jan 01 00:00:00 1970 +0000
   @@ -1,1 +1,3 @@
    a
   +a
   +a
   $ hg log
-  changeset:   1:ea6e356ff2ad
+  changeset:   1:c4e7ebf4e23d
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     no changes, new message
   
@@ -117,16 +116,16 @@ Disable default date on commit so when -
   $ echo 'commit=' >> $HGRCPATH
 
 Test -u/-d:
 
   $ hg ci --amend -u foo -d '1 0'
-  saved backup bundle to $TESTTMP/.hg/strip-backup/ea6e356ff2ad-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/c4e7ebf4e23d-amend-backup.hg (glob)
   $ echo a >> a
   $ hg ci --amend -u foo -d '1 0'
-  saved backup bundle to $TESTTMP/.hg/strip-backup/377b91ce8b56-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/f713f6a6ab17-amend-backup.hg (glob)
   $ hg log -r .
-  changeset:   1:2c94e4a5756f
+  changeset:   1:5e9454fb7bef
   tag:         tip
   user:        foo
   date:        Thu Jan 01 00:00:01 1970 +0000
   summary:     no changes, new message
   
@@ -137,65 +136,65 @@ Open editor with old commit message if a
   > #!/bin/sh
   > cat $1
   > echo "another precious commit message" > "$1"
   > __EOF__
   $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
-  amending changeset 2c94e4a5756f
-  copying changeset 2c94e4a5756f to ad120869acf0
+  amending changeset 5e9454fb7bef
+  copying changeset 5e9454fb7bef to ad120869acf0
   no changes, new message
   
   
   HG: Enter commit message.  Lines beginning with 'HG:' are removed.
   HG: Leave message empty to abort commit.
   HG: --
   HG: user: foo
   HG: branch 'default'
   HG: changed a
   a
-  stripping amended changeset 2c94e4a5756f
+  stripping amended changeset 5e9454fb7bef
   1 changesets found
-  saved backup bundle to $TESTTMP/.hg/strip-backup/2c94e4a5756f-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/5e9454fb7bef-amend-backup.hg (glob)
   1 changesets found
   adding branch
   adding changesets
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  committed changeset 1:ffb49186f961
+  committed changeset 1:18afb243865c
 
 Same, but with changes in working dir (different code path):
 
   $ echo a >> a
   $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
-  amending changeset ffb49186f961
+  amending changeset 18afb243865c
   a
-  copying changeset a4f8a65b7c6a to ad120869acf0
+  copying changeset a3ab8cb5aca7 to ad120869acf0
   another precious commit message
   
   
   HG: Enter commit message.  Lines beginning with 'HG:' are removed.
   HG: Leave message empty to abort commit.
   HG: --
   HG: user: foo
   HG: branch 'default'
   HG: changed a
   a
-  stripping intermediate changeset a4f8a65b7c6a
-  stripping amended changeset ffb49186f961
+  stripping intermediate changeset a3ab8cb5aca7
+  stripping amended changeset 18afb243865c
   2 changesets found
-  saved backup bundle to $TESTTMP/.hg/strip-backup/ffb49186f961-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/18afb243865c-amend-backup.hg (glob)
   1 changesets found
   adding branch
   adding changesets
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  committed changeset 1:fb6cca43446f
+  committed changeset 1:32576d4c5ba0
 
   $ rm editor.sh
   $ hg log -r .
-  changeset:   1:fb6cca43446f
+  changeset:   1:32576d4c5ba0
   tag:         tip
   user:        foo
   date:        Thu Jan 01 00:00:01 1970 +0000
   summary:     another precious commit message
   
@@ -203,20 +202,20 @@ Same, but with changes in working dir (d
 Moving bookmarks, preserve active bookmark:
 
   $ hg book book1
   $ hg book book2
   $ hg ci --amend -m 'move bookmarks'
-  saved backup bundle to $TESTTMP/.hg/strip-backup/fb6cca43446f-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/32576d4c5ba0-amend-backup.hg (glob)
   $ hg book
-     book1                     1:0cf1c7a51bcf
-   * book2                     1:0cf1c7a51bcf
+     book1                     1:4f7954c0988d
+   * book2                     1:4f7954c0988d
   $ echo a >> a
   $ hg ci --amend -m 'move bookmarks'
-  saved backup bundle to $TESTTMP/.hg/strip-backup/0cf1c7a51bcf-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/4f7954c0988d-amend-backup.hg (glob)
   $ hg book
-     book1                     1:7344472bd951
-   * book2                     1:7344472bd951
+     book1                     1:8b74f9324cbf
+   * book2                     1:8b74f9324cbf
 
   $ echo '[defaults]' >> $HGRCPATH
   $ echo "commit=-d '0 0'" >> $HGRCPATH
 
 Moving branches:
@@ -228,13 +227,13 @@ Moving branches:
   $ hg ci -m 'branch foo'
   $ hg branch default -f
   marked working directory as branch default
   (branches are permanent and global, did you want a bookmark?)
   $ hg ci --amend -m 'back to default'
-  saved backup bundle to $TESTTMP/.hg/strip-backup/1661ca36a2db-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/130b3ecce071-amend-backup.hg (glob)
   $ hg branches
-  default                        2:f24ee5961967
+  default                        2:9ac2de9c0b28
 
 Close branch:
 
   $ hg up -q 0
   $ echo b >> b
@@ -253,13 +252,13 @@ Same thing, different code path:
   $ echo b >> b
   $ hg ci -m 'reopen branch'
   reopening closed branch head 4
   $ echo b >> b
   $ hg ci --amend --close-branch
-  saved backup bundle to $TESTTMP/.hg/strip-backup/5e302dcc12b8-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/2cd74a061250-amend-backup.hg (glob)
   $ hg branches
-  default                        2:f24ee5961967
+  default                        2:9ac2de9c0b28
 
 Refuse to amend merges:
 
   $ hg up -q default
   $ hg merge foo
@@ -277,30 +276,30 @@ Follow copies/renames:
 
   $ hg mv b c
   $ hg ci -m 'b -> c'
   $ hg mv c d
   $ hg ci --amend -m 'b -> d'
-  saved backup bundle to $TESTTMP/.hg/strip-backup/9c207120aa98-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/6d397cf8f8b4-amend-backup.hg (glob)
   $ hg st --rev '.^' --copies d
   A d
     b
   $ hg cp d e
   $ hg ci -m 'e = d'
   $ hg cp e f
   $ hg ci --amend -m 'f = d'
-  saved backup bundle to $TESTTMP/.hg/strip-backup/fda2b3b27b22-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/1dff0fdfdd5c-amend-backup.hg (glob)
   $ hg st --rev '.^' --copies f
   A f
     d
 
   $ mv f f.orig
   $ hg rm -A f
   $ hg ci -m removef
   $ hg cp a f
   $ mv f.orig f
   $ hg ci --amend -m replacef
-  saved backup bundle to $TESTTMP/.hg/strip-backup/20a7413547f9-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/38996f6f2192-amend-backup.hg (glob)
   $ hg st --change . --copies
   $ hg log -r . --template "{file_copies}\n"
   
 
 Move added file (issue3410):
@@ -308,11 +307,11 @@ Move added file (issue3410):
   $ echo g >> g
   $ hg ci -Am g
   adding g
   $ hg mv g h
   $ hg ci --amend
-  saved backup bundle to $TESTTMP/.hg/strip-backup/5daa77a5d616-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/7a2783ffccd0-amend-backup.hg (glob)
   $ hg st --change . --copies h
   A h
   $ hg log -r . --template "{file_copies}\n"
   
 
@@ -328,15 +327,15 @@ Preserve extra dict (issue3430):
   marked working directory as branch a
   (branches are permanent and global, did you want a bookmark?)
   $ echo a >> a
   $ hg ci -ma
   $ hg ci --amend -m "a'"
-  saved backup bundle to $TESTTMP/.hg/strip-backup/167f8e3031df-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/ec57d9745b53-amend-backup.hg (glob)
   $ hg log -r . --template "{branch}\n"
   a
   $ hg ci --amend -m "a''"
-  saved backup bundle to $TESTTMP/.hg/strip-backup/ceac1a44c806-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/a871d6652029-amend-backup.hg (glob)
   $ hg log -r . --template "{branch}\n"
   a
 
 Also preserve other entries in the dict that are in the old commit,
 first graft something so there's an additional entry:
@@ -349,12 +348,13 @@ first graft something so there's an addi
   $ hg up 11
   5 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg graft 12
   grafting revision 12
   $ hg ci --amend -m 'graft amend'
-  saved backup bundle to $TESTTMP/.hg/strip-backup/18a5124daf7a-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/9a61d80193bf-amend-backup.hg (glob)
   $ hg log -r . --debug | grep extra
+  extra:       amend-from=9a61d80193bfc77ffbd78c0b797bfa6911a1856f
   extra:       branch=a
   extra:       source=2647734878ef0236dda712fae9c1651cf694ea8a
 
 Preserve phase
 
@@ -389,30 +389,30 @@ Amend with no files changes
   13
   $ hg ci --amend -m 'babar'
   $ hg id -n
   14
   $ hg log -Gl 3 --style=compact
-  @  14[tip]:11   43df5a5434ad   1970-01-01 00:00 +0000   test
+  @  14[tip]:11   0eee7ea905ca   1970-01-01 00:00 +0000   test
   |    babar
   |
   | o  12:0   2647734878ef   1970-01-01 00:00 +0000   test
   | |    fork
   | |
-  o |  11   7e09f708a0e9   1970-01-01 00:00 +0000   test
+  o |  11   02c38da88c2f   1970-01-01 00:00 +0000   test
   | |    a''
   | |
   $ hg log -Gl 4 --hidden --style=compact
-  @  14[tip]:11   43df5a5434ad   1970-01-01 00:00 +0000   test
+  @  14[tip]:11   0eee7ea905ca   1970-01-01 00:00 +0000   test
   |    babar
   |
-  | x  13:11   175fafee6f44   1970-01-01 00:00 +0000   test
+  | x  13:11   3e7615e4fce4   1970-01-01 00:00 +0000   test
   |/     amend for phase
   |
   | o  12:0   2647734878ef   1970-01-01 00:00 +0000   test
   | |    fork
   | |
-  o |  11   7e09f708a0e9   1970-01-01 00:00 +0000   test
+  o |  11   02c38da88c2f   1970-01-01 00:00 +0000   test
   | |    a''
   | |
 
 Amend with files changes
 
@@ -420,25 +420,36 @@ Amend with files changes
 ride of)
 
   $ echo 'babar' >> a
   $ hg commit --amend
   $ hg log -Gl 6 --hidden --style=compact
-  @  16[tip]:11   31e0a4a1b04a   1970-01-01 00:00 +0000   test
+  @  16[tip]:11   bf9d312126f3   1970-01-01 00:00 +0000   test
   |    babar
   |
-  | x  15   053c696ada75   1970-01-01 00:00 +0000   test
-  | |    temporary amend commit for 43df5a5434ad
+  | x  15   a607aafa01c9   1970-01-01 00:00 +0000   test
+  | |    temporary amend commit for 0eee7ea905ca
   | |
-  | x  14:11   43df5a5434ad   1970-01-01 00:00 +0000   test
+  | x  14:11   0eee7ea905ca   1970-01-01 00:00 +0000   test
   |/     babar
   |
-  | x  13:11   175fafee6f44   1970-01-01 00:00 +0000   test
+  | x  13:11   3e7615e4fce4   1970-01-01 00:00 +0000   test
   |/     amend for phase
   |
   | o  12:0   2647734878ef   1970-01-01 00:00 +0000   test
   | |    fork
   | |
-  o |  11   7e09f708a0e9   1970-01-01 00:00 +0000   test
+  o |  11   02c38da88c2f   1970-01-01 00:00 +0000   test
   | |    a''
   | |
 
 
+Test that amend does not make it easy to create obsoletescence cycle
+---------------------------------------------------------------------
+
+
+  $ hg id -r 14
+  0eee7ea905ca (a)
+  $ hg revert -ar 14
+  reverting a
+  $ hg commit --amend
+  $ hg id
+  8ccab5c7e7fb (a) tip
diff --git a/tests/test-keyword.t b/tests/test-keyword.t
--- a/tests/test-keyword.t
+++ b/tests/test-keyword.t
@@ -507,13 +507,13 @@ amend
   $ hg -q commit -d '14 1' -m 'prepare amend'
 
   $ hg --debug commit --amend -d '15 1' -m 'amend without changes' | grep keywords
   overwriting a expanding keywords
   $ hg -q id
-  577e60613a88
+  50941c542db8
   $ head -1 a
-  expand $Id: a,v 577e60613a88 1970/01/01 00:00:15 test $
+  expand $Id: a,v 50941c542db8 1970/01/01 00:00:15 test $
 
   $ hg -q strip -n tip
 
 Test patch queue repo
 


More information about the Mercurial-devel mailing list