Source code for spack.cmd.clone

# Copyright 2013-2024 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)

import os

import llnl.util.tty as tty
from llnl.util.filesystem import mkdirp, working_dir

import spack.paths
import spack.util.git
from spack.util.executable import ProcessError

_SPACK_UPSTREAM = "https://github.com/spack/spack"

description = "create a new installation of spack in another prefix"
section = "admin"
level = "long"


[docs] def setup_parser(subparser): subparser.add_argument( "-r", "--remote", action="store", dest="remote", help="name of the remote to clone from", default="origin", ) subparser.add_argument("prefix", help="name of prefix where we should install spack")
[docs] def get_origin_info(remote): git_dir = os.path.join(spack.paths.prefix, ".git") git = spack.util.git.git(required=True) try: branch = git("symbolic-ref", "--short", "HEAD", output=str) except ProcessError: branch = "develop" tty.warn("No branch found; using default branch: %s" % branch) if remote == "origin" and branch not in ("master", "develop"): branch = "develop" tty.warn("Unknown branch found; using default branch: %s" % branch) try: origin_url = git( "--git-dir=%s" % git_dir, "config", "--get", "remote.%s.url" % remote, output=str ) except ProcessError: origin_url = _SPACK_UPSTREAM tty.warn("No git repository found; using default upstream URL: %s" % origin_url) return (origin_url.strip(), branch.strip())
[docs] def clone(parser, args): origin_url, branch = get_origin_info(args.remote) prefix = args.prefix tty.msg("Fetching spack from '%s': %s" % (args.remote, origin_url)) if os.path.isfile(prefix): tty.die("There is already a file at %s" % prefix) mkdirp(prefix) if os.path.exists(os.path.join(prefix, ".git")): tty.die("There already seems to be a git repository in %s" % prefix) files_in_the_way = os.listdir(prefix) if files_in_the_way: tty.die( "There are already files there! Delete these files before boostrapping spack.", *files_in_the_way, ) tty.msg("Installing:", "%s/bin/spack" % prefix, "%s/lib/spack/..." % prefix) with working_dir(prefix): git = spack.util.git.git(required=True) git("init", "--shared", "-q") git("remote", "add", "origin", origin_url) git("fetch", "origin", "%s:refs/remotes/origin/%s" % (branch, branch), "-n", "-q") git("reset", "--hard", "origin/%s" % branch, "-q") git("checkout", "-B", branch, "origin/%s" % branch, "-q") tty.msg( "Successfully created a new spack in %s" % prefix, "Run %s/bin/spack to use this installation." % prefix, )