changeset 1150:2c99d92faa62 stable

evolve: fix error during iteration over bumped changesets (bug38) We are iterating over a manifest while altering it. We cannot use iteritems() in this context. we move to items, that will be an issue for very large changesets.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Mon, 03 Nov 2014 11:11:14 +0000
parents a206ee74f129
children 802a87359017
files README hgext/evolve.py tests/test-evolve-bumped.t
diffstat 3 files changed, 85 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/README	Mon Oct 20 13:54:46 2014 +0300
+++ b/README	Mon Nov 03 11:11:14 2014 +0000
@@ -52,6 +52,7 @@
 
 - amend: fix --logfile argument
 - evolve: preserve branch change when evolving
+- evolve: fix potential crash while solving `bumped` changesets.
 
 5.0.0 -- 2014-10-22
 
--- a/hgext/evolve.py	Mon Oct 20 13:54:46 2014 +0300
+++ b/hgext/evolve.py	Mon Nov 03 11:11:14 2014 +0000
@@ -1415,7 +1415,7 @@
         files = set()
         copied = copies.pathcopies(prec, bumped)
         precmanifest = prec.manifest()
-        for key, val in bumped.manifest().iteritems():
+        for key, val in bumped.manifest().items():
             if precmanifest.pop(key, None) != val:
                 files.add(key)
         files.update(precmanifest)  # add missing files
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve-bumped.t	Mon Nov 03 11:11:14 2014 +0000
@@ -0,0 +1,83 @@
+  $ hg init public
+  $ cd public
+  $ echo a > a
+  $ hg commit -A -m init
+  adding a
+  $ cd ..
+
+  $ evolvepath=$(echo $(dirname $TESTDIR))/hgext/evolve.py
+  $ hg clone -U public private
+  $ cd private
+  $ cat >> .hg/hgrc <<EOF
+  > [extensions]
+  > rebase =
+  > evolve = $evolvepath
+  > [phases]
+  > publish = false
+  > EOF
+  $ cd ..
+
+  $ cp -a private alice
+  $ cp -a private bob
+
+  $ cd alice
+  $ hg update
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ echo a >> a
+  $ hg commit -u alice -m 'modify a'
+  $ hg push ../private
+  pushing to ../private
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  $ hg log -r 'draft()'
+  changeset:   1:4d1169d82e47
+  tag:         tip
+  user:        alice
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     modify a
+  
+
+  $ cd ../bob
+  $ hg pull ../private
+  pulling from ../private
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pull obsolescence markers
+  (run 'hg update' to get a working copy)
+  $ hg log -r 'draft()'
+  changeset:   1:4d1169d82e47
+  tag:         tip
+  user:        alice
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     modify a
+  
+  $ hg push ../public
+  pushing to ../public
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  $ hg log -r 'draft()'
+
+  $ cd ../alice
+  $ hg amend -m 'tweak a'
+  $ hg pull ../public
+  pulling from ../public
+  searching for changes
+  no changes found
+  pull obsolescence markers
+  1 new bumped changesets
+
+  $ hg evolve -a
+  recreate:[2] tweak a
+  atop:[1] modify a
+  computing new diff
+  committed as 4d1169d82e47
+  working directory is now at 4d1169d82e47