Files
omarchy-pkgs/bin/repo
T
Ryan Hughes 63f6156f25 Replace migrate with manifest-driven advance-channel and add the release lock
bin/repo advance --from/--to moves packages forward through the pipeline
(edge → rc → stable), driven by the source channel's database rather than the
raw directory, copying packages AND their detached signatures (fixing the old
migrate bug that left promoted packages unverifiable), refusing to rewrite any
published filename, and requiring a .sig for everything it moves. stable → rc
is allowed only as --fast-ring parity replication or the one-time
--bootstrap seed (bin/repo bootstrap-rc). 'migrate' stays as a deprecated
alias for the transition.

helpers/lock-helpers.sh adds a host-wide flock shared by bin/release,
advance-channel, and upload-prebuilt (reentrant via OMARCHY_RELEASE_LOCK_HELD)
so timers and operators serialize instead of interleaving partial publishes.

bin/release gains a stable-only step 7: replicate fast-ring artifacts to rc so
rc and stable stay in parity between release trains (skipped until rc is
bootstrapped).
2026-08-27 01:10:33 -04:00

163 lines
4.5 KiB
Bash
Executable File

#!/bin/bash
# Meta command for Omarchy repository management
# Usage: ./bin/repo <command> [options]
set -e
# Get the directory of this script
SCRIPT_DIR=$(realpath "${BASH_SOURCE[0]%/*}")
BUILD_ROOT=$(realpath "$SCRIPT_DIR/..")
# Source common functions
source "$BUILD_ROOT/helpers/message-helpers.sh"
source "$BUILD_ROOT/helpers/paths.sh"
# Extract mirror from arguments for log naming (before args are shifted)
LOG_MIRROR=""
for ((i=1; i<=$#; i++)); do
if [[ "${!i}" == "--mirror" ]]; then
next=$((i+1))
LOG_MIRROR="${!next}"
break
fi
done
# Setup logging with timestamps
mkdir -p "$LOG_DIR"
# Rotate logs first - keep only the 10 most recent
if [[ -d "$LOG_DIR" ]]; then
cd "$LOG_DIR"
# List logs by modification time (newest first), skip first 9, delete the rest
# This way after we create the new log, we'll have exactly 10
ls -t repo_*.log 2>/dev/null | tail -n +10 | xargs -r rm -f
cd "$BUILD_ROOT"
fi
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
if [[ -n "$LOG_MIRROR" ]]; then
LOG_FILE="$LOG_DIR/repo_${LOG_MIRROR}_${TIMESTAMP}.log"
else
LOG_FILE="$LOG_DIR/repo_${TIMESTAMP}.log"
fi
export LOG_FILE
export OMARCHY_LOG_FILE="$LOG_FILE"
# Show usage
show_usage() {
echo "Usage: $0 <command> [options]"
echo ""
echo "Commands:"
echo " release Run complete workflow: build → sign → promote → clean → update → sync"
echo " build Build packages (unsigned)"
echo " sign Sign all packages in build-output"
echo " promote Promote build to production (build-output → pkgs.omarchy.org)"
echo " update Update repository database"
echo " clean Clean old package versions"
echo " advance Move packages forward through the pipeline (edge → rc → stable)"
echo " bootstrap-rc One-time seed of the rc channel from stable"
echo " migrate DEPRECATED alias for 'advance --from edge --to stable'"
echo " list List source package metadata (use --repo for published repo)"
echo " remove Remove a specific package"
echo " sync Sync repository to remote"
echo " push Upload local builds to the repository host and publish them there"
echo " deploy Build locally, then push: one command from a build machine"
echo " setup Install everything the repository host needs"
echo ""
echo "Typical workflows:"
echo " $0 release # Complete release workflow"
echo ""
echo " $0 build # Manual step-by-step:"
echo " $0 sign"
echo " $0 promote"
echo " $0 clean"
echo " $0 update"
echo " $0 sync pkgs.omarchy.org/x86_64"
echo ""
echo "For command-specific help, use:"
echo " $0 <command> --help"
exit 0
}
# Check if no command provided
if [[ $# -eq 0 ]]; then
show_usage
fi
# Get command and shift arguments
COMMAND="$1"
shift
# Route to appropriate script with logging
case $COMMAND in
release)
"$SCRIPT_DIR/release" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
build)
"$SCRIPT_DIR/build" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
sign)
"$SCRIPT_DIR/sign" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
promote)
"$SCRIPT_DIR/promote-build" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
update)
"$SCRIPT_DIR/update-repo" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
clean)
"$SCRIPT_DIR/clean-repo" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
advance)
"$SCRIPT_DIR/advance-channel" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
bootstrap-rc)
"$SCRIPT_DIR/advance-channel" --from stable --to rc --bootstrap "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
migrate)
print_warning "'migrate' is deprecated; releases now flow edge → rc → stable (bin/repo advance)"
"$SCRIPT_DIR/advance-channel" --from edge --to stable "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
list)
"$SCRIPT_DIR/list-packages" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
remove)
"$SCRIPT_DIR/remove-package" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
sync)
"$SCRIPT_DIR/sync-repo" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
push)
"$SCRIPT_DIR/push-build" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
deploy)
"$SCRIPT_DIR/deploy" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
setup)
"$SCRIPT_DIR/setup" "$@" 2>&1 | tee "$LOG_FILE"
exit ${PIPESTATUS[0]}
;;
-h | --help | help)
show_usage
;;
*)
print_error "Unknown command: $COMMAND"
echo ""
show_usage
;;
esac