branching: merge with stable
authorPierre-Yves David <pierre-yves.david@octobus.net>
Tue, 10 Dec 2019 20:47:13 +0100
changeset 5000 8d38ad9c044f
parent 4986 1214f3d085a9 (current diff)
parent 4999 a9457b9aca4e (diff)
child 5003 ad1ea34335cb
branching: merge with stable
CHANGELOG
hgext3rd/evolve/cmdrewrite.py
hgext3rd/evolve/evolvecmd.py
--- a/CHANGELOG	Fri Dec 06 17:18:49 2019 +0100
+++ b/CHANGELOG	Tue Dec 10 20:47:13 2019 +0100
@@ -22,6 +22,7 @@
   * topic: add more options to command synopsis string
   * evolve: use more often seen metavariables in command synopsis strings
   * documentation: update text and add missing figures
+  * amend: cleany abort when both `--patch` and `--extract` are passed
 
 9.2.1 -- 2019-10-05
 -------------------
--- a/hgext3rd/evolve/cmdrewrite.py	Fri Dec 06 17:18:49 2019 +0100
+++ b/hgext3rd/evolve/cmdrewrite.py	Tue Dec 10 20:47:13 2019 +0100
@@ -129,6 +129,8 @@
     """
     _checknotesize(ui, opts)
     opts = opts.copy()
+    if opts.get('patch') and opts.get('extract'):
+        raise error.Abort(_(b'cannot use both --patch and --extract'))
     if opts.get('patch'):
         return amendpatch(ui, repo, *pats, **opts)
     if opts.get('extract'):
--- a/hgext3rd/evolve/evolvecmd.py	Fri Dec 06 17:18:49 2019 +0100
+++ b/hgext3rd/evolve/evolvecmd.py	Tue Dec 10 20:47:13 2019 +0100
@@ -391,7 +391,15 @@
     # the changeset on which resolution changeset will be based on
     resolutionparent = repo[divp1].node()
 
-    gca = repo.revs(b"ancestor(%d, %d)" % (otherp1, divp1))
+    # the nullrev has to be handled specially because -1 is overloaded to both
+    # mean nullrev (this meaning is used for the result of changectx.rev(), as
+    # called above) and the tipmost revision (this meaning is used for the %d
+    # format specifier, as used below)
+    if nodemod.nullrev in (otherp1, divp1):
+        # nullrev is the only possible ancestor if otherp1 or divp1 is nullrev
+        gca = [nodemod.nullrev]
+    else:
+        gca = repo.revs(b"ancestor(%d, %d)" % (otherp1, divp1))
     # divonly: non-obsolete csets which are topological ancestor of "divergent"
     # but not "other"
     divonly = repo.revs(b"only(%d, %d) - obsolete()" % (divergent.rev(),
@@ -493,6 +501,22 @@
                   % divergent))
         return (False, b".")
 
+    try:
+        succsdivp1 = utility._singlesuccessor(repo, divergent.p1())
+    except utility.MultipleSuccessorsError:
+        msg = _(b"ambiguous orphan resolution parent for %b")
+        raise error.Abort(msg % divergent.hex()[:12])
+    # relocate divergent cset to its obsolete parent's successsor
+    if succsdivp1 != divergent.p1().rev():
+        ui.status(_(b'rebasing "divergent" content-divergent changeset %s on'
+                    b' %s\n' % (divergent, repo[succsdivp1])))
+        with state.saver(evolvestate, {b'current': divergent.node()}):
+            newdivergent = relocate(repo, divergent, repo[succsdivp1],
+                                    evolvestate, keepbranch=True)
+        divergent = repo[newdivergent]
+        evolvestate[b'temprevs'].append(divergent.node())
+        evolvestate[b'divergent'] = divergent.node()
+
     # Sometimes we already have the other cset where we want it
     if relocatereq and other == divergent.p1():
         relocatereq = False
@@ -629,7 +653,17 @@
 
         mergehook(repo, base, divergent, other)
 
-        newnode = repo.commit(text=desc, user=user)
+        date = divergent.date()
+        if other.date() != divergent.date():
+            basedate = base.date()
+            if other.date() == basedate:
+                date = divergent.date()
+            elif divergent.date() == basedate:
+                date = other.date()
+            else:
+                date = max(divergent.date(), other.date())
+
+        newnode = repo.commit(text=desc, user=user, date=date)
         if newnode == divergent.node() or newnode is None:
             # no changes
             new = divergent
--- a/hgext3rd/evolve/obsdiscovery.py	Fri Dec 06 17:18:49 2019 +0100
+++ b/hgext3rd/evolve/obsdiscovery.py	Tue Dec 10 20:47:13 2019 +0100
@@ -33,6 +33,7 @@
     util,
 )
 from mercurial.i18n import _
+from mercurial.utils import stringutil
 
 from . import (
     compat,
@@ -447,7 +448,9 @@
                             for r in ranges:
                                 self._data.pop(r, None)
                     except (sqlite3.DatabaseError, sqlite3.OperationalError) as exc:
-                        repo.ui.log(b'evoext-cache', b'error while updating obshashrange cache: %s' % exc)
+                        repo.ui.log(b'evoext-cache',
+                                    b'error while updating obshashrange cache: %s'
+                                    % stringutil.forcebytestr(exc))
                         del self._updating
                         return
 
@@ -551,8 +554,11 @@
             if r'_con' in vars(self):
                 del self._con
             self._new.clear()
-            repo.ui.log(b'evoext-cache', b'error while saving new data: %s' % exc)
-            repo.ui.debug(b'evoext-cache: error while saving new data: %s' % exc)
+            repo.ui.log(b'evoext-cache',
+                        b'error while saving new data: %s'
+                        % stringutil.forcebytestr(exc))
+            repo.ui.debug(b'evoext-cache: error while saving new data: %s'
+                          % stringutil.forcebytestr(exc))
 
     def _trysave(self, repo):
         if self._con is None:
--- a/hgext3rd/evolve/state.py	Fri Dec 06 17:18:49 2019 +0100
+++ b/hgext3rd/evolve/state.py	Tue Dec 10 20:47:13 2019 +0100
@@ -114,7 +114,7 @@
             repo.ui.debug(b'ignoring corrupted evolvestate (file contains %i bits)'
                           % len(versionblob))
             return None
-        version = struct._unpack(b'>I', versionblob)[0]
+        version = struct.unpack(b'>I', versionblob)[0]
         if version != 0:
             msg = _(b'unknown evolvestate version %i') % version
             raise error.Abort(msg, hint=_(b'upgrade your evolve'))
@@ -125,7 +125,7 @@
         while off < end:
             rtype = data[off]
             off += 1
-            length = struct._unpack(b'>I', data[off:(off + 4)])[0]
+            length = struct.unpack(b'>I', data[off:(off + 4)])[0]
             off += 4
             record = data[off:(off + length)]
             off += length
--- a/tests/test-amend.t	Fri Dec 06 17:18:49 2019 +0100
+++ b/tests/test-amend.t	Tue Dec 10 20:47:13 2019 +0100
@@ -165,3 +165,8 @@
    -i --interactive         use interactive mode
   
   (some details hidden, use --verbose to show complete help)
+
+Check that we abort if --patch and --extract both are used at once
+  $ hg amend --patch --extract
+  abort: cannot use both --patch and --extract
+  [255]
--- a/tests/test-evolve-content-divergent-corner-cases.t	Fri Dec 06 17:18:49 2019 +0100
+++ b/tests/test-evolve-content-divergent-corner-cases.t	Tue Dec 10 20:47:13 2019 +0100
@@ -270,45 +270,22 @@
   o  0:9092f1db7931 added a
       () [default] draft
 
-  $ hg evolve --content-divergent --any --update
+  $ hg evolve --content-divergent --any --update --config ui.interactive=true <<EOF
+  > c
+  > EOF
   merge:[5] updated e
   with: [6] updated e
   base: [4] added e
-  rebasing "other" content-divergent changeset de4ea3103326 on 9150fe93bec6
-  merging d
-  warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
-  unresolved merge conflicts
-  (see 'hg help evolve.interrupted')
-  [1]
-
-  $ hg diff --no-git --config diff.unified=3
-  diff -r 9150fe93bec6 d
-  --- a/d	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  @@ -1,1 +1,5 @@
-  +<<<<<<< destination: 9150fe93bec6 - test: added d
-   d
-  +=======
-  +dd
-  +>>>>>>> evolving:    de4ea3103326 - test: updated e
-  diff -r 9150fe93bec6 e
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +ee
-
-  $ echo dresolved > d
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  evolving 6:de4ea3103326 "updated e"
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory is now at 83b1664a580f
+  rebasing "divergent" content-divergent changeset ff6f7cd76a7c on 155349b645be
+  rebasing "other" content-divergent changeset de4ea3103326 on 155349b645be
+  file 'd' was deleted in local but was modified in other.
+  You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
+  What do you want to do? c
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  working directory is now at eb6357cd41b6
 
   $ hg glog -l1
-  @  8:83b1664a580f updated e
+  @  9:eb6357cd41b6 updated e
   |   () [default] draft
   ~
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve-content-divergent-first-changeset.t	Tue Dec 10 20:47:13 2019 +0100
@@ -0,0 +1,41 @@
+  $ . $TESTDIR/testlib/pythonpath.sh
+  $ echo "[extensions]" >> $HGRCPATH
+  $ echo "evolve=" >> $HGRCPATH
+
+This test file tests the case of content-divergence resolution of changesets
+that have the null revision as the parent.
+
+  $ hg init issue6201
+  $ cd issue6201
+
+  $ touch test
+  $ hg add test
+  $ hg commit -m test
+  $ hg log -T '{node|short}\n'
+  be090ea66256
+
+  $ echo a >> test
+  $ hg amend -m div1
+  $ hg log -T '{node|short}\n'
+  79fa0eb22d65
+
+  $ hg up be090ea66256 --hidden --quiet
+  updated to hidden changeset be090ea66256
+  (hidden revision 'be090ea66256' was rewritten as: 79fa0eb22d65)
+  working directory parent is obsolete! (be090ea66256)
+  $ echo a >> test
+  $ echo b >> test
+  $ hg amend -m div2
+  2 new content-divergent changesets
+  $ hg log -T '{node|short}\n'
+  4b2524b7508e
+  79fa0eb22d65
+
+  $ hg evolve --content-divergent --config ui.merge=internal:other
+  merge:[1] div1
+  with: [2] div2
+  base: [0] test
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  working directory is now at 12772224141b
+
+  $ hg evolve --list
--- a/tests/test-evolve-content-divergent-interrupted.t	Fri Dec 06 17:18:49 2019 +0100
+++ b/tests/test-evolve-content-divergent-interrupted.t	Tue Dec 10 20:47:13 2019 +0100
@@ -195,6 +195,7 @@
   merge:[5] added d
   with: [7] added d
   base: [4] added d
+  rebasing "divergent" content-divergent changeset e49523854bc8 on ddcf04e1458c
   merging d
   warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -203,6 +204,7 @@
   [1]
 
   $ hg evolve --abort
+  1 new orphan changesets
   2 new content-divergent changesets
   evolve aborted
   working directory is now at 491e10505bae
--- a/tests/test-evolve-content-divergent-stack.t	Fri Dec 06 17:18:49 2019 +0100
+++ b/tests/test-evolve-content-divergent-stack.t	Tue Dec 10 20:47:13 2019 +0100
@@ -147,23 +147,26 @@
   merge:[6] added b
   with: [10] added b
   base: [2] added b
+  rebasing "divergent" content-divergent changeset d5f148423c16 on f66f262fff6c
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merge:[7] added c
   with: [11] added c
   base: [3] added c
+  rebasing "divergent" content-divergent changeset 3ce4be6d8e5e on eadfd9d70680
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merge:[8] added d
   with: [12] added d
   base: [4] added d
+  rebasing "divergent" content-divergent changeset c72d2885eb51 on b2cac10f3836
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at f66f262fff6c
 
   $ hg glog
-  o  16:038fe7db3d88 added d
+  o  19:038fe7db3d88 added d
   |   () [default] draft
-  o  15:b2cac10f3836 added c
+  o  17:b2cac10f3836 added c
   |   () [default] draft
-  o  14:eadfd9d70680 added b
+  o  15:eadfd9d70680 added b
   |   () [default] draft
   @  13:f66f262fff6c watbar to a
   |   () [default] draft
@@ -315,26 +318,29 @@
   merge:[11] added b
   with: [6] added b
   base: [2] added b
-  rebasing "other" content-divergent changeset d5f148423c16 on c04ff147ef79
+  rebasing "divergent" content-divergent changeset 6eb54b5af3fb on 74fbf3e6a0b6
+  rebasing "other" content-divergent changeset d5f148423c16 on 74fbf3e6a0b6
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merge:[12] added c
   with: [7] added c
   base: [3] added c
-  rebasing "other" content-divergent changeset 3ce4be6d8e5e on 6eb54b5af3fb
+  rebasing "divergent" content-divergent changeset 8ed612937375 on 4e29776e83a5
+  rebasing "other" content-divergent changeset 3ce4be6d8e5e on 4e29776e83a5
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merge:[13] added d
   with: [8] added d
   base: [4] added d
-  rebasing "other" content-divergent changeset c72d2885eb51 on 8ed612937375
+  rebasing "divergent" content-divergent changeset d45f050514c2 on 77126af93a25
+  rebasing "other" content-divergent changeset c72d2885eb51 on 77126af93a25
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 74fbf3e6a0b6
 
   $ hg glog
-  o  21:5f7a38bdb75c added d
+  o  24:c8f73c376a6e added d
   |   () [default] draft
-  o  19:9865d598f0e0 added c
+  o  21:77126af93a25 added c
   |   () [default] draft
-  o  17:ac70b8c8eb63 added b
+  o  18:4e29776e83a5 added b
   |   () [default] draft
   @  15:74fbf3e6a0b6 watbar to a
   |   () [default] draft
@@ -343,3 +349,278 @@
   o  0:8fa14d15e168 added hgignore
       () [default] draft
   $ cd ..
+
+Make sure that content-divergent resolution doesn't undo a change (issue6203)
+-----------------------------------------------------------------------------
+
+  $ hg init issue6203
+  $ cd issue6203
+  $ echo a > a; hg add a; hg ci -m a
+  $ echo 'b with typo' > b; hg add b; hg ci -m b
+  $ echo c > c; hg add c; hg ci -m c
+
+  $ hg prev
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  [1] b
+  $ echo 'b without typo' > b
+  $ hg amend
+  1 new orphan changesets
+  $ hg evolve
+  move:[2] c
+  atop:[3] b
+
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo d > d; hg add d; hg ci -m d
+  created new head
+  $ hg rebase --hidden --config experimental.evolution.allowdivergence=True -s 1 -d 5
+  rebasing 1:d420a663b65e "b"
+  rebasing 2:49f182e7a6cc "c"
+  4 new content-divergent changesets
+  $ hg log -G -v --patch
+  *  changeset:   7:ef4885dea3da
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  instability: content-divergent
+  |  files:       c
+  |  description:
+  |  c
+  |
+  |
+  |  diff -r fe788ccf5416 -r ef4885dea3da c
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c
+  |
+  *  changeset:   6:fe788ccf5416
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  instability: content-divergent
+  |  files:       b
+  |  description:
+  |  b
+  |
+  |
+  |  diff -r 980f7dc84c29 -r fe788ccf5416 b
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +b with typo
+  |
+  @  changeset:   5:980f7dc84c29
+  |  parent:      0:cb9a9f314b8b
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  files:       d
+  |  description:
+  |  d
+  |
+  |
+  |  diff -r cb9a9f314b8b -r 980f7dc84c29 d
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +d
+  |
+  | *  changeset:   4:fef59171875e
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  instability: content-divergent
+  | |  files:       c
+  | |  description:
+  | |  c
+  | |
+  | |
+  | |  diff -r 5b2d00df9c4e -r fef59171875e c
+  | |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  | |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  | |  @@ -0,0 +1,1 @@
+  | |  +c
+  | |
+  | *  changeset:   3:5b2d00df9c4e
+  |/   parent:      0:cb9a9f314b8b
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    instability: content-divergent
+  |    files:       b
+  |    description:
+  |    b
+  |
+  |
+  |    diff -r cb9a9f314b8b -r 5b2d00df9c4e b
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +b without typo
+  |
+  o  changeset:   0:cb9a9f314b8b
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     files:       a
+     description:
+     a
+  
+  
+     diff -r 000000000000 -r cb9a9f314b8b a
+     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
+     @@ -0,0 +1,1 @@
+     +a
+  
+
+  $ hg evolve --content-divergent
+  merge:[6] b
+  with: [3] b
+  base: [1] b
+  rebasing "other" content-divergent changeset 5b2d00df9c4e on 980f7dc84c29
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  merge:[7] c
+  with: [4] c
+  base: [2] c
+  rebasing "divergent" content-divergent changeset ef4885dea3da on 0999c349998d
+  rebasing "other" content-divergent changeset fef59171875e on 0999c349998d
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Expected result:
+Changeset with description "b" only adds file "b" with content "b without typo".
+Changeset with description "c" only adds file "c" with content "c".
+
+  $ hg glog -l2 -p
+  o  12:4ca627f76da9 c
+  |   () [default] draftdiff -r 0999c349998d -r 4ca627f76da9 c
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c
+  |
+  o  9:0999c349998d b
+  |   () [default] draftdiff -r 980f7dc84c29 -r 0999c349998d b
+  ~  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+     +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+     @@ -0,0 +1,1 @@
+     +b without typo
+  
+  $ cd ..
+
+Testing case when resolution parent is ambiguous (MultipleSuccessorsError)
+--------------------------------------------------------------------------
+
+  $ hg init multiplesuccs1
+  $ cd multiplesuccs1
+  $ echo base > base
+  $ hg ci -Aqm "added base"
+  $ echo foo > foo
+  $ hg ci -Aqm "added foo"
+  $ echo bar > bar; echo car > car
+  $ hg ci -Aqm "added bar and car"
+  $ echo dar > dar
+  $ hg ci -Aqm "added dar"
+
+  $ cd ..
+  $ hg clone multiplesuccs1 multiplesuccs2
+  updating to branch default
+  5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd multiplesuccs2
+  $ hg up -r "desc('added foo')"
+  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+  $ echo newfoo > foo
+  $ hg amend
+  2 new orphan changesets
+  $ hg evolve
+  move:[2] added bar and car
+  atop:[4] added foo
+  move:[3] added dar
+
+  $ cd ../multiplesuccs1
+  $ hg up -r "desc('added base')"
+  0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+  $ echo tuna > tuna
+  $ hg ci -Aqm "added tuna"
+  $ hg rebase -s "desc('added foo')" -d .
+  rebasing 1:8da7bbaea4f7 "added foo"
+  rebasing 2:7f4b97b13607 "added bar and car"
+  rebasing 3:9f12b2fcb3de "added dar"
+
+  $ cd ../multiplesuccs2
+  $ hg pull
+  pulling from $TESTTMP/multiplesuccs1
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 4 changesets with 1 changes to 5 files (+1 heads)
+  3 new obsolescence markers
+  6 new content-divergent changesets
+  new changesets 9703820a7d5b:9a1f460df8b5 (4 drafts)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg glog
+  *  10:9a1f460df8b5 added dar
+  |   () [default] draft
+  *  9:7dd5b9d42ef3 added bar and car
+  |   () [default] draft
+  *  8:afd8b2ea1b77 added foo
+  |   () [default] draft
+  o  7:9703820a7d5b added tuna
+  |   () [default] draft
+  | *  6:57a3f8edf065 added dar
+  | |   () [default] draft
+  | *  5:f4ed107810a7 added bar and car
+  | |   () [default] draft
+  | @  4:8a2d93492f59 added foo
+  |/    () [default] draft
+  o  0:bde1d2b6b5e5 added base
+      () [default] draft
+
+  $ hg evolve -r 4+5 --content-divergent
+  merge:[8] added foo
+  with: [4] added foo
+  base: [1] added foo
+  rebasing "other" content-divergent changeset 8a2d93492f59 on 9703820a7d5b
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  merge:[9] added bar and car
+  with: [5] added bar and car
+  base: [2] added bar and car
+  rebasing "divergent" content-divergent changeset 7dd5b9d42ef3 on 8ef6ad88580d
+  rebasing "other" content-divergent changeset f4ed107810a7 on 8ef6ad88580d
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  2 new orphan changesets
+  working directory is now at 8ef6ad88580d
+
+  $ hg glog
+  o  15:09ba686a465e added bar and car
+  |   () [default] draft
+  @  12:8ef6ad88580d added foo
+  |   () [default] draft
+  | *  10:9a1f460df8b5 added dar
+  | |   () [default] draft
+  | x  9:7dd5b9d42ef3 added bar and car
+  | |   () [default] draft
+  | x  8:afd8b2ea1b77 added foo
+  |/    () [default] draft
+  o  7:9703820a7d5b added tuna
+  |   () [default] draft
+  | *  6:57a3f8edf065 added dar
+  | |   () [default] draft
+  | x  5:f4ed107810a7 added bar and car
+  | |   () [default] draft
+  | x  4:8a2d93492f59 added foo
+  |/    () [default] draft
+  o  0:bde1d2b6b5e5 added base
+      () [default] draft
+
+  $ echo bar > bar; hg ci -Aqm "added bar"
+  $ echo car > car; hg ci -Aqm "added car"
+  $ hg prune --split -s 16+17 -r 15
+  1 changesets pruned
+
+  $ hg evolve --content-divergent
+  skipping 57a3f8edf065: have a different parent than 9a1f460df8b5 (not handled yet)
+  | 57a3f8edf065, 9a1f460df8b5 are not based on the same changeset.
+  | With the current state of its implementation, 
+  | evolve does not work in that case.
+  | rebase one of them next to the other and run 
+  | this command again.
+  | - either: hg rebase --dest 'p1(57a3f8edf065)' -r 9a1f460df8b5
+  | - or:     hg rebase --dest 'p1(9a1f460df8b5)' -r 57a3f8edf065
--- a/tests/test-evolve-issue5958.t	Fri Dec 06 17:18:49 2019 +0100
+++ b/tests/test-evolve-issue5958.t	Tue Dec 10 20:47:13 2019 +0100
@@ -22,6 +22,8 @@
 (Make changes in unrelated files so that we don't have any merge conflicts
 during the rebase, but the two touched revisions aren't identical)
 
+date: updated on both side to the same value
+
   $ echo hi > bar.txt
   $ hg add -q bar.txt
   $ hg amend -q
@@ -79,10 +81,176 @@
        rewritten(date) as 0065551bd38f using metaedit by test (Thu Jan 01 00:00:00 1970 +0000)
        rewritten(date) as c17bf400a278 using metaedit by test (Thu Jan 01 00:00:00 1970 +0000)
   
+  $ hg evolve --list --rev .
+  08bc7ba82799: add foo.txt
+    content-divergent: c17bf400a278 (draft) (precursor cc71ffbc7c00)
+  
+  $ hg log --hidden -r cc71ffbc7c00 -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n'
+  1 cc71ffbc7c00 1970-01-01 00:00 +0000: date-changed using metaedit as 4:c17bf400a278; date-changed using metaedit as 2:0065551bd38f
+  $ hg log -r 'desc("add foo.txt")' -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n'
+  4 c17bf400a278 1969-12-31 23:59 -0000: 
+  6 08bc7ba82799 1969-12-31 23:59 -0000: 
   $ hg evolve --content-divergent
   merge:[6] add foo.txt
   with: [4] add foo.txt
   base: [1] add foo.txt
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   1 new orphan changesets
-  working directory is now at 2372e6d39855
+  working directory is now at 459c64f7eaad
+  $ hg log -r 'desc("add foo.txt")' -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n'
+  4 c17bf400a278 1969-12-31 23:59 -0000: rewritten using evolve as 7:459c64f7eaad
+  7 459c64f7eaad 1969-12-31 23:59 -0000: 
+
+date: updated one one side to an older value
+
+  $ hg evolve -r .
+  move:[7] add foo.txt
+  atop:[0] add r0
+  working directory is now at 545776b4e79f
+  $ hg update --hidden --rev 'predecessors(.)'
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  updated to hidden changeset 459c64f7eaad
+  (hidden revision '459c64f7eaad' was rewritten as: 545776b4e79f)
+  working directory parent is obsolete! (459c64f7eaad)
+  (use 'hg evolve' to update to its successor: 545776b4e79f)
+  $ hg amend --date "0 3"
+  1 new orphan changesets
+  2 new content-divergent changesets
+  $ hg rebase -r . -d 0
+  rebasing 9:c117f15338e6 "add foo.txt" (tip)
+  $ hg log -G
+  @  changeset:   10:7a09c7a39546
+  |  tag:         tip
+  |  parent:      0:a24ed8ad918c
+  |  user:        test
+  |  date:        Wed Dec 31 23:59:57 1969 -0000
+  |  instability: content-divergent
+  |  summary:     add foo.txt
+  |
+  | *  changeset:   8:545776b4e79f
+  |/   parent:      0:a24ed8ad918c
+  |    user:        test
+  |    date:        Wed Dec 31 23:59:58 1969 -0000
+  |    instability: content-divergent
+  |    summary:     add foo.txt
+  |
+  o  changeset:   0:a24ed8ad918c
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add r0
+  
+  $ hg evolve --list -r .
+  7a09c7a39546: add foo.txt
+    content-divergent: 545776b4e79f (draft) (precursor 459c64f7eaad)
+  
+  $ hg log -r 459c64f7eaad+7a09c7a39546+545776b4e79f --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n'
+  7 459c64f7eaad 1969-12-31 23:59 -0000: date-changed using amend as 9:c117f15338e6; rebased using evolve as 8:545776b4e79f
+  10 7a09c7a39546 1969-12-31 23:59 -0000: 
+  8 545776b4e79f 1969-12-31 23:59 -0000: 
+  $ hg evolve --content-divergent
+  merge:[8] add foo.txt
+  with: [10] add foo.txt
+  base: [7] add foo.txt
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory is now at 39c4200c0d94
+  $ hg log -r . --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n'
+  11 39c4200c0d94 1969-12-31 23:59 -0000: 
+
+date: updated one side to an newer value
+
+  $ hg update --hidden --rev 'predecessors(.)'
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  updated to hidden changeset 7a09c7a39546
+  (hidden revision '7a09c7a39546' was rewritten as: 39c4200c0d94)
+  working directory parent is obsolete! (7a09c7a39546)
+  (use 'hg evolve' to update to its successor: 39c4200c0d94)
+  $ hg amend --date "120 0"
+  2 new content-divergent changesets
+  $ hg log -G
+  @  changeset:   12:da3be3d72fe2
+  |  tag:         tip
+  |  parent:      0:a24ed8ad918c
+  |  user:        test
+  |  date:        Thu Jan 01 00:02:00 1970 +0000
+  |  instability: content-divergent
+  |  summary:     add foo.txt
+  |
+  | *  changeset:   11:39c4200c0d94
+  |/   parent:      0:a24ed8ad918c
+  |    user:        test
+  |    date:        Wed Dec 31 23:59:57 1969 -0000
+  |    instability: content-divergent
+  |    summary:     add foo.txt
+  |
+  o  changeset:   0:a24ed8ad918c
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add r0
+  
+  $ hg evolve --list -r .
+  da3be3d72fe2: add foo.txt
+    content-divergent: 39c4200c0d94 (draft) (precursor 7a09c7a39546)
+  
+  $ hg up 39c4200c0d94
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg log -r 7a09c7a39546+39c4200c0d94+da3be3d72fe2 --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n'
+  10 7a09c7a39546 1969-12-31 23:59 -0000: date-changed using amend as 12:da3be3d72fe2; rewritten using evolve as 11:39c4200c0d94
+  11 39c4200c0d94 1969-12-31 23:59 -0000: 
+  12 da3be3d72fe2 1970-01-01 00:02 +0000: 
+  $ hg evolve --content-divergent
+  merge:[11] add foo.txt
+  with: [12] add foo.txt
+  base: [10] add foo.txt
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory is now at 06cde6010a51
+  $ hg log -r . --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n'
+  13 06cde6010a51 1970-01-01 00:02 +0000: 
+
+date: updated each side to a different value, newer should win
+
+  $ hg amend --date "235 0"
+  $ hg update --hidden --rev 'predecessors(.)'
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  updated to hidden changeset 06cde6010a51
+  (hidden revision '06cde6010a51' was rewritten as: a7412ff9bfb3)
+  working directory parent is obsolete! (06cde6010a51)
+  (use 'hg evolve' to update to its successor: a7412ff9bfb3)
+  $ hg amend --date "784 0"
+  2 new content-divergent changesets
+  $ hg log -G
+  @  changeset:   15:e3077936ec52
+  |  tag:         tip
+  |  parent:      0:a24ed8ad918c
+  |  user:        test
+  |  date:        Thu Jan 01 00:13:04 1970 +0000
+  |  instability: content-divergent
+  |  summary:     add foo.txt
+  |
+  | *  changeset:   14:a7412ff9bfb3
+  |/   parent:      0:a24ed8ad918c
+  |    user:        test
+  |    date:        Thu Jan 01 00:03:55 1970 +0000
+  |    instability: content-divergent
+  |    summary:     add foo.txt
+  |
+  o  changeset:   0:a24ed8ad918c
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add r0
+  
+  $ hg evolve --list -r .
+  e3077936ec52: add foo.txt
+    content-divergent: a7412ff9bfb3 (draft) (precursor 06cde6010a51)
+  
+  $ hg log -r 39c4200c0d94+a7412ff9bfb3+e3077936ec52 --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n'
+  11 39c4200c0d94 1969-12-31 23:59 -0000: date-changed using evolve as 13:06cde6010a51
+  14 a7412ff9bfb3 1970-01-01 00:03 +0000: 
+  15 e3077936ec52 1970-01-01 00:13 +0000: 
+  $ hg evolve --content-divergent
+  merge:[14] add foo.txt
+  with: [15] add foo.txt
+  base: [13] add foo.txt
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory is now at 1a39f3901288
+  $ hg log -r . --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n'
+  16 1a39f3901288 1970-01-01 00:13 +0000: 
--- a/tests/test-topic-stack-complex.t	Fri Dec 06 17:18:49 2019 +0100
+++ b/tests/test-topic-stack-complex.t	Tue Dec 10 20:47:13 2019 +0100
@@ -176,4 +176,7 @@
   with: [s4] Added e and f
   base: [3] Added e and f
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory is now at 8faad6276dc6
+  working directory is now at 80b2ddbf01d3
+
+  $ hg log -r 80b2ddbf01d3 -T '{date|hgdate}\n'
+  0 1