1
0
Files
dotfiles/scripts/hcf/package_repo_changes
2025-03-31 20:18:34 +02:00

62 lines
1.8 KiB
Bash
Executable File

#!/bin/bash
# Script to package all git changes and untracked files into a single archive
#
# ./package_repo_changes [ARCHIVE_NAME]
set -euo pipefail
cleanup() {
local exit_code=$?
echo "Cleaning up temporary files..."
[[ -d "${TEMP_DIR:-}" ]] && rm -rf "$TEMP_DIR"
exit $exit_code
}
trap cleanup EXIT
# Get the repository root directory
REPO_DIR=$(git rev-parse --show-toplevel)
cd "$REPO_DIR"
TEMP_DIR=$(mktemp -d)
echo "Creating temporary directory: $TEMP_DIR"
# Check if there are any changes to package
if git diff --quiet && [[ -z "$(git ls-files --others --exclude-standard)" ]]; then
echo "No changes detected in the repository. Nothing to package."
exit 0
fi
echo "Generating patch file for tracked changes..."
git diff >"$TEMP_DIR/changes.patch"
# Include staged changes as well
if ! git diff --staged --quiet; then
echo "Including staged changes..."
git diff --staged >>"$TEMP_DIR/changes.patch"
fi
echo "Packaging untracked files..."
git ls-files --others --exclude-standard >"$TEMP_DIR/untracked_files.txt"
if [[ -s "$TEMP_DIR/untracked_files.txt" ]]; then
tar -czf "$TEMP_DIR/untracked.tar.gz" -T "$TEMP_DIR/untracked_files.txt"
echo "Untracked files packaged successfully."
else
echo "No untracked files found."
touch "$TEMP_DIR/untracked.tar.gz"
fi
# Allow custom archive name with default fallback
ARCHIVE_NAME=${1:-"changes_$(date +%Y%m%d_%H%M%S).tar.gz"}
echo "Creating final archive: $ARCHIVE_NAME"
tar -czf "$ARCHIVE_NAME" -C "$TEMP_DIR" changes.patch untracked.tar.gz
echo "Archive created successfully at: $REPO_DIR/$ARCHIVE_NAME"
echo ""
echo "To apply these changes elsewhere:"
echo "1. Extract the archive: tar -xzf $ARCHIVE_NAME"
echo "2. Apply the patch: git apply changes.patch"
echo "3. Extract untracked files: tar -xzf untracked.tar.gz"