clone

a personal forge on plain git: static pages, stacked-diff reviews, signed local ci, repo sites and releases

main
forge / test / scenarios / release-files.sh
release-files.sh 2.4K
1# A release is regular files at the top of its tree, with names that make2# plain URLs, none over forge.releasemaxsize (256 MiB unless set).3. "$(dirname "$0")/../lib.sh"4user dami5repo dami/greet6clone dami dami/greet "$T/w/d"7at "$T/w/d" commit "first"8at "$T/w/d" git tag v19ok push_as dami "$T/w/d" origin main v110g=$FORGE_ROOT/dami/greet.git11mkdir "$T/f"12head -c 3000 /dev/zero >"$T/f/big.bin"13printf 'small\n' >"$T/f/small"1415git --git-dir="$g" config forge.releasemaxsize 2k16FORGE_USER=dami fails_with 'release v1: big.bin is 3000 bytes, over forge.releasemaxsize \(2048\)' at "$T/w/d" "$FORGE" release publish v1 "$T/f/big.bin" "$T/f/small"17git --git-dir="$g" config forge.releasemaxsize 4k18FORGE_USER=dami ok at "$T/w/d" "$FORGE" release publish v1 "$T/f/big.bin" "$T/f/small"19exists "$FORGE_WWW/dami/greet/releases/download/v1/big.bin"20git --git-dir="$g" config --unset forge.releasemaxsize2122# tree <entries>: a release commit whose tree is SHA256SUMS of the blobs,23# its signature, and these mktree lines; refused for the reason.24rm -rf "$T/f"25mkdir "$T/f"26printf 'x\n' >"$T/f/x"27c=$(release_commit "$T/w/d" v1 "$T/f")28base=$(git -C "$T/w/d" ls-tree "$c")29x=$(git -C "$T/w/d" hash-object -w "$T/f/x")30sub=$(printf '100644 blob %s\tx\n' "$x" | git -C "$T/w/d" mktree)31link=$(printf 'x' | git -C "$T/w/d" hash-object -w --stdin)32refused() {33 t=$(printf '%s\n%s\n' "$base" "$1" | git -C "$T/w/d" mktree)34 c2=$(printf 'release\n\nTag: v1\nSource-Commit: %s\n' "$(git -C "$T/w/d" rev-parse v1)" | git -C "$T/w/d" commit-tree "$t")35 fails_with "$2" push_as dami "$T/w/d" origin "+$c2:refs/releases/v1"36}37refused "$(printf '040000 tree %s\tdir' "$sub")" 'release v1: dir is not a file; a release holds files only'38refused "$(printf '120000 blob %s\tlink' "$link")" 'release v1: link is not a file'39refused "$(printf '100644 blob %s\t.env' "$x")" "file names use letters, digits and \. _ \+ -, and don't start with a dot: \.env"40refused "$(printf '100644 blob %s\tindex page.html' "$x")" 'file names use'41# Only SHA256SUMS and its signature: nothing to download.42t=$(git -C "$T/w/d" ls-tree "$c" | grep SHA256SUMS | git -C "$T/w/d" mktree)43c2=$(printf 'release\n\nTag: v1\nSource-Commit: %s\n' "$(git -C "$T/w/d" rev-parse v1)" | git -C "$T/w/d" commit-tree "$t")44fails_with 'release v1: no files' push_as dami "$T/w/d" origin "+$c2:refs/releases/v1"45exists "$FORGE_WWW/dami/greet/releases/download/v1/big.bin"