[PATCH 2 of 2 STABLE] revbranchcache: return uncached branchinfo for nullrev (issue4683)

Yuya Nishihara yuya at tcha.org
Sat May 23 02:58:38 CDT 2015


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1432347240 -32400
#      Sat May 23 11:14:00 2015 +0900
# Branch stable
# Node ID 85c4939beb9019d6495853e9c6e0105742668fc5
# Parent  34e51d3d198185a395c88ce569de2a4aafa6316b
revbranchcache: return uncached branchinfo for nullrev (issue4683)

This fixes the crash caused by "branch(null)" revset. No cache should be
necessary for nullrev because changelog.branchinfo(nullrev) does not involve
IO operation.

Note that the problem of "branch(wdir())" isn't addressed by this patch.
"wdir()" will raise TypeError in many places because of None. This is the
reason why "wdir()" is still experimental.

diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py
--- a/mercurial/branchmap.py
+++ b/mercurial/branchmap.py
@@ -341,6 +341,10 @@ class revbranchcache(object):
         changelog = self._repo.changelog
         rbcrevidx = rev * _rbcrecsize
 
+        # avoid negative index, changelog.read(nullrev) is fast without cache
+        if rev == nullrev:
+            return changelog.branchinfo(rev)
+
         # if requested rev is missing, add and populate all missing revs
         if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
             self._rbcrevs.extend('\0' * (len(changelog) * _rbcrecsize -
diff --git a/tests/test-revset.t b/tests/test-revset.t
--- a/tests/test-revset.t
+++ b/tests/test-revset.t
@@ -1602,6 +1602,14 @@ prepare repository that has "default" br
   $ echo default5 >> a
   $ hg ci -m5
 
+"null" revision belongs to "default" branch (issue4683)
+
+  $ log 'branch(null)'
+  0
+  1
+  4
+  5
+
 "null" revision belongs to "default" branch, but it shouldn't appear in set
 unless explicitly specified (issue4682)
 


More information about the Mercurial-devel mailing list