diff --git a/README.md b/README.md index abfd21a..da78b4f 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,14 @@ # declpac -`declpac` is a declarative package manager for Arch Linux that syncs your system -with a declared package list using `pacman`. It ensures your system matches your -desired state, handling package installation, upgrades, and orphan cleanup -automatically. +Declarative package manager for Arch Linux that syncs your system with a declared package list using pacman. ## Features -- **Declarative state management** — Define your desired package list in files or stdin -- **Automatic dependency resolution** — Pacman handles transitive dependencies -- **Smart orphan cleanup** — Removes packages no longer needed -- **Explicit package tracking** — Marks your declared packages as explicit -- **AUR support** — Falls back to AUR for packages not in official repos -- **Machine-readable output** — Perfect for scripting and automation +- Declarative state management — define your desired package list in files or stdin +- Smart orphan cleanup — removes packages no longer needed +- Explicit package tracking — marks declared packages as explicit +- AUR support — builds and installs AUR packages automatically +- Machine-readable output — perfect for scripting ## Installation @@ -28,14 +24,13 @@ sudo mv declpac /usr/local/bin/ ### Dependencies - Go 1.21+ -- pacman (system package manager) -- aur (AUR helper, optional for AUR support) -- Root privileges (required for pacman operations) +- pacman +- makepkg (for AUR support) +- git (for AUR support) +- Root privileges ## Usage -### Basic Usage - ```bash # Single state file sudo declpac --state packages.txt @@ -45,119 +40,63 @@ sudo declpac --state base.txt --state apps.txt # From stdin cat packages.txt | sudo declpac + +# Preview changes without applying +sudo declpac --dry-run --state packages.txt ``` ### State File Format -State files contain one package name per line: +One package name per line, lines beginning with `#` are comments: ``` bash vim git docker +# this is a comment ``` -Lines are treated as package names with whitespace trimmed: - -``` -bash # bash - vim # vim -# comment # ignored -``` - -### Command Line Options +### Options | Flag | Alias | Description | |------|-------|-------------| -| `--state` | `-s` | State file(s) to read package list from (can be used multiple times) | -| `--yes` | `-y` | Skip confirmation prompts (for scripting) | -| `--dry-run` | | Simulate sync without making changes | +| `--state` | `-s` | State file to read package list from (can be used multiple times) | +| `--dry-run` | | Preview changes without applying them | | `--help` | `-h` | Show help message | -### Examples - -#### Minimal System - -```bash -# Create a minimal system package list -echo -e "base\nbase-devel\nlinux-headers\nvim\ngit\ncurl\nwget" > ~/.config/declpac/minimal.txt - -# Apply the state -sudo declpac --state ~/.config/declpac/minimal.txt -``` - -#### Development Environment - -```bash -# development.txt -go -nodejs -python -rust -docker -docker-compose -kubectl -helm -terraform - -# Apply -sudo declpac --state development.txt -``` - -#### Full System Sync - -```bash -# Combine multiple files -sudo declpac --state ~/.config/declpac/base.txt --state ~/.config/declpac/desktop.txt - -# Or use stdin -cat ~/.config/declpac/full-system.txt | sudo declpac -``` - -#### Dry-Run Preview - -```bash -# Preview what would happen without making changes -sudo declpac --dry-run --state packages.txt - -# Example output: -# Installed 3 packages, removed 2 packages -# Would install: vim, git, docker -# Would remove: python2, perl-xml-parser -``` - ## How It Works -1. **Collect packages** — Reads from all `--state` files and stdin -2. **Merge** — Combines all packages additively (duplicates allowed) -3. **Validate** — Checks packages exist in repos or AUR -4. **Mark explicit** — Marks declared packages as explicit dependencies -5. **Sync** — Runs `pacman -Syu` to install/upgrade packages -6. **Cleanup** — Removes orphaned packages with `pacman -Rns` -7. **Report** — Outputs summary: `Installed X packages, removed Y packages` +1. **Read** — Collect packages from all state files and stdin +2. **Merge** — Combine into single package list +3. **Categorize** — Check if packages are in official repos or AUR +4. **Sync** — Install/update packages via pacman +5. **Build** — Build and install AUR packages via makepkg +6. **Mark** — Mark declared packages as explicit, all others as dependencies +7. **Cleanup** — Remove orphaned packages ### Database Freshness -If the pacman database is older than 24 hours, `declpac` automatically refreshes it with `pacman -Syy` before validation. - -### Orphan Cleanup +If the pacman database is older than 24 hours, it is automatically refreshed. -After syncing, `declpac` identifies and removes packages that are: -- Not explicitly installed -- Not required by any other package +### Logging -This keeps your system clean from dependency artifacts. +Operations are logged to `/var/log/declpac.log`. -## Output Format +## Output ``` -# Success (packages installed/removed) +# Packages installed/removed Installed 5 packages, removed 2 packages -# Success (no changes) +# No changes needed Installed 0 packages, removed 0 packages +# Dry-run preview +Installed 3 packages, removed 1 packages +Would install: vim, git, docker +Would remove: python2 + # Error error: package not found: ``` @@ -167,36 +106,54 @@ error: package not found: | Code | Meaning | |------|---------| | 0 | Success | -| 1 | Error (no packages, validation failure, pacman error) | +| 1 | Error | -## Security Considerations +## Examples -- **Run as root** — `declpac` requires root privileges for pacman operations -- **Review state files** — Only install packages from trusted sources -- **Backup** — Consider backing up your system before major changes +### Minimal System -## Troubleshooting +```bash +echo -e "base\nbase-devel\nlinux-headers\nvim\ngit\ncurl" > ~/.config/declpac/minimal.txt +sudo declpac --state ~/.config/declpac/minimal.txt +``` -### "Permission denied" +### Development Environment -`declpac` requires root privileges. Use `sudo`: +```bash +# development.txt +go +nodejs +python +rust +docker + +sudo declpac --state development.txt +``` + +### Dry-Run ```bash -sudo declpac --state packages.txt +sudo declpac --dry-run --state packages.txt ``` -### "Package not found" +## Troubleshooting -The package doesn't exist in pacman repos or AUR. Check the package name: +### Permission denied +Use sudo: +```bash +sudo declpac --state packages.txt +``` + +### Package not found + +Check if the package exists: ```bash pacman -Ss ``` ### Database sync fails -Refresh manually: - ```bash sudo pacman -Syy ``` @@ -210,13 +167,14 @@ declpac/ ├── pkg/ │ ├── input/ # State file/stdin reading │ ├── merge/ # Package merging -│ ├── validation/ # Package validation -│ ├── pacman/ # Pacman integration -│ └── output/ # Output formatting -├── go.mod # Go module -└── README.md # This file +│ ├── fetch/ # Package resolution (pacman/AUR) +│ ├── pacman/ # Pacman operations +│ ├── validation/ # Database freshness check +│ ├── output/ # Output formatting +│ └── state/ # Logging +└── README.md ``` ## License -GPL-3.0 +GPL-3.0 \ No newline at end of file