#!/usr/bin/env bash set -euo pipefail # --------------------------------------------------------------------------- # rebuild-perspective.sh — rebuild the patched Perspective and re-vendor it # # pf_app runs a patched build of Perspective that exposes the column axis # expand/collapse the engine already implements (split_by_depth, and # expand_column/collapse_column). Upstream does not ship this yet, so the # built packages are vendored into this directory as npm tarballs. # # Source of truth: https://github.com/fleetside72/perspective # branch column-axis-expand-collapse # # This script exists because vendored binaries are opaque: once the .tgz files # are committed, nothing in the repo records how to regenerate them. Run this # after changing the fork, then commit the resulting tarballs. # # Only needed on a machine that is changing the engine. Deploys just run # `npm install`, which expands the committed tarballs - see ../README in this # directory. # --------------------------------------------------------------------------- PSP="${PSP_DIR:-$HOME/perspective}" BRANCH="${PSP_BRANCH:-column-axis-expand-collapse}" VENDOR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # The four packages that must move together. Perspective's own docs are # emphatic that loader, packages, data format and apache-arrow are one unit; # vendoring a subset would reintroduce exactly the drift that causes trouble. PACKAGES=( "rust/perspective-js" "rust/perspective-server" "rust/perspective-viewer" "packages/viewer-datagrid" ) info() { echo -e "\033[0;34m==>\033[0m $*"; } ok() { echo -e "\033[0;32m ✓\033[0m $*"; } die() { echo -e "\033[0;31m ✗\033[0m $*" >&2; exit 1; } # -- preflight -------------------------------------------------------------- [[ -d "$PSP" ]] || die "No Perspective checkout at $PSP. git clone https://github.com/fleetside72/perspective.git $PSP cd $PSP && git checkout $BRANCH Set PSP_DIR to use a different path." command -v pnpm >/dev/null || die "pnpm not found. Perspective builds with pnpm, not npm." command -v protoc >/dev/null || die "protoc not found. Its VERSION selects which protobuf source tree the build clones, and a version below 22 pulls a layout the build cannot consume. Needs >= 22 (33.2 known good). Distro packages are usually far too old." cmake_ver=$(cmake --version 2>/dev/null | head -1 | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?') || die "cmake not found" cmake_major=${cmake_ver%%.*}; cmake_minor=$(echo "$cmake_ver" | cut -d. -f2) if (( cmake_major < 3 || (cmake_major == 3 && cmake_minor < 29) )); then die "cmake $cmake_ver is too old; Perspective needs >= 3.29.5. A user-level install works: pip3 install --user 'cmake>=3.29.5'" fi info "Perspective checkout: $PSP" git -C "$PSP" rev-parse --abbrev-ref HEAD | grep -qx "$BRANCH" \ || echo " ! on branch $(git -C "$PSP" rev-parse --abbrev-ref HEAD), expected $BRANCH" commit=$(git -C "$PSP" rev-parse --short HEAD) dirty=$(git -C "$PSP" status --porcelain | wc -l) echo " commit $commit$([[ $dirty -gt 0 ]] && echo " (+$dirty uncommitted files)")" # -- build ------------------------------------------------------------------ # `metadata` first: it generates docs/expression_gen.md, which perspective-client # includes at compile time. Building a scope without it fails on the missing file. info "Building (this takes ~40 minutes cold, a few minutes warm)…" ( cd "$PSP" && PSP_ONCE=1 PACKAGE="metadata,server,client,viewer,viewer-datagrid" pnpm run build ) ok "build complete" # -- pack ------------------------------------------------------------------- info "Packing tarballs into $VENDOR" rm -f "$VENDOR"/*.tgz for p in "${PACKAGES[@]}"; do ( cd "$PSP/$p" && npm pack --pack-destination "$VENDOR" >/dev/null ) ok "$(basename "$p")" done # -- record provenance ------------------------------------------------------ # A committed .tgz is an opaque binary; without this the tie back to source is # only in someone's memory. cat > "$VENDOR/PROVENANCE.txt" </dev/null || echo 'unknown') built $(date -u +%Y-%m-%dT%H:%M:%SZ) on $(hostname) dirty $dirty uncommitted file(s) in the source tree at build time Regenerate with ui/vendor/rebuild-perspective.sh EOF echo ls -la "$VENDOR"/*.tgz | awk '{printf " %-52s %5.1f MB\n", $NF, $5/1048576}' echo ok "Done. Now: cd ui && npm install && git add vendor && git commit" [[ $dirty -gt 0 ]] && echo -e "\033[1;33m !\033[0m source tree had uncommitted changes — push them to the fork first" exit 0