changeset 33518:d7522f983f37

bookmarks: explicitly convert to 'node' during initialization We know the content of the file is supposed to be full hex. So we can do the translation ourselves and directly check if the node is known. As nice side effect we now have proper error handling for invalid node value. Before: ! wall 0.021580 comb 0.020000 user 0.020000 sys 0.000000 (best of 134) After: ! wall 0.009342 comb 0.010000 user 0.010000 sys 0.000000 (best of 302)
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 07 Jun 2017 22:26:43 +0100
parents b5613bda454e
children 173f1bdc322d
files mercurial/bookmarks.py tests/test-bookmarks.t
diffstat 2 files changed, 12 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/bookmarks.py
+++ b/mercurial/bookmarks.py
@@ -50,7 +50,8 @@
     def __init__(self, repo):
         dict.__init__(self)
         self._repo = repo
-        lookup = repo.changelog.lookup
+        nm = repo.changelog.nodemap
+        tonode = bin # force local lookup
         try:
             bkfile = _getbkfile(repo)
             for line in bkfile:
@@ -62,11 +63,16 @@
                                  % line)
                     continue
                 sha, refspec = line.split(' ', 1)
-                refspec = encoding.tolocal(refspec)
                 try:
-                    self[refspec] = lookup(sha)
-                except LookupError:
-                    pass
+                    node = tonode(sha)
+                    if node in nm:
+                        refspec = encoding.tolocal(refspec)
+                        self[refspec] = node
+                except (TypeError, ValueError):
+                    # - bin(...) can raise TypeError
+                    # - node in nm can raise ValueError for non-20-bytes entry
+                    repo.ui.warn(_('malformed line in .hg/bookmarks: %r\n')
+                                 % line)
         except IOError as inst:
             if inst.errno != errno.ENOENT:
                 raise
--- a/tests/test-bookmarks.t
+++ b/tests/test-bookmarks.t
@@ -700,7 +700,7 @@
 
 test missing revisions
 
-  $ echo "925d80f479bc z" > .hg/bookmarks
+  $ echo "925d80f479b925d80f479bc925d80f479bccabab z" > .hg/bookmarks
   $ hg book
   no bookmarks set