contrib/benchmarks/revset.py
author Gregory Szorc <gregory.szorc@gmail.com>
Thu, 06 Jul 2017 12:14:03 -0700
changeset 33297 ba5d89774db6
parent 30406 cff0f5926797
child 43076 2372284d9457
permissions -rw-r--r--
sparse: move config parsing into core This patch marks the beginning of moving code from the sparse extension into core. The goal is to move as much of the functionality as possible into core, where it will be an experimental feature. The extension will likely continue to exist to enable the feature and provide UI elements. As part of the move, the repo method was converted to a module function. It doesn't need to exist on repos. An error message was also updated to reflect that an error isn't necessarily from the .hg/sparse file. The API should be updated later to pass in a filename so the error can be more descriptive. Copyright of the added file was copied from the sparse extension.

# revset.py - asv revset benchmarks
#
# Copyright 2016 Logilab SA <contact@logilab.fr>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

'''ASV revset benchmarks generated from contrib/base-revsets.txt

Each revset benchmark is parameterized with variants (first, last, sort, ...)
'''

from __future__ import absolute_import

import os
import string
import sys

from . import basedir, perfbench

def createrevsetbenchmark(baseset, variants=None):
    if variants is None:
        # Default variants
        variants = ["plain", "first", "last", "sort", "sort+first",
                    "sort+last"]
    fname = "track_" + "_".join("".join([
        c if c in string.digits + string.letters else " "
        for c in baseset
    ]).split())

    def wrap(fname, baseset):
        @perfbench(name=baseset, params=[("variant", variants)])
        def f(perf, variant):
            revset = baseset
            if variant != "plain":
                for var in variant.split("+"):
                    revset = "%s(%s)" % (var, revset)
            return perf("perfrevset", revset)
        f.__name__ = fname
        return f
    return wrap(fname, baseset)

def initializerevsetbenchmarks():
    mod = sys.modules[__name__]
    with open(os.path.join(basedir, 'contrib', 'base-revsets.txt'),
              'rb') as fh:
        for line in fh:
            baseset = line.strip()
            if baseset and not baseset.startswith('#'):
                func = createrevsetbenchmark(baseset)
                setattr(mod, func.__name__, func)

initializerevsetbenchmarks()