From 433bb71f552b6db5b898c872a611256441888a5a Mon Sep 17 00:00:00 2001 From: Xuming Meng Date: Fri, 18 Oct 2024 14:06:09 +0200 Subject: [PATCH] feat(config): remove to_list when merging default info --- labgrid/config/managers.bzl | 2 +- labgrid/config/rule.bzl | 34 ++++++++++------------------------ labgrid/executor/args.bzl | 5 ++--- labgrid/executor/executor.py | 12 ++++++++---- 4 files changed, 21 insertions(+), 32 deletions(-) diff --git a/labgrid/config/managers.bzl b/labgrid/config/managers.bzl index df1bb66e..beeaa821 100644 --- a/labgrid/config/managers.bzl +++ b/labgrid/config/managers.bzl @@ -15,7 +15,7 @@ managers = rule( doc = DOC, attrs = ATTRS, implementation = implementation, - provides = [DefaultInfo, PyInfo], + provides = [PyInfo], toolchains = ["//labgrid/toolchain/config:type"], cfg = _cfg, ) diff --git a/labgrid/config/rule.bzl b/labgrid/config/rule.bzl index 3751ead0..35d8aea9 100644 --- a/labgrid/config/rule.bzl +++ b/labgrid/config/rule.bzl @@ -99,32 +99,18 @@ def _runfile(value, separator = "~"): return value def _merge_py_info(targets): - transitive_sources = [] - imports = [] - for target in targets: - p = target[PyInfo] - transitive_sources.extend(p.transitive_sources.to_list() if p.transitive_sources else []) - imports.extend(p.imports.to_list() if p.imports else []) return PyInfo( - transitive_sources = depset(transitive_sources), - imports = depset(imports), + transitive_sources = depset(transitive = [t[PyInfo].transitive_sources for t in targets]), + imports = depset(transitive = [t[PyInfo].imports for t in targets]), ) -def _merge_default_info(targets): - files = [] - data_runfiles = [] - default_runfiles = [] - for target in targets: - d = target[DefaultInfo] - files.extend(d.files.to_list() if d.files else []) - if d.data_runfiles: - data_runfiles.append(d.data_runfiles) - if d.default_runfiles: - default_runfiles.append(d.default_runfiles) +def _merge_default_info(ctx, targets): + files = depset(transitive = [t.files for t in targets]) + runfiles = ctx.runfiles() + runfiles = runfiles.merge_all([t.default_runfiles for t in targets]) return DefaultInfo( - files = depset(files), - data_runfiles = data_runfiles[0].merge_all(data_runfiles) if data_runfiles else None, - default_runfiles = default_runfiles[0].merge_all(default_runfiles) if default_runfiles else None, + files = files, + runfiles = runfiles, ) def implementation(ctx): @@ -133,10 +119,10 @@ def implementation(ctx): default = DefaultInfo(files = depset([ctx.file.src])) toolchain = platform_common.ToolchainInfo( src = ctx.file.src, - deps = [_merge_default_info(ctx.attr.deps), _merge_py_info(ctx.attr.deps)], + deps = [_merge_default_info(ctx, ctx.attr.deps), _merge_py_info(ctx.attr.deps)], env = env, data = depset(transitive = [d.files for d in data]), - managers = [_merge_default_info(ctx.attr.managers), _merge_py_info(ctx.attr.managers)], + managers = [_merge_default_info(ctx, ctx.attr.managers), _merge_py_info(ctx.attr.managers)], ) return [default, toolchain] diff --git a/labgrid/executor/args.bzl b/labgrid/executor/args.bzl index 138aad82..e09419c6 100644 --- a/labgrid/executor/args.bzl +++ b/labgrid/executor/args.bzl @@ -5,8 +5,7 @@ visibility("//labgrid/executor/...") DOC = "Creates an args file to be passed to `//labgrid/executor`" ATTRS = { - "_manager": attr.label_list( - allow_files = True, + "_managers": attr.label_list( doc = "The manager to use", default = ["//labgrid/config:managers"], cfg = "exec", @@ -28,7 +27,7 @@ def implementation(ctx): output = ctx.actions.declare_file("executor-args.txt") lines = [] - for m in ctx.files._manager: + for m in ctx.files._managers: lines.extend(["--manager", "{}:{}".format(_import_path(m.short_path), "manager")]) for name, value in ctx.attr._env[EnvironmentInfo].environment.items(): lines.extend(["--env", name, value]) diff --git a/labgrid/executor/executor.py b/labgrid/executor/executor.py index b593cf60..fe189732 100644 --- a/labgrid/executor/executor.py +++ b/labgrid/executor/executor.py @@ -19,7 +19,10 @@ from bazel.labgrid.executor.manager import Data, Manager def load(value: str) -> Manager: - name, _, attr = value.partition(":") + name, found, attr = value.partition(":") + if not found: + raise ArgumentTypeError(f"Must be of the form `:`: {value}") + module = import_module(name) try: @@ -47,6 +50,8 @@ def arguments(prsr: ArgumentParser) -> None: help="A manager to load from a Python module, of the form `module.to.load:Manager`.", action="append", type=load, + default=[], + dest="managers", ) prsr.add_argument( "--env", @@ -78,9 +83,8 @@ def main(exe: Path, *args: str) -> int: data = Data(env={}) with ExitStack() as stack: - if parsed.manager: - for manager in parsed.manager: - data = stack.enter_context(manager(data)) + for manager in parsed.managers: + data = stack.enter_context(manager(data)) env = {k: resolve_runfile(v) for k, v in parsed.env} env |= {k: v for k, v in data.env.items() if k != "RUNFILES_DIR"} try: -- GitLab