diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -645,9 +645,16 @@ class filectx(object): # the easy case: no (relevant) renames if fc2.path() == self.path() and self.path() in actx: return actx[self.path()] - acache = {} + + # the next easiest cases: unambiguous predecessor (name trumps + # history) + if self.path() in actx and fc2.path() not in actx: + return actx[self.path()] + if fc2.path() in actx and self.path() not in actx: + return actx[fc2.path()] # prime the ancestor cache for the working directory + acache = {} for c in (self, fc2): if c._filerev is None: pl = [(n.path(), n.filenode()) for n in c.parents()] diff --git a/tests/test-graft.t b/tests/test-graft.t --- a/tests/test-graft.t +++ b/tests/test-graft.t @@ -72,28 +72,23 @@ Graft a rename: # HG changeset patch # User foo # Date 0 0 - # Node ID d2e44c99fd3f31c176ea4efb9eca9f6306c81756 + # Node ID ef0ef43d49e79e81ddafdc7997401ba0041efc82 # Parent 68795b066622ca79a25816a662041d8f78f3cd9e 2 diff --git a/a b/b rename from a rename to b - --- a/a - +++ b/b - @@ -1,1 +1,1 @@ - -a - +b Look for extra:source $ hg log --debug -r tip - changeset: 7:d2e44c99fd3f31c176ea4efb9eca9f6306c81756 + changeset: 7:ef0ef43d49e79e81ddafdc7997401ba0041efc82 tag: tip phase: draft parent: 0:68795b066622ca79a25816a662041d8f78f3cd9e parent: -1:0000000000000000000000000000000000000000 - manifest: 7:5d59766436fd8fbcd38e7bebef0f6eaf3eebe637 + manifest: 7:e59b6b228f9cbf9903d5e9abf996e083a1f533eb user: foo date: Thu Jan 01 00:00:00 1970 +0000 files+: b @@ -128,16 +123,20 @@ Graft out of order, skipping a merge and checking for directory renames resolving manifests overwrite: False, partial: False - ancestor: 68795b066622, local: d2e44c99fd3f+, remote: 5d205f8b35b6 + ancestor: 68795b066622, local: ef0ef43d49e7+, remote: 5d205f8b35b6 b: local copied/moved to a -> m preserving b for resolve of b updating: b 1/1 files (100.00%) - graft for revision 1 is empty + picked tool 'internal:merge' for b (binary False symlink False) + merging b and a to b + my b@ef0ef43d49e7+ other a@5d205f8b35b6 ancestor a@68795b066622 + premerge successful + b grafting revision 5 searching for copies back to rev 1 resolving manifests overwrite: False, partial: False - ancestor: 4c60f11aa304, local: d2e44c99fd3f+, remote: 97f8bfe72746 + ancestor: 4c60f11aa304, local: 6b9e5368ca4e+, remote: 97f8bfe72746 e: remote is newer -> g updating: e 1/1 files (100.00%) getting e @@ -146,7 +145,7 @@ Graft out of order, skipping a merge and searching for copies back to rev 1 resolving manifests overwrite: False, partial: False - ancestor: 4c60f11aa304, local: 839a7e8fcf80+, remote: 9c233e8e184d + ancestor: 4c60f11aa304, local: 1905859650ec+, remote: 9c233e8e184d e: versions differ -> m d: remote is newer -> g preserving e for resolve of e @@ -155,7 +154,7 @@ Graft out of order, skipping a merge and updating: e 2/2 files (100.00%) picked tool 'internal:merge' for e (binary False symlink False) merging e - my e@839a7e8fcf80+ other e@9c233e8e184d ancestor e@68795b066622 + my e@1905859650ec+ other e@9c233e8e184d ancestor e@68795b066622 warning: conflicts during merge. merging e incomplete! (edit conflicts, then use 'hg resolve --mark') abort: unresolved conflicts, can't continue @@ -201,11 +200,13 @@ Compare with original: View graph: $ hg --config extensions.graphlog= log -G --template '{author}@{rev}.{phase}: {desc}\n' - @ test@10.draft: 3 + @ test@11.draft: 3 + | + o test@10.draft: 4 | - o test@9.draft: 4 + o test@9.draft: 5 | - o test@8.draft: 5 + o bar@8.draft: 1 | o foo@7.draft: 2 | @@ -233,17 +234,17 @@ Graft again onto another branch should p grafting revision 7 $ hg log -r 7 --template '{rev}:{node}\n' - 7:d2e44c99fd3f31c176ea4efb9eca9f6306c81756 + 7:ef0ef43d49e79e81ddafdc7997401ba0041efc82 $ hg log -r 2 --template '{rev}:{node}\n' 2:5c095ad7e90f871700f02dd1fa5012cb4498a2d4 $ hg log --debug -r tip - changeset: 12:95adbe5de6b10f376b699ece9ed5a57cd7b4b0f6 + changeset: 13:9db0f28fd3747e92c57d015f53b5593aeec53c2d tag: tip phase: draft - parent: 11:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f + parent: 12:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f parent: -1:0000000000000000000000000000000000000000 - manifest: 12:9944044f82a462bbaccc9bdf7e0ac5b811db7d1b + manifest: 13:dc313617b8c32457c0d589e0dbbedfe71f3cd637 user: foo date: Thu Jan 01 00:00:00 1970 +0000 files+: b @@ -261,7 +262,7 @@ Disallow grafting an already grafted cse [255] Disallow grafting already grafted csets with the same origin onto each other - $ hg up -q 12 + $ hg up -q 13 $ hg graft 2 skipping already grafted revision 2 [255] @@ -274,5 +275,5 @@ Disallow grafting already grafted csets skipping already grafted revision 2 [255] $ hg graft tip - skipping already grafted revision 12 (same origin 2) + skipping already grafted revision 13 (same origin 2) [255]