[PATCH 5 of 6] perftemplating: stop going through the log command

Boris Feld boris.feld at octobus.net
Mon Jun 11 03:52:24 EDT 2018


# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1527787384 -7200
#      Thu May 31 19:23:04 2018 +0200
# Node ID d3a7e385f495769fc0bdd37a0801dfb7ee7f153d
# Parent  a8dd8972d7b4e809dd9533af7e977ad686b6220c
# EXP-Topic perftemplate
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r d3a7e385f495
perftemplating: stop going through the log command

Only benchmark the rendering phase by moving steps outside of the timed
function:

* revisions resolution,
* template parsing

diff --git a/contrib/perf.py b/contrib/perf.py
--- a/contrib/perf.py
+++ b/contrib/perf.py
@@ -81,6 +81,16 @@ except (AttributeError, ImportError):
     except (AttributeError, ImportError):
         queue = util.queue
 
+try:
+    from mercurial import logcmdutil
+    makelogtemplater = logcmdutil.maketemplater
+except (AttributeError, ImportError):
+    try:
+        from mercurial import cmdutil
+        makelogtemplater = cmdutil.makelogtemplater
+    except (AttributeError, ImportError):
+        makelogtemplater = None
+
 # for "historical portability":
 # define util.safehasattr forcibly, because util.safehasattr has been
 # available since 1.9.3 (or 94b200a11cf7)
@@ -901,14 +911,26 @@ def perfmoonwalk(ui, repo, **opts):
          [('r', 'rev', [], 'revisions to run the template on'),
          ] + formatteropts)
 def perftemplating(ui, repo, **opts):
+    if makelogtemplater is None:
+        ui.write_err('incompatible Mercurial version')
+        return 1
+
     nullui = ui.copy()
     nullui.fout = open(os.devnull, 'wb')
     nullui.disablepager()
     revs = opts.get('rev')
+    if not revs:
+        revs = ['all()']
+    revs = list(scmutil.revrange(repo, revs))
+
+    template = ('{date|shortdate} [{rev}:{node|short}]'
+                ' {author|person}: {desc|firstline}\n')
+    displayer = makelogtemplater(nullui, repo, template)
     def format():
-        commands.log(nullui, repo, rev=revs, date='', user='',
-                     template='{date|shortdate} [{rev}:{node|short}]'
-                              ' {author|person}: {desc|firstline}\n')
+        for r in revs:
+            ctx = repo[r]
+            displayer.show(ctx)
+            displayer.flush(ctx)
 
     timer, fm = gettimer(ui, opts)
     timer(format)


More information about the Mercurial-devel mailing list