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

Pierre-Yves David pierre-yves.david at ens-lyon.org
Thu Oct 18 14:11:04 CDT 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1350587037 -7200
# Node ID 7ec488b147963f80344dd4431f74faac66e68ef0
# 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_source' extra key.

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1696,6 +1696,9 @@
             if not message:
                 message = old.description()
 
+            pureextra = extra.copy()
+            extra['amend_source'] = old.hex()
+
             new = context.memctx(repo,
                                  parents=[base.node(), nullid],
                                  text=message,
@@ -1705,6 +1708,18 @@
                                  date=date,
                                  extra=extra)
             new._text = commitforceeditor(repo, new, [])
+
+            if ((not node)
+                and new._text == old.description()
+                and user == old.user()
+                and date == old.date()
+                and pureextra == old.extra()):
+                # nothing changed. continuing here would create a new node
+                # anyway because of the amend_source noise.
+                #
+                # This not what we expect from amend.
+                return old.node()
+
             ph = repo.ui.config('phases', 'new-commit', phases.draft)
             try:
                 repo.ui.setconfig('phases', 'new-commit', old.phase())
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
@@ -20,8 +20,7 @@
 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]
@@ -32,12 +31,12 @@
 
   $ 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 bfde68d0f33718eeff7a4333169745f1d3140341
+  bfde68d0f337 tip
+  saved backup bundle to $TESTTMP/.hg/strip-backup/f20d963f0483-amend-backup.hg (glob)
   $ echo 'pretxncommit.foo = ' >> $HGRCPATH
   $ hg diff -c .
-  diff -r ad120869acf0 -r 9cd25b479c51 a
+  diff -r ad120869acf0 -r bfde68d0f337 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 @@
@@ -45,7 +44,7 @@
   +a
   +a
   $ hg log
-  changeset:   1:9cd25b479c51
+  changeset:   1:bfde68d0f337
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
@@ -62,36 +61,36 @@
   $ 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/bfde68d0f337-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/0ec8a20326c7-amend-backup.hg (glob)
 
   $ hg cat b
