chore: sync local latest state and repository cleanup
This commit is contained in:
113
scripts/ci/archive-logs.sh
Executable file
113
scripts/ci/archive-logs.sh
Executable file
@@ -0,0 +1,113 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
APPLY="false"
|
||||
OLDER_THAN_DAYS="1"
|
||||
ARCHIVE_TAG_DEFAULT="$(date +%Y%m%d_%H%M%S)"
|
||||
ARCHIVE_TAG="${ARCHIVE_TAG_DEFAULT}"
|
||||
|
||||
PATTERN_PATHS=(
|
||||
"logs/e2e-automation/run_*.log"
|
||||
"logs/e2e-automation/report_*.md"
|
||||
"logs/prd-review/review_*.md"
|
||||
"logs/prd-review/claude_apply_*.md"
|
||||
"logs/prd-review/execution_report_*.md"
|
||||
"logs/prd-review/optimization_report_*.md"
|
||||
)
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage:
|
||||
./scripts/ci/archive-logs.sh [--apply] [--older-than-days N] [--archive-tag TAG]
|
||||
|
||||
Options:
|
||||
--apply Execute archive move. Without this flag, script runs in dry-run mode.
|
||||
--older-than-days N Archive files older than N days. Default: 1
|
||||
--archive-tag TAG Archive subdir tag under logs/archive/. Default: timestamp
|
||||
-h, --help Show help
|
||||
|
||||
Examples:
|
||||
./scripts/ci/archive-logs.sh
|
||||
./scripts/ci/archive-logs.sh --apply
|
||||
./scripts/ci/archive-logs.sh --apply --older-than-days 2 --archive-tag weekly_20260323
|
||||
EOF
|
||||
}
|
||||
|
||||
log() { echo "[archive-logs] $*"; }
|
||||
|
||||
run_cmd() {
|
||||
if [[ "${APPLY}" == "true" ]]; then
|
||||
"$@"
|
||||
else
|
||||
log "DRY-RUN: $*"
|
||||
fi
|
||||
}
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--apply)
|
||||
APPLY="true"
|
||||
shift
|
||||
;;
|
||||
--older-than-days)
|
||||
OLDER_THAN_DAYS="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
--archive-tag)
|
||||
ARCHIVE_TAG="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if ! [[ "${OLDER_THAN_DAYS}" =~ ^[0-9]+$ ]]; then
|
||||
echo "Invalid --older-than-days: ${OLDER_THAN_DAYS}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ARCHIVE_DIR="${ROOT_DIR}/logs/archive/${ARCHIVE_TAG}"
|
||||
CUTOFF_EPOCH="$(date -d "${OLDER_THAN_DAYS} days ago" +%s)"
|
||||
|
||||
log "root=${ROOT_DIR}"
|
||||
log "apply=${APPLY} older_than_days=${OLDER_THAN_DAYS} archive_dir=${ARCHIVE_DIR}"
|
||||
log "cutoff=$(date -d "@${CUTOFF_EPOCH}" '+%Y-%m-%d %H:%M:%S')"
|
||||
|
||||
if [[ "${APPLY}" == "true" ]]; then
|
||||
mkdir -p "${ARCHIVE_DIR}"
|
||||
fi
|
||||
|
||||
shopt -s nullglob
|
||||
moved_count=0
|
||||
for pattern in "${PATTERN_PATHS[@]}"; do
|
||||
for abs in "${ROOT_DIR}"/${pattern}; do
|
||||
[[ -f "${abs}" ]] || continue
|
||||
|
||||
mtime_epoch="$(stat -c %Y "${abs}")"
|
||||
if [[ "${mtime_epoch}" -ge "${CUTOFF_EPOCH}" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
rel="${abs#${ROOT_DIR}/}"
|
||||
dest="${ARCHIVE_DIR}/${rel}"
|
||||
run_cmd mkdir -p "$(dirname "${dest}")"
|
||||
run_cmd mv "${abs}" "${dest}"
|
||||
log "ARCHIVE ${rel} -> ${dest}"
|
||||
moved_count=$((moved_count + 1))
|
||||
done
|
||||
done
|
||||
shopt -u nullglob
|
||||
|
||||
log "done: archived=${moved_count}"
|
||||
if [[ "${APPLY}" != "true" ]]; then
|
||||
log "dry-run completed. Use --apply to execute."
|
||||
fi
|
||||
Reference in New Issue
Block a user