changeset 17865:daf32ebfde6b stable

bookmark: prevent crashing when a successor is unknown locally (issue3680) The `%ln` revset substitution does not accept unknown node. We prune unknown node from potential successors before computing descendants. This have no impact on the result of this function. - Descendants of unknown changeset as unknown, - all successors of unknown changesets are already return by the call who returned those same unknown changesets, - unknown changesets are never a valid destination for a bookmark.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Thu, 25 Oct 2012 23:43:52 +0200
parents d044a762f47f
children 75b43843eb4d
files mercurial/bookmarks.py tests/test-bookmarks-pushpull.t
diffstat 2 files changed, 5 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/bookmarks.py	Thu Oct 25 23:36:03 2012 +0200
+++ b/mercurial/bookmarks.py	Thu Oct 25 23:43:52 2012 +0200
@@ -256,7 +256,7 @@
     elif repo.obsstore:
         # We only need this complicated logic if there is obsolescence
         # XXX will probably deserve an optimised revset.
-
+        nm = repo.changelog.nodemap
         validdests = set([old])
         plen = -1
         # compute the whole set of successors or descendants
@@ -268,7 +268,8 @@
                     # obsolescence marker does not apply to public changeset
                     succs.update(obsolete.allsuccessors(repo.obsstore,
                                                         [c.node()]))
-            validdests = set(repo.set('%ln::', succs))
+            known = (n for n in succs if nm.get(n) is not None)
+            validdests = set(repo.set('%ln::', known))
         validdests.remove(old)
         return new in validdests
     else:
--- a/tests/test-bookmarks-pushpull.t	Thu Oct 25 23:36:03 2012 +0200
+++ b/tests/test-bookmarks-pushpull.t	Thu Oct 25 23:43:52 2012 +0200
@@ -262,7 +262,8 @@
   4efff6d98829d9c824c621afd6e3f01865f5439f
   $ hg id --debug -r 5
   c922c0139ca03858f655e4a2af4dd02796a63969 tip Y
-  $ hg debugobsolete f6fc62dde3c0771e29704af56ba4d8af77abcc2f 4efff6d98829d9c824c621afd6e3f01865f5439f
+  $ hg debugobsolete f6fc62dde3c0771e29704af56ba4d8af77abcc2f cccccccccccccccccccccccccccccccccccccccc
+  $ hg debugobsolete cccccccccccccccccccccccccccccccccccccccc 4efff6d98829d9c824c621afd6e3f01865f5439f
   $ hg push http://localhost:$HGPORT2/
   pushing to http://localhost:$HGPORT2/
   searching for changes