-  b: no such file in rev 664a9b2d60cd
+  b: no such file in rev 399d3918e713
   [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 399d3918e713
+  copying changeset 399d3918e713 to ad120869acf0
   a
-  stripping amended changeset 664a9b2d60cd
+  stripping amended changeset 399d3918e713
   1 changesets found
-  saved backup bundle to $TESTTMP/.hg/strip-backup/664a9b2d60cd-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/399d3918e713-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:902799e2e675
   $ hg diff -c .
-  diff -r ad120869acf0 -r ea6e356ff2ad a
+  diff -r ad120869acf0 -r 902799e2e675 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 @@
@@ -99,7 +98,7 @@
   +a
   +a
   $ hg log
-  changeset:   1:ea6e356ff2ad
+  changeset:   1:902799e2e675
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
@@ -119,12 +118,12 @@
 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/902799e2e675-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/4c1a5863380e-amend-backup.hg (glob)
   $ hg log -r .
-  changeset:   1:2c94e4a5756f
+  changeset:   1:e114ec2d0aa3
   tag:         tip
   user:        foo
   date:        Thu Jan 01 00:00:01 1970 +0000
@@ -139,8 +138,8 @@
   > 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 e114ec2d0aa3
+  copying changeset e114ec2d0aa3 to ad120869acf0
   no changes, new message
   
   
@@ -151,24 +150,24 @@
   HG: branch 'default'
   HG: changed a
   a
-  stripping amended changeset 2c94e4a5756f
+  stripping amended changeset e114ec2d0aa3
   1 changesets found
-  saved backup bundle to $TESTTMP/.hg/strip-backup/2c94e4a5756f-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/e114ec2d0aa3-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:7bfc154bf904
 
 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 7bfc154bf904
   a
-  copying changeset a4f8a65b7c6a to ad120869acf0
+  copying changeset f1f10e4529ab to ad120869acf0
   another precious commit message
   
   
@@ -179,21 +178,21 @@
   HG: branch 'default'
   HG: changed a
   a
-  stripping intermediate changeset a4f8a65b7c6a
-  stripping amended changeset ffb49186f961
+  stripping intermediate changeset f1f10e4529ab
+  stripping amended changeset 7bfc154bf904
   2 changesets found
-  saved backup bundle to $TESTTMP/.hg/strip-backup/ffb49186f961-amend-backup.hg (glob)
+  saved backup bundle to $TESTTMP/.hg/strip-backup/7bfc154bf904-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:856ab03cce31
 
   $ rm editor.sh
   $ hg log -r .
-  changeset:   1:fb6cca43446f
+  changeset:   1:856ab03cce31
   tag:         tip
   user:        foo
   date:        Thu Jan 01 00:00:01 1970 +0000
@@ -205,16 +204,16 @@
   $ 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/856ab03cce31-amend-backup.hg (glob)
   $ hg book
-     book1                     1:0cf1c7a51bcf
-   * book2                     1:0cf1c7a51bcf
+     book1                     1:a8b84a7dab52
+   * book2                     1:a8b84a7dab52
   $ 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/a8b84a7dab52-amend-backup.hg (glob)
   $ hg book
-     book1                     1:7344472bd951
-   * book2                     1:7344472bd951
+     book1                     1:cf308a00d397
+   * book2                     1:cf308a00d397
 
   $ echo '[defaults]' >> $HGRCPATH
   $ echo "commit=-d '0 0'" >> $HGRCPATH
@@ -230,9 +229,9 @@
   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/a6be1f314298-amend-backup.hg (glob)
   $ hg branches
-  default                        2:f24ee5961967
+  default                        2:1b346cc84440
 
 Close branch:
 
@@ -255,9 +254,9 @@
   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/027371728205-amend-backup.hg (glob)
   $ hg branches
-  default                        2:f24ee5961967
+  default                        2:1b346cc84440
 
 Refuse to amend merges:
 
@@ -279,7 +278,7 @@
   $ 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/b9f631c5114b-amend-backup.hg (glob)
   $ hg st --rev '.^' --copies d
   A d
     b
@@ -287,7 +286,7 @@
   $ 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/08a903ea49b8-amend-backup.hg (glob)
   $ hg st --rev '.^' --copies f
   A f
     d
@@ -298,7 +297,7 @@
   $ 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/3dda4384bcd5-amend-backup.hg (glob)
   $ hg st --change . --copies
   $ hg log -r . --template "{file_copies}\n"
   
@@ -310,7 +309,7 @@
   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/9df64da08ca3-amend-backup.hg (glob)
   $ hg st --change . --copies h
   A h
   $ hg log -r . --template "{file_copies}\n"
@@ -330,11 +329,11 @@
   $ 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/e753d16337ab-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/90313223e1b1-amend-backup.hg (glob)
   $ hg log -r . --template "{branch}\n"
   a
 
@@ -351,8 +350,9 @@
   $ 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/5bce7e78ab1a-amend-backup.hg (glob)
   $ hg log -r . --debug | grep extra
+  extra:       amend_source=5bce7e78ab1a226e42c28796dfa18e5e11f52b67
   extra:       branch=a
   extra:       source=2647734878ef0236dda712fae9c1651cf694ea8a
 
@@ -391,26 +391,26 @@
   $ hg id -n
   14
   $ hg log -Gl 3 --style=compact
-  @  14[tip]:11   43df5a5434ad   1970-01-01 00:00 +0000   test
+  @  14[tip]:11   d04bed6bd22a   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   8bbd19837375   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   d04bed6bd22a   1970-01-01 00:00 +0000   test
   |    babar
   |
-  | x  13:11   175fafee6f44   1970-01-01 00:00 +0000   test
+  | x  13:11   91e19651deb6   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   8bbd19837375   1970-01-01 00:00 +0000   test
   | |    a''
   | |
 
@@ -422,23 +422,34 @@
   $ 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   f696aa760fdd   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   c2e92673fa56   1970-01-01 00:00 +0000   test
+  | |    temporary amend commit for d04bed6bd22a
   | |
-  | x  14:11   43df5a5434ad   1970-01-01 00:00 +0000   test
+  | x  14:11   d04bed6bd22a   1970-01-01 00:00 +0000   test
   |/     babar
   |
-  | x  13:11   175fafee6f44   1970-01-01 00:00 +0000   test
+  | x  13:11   91e19651deb6   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   8bbd19837375   1970-01-01 00:00 +0000   test
   | |    a''
   | |
 
 
+Test that amend does not make it easy to create obsoletescence cycle
+---------------------------------------------------------------------
+
+
+  $ hg id -r 14
+  d04bed6bd22a (a)
+  $ hg revert -ar 14
+  reverting a
+  $ hg commit --amend
+  $ hg id
+  45a48907d00a (a) tip
diff --git a/tests/test-keyword.t b/tests/test-keyword.t
--- a/tests/test-keyword.t
+++ b/tests/test-keyword.t
@@ -509,9 +509,9 @@
   $ hg --debug commit --amend -d '15 1' -m 'amend without changes' | grep keywords
   overwriting a expanding keywords
   $ hg -q id
-  577e60613a88
+  67d8c481a6be
   $ head -1 a
-  expand $Id: a,v 577e60613a88 1970/01/01 00:00:15 test $
+  expand $Id: a,v 67d8c481a6be 1970/01/01 00:00:15 test $
 
   $ hg -q strip -n tip
 


More information about the Mercurial-devel mailing list