aboutsummaryrefslogtreecommitdiff
path: root/scripts/rollover/rollover.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/rollover/rollover.sh')
-rw-r--r--scripts/rollover/rollover.sh54
1 files changed, 54 insertions, 0 deletions
diff --git a/scripts/rollover/rollover.sh b/scripts/rollover/rollover.sh
new file mode 100644
index 0000000..d6e3fab
--- /dev/null
+++ b/scripts/rollover/rollover.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+[ -d "$BACKUP_DIR" ] || {
+ echo "Not a directory: $BACKUP_DIR" >&2
+ exit 1
+}
+
+ts_regex='^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$'
+
+shopt -s nullglob
+candidates=()
+for p in "$BACKUP_DIR"/*; do
+ [[ -d "$p" ]] || continue
+ name="${p##*/}"
+ [[ "$name" =~ $ts_regex ]] && candidates+=("$name")
+done
+shopt -u nullglob
+
+if ((${#candidates[@]} == 0)); then
+ echo "No matching timestamp directories found in $BACKUP_DIR"
+ exit 0
+fi
+
+mapfile -t sorted < <(printf '%s\n' "${candidates[@]}" | LC_ALL=C sort -r)
+newest="${sorted[0]}"
+newest_path="${BACKUP_DIR%/}/$newest"
+
+for name in "${sorted[@]:1}"; do
+ rm -rf -- "${BACKUP_DIR%/}/$name"
+done
+
+date_part="${newest%%T*}"
+
+if date --version >/dev/null 2>&1; then
+ weekname="$(date -d "$date_part" +%G-W%V)"
+else
+ weekname="$(date -jf "%Y-%m-%d" "$date_part" +%G-W%V)"
+fi
+
+target="${BACKUP_DIR%/}/${weekname}"
+
+if [[ "$newest_path" == "$target" ]]; then
+ echo "Newest directory already named '$target'. Done."
+ exit 0
+fi
+
+if [[ -e "$target" && "$target" != "$newest_path" ]]; then
+ echo "Target '$target' already exists. Refusing to overwrite." >&2
+ exit 1
+fi
+
+mv -- "$newest_path" "$target"
+echo "rolled $newest over to $target"