Files
nx9-wg/scripts/backup-source.sh
T

86 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# ==============================================================================
# nx9-wg Source Repository Backup Tool
# ==============================================================================
# PURPOSE:
# Creates a timestamped, compressed source code backup archive while strictly
# excluding build artifacts (target/) and temporary databases, while retaining
# the full .git version history for recovery and auditability.
#
# PREREQUISITES:
# - tar
# - xz or gzip
# - sha256sum
#
# BEHAVIOR:
# - Non-destructive to the source tree.
# - Verifies the integrity of the generated archive.
# - Generates a companion .sha256 checksum file.
#
# USAGE:
# bash scripts/backup-source.sh [DESTINATION_DIR]
# ./scripts/backup-source.sh /backup/sources
# ==============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
DEST_DIR="${1:-${ROOT_DIR}/..}"
mkdir -p "${DEST_DIR}"
DEST_DIR="$(cd "${DEST_DIR}" && pwd)"
PROJECT_NAME="nx9-wg"
TIMESTAMP="$(date +%Y-%m-%d-%H%M%S)"
ARCHIVE_BASE="${PROJECT_NAME}-source-${TIMESTAMP}"
ARCHIVE_PATH="${DEST_DIR}/${ARCHIVE_BASE}.tar.xz"
log() {
echo -e "\033[1;34m[BACKUP-SRC]\033[0m \033[1;37m$*\033[0m"
}
success() {
echo -e "\033[1;32m[SUCCESS]\033[0m $*"
}
error() {
echo -e "\033[1;31m[ERROR]\033[0m $*" >&2
exit 1
}
log "Creating source backup of ${ROOT_DIR}..."
log "Destination archive: ${ARCHIVE_PATH}"
# Create archive excluding heavy/temporary build outputs
tar --exclude='target' \
--exclude='.cargo' \
--exclude='*.log' \
--exclude='*.tmp' \
--exclude='*.db' \
--exclude='*.db-wal' \
--exclude='*.db-shm' \
--exclude='*.tar.gz' \
--exclude='*.tar.xz' \
-cJf "${ARCHIVE_PATH}" \
-C "$(dirname "${ROOT_DIR}")" "$(basename "${ROOT_DIR}")" || error "Failed to create source archive."
# Verify archive integrity
log "Verifying archive integrity..."
tar -tf "${ARCHIVE_PATH}" >/dev/null || error "Archive verification check failed."
# Generate checksum
(cd "${DEST_DIR}" && sha256sum "$(basename "${ARCHIVE_PATH}")" > "${ARCHIVE_BASE}.sha256")
ARCHIVE_SIZE="$(du -h "${ARCHIVE_PATH}" | cut -f1)"
ARCHIVE_SHA="$(cat "${DEST_DIR}/${ARCHIVE_BASE}.sha256" | awk '{print $1}')"
echo -e "\n================================================================="
echo -e "\033[1;32m SOURCE BACKUP COMPLETED SUCCESSFULLY!\033[0m"
echo -e "================================================================="
echo " Archive Path: ${ARCHIVE_PATH}"
echo " Archive Size: ${ARCHIVE_SIZE}"
echo " SHA-256: ${ARCHIVE_SHA}"
echo " Checksum File:${DEST_DIR}/${ARCHIVE_BASE}.sha256"
echo -e "=================================================================\n"