#!/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"