🔒 Repository is read-only – file editing is disabled.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
#!/usr/bin/env bash
# Krótki test funkcji pomocniczych pagbuild (bez uruchamiania chroot)
set -euo pipefail
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin${PATH:+:$PATH}"
# ── kopie funkcji z pagbuild ──
is_valid_archive() {
local f="$1" ext magic
[[ -f "$f" ]] || return 1
ext="${f##*.}"
case "$ext" in
gz|tgz|xz|txz|bz2|tbz2|zip) ;;
*) return 0 ;;
esac
magic=$(head -c 8 "$f" | od -An -tx1 | tr -d ' \n')
case "$ext" in
gz|tgz) [[ "$magic" == 1f8b* ]] ;;
xz|txz) [[ "$magic" == fd377a585a00* ]] ;;
bz2|tbz2) [[ "$magic" == 425a68* ]] ;;
zip) [[ "$magic" == 504b0304* ]] ;;
esac
}
fetch_source() {
local url="$1" dest="$2" tmp
tmp="${dest}.tmp"
rm -f "$tmp"
echo "Pobieranie: $url"
if curl -fsSL --retry 3 --connect-timeout 20 --max-time 900 "$url" -o "$tmp" && mv -f "$tmp" "$dest"; then
return 0
fi
rm -f "$tmp"
return 1
}
declare -A MIRRORS=(
["ftp.gnu.org"]="https://mirrors.kernel.org/gnu https://ftp.nluug.nl/pub/gnu https://mirror.ibcp.fr/pub/gnu"
["www.openssl.org"]="https://github.com/openssl/openssl/releases"
["sourceware.org"]="https://mirrors.kernel.org/sourceware"
["www.kernel.org"]="https://mirrors.edge.kernel.org"
)
T="$(mktemp -d)"
trap 'rm -rf "$T"' EXIT
# 1. is_valid_archive
echo "hello gzip" | gzip > "$T/real.tar.gz"
echo "<html>404 Not Found</html>" > "$T/fake.tar.gz"
printf 'ustar-archive-content' > "$T/plain.tar"
head -c 100 /dev/urandom > "$T/trunc.xz"
is_valid_archive "$T/real.tar.gz" && echo "PASS: prawdziwy .tar.gz rozpoznany"
if is_valid_archive "$T/fake.tar.gz"; then echo "FAIL: HTML przyjęty jako gzip"; exit 1; else echo "PASS: HTML odrzucony"; fi
is_valid_archive "$T/plain.tar" && echo "PASS: plain .tar bez walidacji"
if is_valid_archive "$T/trunc.xz"; then echo "FAIL: śmieci przyjęte jako xz"; exit 1; else echo "PASS: śmieci .xz odrzucone"; fi
if is_valid_archive "$T/nieistnieje.gz"; then echo "FAIL: brak pliku przyjęty"; exit 1; else echo "PASS: brak pliku odrzucony"; fi
# 2. fetch_source przez file:// (staging + mv)
cp "$T/real.tar.gz" "$T/src.tar.gz"
fetch_source "file://$T/src.tar.gz" "$T/dl.tar.gz"
cmp -s "$T/real.tar.gz" "$T/dl.tar.gz" && echo "PASS: fetch_source pobrał poprawnie"
if [[ -e "$T/dl.tar.gz.tmp" ]]; then echo "FAIL: .tmp nie posprzątany"; exit 1; else echo "PASS: .tmp posprzątany"; fi
# 3. nieudane pobranie nie zostawia śmieci
if fetch_source "file://$T/nie-ma-tego-pliku.gz" "$T/bad.gz"; then echo "FAIL: fetch_source miał zwrócić błąd"; exit 1; else echo "PASS: fetch_source zwraca błąd"; fi
if [[ -e "$T/bad.gz" || -e "$T/bad.gz.tmp" ]]; then echo "FAIL: śmieci po nieudanym pobraniu"; exit 1; else echo "PASS: brak śmieci po nieudanym pobraniu"; fi
# 4. mirror URL construction
SRC_URL="https://ftp.gnu.org/gnu/bash/bash-5.2.37.tar.gz"
MIRROR_URLS=()
for _host in "${!MIRRORS[@]}"; do
[[ "$SRC_URL" == *"$_host"* ]] || continue
_orig_path="${SRC_URL#*"$_host"}"
for _m in ${MIRRORS[$_host]}; do
_m_no_scheme="${_m#*://}"
if [[ "$_m_no_scheme" == */* ]]; then
_m_path="/${_m_no_scheme#*/}"
else
_m_path=""
fi
if [[ -z "$_m_path" ]]; then
MIRROR_URLS+=("$_m$_orig_path")
elif [[ "$_orig_path" == "$_m_path"* ]]; then
MIRROR_URLS+=("$_m${_orig_path#"$_m_path"}")
fi
done
done
echo " mirror: ${MIRROR_URLS[0]}"
[[ "${MIRROR_URLS[0]}" == "https://mirrors.kernel.org/gnu/bash/bash-5.2.37.tar.gz" ]] && echo "PASS: mirror gnu OK" || { echo "FAIL: zły mirror gnu: ${MIRROR_URLS[0]}"; exit 1; }
SRC_URL="https://github.com/systemd/systemd/archive/v256.4.tar.gz"
MIRROR_URLS=()
for _host in "${!MIRRORS[@]}"; do
if [[ "$SRC_URL" == *"$_host"* ]]; then
_rel="${SRC_URL#*"$_host"}"
for _m in ${MIRRORS[$_host]}; do
MIRROR_URLS+=("$_m$_rel")
done
fi
done
if [[ ${#MIRROR_URLS[@]} -eq 0 ]]; then echo "PASS: github bez mirrora (brak pasującego hosta)"; else echo "FAIL: github dostał mirror: ${MIRROR_URLS[*]}"; exit 1; fi
# 5. CHROOT_BIN detection
CHROOT_BIN=""
for _cand in /usr/sbin/chroot /sbin/chroot /bin/chroot /usr/bin/chroot; do
[[ -x "$_cand" ]] && CHROOT_BIN="$_cand" && break
done
[[ -z "$CHROOT_BIN" ]] && CHROOT_BIN="$(command -v chroot 2>/dev/null || true)"
echo " chroot: ${CHROOT_BIN:-BRAK}"
[[ -n "$CHROOT_BIN" ]] && echo "PASS: chroot znaleziony" || { echo "FAIL: chroot nie znaleziony (brak coreutils?)"; exit 1; }
echo ""
echo "✅ WSZYSTKIE TESTY POMOCNICZE PRZESZŁY"