Files
omarchy-pkgs/README.md
T
2025-10-26 23:53:13 -04:00

236 lines
6.4 KiB
Markdown

# Omarchy Package Repository
This repository manages the Omarchy Package Repository, building a host of PKGBUILDs and facilitating syncing from AUR where necessary.
## Overview
The build system uses Docker to create a clean, reproducible build environment. Packages are built unsigned, then signed in a separate step, promoted to production, and synced to a remote server.
### Directory Structure
```
omarchy-pkgs/
├── pkgbuilds/ # Source PKGBUILDs (one directory per package)
├── build-output/ # Temporary build workspace
├── pkgs.omarchy.org/ # Final signed packages
├── build/ # Build scripts that run inside of the Docker container
├── bin/ # Command-line tools
└── logs/ # Build and operation logs
```
## Quick Start
### Complete Release Workflow
Build, sign, promote, clean, and sync in one command:
```bash
bin/repo release
```
With options:
```bash
bin/repo release --skip-prod-check # Skip production confirmation
bin/repo release --sync-remote dev-pkgs:/ # Sync to dev remote instead
bin/repo release --package omarchy-nvim # Build only one package
```
### Step-by-Step Workflow
```bash
# 1. Build packages (unsigned)
bin/repo build
# 2. Sign all built packages (sitting in `build-output`)
bin/repo sign
# 3. Promote to production directory (copy from `build-output` -> `pkgs.omarchy.org`)
bin/repo promote
# 4. Clean old versions and update database
bin/repo clean
# 5. Sync to remote server
bin/repo sync pkgs.omarchy.org/x86_64
```
## Commands
### `bin/repo build`
Builds packages from `pkgbuilds/` directory in a Docker container.
**Options:**
- `--package <name>` - Build only a specific package
- `--arch <arch>` - Target architecture (default: x86_64)
**What it does:**
- Clears `build-output/` directory
- Builds packages in dependency order
- Creates unsigned `.pkg.tar.zst` files in `build-output/x86_64/`
- Skips packages that are already up-to-date in `pkgs.omarchy.org/`
**Examples:**
```bash
bin/repo build # Build all packages
bin/repo build --package omarchy-nvim # Build only yay
```
### `bin/repo sign`
Signs all unsigned packages in `build-output/`.
**What it does:**
- Fetches GPG key and passphrase from env or 1Password
- Signs all `.pkg.tar.zst` files
### `bin/repo promote`
Copies signed packages from `build-output/` to `pkgs.omarchy.org/`.
**Options:**
- `--arch <arch>` - Target architecture (default: x86_64)
- `--dry-run` - Preview what would be copied
**What it does:**
- Copies all packages and signatures to production directory
- Cleans up `build-output/` after successful promotion
**Examples:**
```bash
bin/repo promote
bin/repo promote --dry-run
```
### `bin/repo clean`
Removes old package versions and updates the repository database.
**Options:**
- `--keep N` - Keep N versions of each package (default: 2)
- `--dry-run` - Preview what would be removed
- `--usage` - Show disk usage statistics
**What it does:**
- Removes old package versions (keeps latest 2 by default)
- Updates `omarchy.db.tar.zst` repository database
- Shows disk usage and statistics
**Examples:**
```bash
bin/repo clean # Keep 2 versions
bin/repo clean --keep 3 # Keep 3 versions
bin/repo clean --dry-run # Preview cleanup
bin/repo clean --usage # Show disk usage
```
### `bin/repo sync`
Syncs the repository to a remote server using rclone.
**Arguments:**
- `<directory>` - Local directory to sync (e.g., `pkgs.omarchy.org/x86_64`)
**Options:**
- `--remote <remote>` - Rclone remote destination (default: `pkgs.omarchy.org:omarchy-pkgs`)
- `--skip-prod-check` - Skip production confirmation
**What it does:**
- Syncs packages to remote (uses `--ignore-existing` to preserve versions)
- Syncs database files with checksums
- Prompts for confirmation when syncing to production
**Examples:**
```bash
bin/repo sync pkgs.omarchy.org/x86_64 # Sync to production
bin/repo sync pkgs.omarchy.org/x86_64 --skip-prod-check # Skip confirmation
bin/repo sync pkgs.omarchy.org/x86_64 --remote dev-pkgs:/# Sync to dev
```
### `bin/repo release`
Runs the complete release workflow in sequence.
**Options:**
- `--package <name>` - Build only a specific package
- `--arch <arch>` - Target architecture (default: x86_64)
- `--sync-remote <path>` - Rclone remote for sync (default: production)
- `--skip-prod-check` - Skip production confirmation
**What it does:**
1. Builds packages
2. Signs packages
3. Promotes to production
4. Cleans old versions
5. Syncs to remote
**Examples:**
```bash
bin/repo release # Full workflow
bin/repo release --skip-prod-check # Skip prod confirmation
bin/repo release --sync-remote dev-pkgs:/ # Sync to dev
bin/repo release --package omarchy-nvim # Single package
```
### Other Commands
**`bin/repo list`** - List all packages in the repository
```bash
bin/repo list
```
**`bin/repo remove <package>`** - Remove a package from the repository
```bash
bin/repo remove yay
```
**`bin/repo update`** - Update the repository database (usually done automatically by `clean`)
```bash
bin/repo update
```
## Adding New Packages
### From AUR
1. Add package name to `build/packages/omarchy-aur.packages` (for future syncing)
2. Sync PKGBUILD to local directory:
```bash
bin/sync-aur package-name
```
3. Build and release:
```bash
bin/repo release --package package-name
```
### Custom Package
1. Create directory in `pkgbuilds/`:
```bash
mkdir pkgbuilds/my-package
```
2. Add PKGBUILD and any additional files
3. Build and release:
```bash
bin/repo release --package my-package
```
## Package Dependencies
The build system automatically handles dependencies between packages being built. For example, if `aether` depends on `hyprshade`, the build system will:
1. Detect the dependency relationship
2. Build `hyprshade` first
3. Add it to the `omarchy-build` temporary repository
4. Build `aether` (which can now install `hyprshade` from `omarchy-build`)
This works through two internal repositories:
- **`omarchy-build`** - Temporary repo in `build-output/` (unsigned packages, used during build)
- **`omarchy`** - Production repo in `pkgs.omarchy.org/` (signed packages)
## Version Management
Packages are only rebuilt if:
- PKGBUILD version is newer than the version in the repository DB
- Package doesn't exist in production yet