48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from .config import repo_root
|
|
from .installer import apply_plan
|
|
from .models import load_lockfile, load_registry
|
|
from .planner import create_plan
|
|
from .state import load_installed_state
|
|
|
|
|
|
def enable_disabled_plugin(
|
|
*,
|
|
instance: str,
|
|
instance_path: Path,
|
|
state_root: Path,
|
|
plugin_id: str,
|
|
registry: str = "registry/plugins.toml",
|
|
lockfile: str | None = None,
|
|
repo: Path | None = None,
|
|
) -> dict[str, Any]:
|
|
installed_state = load_installed_state(state_root, instance)
|
|
if plugin_id not in installed_state.get("disabledPlugins", {}):
|
|
raise KeyError(f"plugin is not recorded as disabled: {plugin_id}")
|
|
|
|
root = repo or repo_root()
|
|
registry_path = (root / registry).resolve() if not Path(registry).is_absolute() else Path(registry)
|
|
lock_path = Path(lockfile) if lockfile else root / "locks" / f"{instance}.lock.toml"
|
|
if not lock_path.is_absolute():
|
|
lock_path = (root / lock_path).resolve()
|
|
loaded_lockfile = load_lockfile(lock_path)
|
|
if not any(plugin.id == plugin_id for plugin in loaded_lockfile.plugins):
|
|
raise KeyError(f"plugin is disabled but not locked for this instance: {plugin_id}")
|
|
|
|
plan, path = create_plan(
|
|
instance=instance,
|
|
instance_path=instance_path,
|
|
beat_saber_version=loaded_lockfile.beat_saber_version,
|
|
registry=load_registry(registry_path),
|
|
lockfile=loaded_lockfile,
|
|
state_root=state_root,
|
|
repo_root=root,
|
|
selected={plugin_id},
|
|
)
|
|
result = apply_plan(plan, state_root)
|
|
return {"planPath": str(path), **result}
|