#!/bin/bash # Build a single-file version of the wizard for `curl | bash` use: # .github/tools/bundle.sh [output] (default: dist/steamify.sh) # # Inlines lib/*.sh in the order steamify.sh sources them and # wraps the entry point's body in main(), so bash has read the whole file # before anything runs. That lets the bundle reattach stdin to the terminal # when it was piped in by curl, so the interactive menu still works. set -euo pipefail cd "$(dirname "$0")/../.." out="${1:-dist/steamify.sh}" entry=steamify.sh mkdir -p "$(dirname "$out")" # Library order, taken from the entry point's source loop. libs=$(grep -oP '^for lib in \K.*(?=; do$)' "$entry") [[ -n "$libs" ]] || { echo "bundle: can't find the lib source loop in $entry" >&2; exit 1; } version="v$(grep -oP '^VERSION=\K.*' "$entry"), $(git describe --always --dirty 2>/dev/null || echo unknown)" { # Header comment and `set` line of the entry point, up to the source loop. sed -n '1,/^SCRIPT_DIR=/p' "$entry" | sed '$d' echo "# Single-file build ($version), generated by .github/tools/bundle.sh - edit the" echo "# sources in the repository instead: https://github.com/theupriser/steamify-cachyos" echo for lib in $libs; do echo "# ----- lib/$lib.sh -----" # Drop each module's shebang and its "Sourced by ..." boilerplate. sed -e '1{/^#!/d}' -e '/^# Sourced by steamify.sh/d' "lib/$lib.sh" echo done # patches/ and services/ embedded: replace lib/common.sh's patch_file # and service_raw, which read them from the checkout. embed() { local fn="$1" dir="$2" f echo "# ----- $dir/ -----" echo "$fn() {" echo ' case "$1" in' for f in "$dir"/*; do [[ "$f" == "$dir/README.md" ]] && continue grep -q '^STEAMIFY_PATCH_EOF$' "$f" && { echo "bundle: $f contains the heredoc delimiter" >&2; exit 1; } echo " $(basename "$f")) cat << 'STEAMIFY_PATCH_EOF'" cat "$f" echo "STEAMIFY_PATCH_EOF" echo " ;;" done echo ' *) return 1 ;;' echo ' esac' echo "}" echo } embed patch_file patches embed service_raw services echo "# ----- steamify.sh -----" echo "main() {" # Everything after the source loop is the entry point's body. sed -n '/^for lib in /,$p' "$entry" | sed '1,/^done$/d' | sed 's/^/ /; s/^ $//' echo "}" echo echo "# Piped in via curl, bash reads this very file from stdin. Give the menu" echo "# the terminal instead - on the same line as main and exit: bash has read" echo "# this line in full, so it never reads further script from the terminal." echo 'reattach_tty() { if [[ ! -t 0 && -z "${WIZARD_KEEP_STDIN:-}" ]]; then { exec /dev/null || true; fi; }' echo 'reattach_tty; main "$@"; exit $?' } > "$out" chmod +x "$out" bash -n "$out" echo "Wrote $out ($version)"