Source code for spack.cmd.debug

# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

import argparse
import os
import platform
import re
from typing import Optional

import spack
import spack.config
import spack.platforms
import spack.repo
import spack.spec
import spack.util.git

description = "debugging commands for troubleshooting Spack"
section = "developer"
level = "long"


[docs] def setup_parser(subparser: argparse.ArgumentParser) -> None: sp = subparser.add_subparsers(metavar="SUBCOMMAND", dest="debug_command") sp.add_parser("report", help="print information useful for bug reports")
def _format_repo_info(source, commit): if source.endswith(".git"): return f"{source[:-4]}/commit/{commit}" return f"{source} ({commit[:7]})" def _get_builtin_repo_info() -> Optional[str]: """Get the builtin package repository git commit sha.""" # Get builtin from config descriptors = spack.repo.RepoDescriptors.from_config( spack.repo.package_repository_lock(), spack.config.CONFIG ) if "builtin" not in descriptors: return None builtin = descriptors["builtin"] source = None if isinstance(builtin, spack.repo.RemoteRepoDescriptor) and builtin.fetched(): destination = builtin.destination source = builtin.repository elif isinstance(builtin, spack.repo.LocalRepoDescriptor): destination = builtin.path source = builtin.path else: return None # no git info git = spack.util.git.git(required=False) if not git: return None rev = git( "-C", destination, "rev-parse", "HEAD", output=str, error=os.devnull, fail_on_error=False ) if git.returncode != 0: return None match = re.match(r"[a-f\d]{7,}$", rev) return _format_repo_info(source, match.group(0)) if match else None def _get_spack_repo_info() -> str: """Get the spack package repository git info.""" commit = spack.get_spack_commit() if not commit: return spack.spack_version repo_info = _format_repo_info("https://github.com/spack/spack.git", commit) return f"{spack.spack_version} ({repo_info})"
[docs] def report(args): host_platform = spack.platforms.host() host_os = host_platform.default_operating_system() host_target = host_platform.default_target() architecture = spack.spec.ArchSpec((str(host_platform), str(host_os), str(host_target))) print("* **Spack:**", _get_spack_repo_info()) print("* **Builtin repo:**", _get_builtin_repo_info() or "not available") print("* **Python:**", platform.python_version()) print("* **Platform:**", architecture)
[docs] def debug(parser, args): if args.debug_command == "report": report(args)