changeset 3787:dc81a788f278

evolve: use cmdrewrite.amend() instead of creating a new commit This patch backs out changeset 88601e1cd5d8. We replaced cmdrewrite.amend() with creating new commit because using amend(), a high level function was not good and creating a new commit gave us more control over things. **HOWEVER** to get more control, you need to get arrange all the pieces together perfectly. Creating a new commit, the existing logic has some bugs around dirstate handling, the `repo.dirstate.setparents()` call especially. Sometimes this fixes the dirstate correctly sometimes not. As Pierre-Yves David said, "Having a "clumsy" implementation with the right behavior is usually a good first step. So having an amend based implementation seems like a good first step.", let's take a step back and get back using amend so that we can have a correct basic implementation which is bug free.
author Pulkit Goyal <7895pulkit@gmail.com>
date Tue, 05 Jun 2018 00:53:21 +0530
parents 41fc764bf28c
children ae30da2e210d
files hgext3rd/evolve/evolvecmd.py tests/test-divergent.t tests/test-sharing.t tests/test-stabilize-result.t
diffstat 4 files changed, 38 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/hgext3rd/evolve/evolvecmd.py	Sun Jun 03 01:59:41 2018 +0530
+++ b/hgext3rd/evolve/evolvecmd.py	Tue Jun 05 00:53:21 2018 +0530
@@ -33,6 +33,7 @@
 from mercurial.i18n import _
 
 from . import (
+    cmdrewrite,
     compat,
     exthelper,
     rewriteutil,
@@ -446,23 +447,25 @@
     tr = repo.currenttransaction()
     assert tr is not None
     try:
+        repo.ui.setconfig('ui', 'allowemptycommit', True, 'evolve')
         with repo.dirstate.parentchange():
-            repo.dirstate.setparents(divergent.p1().node(), node.nullid)
+            repo.dirstate.setparents(divergent.node(), node.nullid)
+        oldlen = len(repo)
+        # temporary hack because we can't use cmdrewrite.amend() during an
+        # interrupted evolve
+        evolvestate.delete()
 
-        newnode = repo.commit(text=divergent.description(), user=repo.ui.username())
-        if newnode == divergent.node() or newnode is None:
-            # no changes
+        # XXX: we should not use amend here, rather create a new commit
+        cmdrewrite.amend(ui, repo, message='', logfile='')
+        # XXX: we can get rid of this len() call also by creating a new commit
+        if oldlen == len(repo):
             new = divergent
-            repo.ui.status(_("nothing changed\n"))
-            hg.updaterepo(repo, divergent.rev(), False)
-            obsolete.createmarkers(repo, [(other, (new,))], operation='evolve')
+            # no changes
         else:
-            new = repo[newnode]
-            hg.updaterepo(repo, new.rev(), False)
-            obsolete.createmarkers(repo, [(other, (new,))], operation='evolve')
-            obsolete.createmarkers(repo, [(divergent, (new,))], operation='evolve')
+            new = repo['.']
 
         # creating markers and moving phases post-resolution
+        obsolete.createmarkers(repo, [(other, (new,))], operation='evolve')
         phases.retractboundary(repo, tr, other.phase(), [new.node()])
         return (True, new.node())
     finally:
--- a/tests/test-divergent.t	Sun Jun 03 01:59:41 2018 +0530
+++ b/tests/test-divergent.t	Tue Jun 05 00:53:21 2018 +0530
@@ -60,9 +60,9 @@
   updating to "local" side of the conflict: c2f698071cba
   merging "other" content-divergent changeset 'e708fd28d5cf'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory is now at c9708170cf11
+  working directory is now at c26f1d3baed2
   $ hg log -G
-  @  4:c9708170cf11@default(draft) add bdivergent1 []
+  @  4:c26f1d3baed2@default(draft) add bdivergent1 []
   |
   o  0:135f39f4bd78@default(draft) add _a []
   
@@ -94,7 +94,7 @@
   |
   | *  6:26c7705fee96@default(draft) add cdivergent1 [content-divergent]
   |/
-  | o  4:c9708170cf11@default(draft) add bdivergent1 []
+  | o  4:c26f1d3baed2@default(draft) add bdivergent1 []
   |/
   o  0:135f39f4bd78@default(draft) add _a []
   
@@ -154,7 +154,7 @@
   base: [1] add _b
   merging "other" content-divergent changeset 'c2f698071cba'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory is now at 1ed713bcebf6
+  working directory is now at aa26817f6fbe
 
 
   $ cd ..
--- a/tests/test-sharing.t	Sun Jun 03 01:59:41 2018 +0530
+++ b/tests/test-sharing.t	Tue Jun 05 00:53:21 2018 +0530
@@ -511,12 +511,12 @@
   base: [4] fix bug 24 (v1)
   merging "other" content-divergent changeset 'e3f99ce9d9cd'
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
-  working directory is now at 711ede2d7a26
+  working directory is now at 5ad6037c046c
   $ hg log -q -r 'contentdivergent()'
 
 Figure SG10: Bob's repository after fixing divergence.
   $ hg --hidden shortlog -G -r 3::
-  @  7:711ede2d7a26  draft  fix bug 24 (v2 by bob)
+  @  7:5ad6037c046c  draft  fix bug 24 (v2 by bob)
   |
   | x  6:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
   |/
@@ -527,7 +527,7 @@
   o  3:a06ec1bf97bd  public  fix bug 15 (v2)
   |
   ~
-  $ hg --hidden shortlog -r 'precursors(711ede2d7a26)'
+  $ hg --hidden shortlog -r 'precursors(5ad6037c046c)'
   5:a360947f6faf  draft  fix bug 24 (v2 by bob)
   6:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
   $ cat file1
--- a/tests/test-stabilize-result.t	Sun Jun 03 01:59:41 2018 +0530
+++ b/tests/test-stabilize-result.t	Tue Jun 05 00:53:21 2018 +0530
@@ -294,14 +294,16 @@
   resolving manifests
   merging a
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  amending changeset eacc9c8240fe
   committing files:
   a
   committing manifest
   committing changelog
-  working directory is now at 4d6ed26797bc
+  committed changeset 15:f344982e63c4
+  working directory is now at f344982e63c4
   $ hg st
   $ glog
-  @  15:4d6ed26797bc@default(draft) bk:[] More addition
+  @  15:f344982e63c4@default(draft) bk:[] More addition
   |
   | o  11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363:
   | |
@@ -314,7 +316,7 @@
   o  0:07f494440405@default(public) bk:[] adda
   
   $ hg summary
-  parent: 15:4d6ed26797bc tip
+  parent: 15:f344982e63c4 tip
    More addition
   branch: default
   commit: (clean)
@@ -325,11 +327,11 @@
   # User test
   # Date 0 0
   #      Thu Jan 01 00:00:00 1970 +0000
-  # Node ID 4d6ed26797bc392c0099e48402a5134e669f1a60
+  # Node ID f344982e63c462b1e44c0371c804685389e673a9
   # Parent  7bc2f5967f5e4ed277f60a89b7b04cc5d6407ced
   More addition
   
-  diff -r 7bc2f5967f5e -r 4d6ed26797bc a
+  diff -r 7bc2f5967f5e -r f344982e63c4 a
   --- a/a	Thu Jan 01 00:00:00 1970 +0000
   +++ b/a	Thu Jan 01 00:00:00 1970 +0000
   @@ -1,1 +1,9 @@
@@ -349,9 +351,9 @@
   $ hg up --hidden 3932c176bbaa
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   updated to hidden changeset 3932c176bbaa
-  (hidden revision '3932c176bbaa' was rewritten as: 4d6ed26797bc)
+  (hidden revision '3932c176bbaa' was rewritten as: f344982e63c4)
   working directory parent is obsolete! (3932c176bbaa)
-  (use 'hg evolve' to update to its successor: 4d6ed26797bc)
+  (use 'hg evolve' to update to its successor: f344982e63c4)
   $ echo 'gotta break' >> a
   $ hg amend
   2 new content-divergent changesets
@@ -364,7 +366,7 @@
   $ glog
   @  17:0b336205a5d0@default(draft) bk:[] More addition (2)
   |
-  | *  15:4d6ed26797bc@default(draft) bk:[] More addition
+  | *  15:f344982e63c4@default(draft) bk:[] More addition
   |/
   | o  11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363:
   | |
@@ -379,8 +381,8 @@
 
   $ hg evolve -qn --content-divergent
   hg update -c 0b336205a5d0 &&
-  hg merge 4d6ed26797bc &&
-  hg commit -m "auto merge resolving conflict between 0b336205a5d0 and 4d6ed26797bc"&&
+  hg merge f344982e63c4 &&
+  hg commit -m "auto merge resolving conflict between 0b336205a5d0 and f344982e63c4"&&
   hg up -C 3932c176bbaa &&
   hg revert --all --rev tip &&
   hg commit -m "`hg log -r 0b336205a5d0 --template={desc}`";
@@ -388,7 +390,7 @@
   merge:[17] More addition (2)
   with: [15] More addition
   base: [12] More addition
-  merging "other" content-divergent changeset '4d6ed26797bc'
+  merging "other" content-divergent changeset 'f344982e63c4'
   merging a
   warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -411,9 +413,9 @@
   (no more unresolved files)
   continue: hg evolve --continue
   $ hg evolve --continue
-  working directory is now at e8746835a2a1
+  working directory is now at e015aa78acee
   $ glog
-  @  18:e8746835a2a1@default(draft) bk:[] More addition (2)
+  @  18:e015aa78acee@default(draft) bk:[] More addition (2)
   |
   | o  11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363:
   | |
@@ -430,11 +432,11 @@
   # User test
   # Date 0 0
   #      Thu Jan 01 00:00:00 1970 +0000
-  # Node ID e8746835a2a13122bc8c0ed84fe4ee35649af25d
+  # Node ID e015aa78acee692d26215fafdb7f70974682739c
   # Parent  7bc2f5967f5e4ed277f60a89b7b04cc5d6407ced
   More addition (2)
   
-  diff -r 7bc2f5967f5e -r e8746835a2a1 a
+  diff -r 7bc2f5967f5e -r e015aa78acee a
   --- a/a	Thu Jan 01 00:00:00 1970 +0000
   +++ b/a	Thu Jan 01 00:00:00 1970 +0000
   @@ -1,1 +1,9 @@