1# forge mirror syncs the pages on its list by checksum, without the release2# downloads, then deletes what else is in the bucket but the downloads, then3# syncs the downloads alone by size and mtime, so unchanged binaries aren't4# read. Uploads skip rclone's HEAD of each object after it. rclone here is5# a stand-in that writes down how it was called.6. "$(dirname "$0")/../lib.sh"7user dami8repo dami/greet9clone dami dami/greet "$T/w/d"10at "$T/w/d" commit "first"11at "$T/w/d" git tag v112ok push_as dami "$T/w/d" origin main13mkdir "$T/f"14printf 'greet\n' >"$T/f/greet"15FORGE_USER=dami ok at "$T/w/d" "$FORGE" release publish v1 "$T/f/greet"16touch "$FORGE_WWW/index.html"17fake_rclone18mkdir -p "$T/bucket/dami/greet/blob"19echo old >"$T/bucket/dami/greet/blob/index.html"20ok forge mirror21eq "$(cut -d' ' -f1 "$T/rclone.log" | tr '\n' ' ')" "sync lsf delete sync "22sed -n 1p "$T/rclone.log" >"$T/pass1"23sed -n 4p "$T/rclone.log" >"$T/pass2"24has "$T/pass1" "^sync $FORGE_WWW :s3:pages --config --files-from-raw $FORGE_ROOT/.forge/mirror.keep --checksum --fast-list --s3-no-head "25has "$T/pass2" "^sync $FORGE_WWW :s3:pages --config --fast-list --s3-no-head "26lacks "$T/pass2" 'checksum'27has "$T/pass2" "--filter - \*\.old/\*\* --filter - \*\.tmp\.\*/\*\* --filter \+ /\*/\*/releases/download/\*\* --filter - \*\*$"28lacks "$FORGE_ROOT/.forge/mirror.keep" 'releases/download'29has "$T/rclone.log" "^delete :s3:pages --config --files-from-raw $FORGE_ROOT/.forge/mirror.keep.gone "30# --dry-run goes to both syncs and the deletion.31mkdir -p "$T/bucket/dami/greet/blob"32echo old >"$T/bucket/dami/greet/blob/index.html"33: >"$T/rclone.log"34ok forge mirror --dry-run35eq "$(grep -c -- '--dry-run' "$T/rclone.log")" 336exists "$T/bucket/dami/greet/blob/index.html"