mirrors: make spack mirror environment aware (#12345)

Allow "spack mirror" with no spec arguments to create a mirror for the
active environment (download all concretized specs in the environment)
This commit is contained in:
Greg Becker 2019-08-15 18:45:17 -07:00 committed by Peter Scheibel
parent 46e8de914a
commit 0307b5a3dc
3 changed files with 38 additions and 4 deletions

View File

@ -17,6 +17,7 @@
import spack.mirror import spack.mirror
import spack.repo import spack.repo
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments
import spack.environment as ev
from spack.spec import Spec from spack.spec import Spec
from spack.error import SpackError from spack.error import SpackError
from spack.util.spack_yaml import syaml_dict from spack.util.spack_yaml import syaml_dict
@ -161,8 +162,12 @@ def mirror_create(args):
tty.die("Cannot pass specs on the command line with --file.") tty.die("Cannot pass specs on the command line with --file.")
specs = _read_specs_from_file(args.file) specs = _read_specs_from_file(args.file)
# If nothing is passed, use all packages. # If nothing is passed, use environment or all if no active env
if not specs: if not specs:
env = ev.get_env(args, 'mirror')
if env:
specs = env.specs_by_hash.values()
else:
specs = [Spec(n) for n in spack.repo.all_package_names()] specs = [Spec(n) for n in spack.repo.all_package_names()]
specs.sort(key=lambda s: s.format("{name}{@version}").lower()) specs.sort(key=lambda s: s.format("{name}{@version}").lower())

View File

@ -104,6 +104,7 @@ def get_matching_versions(specs, **kwargs):
if spec.concrete: if spec.concrete:
matching_spec.append(spec) matching_spec.append(spec)
pkg_versions -= 1 pkg_versions -= 1
if spec.version in version_order:
version_order.remove(spec.version) version_order.remove(spec.version)
for v in version_order: for v in version_order:

View File

@ -4,10 +4,16 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT) # SPDX-License-Identifier: (Apache-2.0 OR MIT)
import pytest import pytest
import os
from spack.main import SpackCommand from spack.main import SpackCommand
import spack.environment as ev
import spack.config
mirror = SpackCommand('mirror') mirror = SpackCommand('mirror')
env = SpackCommand('env')
add = SpackCommand('add')
concretize = SpackCommand('concretize')
@pytest.mark.disable_clean_stage_check @pytest.mark.disable_clean_stage_check
@ -17,3 +23,25 @@ def test_regression_8083(tmpdir, capfd, mock_packages, mock_fetch, config):
output = mirror('create', '-d', str(tmpdir), 'externaltool') output = mirror('create', '-d', str(tmpdir), 'externaltool')
assert 'Skipping' in output assert 'Skipping' in output
assert 'as it is an external spec' in output assert 'as it is an external spec' in output
@pytest.mark.regression('12345')
def test_mirror_from_env(tmpdir, mock_packages, mock_fetch, config,
mutable_mock_env_path):
mirror_dir = str(tmpdir)
env_name = 'test'
env('create', env_name)
with ev.read(env_name):
add('trivial-install-test-package')
add('git-test')
concretize()
with spack.config.override('config:checksum', False):
mirror('create', '-d', mirror_dir)
e = ev.read(env_name)
assert set(os.listdir(mirror_dir)) == set([s.name for s in e.user_specs])
for spec in e.specs_by_hash.values():
mirror_res = os.listdir(os.path.join(mirror_dir, spec.name))
expected = ['%s.tar.gz' % spec.format('{name}-{version}')]
assert mirror_res == expected