Source code for asv.commands.update
# Licensed under a 3-clause BSD style license - see LICENSE.rst
import os
import re
from .. import util
from ..benchmarks import Benchmarks
from ..console import log
from ..machine import Machine, MachineCollection
from ..results import Results, get_filename
from . import Command
from .run import Run
[docs]
class Update(Command):
@classmethod
[docs]
def setup_arguments(cls, subparsers):
parser = subparsers.add_parser(
"update",
help="Update the results and config files to the current version",
description="Update the results and config files to the current version",
)
parser.set_defaults(func=cls.run_from_args)
return parser
@classmethod
[docs]
def run_from_conf_args(cls, conf, args, _machine_file=None):
return cls.run(conf, _machine_file=_machine_file)
@classmethod
[docs]
def run(cls, conf, _machine_file=None):
MachineCollection.update(_path=_machine_file)
log.info("Updating results data...")
for root, dirs, files in os.walk(conf.results_dir):
for filename in files:
path = os.path.join(root, filename)
if filename == 'machine.json':
Machine.update(path)
elif filename == "benchmarks.json":
pass
elif filename.endswith('.json'):
try:
Results.update(path)
except util.UserError as err:
# Conversion failed: just skip the file
log.warning(f"{path}: {err}")
continue
# Rename files if necessary
m = re.match(
r'^([0-9a-f]+)-(.*)\.json$', os.path.basename(path), re.IGNORECASE
)
if m:
new_path = get_filename(root, m.group(1), m.group(2))
if new_path != path:
try:
if os.path.exists(new_path):
raise OSError()
os.rename(path, new_path)
except OSError:
log.warning(f"{path}: should be renamed to {new_path}")
else:
log.warning(f"{path}: unrecognized file name")
# Check benchmarks.json
log.info("Updating benchmarks.json...")
ok = False
try:
Benchmarks.load(conf)
ok = True
except util.UserError:
pass
if not ok:
# Regenerating the file is needed
with log.indent():
Run.run(conf, bench=['just-discover'])