#!/usr/bin/env bash # Build the meshbay-cli package: the command-line client, and the Python # packages only it needs, on top of meshbay-common. # # Expects build-common.sh to have run first: it installed the CLI last, after # listing the servers' packages in servers-site.txt and servers-bin.txt, so # everything not in those lists is the CLI's and moves here. # # Usage: ./build-cli.sh [staging-dir] set -euo pipefail REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" STAGING="${1:-/tmp/meshbay-build}" COMMON_ROOT="$STAGING/meshbay-common-root" ROOT="$STAGING/meshbay-cli-root" VENV="$COMMON_ROOT/opt/meshbay-common/venv" PYVER=$(basename "$VENV"/lib/python3.*) SITE="$VENV/lib/$PYVER/site-packages" VERSION=$(python3 -c " import tomllib, pathlib p = pathlib.Path('$REPO/packages/meshbay-cli/pyproject.toml') print(tomllib.loads(p.read_text())['project']['version']) ") echo "==> meshbay-cli $VERSION" [ -d "$VENV" ] || { echo "!! shared venv not found — run build-common.sh first" >&2; exit 1; } [ -f "$STAGING/servers-site.txt" ] || { echo "!! $STAGING/servers-site.txt missing — run build-common.sh first" >&2; exit 1; } [ -d "$SITE/meshbay_cli" ] || { echo "!! meshbay_cli not in the shared venv — was build-cli.sh already run?" >&2; exit 1; } rm -rf "$ROOT" mkdir -p "$ROOT/opt/meshbay-cli" # Run from the staged venv with no bytecode written: whatever it imports # would otherwise leave __pycache__ in files other packages own. run_venv() { PYTHONDONTWRITEBYTECODE=1 "$VENV/bin/python" "$@"; } # --- Before moving anything: the notices and the man page ----------------- # Both need the CLI importable, which it is only where build-common.sh put it. echo " writing THIRD-PARTY-NOTICES.txt" run_venv "$REPO/packaging/third_party_notices.py" \ -o "$ROOT/opt/meshbay-cli/THIRD-PARTY-NOTICES.txt" meshbay-cli echo " generating the man page" mkdir -p "$ROOT/usr/share/man/man1" run_venv -m meshbay_cli.manpage | gzip -9n > "$ROOT/usr/share/man/man1/meshbay-cli.1.gz" [ "$(gzip -dc "$ROOT/usr/share/man/man1/meshbay-cli.1.gz" | head -c 3)" = ".TH" ] || { echo "!! the man page did not generate" >&2; exit 1; } # bash-completion loads it the first time Tab is pressed after `meshbay-cli`. echo " generating the bash completion" COMPLETIONS="$ROOT/usr/share/bash-completion/completions" mkdir -p "$COMPLETIONS" MESHBAY_CLI_HOME="$STAGING/cli-home" run_venv -m meshbay_cli completion bash \ > "$COMPLETIONS/meshbay-cli" grep -q '^complete -F _meshbay_cli meshbay-cli$' "$COMPLETIONS/meshbay-cli" || { echo "!! the bash completion did not generate" >&2; exit 1; } # --- The CLI and its own dependencies, out of the common tree --------------- # MOVE (not copy), as build-hub.sh and build-node.sh do: dpkg/rpm then know # these files belong to meshbay-cli. The list is kept for the maintainer # scripts, which remove the bytecode compiled next to these files. CLI_SITE="$ROOT/opt/meshbay-common/venv/lib/$PYVER/site-packages" CLI_BIN="$ROOT/opt/meshbay-common/venv/bin" mkdir -p "$CLI_SITE" "$CLI_BIN" : > "$ROOT/opt/meshbay-cli/site-packages.list" while IFS= read -r entry; do mv "$SITE/$entry" "$CLI_SITE/" echo "$entry" >> "$ROOT/opt/meshbay-cli/site-packages.list" done < <(LC_ALL=C comm -13 "$STAGING/servers-site.txt" <(LC_ALL=C ls -1A "$SITE")) while IFS= read -r entry; do mv "$VENV/bin/$entry" "$CLI_BIN/" done < <(LC_ALL=C comm -13 "$STAGING/servers-bin.txt" <(LC_ALL=C ls -1A "$VENV/bin")) echo " moved: $(tr '\n' ' ' < "$ROOT/opt/meshbay-cli/site-packages.list")" # Only the client is on PATH; the dependencies' own scripts (pygmentize, # keyring, ...) stay inside the venv. mkdir -p "$ROOT/usr/bin" ln -sf /opt/meshbay-common/venv/bin/meshbay-cli "$ROOT/usr/bin/meshbay-cli" find "$ROOT" -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true # What the venv holds of this package, for the rpm spec's %files: the entries # differ with every dependency upgrade, so no list is kept by hand. ( cd "$ROOT" && find opt/meshbay-common/venv/lib/*/site-packages opt/meshbay-common/venv/bin \ -mindepth 1 -maxdepth 1 | LC_ALL=C sort | sed 's|^|/|' ) > "$ROOT.files" echo "==> meshbay-cli staging ready at $ROOT"