changelog: lazy decode description (API)
authorGregory Szorc <gregory.szorc@gmail.com>
Sat, 27 Feb 2016 22:25:14 -0800
changeset 28306 1778770e1982
parent 28305 f5ae291dfedf
child 28307 86de91c56355
changelog: lazy decode description (API) Currently, changelog reading decodes read values. This is wasteful because a lot of times consumers aren't interested in some of these values. This patch changes description decoding to occur in changectx as needed. revsets reading changelog entries appear to speed up slightly: revset #7: author(lmoscovicz) plain 0) 0.906329 1) 0.872653 revset #8: author(mpm) plain 0) 0.903478 1) 0.878037 revset #9: author(lmoscovicz) or author(mpm) plain 0) 1.817855 1) 1.778680 revset #10: author(mpm) or author(lmoscovicz) plain 0) 1.837052 1) 1.764568
mercurial/changelog.py
mercurial/context.py
--- a/mercurial/changelog.py	Thu Feb 11 19:38:26 2016 +0000
+++ b/mercurial/changelog.py	Sat Feb 27 22:25:14 2016 -0800
@@ -334,12 +334,20 @@
         (.*)            : comment (free text, ideally utf-8)
 
         changelog v0 doesn't use extra
+
+        Returns a 6-tuple consisting of the following:
+          - manifest node (binary)
+          - user (encoding.localstr)
+          - (time, timezone) 2-tuple of a float and int offset
+          - list of files modified by the cset
+          - commit message / description (binary)
+          - dict of extra entries
         """
         text = self.revision(node)
         if not text:
             return nullid, "", (0, 0), [], "", _defaultextra
         last = text.index("\n\n")
-        desc = encoding.tolocal(text[last + 2:])
+        desc = text[last + 2:]
         l = text[:last].split('\n')
         manifest = bin(l[0])
         user = encoding.tolocal(l[1])
--- a/mercurial/context.py	Thu Feb 11 19:38:26 2016 +0000
+++ b/mercurial/context.py	Sat Feb 27 22:25:14 2016 -0800
@@ -554,7 +554,7 @@
     def files(self):
         return self._changeset[3]
     def description(self):
-        return self._changeset[4]
+        return encoding.tolocal(self._changeset[4])
     def branch(self):
         return encoding.tolocal(self._changeset[5].get("branch"))
     def closesbranch(self):