Initial Commit

This commit is contained in:
2026-05-09 17:15:31 -04:00
commit 628441b744
10 changed files with 511 additions and 0 deletions

0
src/__init__.py Normal file
View File

76
src/__main__.py Normal file
View File

@@ -0,0 +1,76 @@
# uv curl git stow taskd
import tomllib
# import pyalpm
import subprocess
import pycman.config as pacman_config
from pathlib import Path
from dataclasses import dataclass
@dataclass
class Repo:
src: str
dest: str
def clone(self) -> None:
dest: Path = Path(self.dest).expanduser()
if dest.exists():
print(f"[skip] {dest} already exists")
return
dest.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["git", "clone", "--recurse-submodules", self.src, str(self.dest)], check=True)
with open("config.toml", "rb") as f:
config = tomllib.load(f)
system_packages = config["system"]["packages"]
dotfiles: Repo = Repo(*config["repos"]["dotfiles"])
class PackageManager:
def __init__(self):
conf = pacman_config.PacmanConfig("/etc/pacman.conf")
self.handle = conf.initialize_alpm()
self.localdb = self.handle.get_localdb()
def is_installed(self, name: str) -> bool:
return self.localdb.get_pkg(name) is not None
def get_version(self, name: str) -> str | None:
pkg = self.localdb.get_pkg(name)
return pkg.version if pkg else None
def ensure_installed(self, packages: list[str]) -> None:
missing = [p for p in packages if not self.is_installed(p)]
if not missing:
return
print(f"Installing: {' '.join(missing)}")
subprocess.run(
["sudo", "pacman", "-S", "--noconfirm", *missing],
check=True
)
def ensure_removed(self, packages: list[str]) -> None:
present = [p for p in packages if self.is_installed(p)]
if not present:
return
subprocess.run(
["sudo", "pacman", "-Rns", "--noconfirm", *present],
check=True
)
def ensure_aur_installed(self, packages: list[str]) -> None:
missing = [p for p in packages if not self.is_installed(p)]
if not missing:
return
subprocess.run(
["paru", "-S", "--noconfirm", "--skipreview", *missing],
check=True
)
pm = PackageManager()
pm.ensure_installed(system_packages)
pm.ensure_aur_installed(config["system"]["aur"])
dotfiles.clone()

0
src/lib/__init__.py Normal file
View File