Track install state by installation id
This commit is contained in:
@@ -39,8 +39,9 @@ def enable_disabled_plugin(
|
||||
lockfile: str | None = None,
|
||||
repo: Path | None = None,
|
||||
progress: Callable[[str], None] | None = None,
|
||||
install_id: str | None = None,
|
||||
) -> dict[str, Any]:
|
||||
installed_state = load_installed_state(state_root, instance)
|
||||
installed_state = load_installed_state(state_root, instance, install_id=install_id)
|
||||
if plugin_id in installed_state.get("plugins", {}):
|
||||
raise KeyError(f"plugin is already enabled: {plugin_id}")
|
||||
|
||||
@@ -65,6 +66,7 @@ def enable_disabled_plugin(
|
||||
repo_root=root,
|
||||
selected={plugin_id},
|
||||
require_bootstrap=False,
|
||||
install_id=install_id,
|
||||
)
|
||||
|
||||
ensure_healthy_bootstrap(
|
||||
@@ -77,6 +79,7 @@ def enable_disabled_plugin(
|
||||
repo_root=root,
|
||||
selected_ids={plugin_id},
|
||||
progress=progress,
|
||||
install_id=install_id,
|
||||
)
|
||||
|
||||
tell(f"Applying {plugin_id}")
|
||||
@@ -94,6 +97,7 @@ def enable_disabled_plugins(
|
||||
lockfile: str | None = None,
|
||||
repo: Path | None = None,
|
||||
progress: Callable[[str], None] | None = None,
|
||||
install_id: str | None = None,
|
||||
) -> dict[str, Any]:
|
||||
if not plugin_ids:
|
||||
return {"enabled": [], "errors": []}
|
||||
@@ -104,7 +108,7 @@ def enable_disabled_plugins(
|
||||
lockfile=lockfile,
|
||||
repo=repo,
|
||||
)
|
||||
installed_state = load_installed_state(state_root, instance)
|
||||
installed_state = load_installed_state(state_root, instance, install_id=install_id)
|
||||
enabled_plugins = installed_state.get("plugins", {})
|
||||
locked_ids = {plugin.id for plugin in loaded_lockfile.plugins}
|
||||
|
||||
@@ -136,6 +140,7 @@ def enable_disabled_plugins(
|
||||
repo_root=root,
|
||||
selected=selected_ids,
|
||||
require_bootstrap=False,
|
||||
install_id=install_id,
|
||||
)
|
||||
|
||||
ensure_healthy_bootstrap(
|
||||
@@ -148,6 +153,7 @@ def enable_disabled_plugins(
|
||||
repo_root=root,
|
||||
selected_ids=selected_ids,
|
||||
progress=progress,
|
||||
install_id=install_id,
|
||||
)
|
||||
|
||||
tell(f"Applying {len(plannable_ids)} plugins")
|
||||
@@ -163,16 +169,18 @@ def enable_disabled_plugins(
|
||||
return {"enabled": enabled, "errors": errors}
|
||||
|
||||
|
||||
def save_known_good_set(*, instance: str, state_root: Path) -> dict[str, Any]:
|
||||
def save_known_good_set(*, instance: str, state_root: Path, install_id: str | None = None) -> dict[str, Any]:
|
||||
"""Record the currently enabled plugin ids as the known-good set for this instance."""
|
||||
installed_state = load_installed_state(state_root, instance)
|
||||
installed_state = load_installed_state(state_root, instance, install_id=install_id)
|
||||
plugin_ids = sorted(installed_state.get("plugins", {}))
|
||||
known_good = {
|
||||
"instance": instance,
|
||||
"beatSaberVersion": installed_state.get("beatSaberVersion"),
|
||||
"pluginIds": plugin_ids,
|
||||
}
|
||||
save_known_good_state(state_root, instance, known_good)
|
||||
if install_id:
|
||||
known_good["installId"] = install_id
|
||||
save_known_good_state(state_root, instance, known_good, install_id=install_id)
|
||||
return known_good
|
||||
|
||||
|
||||
@@ -185,14 +193,15 @@ def restore_known_good_set(
|
||||
lockfile: str | None = None,
|
||||
repo: Path | None = None,
|
||||
progress: Callable[[str], None] | None = None,
|
||||
install_id: str | None = None,
|
||||
) -> dict[str, Any]:
|
||||
"""Disable plugins outside the saved known-good set and re-enable the ones that are missing."""
|
||||
known_good = load_known_good_state(state_root, instance)
|
||||
known_good = load_known_good_state(state_root, instance, install_id=install_id)
|
||||
known_good_ids = set(known_good.get("pluginIds", []))
|
||||
if not known_good:
|
||||
raise KeyError(f"no known-good set is saved for this instance: {instance}")
|
||||
|
||||
installed_state = load_installed_state(state_root, instance)
|
||||
installed_state = load_installed_state(state_root, instance, install_id=install_id)
|
||||
currently_enabled = set(installed_state.get("plugins", {}))
|
||||
|
||||
to_disable = sorted(currently_enabled - known_good_ids)
|
||||
@@ -200,7 +209,7 @@ def restore_known_good_set(
|
||||
disable_errors: list[dict[str, str]] = []
|
||||
for plugin_id in to_disable:
|
||||
try:
|
||||
result = disable_plugin(instance, instance_path, state_root, plugin_id, False)
|
||||
result = disable_plugin(instance, instance_path, state_root, plugin_id, False, install_id=install_id)
|
||||
if result["stateUpdated"]:
|
||||
disabled.append(plugin_id)
|
||||
else:
|
||||
@@ -209,7 +218,7 @@ def restore_known_good_set(
|
||||
except Exception as exc:
|
||||
disable_errors.append({"plugin": plugin_id, "error": str(exc)})
|
||||
|
||||
installed_state = load_installed_state(state_root, instance)
|
||||
installed_state = load_installed_state(state_root, instance, install_id=install_id)
|
||||
currently_enabled = set(installed_state.get("plugins", {}))
|
||||
to_enable = sorted(known_good_ids - currently_enabled)
|
||||
enable_result = enable_disabled_plugins(
|
||||
@@ -221,6 +230,7 @@ def restore_known_good_set(
|
||||
lockfile=lockfile,
|
||||
repo=repo,
|
||||
progress=progress,
|
||||
install_id=install_id,
|
||||
)
|
||||
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user