From 2b16e2d4d4d03fdc1aede71d85b219e056fd51a9 Mon Sep 17 00:00:00 2001 From: Jan Schmitz <44864658+danjujan@users.noreply.github.com> Date: Fri, 4 Aug 2023 17:00:23 +0200 Subject: [PATCH] Enable requires support for commands --- tests/experiment/test_workload_util.py | 25 ++++++++++++++++++ .../varats/experiment/workload_util.py | 15 ++++++++++- varats-core/varats/project/project_util.py | 26 +++++++++++++++++++ varats/varats/projects/c_projects/xz.py | 9 ++++--- 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/tests/experiment/test_workload_util.py b/tests/experiment/test_workload_util.py index 729dedc24..0c9c6f4d1 100644 --- a/tests/experiment/test_workload_util.py +++ b/tests/experiment/test_workload_util.py @@ -1,6 +1,7 @@ """Test VaRA workload utilities.""" import unittest from pathlib import Path +from unittest.mock import patch from benchbuild.command import Command, PathToken, RootRenderer from benchbuild.source.base import Revision, Variant @@ -52,6 +53,30 @@ def test_workload_commands_tags_selected(self) -> None: ) self.assertEqual(len(commands), 1) + def test_workload_commands_requires(self) -> None: + revision = Revision(Xz, Variant(Xz.SOURCE[0], "c5c7ceb08a")) + project = Xz(revision=revision) + binary = Xz.binaries_for_revision(ShortCommitHash("c5c7ceb08a"))[0] + + commands = next( + wu.filter_workload_index( + wu.WorkloadSet(wu.WorkloadCategory.EXAMPLE), project.workloads + ) + ) + commands[0]._requires = {"--compress"} + commands = wu.workload_commands( + project, binary, [wu.WorkloadCategory.EXAMPLE] + ) + self.assertEqual(len(commands), 0) + with patch( + "varats.experiment.workload_util.get_extra_config_options", + return_value=["--compress"] + ): + commands = wu.workload_commands( + project, binary, [wu.WorkloadCategory.EXAMPLE] + ) + self.assertEqual(len(commands), 1) + class TestWorkloadFilenames(unittest.TestCase): diff --git a/varats-core/varats/experiment/workload_util.py b/varats-core/varats/experiment/workload_util.py index 8cf66daff..5c4408cfd 100644 --- a/varats-core/varats/experiment/workload_util.py +++ b/varats-core/varats/experiment/workload_util.py @@ -19,6 +19,7 @@ Command, ) +from varats.experiment.experiment_util import get_extra_config_options from varats.project.project_util import ProjectBinaryWrapper from varats.project.varats_project import VProject from varats.report.report import KeyedReportAggregate, ReportTy @@ -92,8 +93,20 @@ def workload_commands( ) ] + # Filter commands that have required args set. + options = set(get_extra_config_options(project)) + + def requires_filter(prj_cmd: ProjectCommand) -> bool: + if hasattr(prj_cmd.command, "requires") and prj_cmd.command.requires: + return bool(options.intersection(prj_cmd.command.requires)) + return True + + available_cmds = filter(requires_filter, project_cmds) + return list( - filter(lambda prj_cmd: prj_cmd.path.name == binary.name, project_cmds) + filter( + lambda prj_cmd: prj_cmd.path.name == binary.name, available_cmds + ) ) diff --git a/varats-core/varats/project/project_util.py b/varats-core/varats/project/project_util.py index a4c27d74d..bbb086bd3 100644 --- a/varats-core/varats/project/project_util.py +++ b/varats-core/varats/project/project_util.py @@ -7,6 +7,7 @@ import benchbuild as bb import pygit2 +from benchbuild.command import Command as _Command from benchbuild.source import Git from benchbuild.utils.cmd import git from plumbum import local @@ -382,3 +383,28 @@ def copy_renamed_git_to_dest(src_dir: Path, dest_dir: Path) -> None: for name in dirs: if name == ".gitted": os.rename(os.path.join(root, name), os.path.join(root, ".git")) + + +class Command(_Command): + """ + Wrapper around benchbuild's Command class. + + Additional functionality: requires attribute: specify required + args that must be added before execution. + """ + + _requires: tp.Set[str] + + def __init__( + self, + *args: tp.Any, + requires: tp.Optional[tp.Set[str]] = None, + **kwargs: tp.Union[str, tp.List[str]], + ) -> None: + + super().__init__(*args, **kwargs) + self._requires = requires if requires else set() + + @property + def requires(self) -> tp.Set[str]: + return self._requires diff --git a/varats/varats/projects/c_projects/xz.py b/varats/varats/projects/c_projects/xz.py index 1fac7c349..f131ce55b 100644 --- a/varats/varats/projects/c_projects/xz.py +++ b/varats/varats/projects/c_projects/xz.py @@ -2,7 +2,7 @@ import typing as tp import benchbuild as bb -from benchbuild.command import Command, SourceRoot, WorkloadSet +from benchbuild.command import SourceRoot, WorkloadSet from benchbuild.source import HTTPMultiple from benchbuild.utils.cmd import autoreconf, make from benchbuild.utils.revision_ranges import ( @@ -18,6 +18,7 @@ from varats.paper.paper_config import PaperConfigSpecificGit from varats.project.project_domain import ProjectDomains from varats.project.project_util import ( + Command, ProjectBinaryWrapper, get_local_project_git_path, BinaryType, @@ -87,7 +88,8 @@ class Xz(VProject): Command( SourceRoot("xz") / RSBinary("xz"), "-k", - "geo-maps/countries-land-1km.geo.json", + output_param=["{output}"], + output=SourceRoot("geo-maps/countries-land-250m.geo.json"), label="countries-land-1km", creates=["geo-maps/countries-land-1km.geo.json.xz"] ) @@ -101,7 +103,8 @@ class Xz(VProject): "--threads=1", "--format=xz", "-vv", - "geo-maps/countries-land-250m.geo.json", + output_param=["{output}"], + output=SourceRoot("geo-maps/countries-land-250m.geo.json"), label="countries-land-250m", creates=["geo-maps/countries-land-250m.geo.json.xz"] )