Move repo creation code into repository.py
This commit is contained in:
parent
c488f7c4d8
commit
be306d09e9
2 changed files with 58 additions and 46 deletions
|
@ -74,51 +74,7 @@ def setup_parser(subparser):
|
||||||
|
|
||||||
def repo_create(args):
|
def repo_create(args):
|
||||||
"""Create a new package repository."""
|
"""Create a new package repository."""
|
||||||
root = canonicalize_path(args.directory)
|
full_path, namespace = create_repo(args.directory, args.namespace)
|
||||||
namespace = args.namespace
|
|
||||||
|
|
||||||
if not args.namespace:
|
|
||||||
namespace = os.path.basename(root)
|
|
||||||
|
|
||||||
if not re.match(r'\w[\.\w-]*', namespace):
|
|
||||||
tty.die("'%s' is not a valid namespace." % namespace)
|
|
||||||
|
|
||||||
existed = False
|
|
||||||
if os.path.exists(root):
|
|
||||||
if os.path.isfile(root):
|
|
||||||
tty.die('File %s already exists and is not a directory' % root)
|
|
||||||
elif os.path.isdir(root):
|
|
||||||
if not os.access(root, os.R_OK | os.W_OK):
|
|
||||||
tty.die('Cannot create new repo in %s: cannot access directory.' % root)
|
|
||||||
if os.listdir(root):
|
|
||||||
tty.die('Cannot create new repo in %s: directory is not empty.' % root)
|
|
||||||
existed = True
|
|
||||||
|
|
||||||
full_path = os.path.realpath(root)
|
|
||||||
parent = os.path.dirname(full_path)
|
|
||||||
if not os.access(parent, os.R_OK | os.W_OK):
|
|
||||||
tty.die("Cannot create repository in %s: can't access parent!" % root)
|
|
||||||
|
|
||||||
try:
|
|
||||||
config_path = os.path.join(root, repo_config_name)
|
|
||||||
packages_path = os.path.join(root, packages_dir_name)
|
|
||||||
|
|
||||||
mkdirp(packages_path)
|
|
||||||
with open(config_path, 'w') as config:
|
|
||||||
config.write("repo:\n")
|
|
||||||
config.write(" namespace: '%s'\n" % namespace)
|
|
||||||
|
|
||||||
except (IOError, OSError) as e:
|
|
||||||
tty.die('Failed to create new repository in %s.' % root,
|
|
||||||
"Caused by %s: %s" % (type(e), e))
|
|
||||||
|
|
||||||
# try to clean up.
|
|
||||||
if existed:
|
|
||||||
shutil.rmtree(config_path, ignore_errors=True)
|
|
||||||
shutil.rmtree(packages_path, ignore_errors=True)
|
|
||||||
else:
|
|
||||||
shutil.rmtree(root, ignore_errors=True)
|
|
||||||
|
|
||||||
tty.msg("Created repo with namespace '%s'." % namespace)
|
tty.msg("Created repo with namespace '%s'." % namespace)
|
||||||
tty.msg("To register it with spack, run this command:",
|
tty.msg("To register it with spack, run this command:",
|
||||||
'spack repo add %s' % full_path)
|
'spack repo add %s' % full_path)
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
from external import yaml
|
from external import yaml
|
||||||
|
|
||||||
import llnl.util.tty as tty
|
import llnl.util.tty as tty
|
||||||
from llnl.util.filesystem import join_path
|
from llnl.util.filesystem import *
|
||||||
|
|
||||||
import spack.error
|
import spack.error
|
||||||
import spack.config
|
import spack.config
|
||||||
|
@ -705,6 +705,58 @@ def __contains__(self, pkg_name):
|
||||||
return self.exists(pkg_name)
|
return self.exists(pkg_name)
|
||||||
|
|
||||||
|
|
||||||
|
def create_repo(root, namespace=None):
|
||||||
|
"""Create a new repository in root with the specified namespace.
|
||||||
|
|
||||||
|
If the namespace is not provided, use basename of root.
|
||||||
|
Return the canonicalized path and the namespace of the created repository.
|
||||||
|
"""
|
||||||
|
root = canonicalize_path(root)
|
||||||
|
if not namespace:
|
||||||
|
namespace = os.path.basename(root)
|
||||||
|
|
||||||
|
if not re.match(r'\w[\.\w-]*', namespace):
|
||||||
|
raise InvalidNamespaceError("'%s' is not a valid namespace." % namespace)
|
||||||
|
|
||||||
|
existed = False
|
||||||
|
if os.path.exists(root):
|
||||||
|
if os.path.isfile(root):
|
||||||
|
raise BadRepoError('File %s already exists and is not a directory' % root)
|
||||||
|
elif os.path.isdir(root):
|
||||||
|
if not os.access(root, os.R_OK | os.W_OK):
|
||||||
|
raise BadRepoError('Cannot create new repo in %s: cannot access directory.' % root)
|
||||||
|
if os.listdir(root):
|
||||||
|
raise BadRepoError('Cannot create new repo in %s: directory is not empty.' % root)
|
||||||
|
existed = True
|
||||||
|
|
||||||
|
full_path = os.path.realpath(root)
|
||||||
|
parent = os.path.dirname(full_path)
|
||||||
|
if not os.access(parent, os.R_OK | os.W_OK):
|
||||||
|
raise BadRepoError("Cannot create repository in %s: can't access parent!" % root)
|
||||||
|
|
||||||
|
try:
|
||||||
|
config_path = os.path.join(root, repo_config_name)
|
||||||
|
packages_path = os.path.join(root, packages_dir_name)
|
||||||
|
|
||||||
|
mkdirp(packages_path)
|
||||||
|
with open(config_path, 'w') as config:
|
||||||
|
config.write("repo:\n")
|
||||||
|
config.write(" namespace: '%s'\n" % namespace)
|
||||||
|
|
||||||
|
except (IOError, OSError) as e:
|
||||||
|
raise BadRepoError('Failed to create new repository in %s.' % root,
|
||||||
|
"Caused by %s: %s" % (type(e), e))
|
||||||
|
|
||||||
|
# try to clean up.
|
||||||
|
if existed:
|
||||||
|
shutil.rmtree(config_path, ignore_errors=True)
|
||||||
|
shutil.rmtree(packages_path, ignore_errors=True)
|
||||||
|
else:
|
||||||
|
shutil.rmtree(root, ignore_errors=True)
|
||||||
|
|
||||||
|
return full_path, namespace
|
||||||
|
|
||||||
|
|
||||||
class RepoError(spack.error.SpackError):
|
class RepoError(spack.error.SpackError):
|
||||||
"""Superclass for repository-related errors."""
|
"""Superclass for repository-related errors."""
|
||||||
|
|
||||||
|
@ -713,6 +765,10 @@ class NoRepoConfiguredError(RepoError):
|
||||||
"""Raised when there are no repositories configured."""
|
"""Raised when there are no repositories configured."""
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidNamespaceError(RepoError):
|
||||||
|
"""Raised when an invalid namespace is encountered."""
|
||||||
|
|
||||||
|
|
||||||
class BadRepoError(RepoError):
|
class BadRepoError(RepoError):
|
||||||
"""Raised when repo layout is invalid."""
|
"""Raised when repo layout is invalid."""
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue