forked from Shinonome/caelestia-cli
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
import json
|
|
from dataclasses import dataclass, field
|
|
|
|
from caelestia.utils.dots.packages import DEFAULT_AUR_HELPER
|
|
from caelestia.utils.io import warn
|
|
from caelestia.utils.paths import atomic_dump, dots_state_path
|
|
|
|
|
|
@dataclass
|
|
class DotsState:
|
|
# The AUR helper selected selected at install time
|
|
aur_helper: str = "paru"
|
|
|
|
# The git rev of currently applied dots version
|
|
applied_rev: str | None = None
|
|
|
|
# The currently enabled components
|
|
enabled_components: list[str] = field(default_factory=list)
|
|
|
|
# Previously installed packages/local packages
|
|
packages: list[str] = field(default_factory=list)
|
|
local_packages: dict[str, list[str]] = field(default_factory=dict)
|
|
|
|
# Files placed by the last deploy. Only files, not directories
|
|
# Maps dest -> src
|
|
deployed_files: dict[str, str] = field(default_factory=dict)
|
|
|
|
@staticmethod
|
|
def load() -> "DotsState":
|
|
try:
|
|
data = json.loads(dots_state_path.read_text())
|
|
except FileNotFoundError:
|
|
return DotsState()
|
|
except json.JSONDecodeError:
|
|
warn("failed to parse current dots state.")
|
|
return DotsState()
|
|
|
|
return DotsState(
|
|
aur_helper=data.get("aur_helper", DEFAULT_AUR_HELPER),
|
|
applied_rev=data.get("applied_rev"),
|
|
enabled_components=data.get("enabled_components", []),
|
|
packages=data.get("packages", []),
|
|
local_packages=data.get("local_packages", {}),
|
|
deployed_files=data.get("deployed_files", {}),
|
|
)
|
|
|
|
def save(self) -> None:
|
|
atomic_dump(
|
|
dots_state_path,
|
|
{
|
|
"aur_helper": self.aur_helper,
|
|
"applied_rev": self.applied_rev,
|
|
"enabled_components": self.enabled_components,
|
|
"packages": self.packages,
|
|
"local_packages": self.local_packages,
|
|
"deployed_files": self.deployed_files,
|
|
},
|
|
)
|