From 944b3dad3fa853838ee560f1682ece6cf20b3e53 Mon Sep 17 00:00:00 2001 From: psakiev Date: Wed, 14 May 2025 12:26:17 -0600 Subject: [PATCH] More tests --- lib/spack/spack/cmd/mirror.py | 66 ++++++++++++++++++++++-------- lib/spack/spack/test/cmd/mirror.py | 25 +++++++++++ 2 files changed, 73 insertions(+), 18 deletions(-) diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index b641f0b052d..beae3609921 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -240,6 +240,24 @@ def setup_parser(subparser): default=lambda: spack.config.default_modify_scope(), help="configuration scope to modify", ) + set_parser.add_argument( + "--include-file", + help="specs which Spack should always try to add to a mirror" + " (listed in a file, one per line)", + ) + set_parser.add_argument( + "--include-specs", + help="specs which Spack should always try to add to a mirror (specified on command line)", + ) + set_parser.add_argument( + "--exclude-file", + help="specs which Spack should not try to add to a mirror" + " (listed in a file, one per line)", + ) + set_parser.add_argument( + "--exclude-specs", + help="specs which Spack should not try to add to a mirror (specified on command line)", + ) arguments.add_connection_args(set_parser, False) # List @@ -317,6 +335,30 @@ def _default_variable(id_): return None +def _manage_filters(args, mirror) -> bool: + include_specs = [] + if args.include_file: + include_specs.extend(specs_from_text_file(args.include_file, concretize=False)) + if args.include_specs: + include_specs.extend(spack.cmd.parse_specs(str(args.include_specs).split())) + if include_specs: + # round trip specs to assure they are valid + mirror.update({"include": [str(s) for s in include_specs]}) + + exclude_specs = [] + if args.exclude_file: + exclude_specs.extend(specs_from_text_file(args.exclude_file, concretize=False)) + if args.exclude_specs: + exclude_specs.extend(spack.cmd.parse_specs(str(args.exclude_specs).split())) + if exclude_specs: + # round trip specs to assure they are valid + mirror.update({"exclude": [str(s) for s in exclude_specs]}) + if include_specs or exclude_specs: + return True + else: + return False + + def mirror_add(args): """add a mirror to Spack""" if ( @@ -387,23 +429,7 @@ def mirror_add(args): else: mirror = spack.mirrors.mirror.Mirror(args.url, name=args.name) - include_specs = [] - if args.include_file: - include_specs.extend(specs_from_text_file(args.include_file, concretize=False)) - if args.include_specs: - include_specs.extend(spack.cmd.parse_specs(str(args.include_specs).split())) - if include_specs: - # round trip specs to assure they are valid - mirror.update({"include": [str(s) for s in include_specs]}) - - exclude_specs = [] - if args.exclude_file: - exclude_specs.extend(specs_from_text_file(args.exclude_file, concretize=False)) - if args.exclude_specs: - exclude_specs.extend(spack.cmd.parse_specs(str(args.exclude_specs).split())) - if exclude_specs: - # round trip specs to assure they are valid - mirror.update({"exclude": [str(s) for s in exclude_specs]}) + _manage_filters(args, mirror) spack.mirrors.utils.add(mirror, args.scope) @@ -465,6 +491,7 @@ def _configure_mirror(args): changes["source"] = "source" in args.type changed = entry.update(changes, direction) + changed = changed | _manage_filters(args, entry) if changed: mirrors[args.name] = entry.to_dict() @@ -507,7 +534,10 @@ def specs_from_text_file(filename, concretize=False): with open(filename, "r", encoding="utf-8") as f: specs_in_file = f.readlines() specs_in_file = [s.strip() for s in specs_in_file] - return spack.cmd.parse_specs(" ".join(specs_in_file), concretize=concretize) + if concretize: + return spack.cmd.parse_specs(" ".join(specs_in_file), concretize=True) + else: + return spack.cmd.parse_specs(specs_in_file, concretize=False) def concrete_specs_from_user(args): diff --git a/lib/spack/spack/test/cmd/mirror.py b/lib/spack/spack/test/cmd/mirror.py index cd1fe699986..6669168bbfa 100644 --- a/lib/spack/spack/test/cmd/mirror.py +++ b/lib/spack/spack/test/cmd/mirror.py @@ -561,3 +561,28 @@ def test_mirror_add_set_autopush(mutable_config): mirror("set", "--autopush", "example") assert spack.config.get("mirrors:example") == {"url": "http://example.com", "autopush": True} mirror("remove", "example") + + +def test_mirror_add_filters(mutable_config, tmpdir): + exclude_path = os.path.join(str(tmpdir), "test-exclude.txt") + with open(exclude_path, "w", encoding="utf-8") as exclude_file: + exclude_file.write( + """\ +mpich@3.0.1:3.0.2 +mpich@1.0 +""" + ) + include_path = os.path.join(str(tmpdir), "test-include.txt") + with open(include_path, "w", encoding="utf-8") as include_file: + include_file.write( + """\ +build_type=Debug +gcc-runtime +""" + ) + mirror("add", "--exclude-specs", "foo", "example", "http://example.com") + assert spack.config.get("mirrors:example") == {"url": "http://example.com", "exclude": ["foo"]} + mirror("set", "--include-specs", "+shared", "example") + assert spack.config.get("mirrors:example") == {"url": "http://example.com", "exclude": ["foo"], "include": ["+shared"]} + mirror("set", "--include-file", include_path,"--exclude-file", exclude_path, "example") + assert spack.config.get("mirrors:example") == {"url": "http://example.com", "exclude": ["mpich@3.0.1:3.0.2", "mpich@1.0"], "include": ["build_type=Debug", "gcc-runtime"]}