1# forge gc keeps the store trees that release refs name (their files are2# hard links, which point at no tree), and frees those of deleted3# releases, with the downloads of a release whose ref went behind the4# hooks' back.5. "$(dirname "$0")/../lib.sh"6user dami7repo dami/greet8clone dami dami/greet "$T/w/d"9mkdir "$T/f"10export FORGE_USER=dami11g=$FORGE_ROOT/dami/greet.git12for v in 1 2 3; do13 tick 360014 at "$T/w/d" commit "v$v"15 at "$T/w/d" git tag "v$v"16 ok push_as dami "$T/w/d" origin main17 printf 'greet %s\n' "$v" >"$T/f/greet"18 ok at "$T/w/d" "$FORGE" release publish "v$v" "$T/f/greet"19 eval "tree$v=$(git --git-dir="$g" rev-parse "refs/releases/v$v^{tree}")"20done21store=$FORGE_ROOT/.forge/store22dl=$FORGE_WWW/dami/greet/releases/download23ok at "$T/w/d" "$FORGE" release rm v324git --git-dir="$g" update-ref -d refs/releases/v225exists "$dl/v2/greet"2627ok forge gc --age 0 --dry-run28has "$T_LOG" '^would remove release dami/greet v2$'29has "$T_LOG" "^would remove store $tree3 "30exists "$dl/v2/greet"31ok forge gc --age 032has "$T_LOG" '^removed release dami/greet v2$'33has "$T_LOG" "^removed store $tree2 "34has "$T_LOG" "^removed store $tree3 "35lacks "$T_LOG" "$tree1"36missing "$dl/v2"37missing "$store/$tree2"38missing "$store/$tree3"39exists "$store/$tree1/greet"40has "$dl/v1/greet" 'greet 1'41has "$dl/latest/greet" 'greet 1'42ok forge gc --age 043lacks "$T_LOG" 'removed (release|store)'