Patchwork [2,of,8] perf: get subsettable from appropriate module for Mercurial earlier than 2.9

login
register
mail settings
Submitter Katsunori FUJIWARA
Date Aug. 8, 2016, 9:59 a.m.
Message ID <31662cb0696bf1044424.1470650381@juju>
Download mbox | patch
Permalink /patch/16190/
State Changes Requested
Delegated to: Yuya Nishihara
Headers show

Comments

Katsunori FUJIWARA - Aug. 8, 2016, 9:59 a.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1470649697 -32400
#      Mon Aug 08 18:48:17 2016 +0900
# Node ID 31662cb0696bf10444244d8749a2fb6ba485ad77
# Parent  e5f93a8eb06c9b189c4f2460a66fe8f2d7713655
perf: get subsettable from appropriate module for Mercurial earlier than 2.9

Before this patch, using branchmap.subsettable prevents perfbranchmap
from measuring performance of Mercurial earlier than 2.9 (or
175c6fd8cacc), because 175c6fd8cacc moved subsettable from repoview.py
to branchmap.py, even though there are some code paths for Mercurial
earlier than 2.9.

For example, setting "_prereadsize" attribute in perfindex() and
perfnodelookup() is effective only with hg earlier than 1.8 (or
61c9bc3da402).

To get subsettable from appropriate module, this patch examines
existence of subsettable in branchmap and repoview.

This patch also adds check-perf-code.py an extra check entry to detect
direct usage of subsettable attribute in perf.py.
timeless - Aug. 10, 2016, 6:12 a.m.
FUJIWARA Katsunori wrote:
> +    # bisecting in bcee63733aad::59a9f18d4587 can reache here (both

reach

Patch

diff --git a/contrib/perf.py b/contrib/perf.py
--- a/contrib/perf.py
+++ b/contrib/perf.py
@@ -214,6 +214,24 @@  def safeattrsetter(obj, name, ignoremiss
 
     return setter
 
+# utilities to examine each internal API changes
+
+def getbranchmapsubsettable():
+    # for "historical portability":
+    # subsettable is defined in:
+    # - branchmap since 2.9 (or 175c6fd8cacc)
+    # - repoview since 2.5 (or 59a9f18d4587)
+    for mod in (branchmap, repoview):
+        subsettable = getattr(mod, 'subsettable', None)
+        if subsettable:
+            return subsettable
+
+    # bisecting in bcee63733aad::59a9f18d4587 can reache here (both
+    # branchmap and repoview modules exist, but subsettable attribute
+    # doesn't)
+    raise error.Abort(("perfbranchmap not available with this Mercurial"),
+                      hint="use 2.5 or later")
+
 # perf commands
 
 @command('perfwalk', formatteropts)
@@ -807,10 +825,11 @@  def perfbranchmap(ui, repo, full=False, 
         return d
     # add filter in smaller subset to bigger subset
     possiblefilters = set(repoview.filtertable)
+    subsettable = getbranchmapsubsettable()
     allfilters = []
     while possiblefilters:
         for name in possiblefilters:
-            subset = branchmap.subsettable.get(name)
+            subset = subsettable.get(name)
             if subset not in possiblefilters:
                 break
         else:
diff --git a/tests/check-perf-code.py b/tests/check-perf-code.py
--- a/tests/check-perf-code.py
+++ b/tests/check-perf-code.py
@@ -10,6 +10,8 @@  import sys
 # write static check patterns here
 perfpypats = [
   [
+    (r'(branchmap|repoview)\.subsettable',
+     "use getbranchmapsubsettable() for early Mercurial"),
   ],
   # warnings
   [