Source code for spack.cmd.verify

# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from __future__ import print_function

import argparse

import llnl.util.tty as tty

import spack.environment as ev
import spack.store
import spack.verify

description = "Check that all spack packages are on disk as installed"
section = "admin"
level = "long"


[docs]def setup_parser(subparser): setup_parser.parser = subparser subparser.add_argument('-l', '--local', action='store_true', help="Verify only locally installed packages") subparser.add_argument('-j', '--json', action='store_true', help="Ouptut json-formatted errors") subparser.add_argument('-a', '--all', action='store_true', help="Verify all packages") subparser.add_argument('specs_or_files', nargs=argparse.REMAINDER, help="Specs or files to verify") type = subparser.add_mutually_exclusive_group() type.add_argument( '-s', '--specs', action='store_const', const='specs', dest='type', default='specs', help='Treat entries as specs (default)') type.add_argument( '-f', '--files', action='store_const', const='files', dest='type', default='specs', help="Treat entries as absolute filenames. Cannot be used with '-a'")
[docs]def verify(parser, args): local = args.local if args.type == 'files': if args.all: setup_parser.parser.print_help() return 1 for file in args.specs_or_files: results = spack.verify.check_file_manifest(file) if results.has_errors(): if args.json: print(results.json_string()) else: print(results) return 0 else: spec_args = spack.cmd.parse_specs(args.specs_or_files) if args.all: query = spack.store.db.query_local if local else spack.store.db.query # construct spec list if spec_args: spec_list = spack.cmd.parse_specs(args.specs_or_files) specs = [] for spec in spec_list: specs += query(spec, installed=True) else: specs = query(installed=True) elif args.specs_or_files: # construct disambiguated spec list env = ev.active_environment() specs = list(map(lambda x: spack.cmd.disambiguate_spec(x, env, local=local), spec_args)) else: setup_parser.parser.print_help() return 1 for spec in specs: tty.debug("Verifying package %s") results = spack.verify.check_spec_manifest(spec) if results.has_errors(): if args.json: print(results.json_string()) else: tty.msg("In package %s" % spec.format('{name}/{hash:7}')) print(results) return 1 else: tty.debug(results)