from pathlib import Path from typing import Literal from dots_manager.config import Environment from dots_manager.shell import run_shell_command from dots_manager.utils import is_some, parallelize def list_stowable_packages(packages: Path) -> list[Path]: denylist = [".", "__"] return [ d for d in packages.iterdir() if d.is_dir() and all(y not in d.name for y in denylist) ] def apply_stow_operation_to_packages( packages: Path, target: Path, stow_op: Literal["--delete", "--no-folding"], env: Environment, ) -> bool: if not packages.exists(): env.logger.warn("nothing to clean up <_mood.anxious>") return True if not run_shell_command(["stow", "--version"], env.logger): env.logger.error("stow not installed D:") return False package_command = ["stow", "-d", str(packages), "-t", str(target), stow_op] _packages = list_stowable_packages(packages) env.logger.debug(f"found dotfile packages: {_packages}") commands = [package_command + [package.name] for package in _packages] env.logger.debug(f"stowing packages: {commands}") results = parallelize( lambda command: is_some(run_shell_command, command, env.logger)[0], commands, env.logger, ) return len(commands) == sum(1 if x else 0 for x in results)