changeset 22302:9472284df4eb stable

graft: fix collision detection with origin revisions that are missing When grafting something with a matching origin, it would normally be skipped: skipping already grafted revision 123 (23 also has origin 12) But after stripping a graft origin, graft could fail with a reference to the origin that no longer exists: abort: unknown revision '5c095ad7e90f871700f02dd1fa5012cb4498a2d4'! Instead, detect that the origin is unknown and skip it anyway, like: skipping already grafted revision 8 (2 also has unknown origin 5c095ad7e90f871700f02dd1fa5012cb4498a2d4)
author Mads Kiilerich <madski@unity3d.com>
date Wed, 27 Aug 2014 15:30:09 +0200
parents f6371cc62d2a
children 0c838e7459a5
files mercurial/commands.py tests/test-graft.t
diffstat 2 files changed, 24 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/commands.py	Sat Aug 23 17:03:08 2014 -0500
+++ b/mercurial/commands.py	Wed Aug 27 15:30:09 2014 +0200
@@ -3183,14 +3183,23 @@
         ctx = repo[rev]
         n = ctx.extra().get('source')
         if n in ids:
-            r = repo[n].rev()
+            try:
+                r = repo[n].rev()
+            except error.RepoLookupError:
+                r = None
             if r in revs:
                 ui.warn(_('skipping revision %s (already grafted to %s)\n')
                         % (r, rev))
                 revs.remove(r)
             elif ids[n] in revs:
-                ui.warn(_('skipping already grafted revision %s '
-                            '(%s also has origin %d)\n') % (ids[n], rev, r))
+                if r is None:
+                    ui.warn(_('skipping already grafted revision %s '
+                              '(%s also has unknown origin %s)\n')
+                            % (ids[n], rev, n))
+                else:
+                    ui.warn(_('skipping already grafted revision %s '
+                              '(%s also has origin %d)\n')
+                            % (ids[n], rev, r))
                 revs.remove(ids[n])
         elif ctx.hex() in ids:
             r = ids[ctx.hex()]
--- a/tests/test-graft.t	Sat Aug 23 17:03:08 2014 -0500
+++ b/tests/test-graft.t	Wed Aug 27 15:30:09 2014 +0200
@@ -631,3 +631,15 @@
   grafting revision 13
   grafting revision 19
   merging b
+
+
+Continue testing same origin policy, using revision numbers from test above
+but do some destructive editing of the repo:
+
+  $ hg up -qC 7
+  $ hg tag -l -r 13 tmp
+  $ hg --config extensions.mq= strip 2
+  saved backup bundle to $TESTTMP/a/.hg/strip-backup/5c095ad7e90f-backup.hg (glob)
+  $ hg graft tmp
+  skipping already grafted revision 8 (2 also has unknown origin 5c095ad7e90f871700f02dd1fa5012cb4498a2d4)
+  [255]