#!/bin/bash # Omarchy Repository Database Manager # Updates the repository database with all packages set -e # Source common functions BUILD_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..") source "$BUILD_ROOT/lib/common.sh" # Repository configuration ARCH_DIR="$BUILD_ROOT/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 update repository database update_database() { print_info "Updating repository database..." # Change to architecture directory cd "$ARCH_DIR" # If clean build requested, remove ALL database files first if [[ "$CLEAN_BUILD" == true ]]; then print_warning "Clean build requested - removing all database files..." rm -f "${REPO_NAME}.db"* "${REPO_NAME}.files"* else # 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" fi # Check if there are any packages if ! ls *.pkg.tar.* 1>/dev/null 2>&1; then print_warning "No packages found in $ARCH_DIR" print_warning "Run ./bin/build first to build packages" exit 1 fi # Add all packages to the database (excluding signature files) print_success "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_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_success "Database updated successfully!" print_info "Total packages in repository: $PACKAGE_COUNT" } # Function to verify database verify_database() { print_info "Verifying repository database..." if [[ -f "$DB_FILE" ]]; then # List packages in database print_success "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_success "Database verification complete!" else print_error "Database file not found!" exit 1 fi } # Function to sign database (optional) sign_database() { print_info "Signing repository database..." # Check if GPG key is available if ! gpg --list-secret-keys 2>/dev/null | grep -q "sec"; then print_warning "No GPG key found, skipping signing" print_warning "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_success "Database signed successfully!" } || { print_warning "Database signing failed (optional)" } } # Function to generate repository statistics generate_stats() { print_info "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_success "Total packages: $total_packages" print_success "Repository size: $total_size" # List largest packages if [[ $total_packages -gt 0 ]]; then print_success "Largest packages:" ls -lhS *.pkg.tar.* 2>/dev/null | head -5 | awk '{print " " $9 " (" $5 ")"}' fi } # Main execution main() { print_header "Omarchy Repository Database Manager" # Parse command line arguments VERIFY_ONLY=false SIGN_DB=false STATS_ONLY=false CLEAN_BUILD=false while [[ $# -gt 0 ]]; do case $1 in --verify) VERIFY_ONLY=true shift ;; --sign) SIGN_DB=true shift ;; --stats) STATS_ONLY=true shift ;; --clean) CLEAN_BUILD=true shift ;; -h | --help) echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " --clean Remove existing database and rebuild from scratch" 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_error "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 echo "" print_success "Repository update complete!" } # Run main function main "$@"