aboutsummaryrefslogtreecommitdiffstats
path: root/packaging/build/build-cli.sh
blob: b697f10458cfdc9c7e7adc2216b0b036d49f2507 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/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; }

# --- 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"