feat: add GET command (cutekit's simple package manager)
This commit is contained in:
parent
69aa190d9e
commit
109c910e11
|
@ -6,6 +6,7 @@ from . import (
|
||||||
builder, # noqa: F401 this is imported for side effects
|
builder, # noqa: F401 this is imported for side effects
|
||||||
cli,
|
cli,
|
||||||
const,
|
const,
|
||||||
|
get, # noqa: F401 this is imported for side effects
|
||||||
graph, # noqa: F401 this is imported for side effects
|
graph, # noqa: F401 this is imported for side effects
|
||||||
model,
|
model,
|
||||||
plugins,
|
plugins,
|
||||||
|
|
67
cutekit/get.py
Normal file
67
cutekit/get.py
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
from . import cli
|
||||||
|
from . import const
|
||||||
|
from . import model
|
||||||
|
from . import shell
|
||||||
|
|
||||||
|
import dataclasses as dt
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
from tempfile import TemporaryDirectory
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@dt.dataclass
|
||||||
|
class InstallManifest:
|
||||||
|
plugins: list[str]
|
||||||
|
targets: list[str]
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command("G", "get", "Get a package from a remote repository")
|
||||||
|
def getCmd(args: cli.Args):
|
||||||
|
pkg = args.consumeArg()
|
||||||
|
repo = args.consumeOpt(
|
||||||
|
"repository", "https://github.com/cute-engineering/cutekit-contrib.git"
|
||||||
|
)
|
||||||
|
|
||||||
|
project = model.Project.topmost()
|
||||||
|
|
||||||
|
if project is None:
|
||||||
|
raise RuntimeError("Not inside a project")
|
||||||
|
|
||||||
|
if pkg is None:
|
||||||
|
raise RuntimeError("No package specified")
|
||||||
|
|
||||||
|
with TemporaryDirectory() as temp:
|
||||||
|
try:
|
||||||
|
shell.cloneDir(repo, pkg, temp)
|
||||||
|
except FileNotFoundError:
|
||||||
|
raise RuntimeError(f"Package {pkg} not found")
|
||||||
|
|
||||||
|
pkg_path = Path(temp) / pkg
|
||||||
|
|
||||||
|
with (pkg_path / "install.json").open("r") as f:
|
||||||
|
manifest_json = json.load(f)
|
||||||
|
|
||||||
|
[
|
||||||
|
manifest_json.setdefault(key, [])
|
||||||
|
for key in InstallManifest.__dataclass_fields__.keys()
|
||||||
|
]
|
||||||
|
|
||||||
|
manifest = InstallManifest(**manifest_json)
|
||||||
|
|
||||||
|
plugin_dir = Path(const.META_DIR) / "plugins"
|
||||||
|
target_dir = Path(const.TARGETS_DIR)
|
||||||
|
|
||||||
|
plugin_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
target_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
for plugin in manifest.plugins:
|
||||||
|
_logger.info(f"Copying {plugin} to {project.id}'s plugins")
|
||||||
|
shell.cp(str(pkg_path / plugin), plugin_dir)
|
||||||
|
|
||||||
|
for target in manifest.targets:
|
||||||
|
_logger.info(f"Copying {plugin} to {project.id}'s targets")
|
||||||
|
shell.cp(str(pkg_path / target), target_dir)
|
Loading…
Reference in a new issue