Files
openclaw/scripts/e2e/lib/parallels-package-common.sh
2026-04-29 11:49:45 +01:00

123 lines
3.1 KiB
Bash

#!/usr/bin/env bash
parallels_package_current_build_commit() {
node scripts/e2e/lib/parallels-package/build-info-commit.mjs
}
parallels_package_acquire_build_lock() {
local lock_dir="$1"
local owner_pid=""
while ! mkdir "$lock_dir" 2>/dev/null; do
if [[ -f "$lock_dir/pid" ]]; then
owner_pid="$(cat "$lock_dir/pid" 2>/dev/null || true)"
if [[ -n "$owner_pid" ]] && ! kill -0 "$owner_pid" >/dev/null 2>&1; then
printf 'warn: Removing stale Parallels build lock\n' >&2
rm -rf "$lock_dir"
continue
fi
fi
sleep 1
done
printf '%s\n' "$$" >"$lock_dir/pid"
}
parallels_package_release_build_lock() {
local lock_dir="$1"
if [[ -d "$lock_dir" ]]; then
rm -rf "$lock_dir"
fi
}
parallels_package_run_with_build_lock() {
local lock_dir="$1"
local rc
shift
parallels_package_acquire_build_lock "$lock_dir"
set +e
"$@"
rc=$?
set -e
parallels_package_release_build_lock "$lock_dir"
return "$rc"
}
parallels_package_write_dist_inventory() {
node --import tsx --input-type=module --eval \
'import { writePackageDistInventory } from "./src/infra/package-dist-inventory.ts"; await writePackageDistInventory(process.cwd());'
}
parallels_package_assert_no_generated_drift() {
local drift
drift="$(git status --porcelain -- src/canvas-host/a2ui/.bundle.hash 2>/dev/null || true)"
if [[ -z "$drift" ]]; then
return 0
fi
printf 'error: generated file drift after build; commit or revert before Parallels packaging:\n%s\n' "$drift" >&2
return 1
}
parallels_log_progress_extract() {
local _python_bin="$1"
local log_path="$2"
node scripts/e2e/lib/parallels-package/log-progress-extract.mjs "$log_path"
}
parallels_child_job_running() {
local target="$1"
local owner="${2:-}"
local ppid
kill -0 "$target" >/dev/null 2>&1 || return 1
if [[ -z "$owner" ]]; then
return 0
fi
ppid="$(ps -o ppid= -p "$target" 2>/dev/null | tr -d '[:space:]')"
[[ "$ppid" == "$owner" ]]
}
parallels_monitor_jobs_progress() {
local group="$1"
local interval_s="$2"
local stale_s="$3"
local python_bin="$4"
local owner_pid="$5"
shift 5
local labels=()
local pids=()
local logs=()
local last_progress=()
local last_print=()
local i summary now running
while [[ $# -gt 0 ]]; do
labels+=("$1")
pids+=("$2")
logs+=("$3")
last_progress+=("")
last_print+=(0)
shift 3
done
printf '==> %s progress; run dir: %s\n' "$group" "${RUN_DIR:-unknown}"
while :; do
running=0
now=$SECONDS
for ((i = 0; i < ${#pids[@]}; i++)); do
if ! parallels_child_job_running "${pids[$i]}" "$owner_pid"; then
continue
fi
running=1
summary="$(parallels_log_progress_extract "$python_bin" "${logs[$i]}")"
[[ -n "$summary" ]] || summary="waiting for first log line"
if [[ "${last_progress[i]}" != "$summary" ]] || (( now - last_print[i] >= stale_s )); then
printf '==> %s %s: %s\n' "$group" "${labels[$i]}" "$summary"
last_progress[i]="$summary"
last_print[i]=$now
fi
done
(( running )) || break
sleep "$interval_s"
done
}