diff options
author | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2023-03-31 21:12:29 -0700 |
---|---|---|
committer | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2023-03-31 21:12:29 -0700 |
commit | e29c53208a1dc3a737f75e8bb771c688ef8f49a4 (patch) | |
tree | 95ad161111eb886b6298dfd807699a03062dd7b0 | |
parent | c17901f484efaff6fbfc68f22273c31560dcc174 (diff) | |
download | backomp-e29c53208a1dc3a737f75e8bb771c688ef8f49a4.tar.gz backomp-e29c53208a1dc3a737f75e8bb771c688ef8f49a4.tar.xz |
consistent weekly schedule with configurable start day
-rwxr-xr-x | backomp | 31 |
1 files changed, 23 insertions, 8 deletions
@@ -12,13 +12,18 @@ BEGIN { for (i = 1; i <= len; ++i) { b = arr[i] - if (!match(retain, "([*0-9]+)" b, md)) + if (!match(opt_retain, "([*0-9]+)" b, md)) continue ret[b] = md[1] buckets[++n_buckets] = b - repl[b] = !!index(replace, b) + newest_in[b] = !!index(opt_newest_in, b) } + + split("sun mon tue wed thu fri sat", arr) + for (i in arr) + arr2[arr[i]] = i - 1 + wshift = (11 - arr2[opt_week_start])*24*60*60 } { @@ -27,13 +32,16 @@ BEGIN { bt["h"] = flr(t, 60*60) bt["d"] = flr(t, 24*60*60) + bt["w"] = flr(t + wshift, 7*24*60*60) - wshift bt["m"] = mktime(strftime("%Y %m", t, 1) " 01 00 00 00", 1) - bt["w"] = bt["m"] + flr(t - bt["m"], 7*24*60*60) for (i = 1; i <= n_buckets; ++i) { b = buckets[i] - if (repl[b] && bt[b] == last[b, b]) { + if (b == "m" && !newest_in["w"] && bt["m"] > bt["w"]) + next + + if (newest_in[b] && bt[b] == last[b, b]) { for (j = 1; j < i; ++j) { if (bt[buckets[j]] == last[b, buckets[j]]) break @@ -69,7 +77,8 @@ backup() { dest_dir="${1}" src_path="${2}" retain="${3}" - replace="${4}" + newest_in="${4}" + week_start="${5}" [[ "$((dcount++))" -ne 0 ]] && echo echo "[${dcount}] [${retain}] ${src_path} => ${dest_dir}" @@ -82,7 +91,10 @@ backup() { snaps=("${dest_path}" "${snaps[@]}") mapfile -t keep < <( - awk -v "retain=${retain}" -v "replace=${replace}" \ + awk \ + -v "opt_retain=${retain}" \ + -v "opt_newest_in=${newest_in}" \ + -v "opt_week_start=${week_start}" \ "${FILTER_AWK}" < <(printf '%s\n' "${snaps[@]}")) if [[ -z "${keep}" ]]; then echo "WARNING: dirs to keep shouldn't be empty; skipping" >&2 @@ -102,7 +114,8 @@ backup() { declare -A def_opts=( ['retain']='*h*d*w*m' - ['replace']='h' + ['newest_in']='h' + ['week_start']='sun' ) declare -A opts @@ -118,6 +131,8 @@ while IFS='=' read -r f1 f2; do opts["${opt}"]="${f2:-"${def_opts["${opt}"]}"}" else backup "${base_path}/${f1}" "${f2}" \ - "${opts['retain']}" "${opts['replace']}" + "${opts['retain']}" \ + "${opts['newest_in']}" \ + "${opts['week_start']}" fi done < "${1}" |