Patchwork D2232: treemanifest: add an optimized __nonzero__()

login
register
mail settings
Submitter phabricator
Date Feb. 13, 2018, 10:42 p.m.
Message ID <differential-rev-PHID-DREV-mk4kaajftvapxgvw3ql2-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/27848/
State Superseded
Headers show

Comments

phabricator - Feb. 13, 2018, 10:42 p.m.
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  We use bool(manifest) in at least some places:
  
    localrepo.py:1730
    hgweb/webcommands.py:524
  
  Since the treemanifest class doesn't define __nonzero__() (before this
  patch), bool(manifest) will instead call __len__(), which can be slow
  for treemanifests. This patch may make a noticeable difference in the
  localrepo case above, but that only happens when committing a merge
  and I haven't timed it.
  
  Note that Durham already added a __nonzero__ implementation to
  manifestdict in https://phab.mercurial-scm.org/rHGb19291e5d506238acd84f5890da7adadd8167e82 (manifest: add __nonzero__ method,
  2016-11-03).

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2232

AFFECTED FILES
  mercurial/manifest.py

CHANGE DETAILS




To: martinvonz, #hg-reviewers
Cc: mercurial-devel
phabricator - Feb. 14, 2018, 5:11 a.m.
indygreg accepted this revision.
indygreg added a comment.
This revision is now accepted and ready to land.


  Perhaps we should formalize the manifest interface with an abstract base class...

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2232

To: martinvonz, #hg-reviewers, indygreg
Cc: indygreg, mercurial-devel

Patch

diff --git a/mercurial/manifest.py b/mercurial/manifest.py
--- a/mercurial/manifest.py
+++ b/mercurial/manifest.py
@@ -755,6 +755,12 @@ 
             size += m.__len__()
         return size
 
+    def __nonzero__(self):
+        # Faster than "__len() != 0" since it avoids loading sub-manifests
+        return not self._isempty()
+
+    __bool__ = __nonzero__
+
     def _isempty(self):
         self._load() # for consistency; already loaded by all callers
         return (not self._files and (not self._dirs or