86 lines
2.8 KiB
Bash
Executable File
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"
|