Files
cellar-cli-c/tests/make_fake_bottle.sh
T
Matteo Benedetto 090005f6b9 cellar-cli-c: client CLI di Cellar reimplementato in C (statico, retrocompatibile)
Reimplementazione fedele di cellar-cli.py (enne2/cellar @ f5216b1) in C99
POSIX.1-2008, mono-thread, senza dipendenze esterne: miniz e' vendored per
deflate/inflate raw, mentre contenitore gzip, multipart/form-data in streaming,
tar PAX/ustar, JSON e client HTTP/1.1 sono scritti a mano.

- 7 comandi (list, upload, download, install, scan-local, wizard-upload,
  wizard-install) con stdout/stderr/exit code identici al client Python
- 30/30 test di parita' (tests/parity_test.sh) contro due server mock
  indipendenti: output a confronto, alberi installati, interop tar con
  tarfile di Python e con GNU tar, archivio C equivalente a quello Python
- build statiche x86-64 / i686 / aarch64: nessun simbolo GLIBC richiesto,
  nessuna syscall moderna (statx/openat2/memfd_create/getrandom), LFS 64 bit,
  resolver DNS di riserva (hosts + query UDP) per glibc statica senza NSS
- miglioramento rispetto all'originale: upload multipart in streaming invece
  di leggere l'intero archivio in RAM
- divergenze volute documentate nel README (help piu' sintetico, mtime dei
  symlink non ripristinato come tarfile, EOF nei prompt, niente TLS)

Build: make | make 32 | make arm64 | make test | make verify
2026-09-20 17:29:14 +02:00

45 lines
1.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# Crea una bottiglia finta con i casi difficili: symlink (anche rotto), nomi
# lunghi (>100 char, per i record PAX "path"), UTF-8, spazi/apici, permessi
# insoliti e mtime fissi.
set -euo pipefail
dir="${1:?uso: make_fake_bottle.sh <dir-bottles>}"
bottle="$dir/Fake Bottle"
rm -rf "$bottle"
mkdir -p "$bottle/drive_c/Program Files/Game" "$bottle/dosdevices"
cat > "$bottle/bottle.yml" <<'YML'
Name: 'Fake Bottle'
Runner: soda-9.0-1
Arch: win32
Windows: win10
Environment: Gaming
YML
printf 'hello world\n' > "$bottle/drive_c/Program Files/Game/game.exe"
printf 'config\n' > "$bottle/drive_c/config.ini"
printf 'binario\n' > "$bottle/drive_c/program"
head -c 4096 /dev/urandom > "$bottle/drive_c/blob.bin"
printf 'unicode\n' > "$bottle/drive_c/perché.txt"
longname="$bottle/drive_c/$(python3 -c 'print("a"*110)').txt"
printf 'long path\n' > "$longname"
mkdir -p "$bottle/nested/deep/deeper"
printf 'deep\n' > "$bottle/nested/deep/deeper/file.txt"
ln -s "config.ini" "$bottle/drive_c/link_to_config"
ln -s "/nonexistent/target" "$bottle/drive_c/broken_link"
ln -s "../drive_c/config.ini" "$bottle/dosdevices/c_drive"
chmod 750 "$bottle/nested"
chmod 600 "$bottle/drive_c/config.ini"
chmod 755 "$bottle/drive_c/program"
# mtime fissi (con frazione) per verificare i record PAX mtime
touch -d '2026-03-14 01:12:37.123456789' "$bottle/drive_c/config.ini"
touch -d '2020-01-02 03:04:05' "$bottle/bottle.yml"
echo "$bottle"