Source code for spack.schema.repos
# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
"""Schema for repos.yaml configuration file.
.. literalinclude:: _spack_root/lib/spack/spack/schema/repos.py
:lines: 18-
"""
from typing import Any, Dict
#: Properties for inclusion in other schemas
properties: Dict[str, Any] = {
"repos": {
"oneOf": [
{
# old format: array of strings
"type": "array",
"items": {
"type": "string",
"description": "Path to a Spack package repository directory",
},
},
{
# new format: object with named repositories
"type": "object",
"additionalProperties": {
"oneOf": [
{
# local path
"type": "string",
"description": "Path to a Spack package repository directory",
},
{
# remote git repository
"type": "object",
"properties": {
"git": {"type": "string"},
"branch": {"type": "string"},
"commit": {"type": "string"},
"tag": {"type": "string"},
"destination": {"type": "string"},
"paths": {"type": "array", "items": {"type": "string"}},
},
"additionalProperties": False,
},
]
},
},
],
"default": {},
}
}
#: Full schema with metadata
schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Spack repository configuration file schema",
"type": "object",
"additionalProperties": False,
"properties": properties,
}
[docs]
def update(data: Dict[str, Any]) -> bool:
"""Update the repos.yaml configuration data to the new format."""
if not isinstance(data["repos"], list):
return False
from spack.llnl.util import tty
from spack.repo import from_path
# Convert old format [paths...] to new format {namespace: path, ...}
repos = {}
for path in data["repos"]:
try:
repo = from_path(path)
except Exception as e:
tty.warn(f"package repository {path} is disabled due to: {e}")
continue
if repo.namespace is not None:
repos[repo.namespace] = path
data["repos"] = repos
return True