Probably should have committed a long time ago...

This commit is contained in:
Ryan Hughes
2025-08-25 05:45:19 +02:00
commit e00a529ba9
10 changed files with 1319 additions and 0 deletions
Executable
+231
View File
@@ -0,0 +1,231 @@
#!/bin/bash
# Omarchy Repository Package Builder - Docker Isolated
# Builds packages in Docker without affecting the host system
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Repository paths
REPO_DIR="/home/ryan/Dev/omarchy-repo"
ARCH_DIR="$REPO_DIR/x86_64"
BUILD_DIR="$REPO_DIR/build"
# Create directories if they don't exist
mkdir -p "$ARCH_DIR" "$BUILD_DIR"
# Function to print colored messages
print_msg() {
local color=$1
local msg=$2
echo -e "${color}${msg}${NC}"
}
# Function to build Docker image
build_docker_image() {
print_msg "$BLUE" "==> Building Docker image..."
# Check if Dockerfile exists
if [[ ! -f "$BUILD_DIR/Dockerfile" ]]; then
print_msg "$RED" "Error: Dockerfile not found at $BUILD_DIR/Dockerfile"
exit 1
fi
# Prepare package list for Docker build
if [[ -n "$ONLY_PACKAGES" ]]; then
print_msg "$YELLOW" " -> Filtering packages: $ONLY_PACKAGES"
# Create temporary filtered list
> "$BUILD_DIR/packages"
# Check each package against the main list
for pkg in $ONLY_PACKAGES; do
# Check if in package list (handle options like skip-pgp)
if [[ -f "$REPO_DIR/packages" ]]; then
grep "^$pkg\( \|$\)" "$REPO_DIR/packages" >> "$BUILD_DIR/packages" && {
print_msg "$GREEN" " -> $pkg"
} || {
print_msg "$YELLOW" " -> $pkg (not found in package list)"
}
fi
done
else
# Copy full packages list to build directory
cp "$REPO_DIR/packages" "$BUILD_DIR/packages"
fi
# Build image
cd "$BUILD_DIR"
docker build -t omarchy-builder . || {
print_msg "$RED" "Failed to build Docker image"
exit 1
}
print_msg "$GREEN" " -> Docker image built successfully!"
}
# Function to run build in Docker
run_docker_build() {
print_msg "$BLUE" "==> Running package build in Docker..."
# Create src directory if it doesn't exist
mkdir -p "$REPO_DIR/src"
# Build docker run command with options
DOCKER_ENV=""
if [[ "$SKIP_PGP" == true ]]; then
print_msg "$YELLOW" " -> Skipping PGP signature verification"
DOCKER_ENV="$DOCKER_ENV -e SKIP_PGP=true"
fi
if [[ "$FORCE_REBUILD" == true ]]; then
print_msg "$YELLOW" " -> Forcing rebuild of all packages"
DOCKER_ENV="$DOCKER_ENV -e FORCE_REBUILD=true"
fi
docker run --rm \
$DOCKER_ENV \
-v "$ARCH_DIR:/output" \
-v "$ARCH_DIR:/var/cache/pacman/pkg" \
-v "$REPO_DIR/src:/src" \
omarchy-builder || {
print_msg "$RED" "Docker build failed"
exit 1
}
print_msg "$GREEN" " -> Package build complete!"
}
# Function to clean Docker resources
clean_docker() {
print_msg "$BLUE" "==> Cleaning Docker resources..."
# Remove image
docker rmi omarchy-builder 2>/dev/null || true
# Clean temporary packages file from build directory
rm -f "$BUILD_DIR/packages"
print_msg "$GREEN" " -> Cleanup complete!"
}
# Main execution
main() {
print_msg "$BLUE" "================================"
print_msg "$BLUE" "Omarchy Repository Docker Builder"
print_msg "$BLUE" "================================"
# Check for Docker
if ! command -v docker &> /dev/null; then
print_msg "$RED" "Error: Docker is not installed"
print_msg "$YELLOW" "Please install Docker first:"
print_msg "$YELLOW" " sudo pacman -S docker"
print_msg "$YELLOW" " sudo systemctl start docker"
print_msg "$YELLOW" " sudo usermod -aG docker $USER"
exit 1
fi
# Check if Docker daemon is running
if ! docker info &> /dev/null; then
print_msg "$RED" "Error: Docker daemon is not running"
print_msg "$YELLOW" "Start Docker with: sudo systemctl start docker"
exit 1
fi
# Parse command line arguments
CLEAN_ONLY=false
KEEP_IMAGE=false
ONLY_PACKAGES=""
SKIP_PGP=false
FORCE_REBUILD=false
while [[ $# -gt 0 ]]; do
case $1 in
--clean)
CLEAN_ONLY=true
shift
;;
--keep-image)
KEEP_IMAGE=true
shift
;;
--only)
ONLY_PACKAGES="$2"
shift 2
;;
--skip-pgp)
SKIP_PGP=true
shift
;;
--force)
FORCE_REBUILD=true
shift
;;
-h|--help)
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " --clean Clean Docker resources only"
echo " --keep-image Keep Docker image after build"
echo " --only \"pkg1 pkg2\" Only build specific packages"
echo " --skip-pgp Skip PGP signature verification"
echo " --force Force rebuild even if no updates"
echo " -h, --help Show this help message"
echo ""
echo "Examples:"
echo " $0 # Build all packages"
echo " $0 --only \"yay walker-bin\" # Only build yay and walker-bin"
echo " $0 --skip-pgp # Build without PGP checks"
echo ""
echo "This script builds all packages listed in:"
echo " - packages.official (downloaded from Arch repos)"
echo " - packages.aur (built from AUR)"
echo ""
echo "All builds happen inside a Docker container."
echo "No packages are installed on your host system."
exit 0
;;
*)
print_msg "$RED" "Unknown option: $1"
exit 1
;;
esac
done
# Execute based on options
if [[ "$CLEAN_ONLY" == true ]]; then
clean_docker
else
# Build packages
build_docker_image
run_docker_build
# Clean up unless keeping image
if [[ "$KEEP_IMAGE" != true ]]; then
clean_docker
else
print_msg "$YELLOW" "Docker image kept: omarchy-builder"
print_msg "$YELLOW" "Remove with: docker rmi omarchy-builder"
fi
# Show results
print_msg "$BLUE" "\n==> Build Summary:"
local count=$(ls -1 "$ARCH_DIR"/*.pkg.tar.* 2>/dev/null | wc -l)
if [[ $count -gt 0 ]]; then
print_msg "$GREEN" " -> Built/downloaded $count package(s)"
print_msg "$GREEN" " -> Packages are in: $ARCH_DIR"
print_msg "$YELLOW" "\nNext step: Run ./scripts/update-repo.sh"
else
print_msg "$YELLOW" " -> No packages were built"
print_msg "$YELLOW" " -> Check your package lists"
fi
fi
}
# Run main function
main "$@"
Executable
+245
View File
@@ -0,0 +1,245 @@
#!/bin/bash
# Omarchy Repository Cleaner
# Removes old package versions keeping only the latest
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Repository configuration
REPO_DIR="/home/ryan/Dev/omarchy-repo"
ARCH_DIR="$REPO_DIR/x86_64"
KEEP_VERSIONS=2
# Function to print colored messages
print_msg() {
local color=$1
local msg=$2
echo -e "${color}${msg}${NC}"
}
# Function to clean old packages
clean_packages() {
local keep=$1
local dry_run=$2
print_msg "$BLUE" "==> Cleaning old packages (keeping $keep versions)..."
cd "$ARCH_DIR"
# Group packages by name
declare -A packages
for pkg in *.pkg.tar.*; do
[[ -f "$pkg" ]] || continue
# Skip signature files
[[ "$pkg" == *.sig ]] && continue
# Extract package name (remove version and architecture)
# Format: name-version-release-arch.pkg.tar.*
local pkgname=$(echo "$pkg" | sed -E 's/-[0-9]+.*-(any|x86_64|i686)\.pkg\.tar\..*//')
# Add to array
if [[ -n "${packages[$pkgname]}" ]]; then
packages[$pkgname]="${packages[$pkgname]} $pkg"
else
packages[$pkgname]="$pkg"
fi
done
# Process each package group
local total_removed=0
local space_freed=0
for pkgname in "${!packages[@]}"; do
# Convert string to array and sort by modification time (newest first)
IFS=' ' read -ra pkg_files <<< "${packages[$pkgname]}"
# Sort by modification time
local sorted_files=($(ls -t "${pkg_files[@]}" 2>/dev/null))
local count=${#sorted_files[@]}
if [[ $count -gt $keep ]]; then
print_msg "$GREEN" " -> Processing $pkgname ($count versions found)"
# Remove old versions
for ((i=$keep; i<$count; i++)); do
local file="${sorted_files[$i]}"
local size=$(stat -c%s "$file" 2>/dev/null || echo 0)
space_freed=$((space_freed + size))
if [[ "$dry_run" == true ]]; then
print_msg "$YELLOW" " Would remove: $file ($(numfmt --to=iec-i --suffix=B $size))"
else
print_msg "$RED" " Removing: $file ($(numfmt --to=iec-i --suffix=B $size))"
rm -f "$file"
rm -f "${file}.sig" 2>/dev/null || true
fi
total_removed=$((total_removed + 1))
done
fi
done
# Summary
if [[ $total_removed -gt 0 ]]; then
if [[ "$dry_run" == true ]]; then
print_msg "$BLUE" "\n -> Would remove $total_removed old package(s)"
print_msg "$BLUE" " -> Would free $(numfmt --to=iec-i --suffix=B $space_freed)"
else
print_msg "$GREEN" "\n -> Removed $total_removed old package(s)"
print_msg "$GREEN" " -> Freed $(numfmt --to=iec-i --suffix=B $space_freed)"
fi
else
print_msg "$YELLOW" " -> No old packages to remove"
fi
}
# Function to remove all packages
remove_all_packages() {
local dry_run=$1
print_msg "$RED" "==> WARNING: Removing ALL packages from repository!"
if [[ "$dry_run" != true ]]; then
read -p "Are you sure? Type 'yes' to confirm: " confirm
if [[ "$confirm" != "yes" ]]; then
print_msg "$YELLOW" "Cancelled."
exit 0
fi
fi
cd "$ARCH_DIR"
local count=$(ls -1 *.pkg.tar.* 2>/dev/null | wc -l)
if [[ $count -eq 0 ]]; then
print_msg "$YELLOW" "No packages found to remove"
return
fi
if [[ "$dry_run" == true ]]; then
print_msg "$YELLOW" "Would remove $count package(s):"
ls -1 *.pkg.tar.* 2>/dev/null | while read -r pkg; do
echo " - $pkg"
done
else
rm -f *.pkg.tar.*
rm -f *.db* *.files*
print_msg "$GREEN" "Removed $count package(s) and database files"
fi
}
# Function to show repository disk usage
show_disk_usage() {
print_msg "$BLUE" "\n==> Repository Disk Usage:"
cd "$ARCH_DIR"
local total_size=$(du -sh . 2>/dev/null | cut -f1)
local package_count=$(ls -1 *.pkg.tar.* 2>/dev/null | grep -v '\.sig$' | wc -l)
print_msg "$GREEN" " -> Total size: $total_size"
print_msg "$GREEN" " -> Package count: $package_count"
if [[ $package_count -gt 0 ]]; then
print_msg "$GREEN" " -> Average package size: $(du -b *.pkg.tar.* 2>/dev/null | awk '{sum+=$1; count++} END {print sum/count}' | numfmt --to=iec-i --suffix=B)"
fi
}
# Main execution
main() {
print_msg "$BLUE" "================================"
print_msg "$BLUE" "Omarchy Repository Cleaner"
print_msg "$BLUE" "================================"
# Parse command line arguments
DRY_RUN=false
REMOVE_ALL=false
SHOW_USAGE=false
while [[ $# -gt 0 ]]; do
case $1 in
--keep)
KEEP_VERSIONS="$2"
shift 2
;;
--dry-run)
DRY_RUN=true
shift
;;
--all)
REMOVE_ALL=true
shift
;;
--usage)
SHOW_USAGE=true
shift
;;
-h|--help)
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " --keep N Keep N versions of each package (default: 2)"
echo " --dry-run Preview what would be removed without removing"
echo " --all Remove ALL packages (dangerous!)"
echo " --usage Show disk usage statistics"
echo " -h, --help Show this help message"
echo ""
echo "Examples:"
echo " $0 # Keep 2 versions (default)"
echo " $0 --keep 3 # Keep 3 versions"
echo " $0 --dry-run # Preview cleanup"
echo " $0 --all --dry-run # Preview complete removal"
exit 0
;;
*)
print_msg "$RED" "Unknown option: $1"
exit 1
;;
esac
done
# Validate keep versions
if ! [[ "$KEEP_VERSIONS" =~ ^[0-9]+$ ]] || [[ "$KEEP_VERSIONS" -lt 1 ]]; then
print_msg "$RED" "Error: --keep must be a positive integer"
exit 1
fi
# Show dry run notice
if [[ "$DRY_RUN" == true ]]; then
print_msg "$YELLOW" "DRY RUN MODE - No changes will be made"
fi
# Execute based on options
if [[ "$SHOW_USAGE" == true ]]; then
show_disk_usage
elif [[ "$REMOVE_ALL" == true ]]; then
remove_all_packages "$DRY_RUN"
else
clean_packages "$KEEP_VERSIONS" "$DRY_RUN"
# Update database after cleaning (unless dry run)
if [[ "$DRY_RUN" != true ]]; then
print_msg "$BLUE" "\n==> Updating repository database..."
"$REPO_DIR/scripts/update-repo.sh" >/dev/null 2>&1 && {
print_msg "$GREEN" " -> Database updated successfully!"
} || {
print_msg "$YELLOW" " -> Database update failed (may need manual update)"
}
fi
show_disk_usage
fi
print_msg "$GREEN" "\n==> Cleanup complete!"
}
# Run main function
main "$@"
Executable
+8
View File
@@ -0,0 +1,8 @@
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: sync-repo.sh [directory]"
exit 1
fi
rclone sync "$1" "pkgs.omarchy.org:omarchy-pkgs/$(basename $1)" --checksum --progress --copy-links --delete-after -v
+186
View File
@@ -0,0 +1,186 @@
#!/bin/bash
# Omarchy Repository Database Manager
# Updates the repository database with all packages
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Repository configuration
REPO_DIR="/home/ryan/Dev/omarchy-repo"
ARCH_DIR="$REPO_DIR/x86_64"
REPO_NAME="omarchy"
DB_FILE="$ARCH_DIR/${REPO_NAME}.db.tar.zst"
FILES_FILE="$ARCH_DIR/${REPO_NAME}.files.tar.zst"
# Function to print colored messages
print_msg() {
local color=$1
local msg=$2
echo -e "${color}${msg}${NC}"
}
# Function to update repository database
update_database() {
print_msg "$BLUE" "==> Updating repository database..."
# Change to architecture directory
cd "$ARCH_DIR"
# Remove old database files and symlinks
rm -f "${REPO_NAME}.db" "${REPO_NAME}.db.tar.zst"
rm -f "${REPO_NAME}.files" "${REPO_NAME}.files.tar.zst"
rm -f "${REPO_NAME}.db.tar.zst.old" "${REPO_NAME}.files.tar.zst.old"
# Check if there are any packages
if ! ls *.pkg.tar.* 1> /dev/null 2>&1; then
print_msg "$YELLOW" "Warning: No packages found in $ARCH_DIR"
print_msg "$YELLOW" "Run ./scripts/build-packages.sh first to build packages"
exit 1
fi
# Add all packages to the database (excluding signature files)
print_msg "$GREEN" " -> Adding packages to database..."
# Process packages in smaller batches to avoid command line limits
# Use -n 5 to process 5 packages at a time
find . -maxdepth 1 -name "*.pkg.tar.*" ! -name "*.sig" -exec basename {} \; | xargs -n 5 repo-add "$DB_FILE" || {
print_msg "$RED" "Error: Failed to update repository database"
exit 1
}
# Create symlinks for compatibility
ln -sf "${REPO_NAME}.db.tar.zst" "${REPO_NAME}.db"
ln -sf "${REPO_NAME}.files.tar.zst" "${REPO_NAME}.files"
# Count packages
PACKAGE_COUNT=$(ls -1 *.pkg.tar.* 2>/dev/null | wc -l)
print_msg "$GREEN" " -> Database updated successfully!"
print_msg "$BLUE" " -> Total packages in repository: $PACKAGE_COUNT"
}
# Function to verify database
verify_database() {
print_msg "$BLUE" "\n==> Verifying repository database..."
if [[ -f "$DB_FILE" ]]; then
# List packages in database
print_msg "$GREEN" " -> Packages in database:"
tar -tf "$DB_FILE" 2>/dev/null | grep -E "^[^/]+/$" | sed 's|/$||' | sort -u | while read -r pkg; do
echo " - $pkg"
done
print_msg "$GREEN" " -> Database verification complete!"
else
print_msg "$RED" "Error: Database file not found!"
exit 1
fi
}
# Function to sign database (optional)
sign_database() {
print_msg "$BLUE" "\n==> Signing repository database..."
# Check if GPG key is available
if ! gpg --list-secret-keys 2>/dev/null | grep -q "sec"; then
print_msg "$YELLOW" "Warning: No GPG key found, skipping signing"
print_msg "$YELLOW" "To enable signing, create a GPG key and configure it"
return
fi
# Sign the database
gpg --detach-sign --use-agent "$DB_FILE" 2>/dev/null && {
print_msg "$GREEN" " -> Database signed successfully!"
} || {
print_msg "$YELLOW" " -> Database signing failed (optional)"
}
}
# Function to generate repository statistics
generate_stats() {
print_msg "$BLUE" "\n==> Repository Statistics:"
cd "$ARCH_DIR"
# Count packages by type
local total_packages=$(ls -1 *.pkg.tar.* 2>/dev/null | wc -l)
local total_size=$(du -sh . 2>/dev/null | cut -f1)
print_msg "$GREEN" " -> Total packages: $total_packages"
print_msg "$GREEN" " -> Repository size: $total_size"
# List largest packages
if [[ $total_packages -gt 0 ]]; then
print_msg "$GREEN" " -> Largest packages:"
ls -lhS *.pkg.tar.* 2>/dev/null | head -5 | awk '{print " " $9 " (" $5 ")"}'
fi
}
# Main execution
main() {
print_msg "$BLUE" "================================"
print_msg "$BLUE" "Omarchy Repository Database Manager"
print_msg "$BLUE" "================================"
# Parse command line arguments
VERIFY_ONLY=false
SIGN_DB=false
STATS_ONLY=false
while [[ $# -gt 0 ]]; do
case $1 in
--verify)
VERIFY_ONLY=true
shift
;;
--sign)
SIGN_DB=true
shift
;;
--stats)
STATS_ONLY=true
shift
;;
-h|--help)
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " --verify Only verify the database"
echo " --sign Sign the database with GPG"
echo " --stats Show repository statistics only"
echo " -h, --help Show this help message"
exit 0
;;
*)
print_msg "$RED" "Unknown option: $1"
exit 1
;;
esac
done
# Execute based on options
if [[ "$STATS_ONLY" == true ]]; then
generate_stats
elif [[ "$VERIFY_ONLY" == true ]]; then
verify_database
else
update_database
if [[ "$SIGN_DB" == true ]]; then
sign_database
fi
verify_database
generate_stats
fi
print_msg "$GREEN" "\n==> Repository update complete!"
}
# Run main function
main "$@"