merge with i18n stable 2.8
authorMatt Mackall <mpm@selenic.com>
Fri, 01 Nov 2013 17:04:03 -0500
branchstable
changeset 19977 d825e4025e39
parent 19973 1184edaead7a (diff)
parent 19976 bd88e3cd1f50 (current diff)
child 19978 5fa349d367e5
merge with i18n
--- a/contrib/check-code.py	Fri Nov 01 11:04:48 2013 -0200
+++ b/contrib/check-code.py	Fri Nov 01 17:04:03 2013 -0500
@@ -426,7 +426,7 @@
         fp.close()
         if "no-" "check-code" in pre:
             if debug:
-                print "Skipping %s for %s it has no-" " check-code" % (
+                print "Skipping %s for %s it has no-" "check-code" % (
                        name, f)
             break
         for p, r in filters:
--- a/hgext/histedit.py	Fri Nov 01 11:04:48 2013 -0200
+++ b/hgext/histedit.py	Fri Nov 01 17:04:03 2013 -0500
@@ -471,6 +471,10 @@
     instead of --outgoing to specify edit target revision exactly in
     such ambiguous situation. See :hg:`help revsets` for detail about
     selecting revisions.
+
+    Returns 0 on success, 1 if user intervention is required (not only
+    for intentional "edit" command, but also for resolving unexpected
+    conflicts).
     """
     # TODO only abort if we try and histedit mq patches, not just
     # blanket if mq patches are applied somewhere
--- a/hgext/largefiles/overrides.py	Fri Nov 01 11:04:48 2013 -0200
+++ b/hgext/largefiles/overrides.py	Fri Nov 01 17:04:03 2013 -0500
@@ -387,8 +387,8 @@
             # the second parent
             lfile = splitstandin
             standin = f
-            msg = _('%s has been turned into a largefile\n'
-                    'use (l)argefile or keep as (n)ormal file?'
+            msg = _('remote turned local normal file %s into a largefile\n'
+                    'use (l)argefile or keep (n)ormal file?'
                     '$$ &Largefile $$ &Normal file') % lfile
             if repo.ui.promptchoice(msg, 0) == 0:
                 processed.append((lfile, "r", None, msg))
@@ -401,8 +401,8 @@
             # the second parent
             standin = lfutil.standin(f)
             lfile = f
-            msg = _('%s has been turned into a normal file\n'
-                    'keep as (l)argefile or use (n)ormal file?'
+            msg = _('remote turned local largefile %s into a normal file\n'
+                    'keep (l)argefile or use (n)ormal file?'
                     '$$ &Largefile $$ &Normal file') % lfile
             if repo.ui.promptchoice(msg, 0) == 0:
                 processed.append((lfile, "r", None, msg))
--- a/hgext/rebase.py	Fri Nov 01 11:04:48 2013 -0200
+++ b/hgext/rebase.py	Fri Nov 01 17:04:03 2013 -0500
@@ -128,7 +128,8 @@
     If a rebase is interrupted to manually resolve a merge, it can be
     continued with --continue/-c or aborted with --abort/-a.
 
-    Returns 0 on success, 1 if nothing to rebase.
+    Returns 0 on success, 1 if nothing to rebase or there are
+    unresolved conflicts.
     """
     originalwd = target = None
     activebookmark = None
@@ -447,9 +448,44 @@
         repo.ui.debug(" already in target\n")
     repo.dirstate.write()
     repo.ui.debug(" merge against %d:%s\n" % (repo[rev].rev(), repo[rev]))
-    base = None
-    if repo[rev].rev() != repo[min(state)].rev():
+    if repo[rev].rev() == repo[min(state)].rev():
+        # Case (1) initial changeset of a non-detaching rebase.
+        # Let the merge mechanism find the base itself.
+        base = None
+    elif not repo[rev].p2():
+        # Case (2) detaching the node with a single parent, use this parent
         base = repo[rev].p1().node()
+    else:
+        # In case of merge, we need to pick the right parent as merge base.
+        #
+        # Imagine we have:
+        # - M: currently rebase revision in this step
+        # - A: one parent of M
+        # - B: second parent of M
+        # - D: destination of this merge step (p1 var)
+        #
+        # If we are rebasing on D, D is the successors of A or B. The right
+        # merge base is the one D succeed to. We pretend it is B for the rest
+        # of this comment
+        #
+        # If we pick B as the base, the merge involves:
+        # - changes from B to M (actual changeset payload)
+        # - changes from B to D (induced by rebase) as D is a rebased
+        #   version of B)
+        # Which exactly represent the rebase operation.
+        #
+        # If we pick the A as the base, the merge involves
+        # - changes from A to M (actual changeset payload)
+        # - changes from A to D (with include changes between unrelated A and B
+        #   plus changes induced by rebase)
+        # Which does not represent anything sensible and creates a lot of
+        # conflicts.
+        for p in repo[rev].parents():
+            if state.get(p.rev()) == repo[p1].rev():
+                base = p.node()
+                break
+    if base is not None:
+        repo.ui.debug("   detach base %d:%s\n" % (repo[base].rev(), repo[base]))
     # When collapsing in-place, the parent is the common ancestor, we
     # have to allow merging with it.
     return merge.update(repo, rev, True, True, False, base, collapse)
--- a/hgext/shelve.py	Fri Nov 01 11:04:48 2013 -0200
+++ b/hgext/shelve.py	Fri Nov 01 17:04:03 2013 -0500
@@ -66,16 +66,7 @@
         except IOError, err:
             if err.errno != errno.ENOENT:
                 raise
-            if mode[0] in 'wa':
-                try:
-                    self.vfs.mkdir()
-                    return self.vfs(self.fname, mode)
-                except IOError, err:
-                    if err.errno != errno.EEXIST:
-                        raise
-            elif mode[0] == 'r':
-                raise util.Abort(_("shelved change '%s' not found") %
-                                 self.name)
+            raise util.Abort(_("shelved change '%s' not found") % self.name)
 
 class shelvedstate(object):
     """Handle persistence during unshelving operations.
@@ -358,11 +349,6 @@
         finally:
             fp.close()
 
-def readshelvedfiles(repo, basename):
-    """return the list of files touched in a shelve"""
-    fp = shelvedfile(repo, basename, 'files').opener()
-    return fp.read().split('\0')
-
 def checkparents(repo, state):
     """check parent while resuming an unshelve"""
     if state.parents != repo.dirstate.parents():
@@ -532,7 +518,8 @@
     else:
         basename = shelved[0]
 
-    shelvedfiles = readshelvedfiles(repo, basename)
+    if not shelvedfile(repo, basename, 'files').exists():
+        raise util.Abort(_("shelved change '%s' not found") % basename)
 
     wlock = lock = tr = None
     try:
@@ -704,5 +691,6 @@
 
 def extsetup(ui):
     cmdutil.unfinishedstates.append(
-        [shelvedstate._filename, False, True, _('unshelve already in progress'),
+        [shelvedstate._filename, False, False,
+         _('unshelve already in progress'),
          _("use 'hg unshelve --continue' or 'hg unshelve --abort'")])
--- a/mercurial/bdiff.c	Fri Nov 01 11:04:48 2013 -0200
+++ b/mercurial/bdiff.c	Fri Nov 01 17:04:03 2013 -0500
@@ -303,6 +303,8 @@
 	struct hunk l, *h;
 	int an, bn, count, pos = 0;
 
+	l.next = NULL;
+
 	if (!PyArg_ParseTuple(args, "SS:bdiff", &sa, &sb))
 		return NULL;
 
@@ -312,7 +314,6 @@
 	if (!a || !b)
 		goto nomem;
 
-	l.next = NULL;
 	count = diff(a, an, b, bn, &l);
 	if (count < 0)
 		goto nomem;
@@ -344,6 +345,8 @@
 	Py_ssize_t len = 0, la, lb;
 	PyThreadState *_save;
 
+	l.next = NULL;
+
 	if (!PyArg_ParseTuple(args, "s#s#:bdiff", &sa, &la, &sb, &lb))
 		return NULL;
 
@@ -358,7 +361,6 @@
 	if (!al || !bl)
 		goto nomem;
 
-	l.next = NULL;
 	count = diff(al, an, bl, bn, &l);
 	if (count < 0)
 		goto nomem;
--- a/mercurial/help/dates.txt	Fri Nov 01 11:04:48 2013 -0200
+++ b/mercurial/help/dates.txt	Fri Nov 01 17:04:03 2013 -0500
@@ -24,7 +24,7 @@
 
 Lastly, there is Mercurial's internal format:
 
-- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)
+- ``1165411109 0`` (Wed Dec 6 13:18:29 2006 UTC)
 
 This is the internal representation format for dates. The first number
 is the number of seconds since the epoch (1970-01-01 00:00 UTC). The
--- a/mercurial/patch.py	Fri Nov 01 11:04:48 2013 -0200
+++ b/mercurial/patch.py	Fri Nov 01 17:04:03 2013 -0500
@@ -1703,7 +1703,7 @@
             tn = getfilectx(f, ctx2).data()
         a, b = f, f
         if opts.git or losedatafn:
-            if f in added:
+            if f in added or (f in modified and to is None):
                 mode = gitmode[ctx2.flags(f)]
                 if f in copy or f in copyto:
                     if opts.git:
@@ -1739,7 +1739,7 @@
                 if not opts.git and not tn:
                     # regular diffs cannot represent new empty file
                     losedatafn(f)
-            elif f in removed:
+            elif f in removed or (f in modified and tn is None):
                 if opts.git:
                     # have we already reported a copy above?
                     if ((f in copy and copy[f] in added
Binary file tests/bundles/issue4041.hg has changed
--- a/tests/test-git-export.t	Fri Nov 01 11:04:48 2013 -0200
+++ b/tests/test-git-export.t	Fri Nov 01 17:04:03 2013 -0500
@@ -360,3 +360,23 @@
   +foo
   $ hg ci -m 'add filename with spaces'
 
+Additions should be properly marked even in the middle of a merge
+
+  $ hg up -r -2
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo "New File" >> inmerge
+  $ hg add inmerge
+  $ hg ci -m "file in merge"
+  created new head
+  $ hg up 23
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg merge
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg diff -g
+  diff --git a/inmerge b/inmerge
+  new file mode 100644
+  --- /dev/null
+  +++ b/inmerge
+  @@ -0,0 +1,1 @@
+  +New File
--- a/tests/test-issue3084.t	Fri Nov 01 11:04:48 2013 -0200
+++ b/tests/test-issue3084.t	Fri Nov 01 17:04:03 2013 -0500
@@ -28,8 +28,8 @@
 Normal file in the working copy, keeping the normal version:
 
   $ echo "n" | hg merge --config ui.interactive=Yes
-  foo has been turned into a largefile
-  use (l)argefile or keep as (n)ormal file? 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  remote turned local normal file foo into a largefile
+  use (l)argefile or keep (n)ormal file? 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
   getting changed largefiles
   0 largefiles updated, 0 removed
@@ -42,8 +42,8 @@
 
   $ hg update -q -C
   $ echo "l" | hg merge --config ui.interactive=Yes
-  foo has been turned into a largefile
-  use (l)argefile or keep as (n)ormal file? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  remote turned local normal file foo into a largefile
+  use (l)argefile or keep (n)ormal file? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
   getting changed largefiles
   1 largefiles updated, 0 removed
@@ -70,8 +70,8 @@
 
   $ hg update -q -C -r 1
   $ echo "n" | hg merge --config ui.interactive=Yes
-  foo has been turned into a normal file
-  keep as (l)argefile or use (n)ormal file? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  remote turned local largefile foo into a normal file
+  keep (l)argefile or use (n)ormal file? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
   getting changed largefiles
   0 largefiles updated, 0 removed
@@ -98,8 +98,8 @@
 
   $ hg update -q -C -r 1
   $ echo "l" | hg merge --config ui.interactive=Yes
-  foo has been turned into a normal file
-  keep as (l)argefile or use (n)ormal file? 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  remote turned local largefile foo into a normal file
+  keep (l)argefile or use (n)ormal file? 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
   getting changed largefiles
   1 largefiles updated, 0 removed
@@ -137,3 +137,221 @@
   large
 
   $ cd ..
+
+
+Systematic testing of merges involving largefiles:
+
+Ancestor: normal  Parent: normal=  Parent: large   result: large
+Ancestor: normal  Parent: normal2  Parent: large   result: ?
+Ancestor: large   Parent: large=   Parent: normal  result: normal
+Ancestor: large   Parent: large2   Parent: normal  result: ?
+
+All cases should try merging both ways.
+"=" means same file content.
+
+Prepare test repo:
+
+  $ hg init merges
+  $ cd merges
+  $ touch f1
+  $ hg ci -Aqm "0-root"
+
+ancestor is "normal":
+  $ echo normal > f
+  $ hg ci -Aqm "1-normal-ancestor"
+  $ touch f2
+  $ hg ci -Aqm "2-normal-unchanged"
+  $ hg tag -l "normal="
+  $ echo normal2 > f
+  $ hg ci -m "3-normal2"
+  $ hg tag -l "normal2"
+  $ hg up -qr 1
+  $ hg rm f
+  $ echo large > f
+  $ hg add --large f
+  $ hg ci -qm "4-normal-to-large"
+  $ hg tag -l "large"
+
+  $ hg up -qr null
+
+ancestor is "large":
+  $ echo large > f
+  $ hg add --large f
+  $ hg ci -qm "5-large-ancestor"
+  $ touch f2
+  $ hg ci -Aqm "6-large-unchanged"
+  $ hg tag -l "large="
+  $ echo large2 > f
+  $ hg ci -m "7-large2"
+  $ hg tag -l "large2"
+  $ hg up -qr 5
+  $ hg rm f
+  $ echo normal > f
+  $ hg ci -qAm "8-large-to-normal"
+  $ hg tag -l "normal"
+
+Ancestor: normal  Parent: normal=  Parent: large   result: large
+
+  $ hg up -Cqr normal=
+  $ hg merge -r large
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ cat f
+  large
+
+swap
+
+  $ hg up -Cqr large
+  $ hg merge -r normal=
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  0 largefiles updated, 0 removed
+  $ cat f
+  large
+
+Ancestor: normal  Parent: normal2  Parent: large   result: ?
+(annoying extra prompt ... but it do not do any serious harm)
+
+  $ hg up -Cqr normal2
+  $ hg merge -r large
+  local changed f which remote deleted
+  use (c)hanged version or (d)elete? c
+  remote turned local normal file f into a largefile
+  use (l)argefile or keep (n)ormal file? l
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ cat f
+  large
+
+  $ hg up -Cqr normal2
+  $ ( echo c; echo n ) | hg merge -r large --config ui.interactive=Yes
+  local changed f which remote deleted
+  use (c)hanged version or (d)elete? remote turned local normal file f into a largefile
+  use (l)argefile or keep (n)ormal file? 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  0 largefiles updated, 0 removed
+  $ cat f
+  normal2
+
+  $ hg up -Cqr normal2
+  $ echo d | hg merge -r large --config ui.interactive=Yes
+  local changed f which remote deleted
+  use (c)hanged version or (d)elete? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ cat f
+  large
+
+swap
+
+  $ hg up -Cqr large
+  $ hg merge -r normal2
+  remote changed f which local deleted
+  use (c)hanged version or leave (d)eleted? c
+  remote turned local largefile f into a normal file
+  keep (l)argefile or use (n)ormal file? l
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ cat f
+  large
+
+  $ hg up -Cqr large
+  $ ( echo c; echo n ) | hg merge -r normal2 --config ui.interactive=Yes
+  remote changed f which local deleted
+  use (c)hanged version or leave (d)eleted? remote turned local largefile f into a normal file
+  keep (l)argefile or use (n)ormal file? 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  0 largefiles updated, 0 removed
+  $ cat f
+  normal2
+
+  $ hg up -Cqr large
+  $ echo d | hg merge -r normal2 --config ui.interactive=Yes
+  remote changed f which local deleted
+  use (c)hanged version or leave (d)eleted? 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  0 largefiles updated, 0 removed
+  $ cat f
+  large
+
+Ancestor: large   Parent: large=   Parent: normal  result: normal
+
+  $ hg up -Cqr large=
+  $ hg merge -r normal
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  0 largefiles updated, 0 removed
+  $ cat f
+  normal
+
+swap
+
+  $ hg up -Cqr normal
+  $ hg merge -r large=
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ cat f
+  normal
+
+Ancestor: large   Parent: large2   Parent: normal  result: ?
+(annoying extra prompt ... but it do not do any serious harm)
+
+  $ hg up -Cqr large2
+  $ hg merge -r normal
+  local changed .hglf/f which remote deleted
+  use (c)hanged version or (d)elete? c
+  remote turned local largefile f into a normal file
+  keep (l)argefile or use (n)ormal file? l
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ cat f
+  large2
+
+  $ hg up -Cqr large2
+  $ echo d | hg merge -r normal --config ui.interactive=Yes
+  local changed .hglf/f which remote deleted
+  use (c)hanged version or (d)elete? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  0 largefiles updated, 0 removed
+  $ cat f
+  normal
+
+swap
+
+  $ hg up -Cqr normal
+  $ hg merge -r large2
+  remote changed .hglf/f which local deleted
+  use (c)hanged version or leave (d)eleted? c
+  remote turned local normal file f into a largefile
+  use (l)argefile or keep (n)ormal file? l
+  2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ cat f
+  large2
+
+  $ hg up -Cqr normal
+  $ echo d | hg merge -r large2 --config ui.interactive=Yes
+  remote changed .hglf/f which local deleted
+  use (c)hanged version or leave (d)eleted? 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ cat f
+  normal
+
+  $ cd ..
--- a/tests/test-rebase-conflicts.t	Fri Nov 01 11:04:48 2013 -0200
+++ b/tests/test-rebase-conflicts.t	Fri Nov 01 17:04:03 2013 -0500
@@ -124,3 +124,184 @@
    * mybook                    5:d67b21408fc0
 
   $ cd ..
+
+Check that the right ancestors is used while rebasing a merge (issue4041)
+
+  $ hg clone "$TESTDIR/bundles/issue4041.hg" issue4041
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 11 changesets with 8 changes to 3 files (+1 heads)
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd issue4041
+  $ hg phase --draft --force 9
+  $ hg log -G
+  o    changeset:   10:2f2496ddf49d
+  |\   branch:      f1
+  | |  tag:         tip
+  | |  parent:      7:4c9fbe56a16f
+  | |  parent:      9:e31216eec445
+  | |  user:        szhang
+  | |  date:        Thu Sep 05 12:59:39 2013 -0400
+  | |  summary:     merge
+  | |
+  | o  changeset:   9:e31216eec445
+  | |  branch:      f1
+  | |  user:        szhang
+  | |  date:        Thu Sep 05 12:59:10 2013 -0400
+  | |  summary:     more changes to f1
+  | |
+  | o    changeset:   8:8e4e2c1a07ae
+  | |\   branch:      f1
+  | | |  parent:      2:4bc80088dc6b
+  | | |  parent:      6:400110238667
+  | | |  user:        szhang
+  | | |  date:        Thu Sep 05 12:57:59 2013 -0400
+  | | |  summary:     bad merge
+  | | |
+  o | |  changeset:   7:4c9fbe56a16f
+  |/ /   branch:      f1
+  | |    parent:      2:4bc80088dc6b
+  | |    user:        szhang
+  | |    date:        Thu Sep 05 12:54:00 2013 -0400
+  | |    summary:     changed f1
+  | |
+  | o  changeset:   6:400110238667
+  | |  branch:      f2
+  | |  parent:      4:12e8ec6bb010
+  | |  user:        szhang
+  | |  date:        Tue Sep 03 13:58:02 2013 -0400
+  | |  summary:     changed f2 on f2
+  | |
+  | | @  changeset:   5:d79e2059b5c0
+  | | |  parent:      3:8a951942e016
+  | | |  user:        szhang
+  | | |  date:        Tue Sep 03 13:57:39 2013 -0400
+  | | |  summary:     changed f2 on default
+  | | |
+  | o |  changeset:   4:12e8ec6bb010
+  | |/   branch:      f2
+  | |    user:        szhang
+  | |    date:        Tue Sep 03 13:57:18 2013 -0400
+  | |    summary:     created f2 branch
+  | |
+  | o  changeset:   3:8a951942e016
+  | |  parent:      0:24797d4f68de
+  | |  user:        szhang
+  | |  date:        Tue Sep 03 13:57:11 2013 -0400
+  | |  summary:     added f2.txt
+  | |
+  o |  changeset:   2:4bc80088dc6b
+  | |  branch:      f1
+  | |  user:        szhang
+  | |  date:        Tue Sep 03 13:56:20 2013 -0400
+  | |  summary:     added f1.txt
+  | |
+  o |  changeset:   1:ef53c9e6b608
+  |/   branch:      f1
+  |    user:        szhang
+  |    date:        Tue Sep 03 13:55:26 2013 -0400
+  |    summary:     created f1 branch
+  |
+  o  changeset:   0:24797d4f68de
+     user:        szhang
+     date:        Tue Sep 03 13:55:08 2013 -0400
+     summary:     added default.txt
+  
+  $ hg rebase -s9 -d2 --debug # use debug to really check merge base used
+  rebase onto 2 starting from [<changectx e31216eec445>]
+  rebasing: 9:e31216eec445 5/6 changesets (83.33%)
+   future parents are 2 and -1
+  rebase status stored
+   update to 2:4bc80088dc6b
+  resolving manifests
+   branchmerge: False, force: True, partial: False
+   ancestor: d79e2059b5c0+, local: d79e2059b5c0+, remote: 4bc80088dc6b
+   f2.txt: other deleted -> r
+   f1.txt: remote created -> g
+  removing f2.txt
+  updating: f2.txt 1/2 files (50.00%)
+  getting f1.txt
+  updating: f1.txt 2/2 files (100.00%)
+   merge against 9:e31216eec445
+     detach base 8:8e4e2c1a07ae
+    searching for copies back to rev 3
+  resolving manifests
+   branchmerge: True, force: True, partial: False
+   ancestor: 8e4e2c1a07ae, local: 4bc80088dc6b+, remote: e31216eec445
+   f1.txt: remote is newer -> g
+  getting f1.txt
+  updating: f1.txt 1/1 files (100.00%)
+  f1.txt
+  rebasing: 10:2f2496ddf49d 6/6 changesets (100.00%)
+   future parents are 11 and 7
+  rebase status stored
+   already in target
+   merge against 10:2f2496ddf49d
+     detach base 9:e31216eec445
+    searching for copies back to rev 3
+  resolving manifests
+   branchmerge: True, force: True, partial: False
+   ancestor: e31216eec445, local: 19c888675e13+, remote: 2f2496ddf49d
+   f1.txt: remote is newer -> g
+  getting f1.txt
+  updating: f1.txt 1/1 files (100.00%)
+  f1.txt
+  rebase merging completed
+  update back to initial working directory parent
+  resolving manifests
+   branchmerge: False, force: False, partial: False
+   ancestor: 2a7f09cac94c, local: 2a7f09cac94c+, remote: d79e2059b5c0
+   f1.txt: other deleted -> r
+   f2.txt: remote created -> g
+  removing f1.txt
+  updating: f1.txt 1/2 files (50.00%)
+  getting f2.txt
+  updating: f2.txt 2/2 files (100.00%)
+  3 changesets found
+  list of changesets:
+  4c9fbe56a16f30c0d5dcc40ec1a97bbe3325209c
+  e31216eec445e44352c5f01588856059466a24c9
+  2f2496ddf49d69b5ef23ad8cf9fb2e0e4faf0ac2
+  bundling: 1/3 changesets (33.33%)
+  bundling: 2/3 changesets (66.67%)
+  bundling: 3/3 changesets (100.00%)
+  bundling: 1/3 manifests (33.33%)
+  bundling: 2/3 manifests (66.67%)
+  bundling: 3/3 manifests (100.00%)
+  bundling: f1.txt 1/1 files (100.00%)
+  saved backup bundle to $TESTTMP/issue4041/.hg/strip-backup/e31216eec445-backup.hg (glob)
+  3 changesets found
+  list of changesets:
+  4c9fbe56a16f30c0d5dcc40ec1a97bbe3325209c
+  19c888675e133ab5dff84516926a65672eaf04d9
+  2a7f09cac94c7f4b73ebd5cd1a62d3b2e8e336bf
+  bundling: 1/3 changesets (33.33%)
+  bundling: 2/3 changesets (66.67%)
+  bundling: 3/3 changesets (100.00%)
+  bundling: 1/3 manifests (33.33%)
+  bundling: 2/3 manifests (66.67%)
+  bundling: 3/3 manifests (100.00%)
+  bundling: f1.txt 1/1 files (100.00%)
+  adding branch
+  adding changesets
+  changesets: 1 chunks
+  add changeset 4c9fbe56a16f
+  changesets: 2 chunks
+  add changeset 19c888675e13
+  changesets: 3 chunks
+  add changeset 2a7f09cac94c
+  adding manifests
+  manifests: 1/2 chunks (50.00%)
+  manifests: 2/2 chunks (100.00%)
+  manifests: 3/2 chunks (150.00%)
+  adding file changes
+  adding f1.txt revisions
+  files: 1/1 chunks (100.00%)
+  added 2 changesets with 2 changes to 1 files
+  removing unknown node e31216eec445 from 1-phase boundary
+  invalid branchheads cache (served): tip differs
+  rebase completed
+  updating the branch cache
--- a/tests/test-shelve.t	Fri Nov 01 11:04:48 2013 -0200
+++ b/tests/test-shelve.t	Fri Nov 01 17:04:03 2013 -0500
@@ -228,6 +228,7 @@
   +a
   +>>>>>>> other
   diff --git a/b.rename/b b/b.rename/b
+  new file mode 100644
   --- /dev/null
   +++ b/b.rename/b
   @@ -0,0 +1,1 @@
@@ -239,6 +240,7 @@
   @@ -1,1 +0,0 @@
   -b
   diff --git a/c.copy b/c.copy
+  new file mode 100644
   --- /dev/null
   +++ b/c.copy
   @@ -0,0 +1,1 @@
@@ -303,6 +305,11 @@
   $ hg revert -r . a/a
   $ hg resolve -m a/a
 
+  $ hg commit -m 'commit while unshelve in progress'
+  abort: unshelve already in progress
+  (use 'hg unshelve --continue' or 'hg unshelve --abort')
+  [255]
+
   $ hg unshelve -c
   unshelve of 'default' complete