emit_status() { if [[ -w /dev/tty ]]; then
printf "%s\n""$*" >/dev/tty else
printf "%s\n""$*" >&2 fi
}
global_package_root() {
local npm_root
npm_root="$(quiet_npm root -g 2>/dev/null || true)" if [[ -n "$npm_root" ]]; then
printf "%s/%s""$npm_root""$PACKAGE_NAME" fi
}
describe_installed_package() {
local root="$1"
local files="missing"
local size="missing"
local version="missing" if [[ -d "$root" ]]; then
files="$(find "$root" -type f 2>/dev/null | wc -l | tr -d "")"
size="$(du -sh "$root" 2>/dev/null | cut -f1 || true)"
version="$(
node -e '
try {
process.stdout.write(String(require(`${process.argv[1]}/package.json`).version ?? "missing"));
} catch {
process.stdout.write("missing");
} ' "$root"
)" fi
printf "version=%s size=%s files=%s root=%s""$version""$size""$files""$root"
}
print_install_audit() {
local label="$1"
local root
root="$(global_package_root)" if [[ -n "$root" ]]; then echo"==> Install audit (${label}): $(describe_installed_package "$root")" fi
}
run_with_heartbeat() {
local label="$1"
shift
local interval="$HEARTBEAT_INTERVAL" if ! [[ "$interval" =~ ^[0-9]+$ ]] || [[ "$interval" == "0" ]]; then "$@"
return fi
local start
local command_pid
local heartbeat_pid
local status
start="$(date +%s)"
set +e "$@" &
command_pid=$!
( while true; do
sleep "$interval"
kill -0 "$command_pid" >/dev/null 2>&1 || exit 0
local now
local elapsed
local root
now="$(date +%s)"
elapsed=$((now - start))
root="$(global_package_root)" if [[ -n "$root" ]]; then
emit_status "==> Still running (${label}, ${elapsed}s): $(describe_installed_package "$root")" else
emit_status "==> Still running (${label}, ${elapsed}s)" fi done
) &
heartbeat_pid=$!
wait "$command_pid"
status=$?
kill "$heartbeat_pid" >/dev/null 2>&1 || true
wait "$heartbeat_pid" >/dev/null 2>&1 || true
set -e
return "$status"
}
resolve_update_baseline_version() { if [[ -n "$UPDATE_BASELINE_TAG_URL" ]]; then
return fi
local resolved_version
resolved_version="$(quiet_npm view "${PACKAGE_NAME}@${UPDATE_BASELINE_VERSION}" version 2>/dev/null || true)" if [[ -z "$resolved_version" ]]; then echo"ERROR: failed to resolve ${PACKAGE_NAME}@${UPDATE_BASELINE_VERSION}" >&2
return 1 fi
UPDATE_BASELINE_VERSION="$resolved_version"
}
echo"==> Verify installed version" if [[ -n "${OPENCLAW_INSTALL_LATEST_OUT:-}" ]]; then # Non-root installer smoke uses the public install script path, which # resolves npm "latest" rather than this host-served candidate tarball.
local latest_npm_version
latest_npm_version="$(quiet_npm view "$PACKAGE_NAME" version 2>/dev/null || true)" if [[ -n "$latest_npm_version" ]]; then
printf "%s""$latest_npm_version" > "${OPENCLAW_INSTALL_LATEST_OUT:-}" else
printf "%s""$FRESH_VERSION" > "${OPENCLAW_INSTALL_LATEST_OUT:-}" fi fi
verify_installed_cli "$PACKAGE_NAME""$FRESH_VERSION"
if [[ "$SKIP_PREVIOUS" == "1" ]]; then echo"==> Skip preinstall previous (OPENCLAW_INSTALL_SMOKE_SKIP_PREVIOUS=1)" else echo"==> Preinstall previous (forces installer upgrade path)"
npm_install_global "preinstall previous release""${PACKAGE_NAME}@${PREVIOUS_VERSION}"
print_install_audit "previous install" fi
echo"==> Run official installer one-liner"
curl -fsSL "$INSTALL_URL" | bash -s -- --no-prompt
echo"==> Verify installed version" if [[ -n "${OPENCLAW_INSTALL_LATEST_OUT:-}" ]]; then
printf "%s""$LATEST_VERSION" > "${OPENCLAW_INSTALL_LATEST_OUT:-}" fi
verify_installed_cli "$PACKAGE_NAME""$LATEST_VERSION"
echo"OK"
}
run_update_smoke() { if [[ -z "$UPDATE_EXPECT_VERSION" ]]; then echo"ERROR: OPENCLAW_INSTALL_UPDATE_EXPECT_VERSION is required for update mode" >&2
return 1 fi if [[ -z "$UPDATE_TAG_URL" ]]; then echo"ERROR: OPENCLAW_INSTALL_UPDATE_TAG_URL is required for update mode" >&2
return 1 fi
run_npm_global_smoke() { if [[ -z "$UPDATE_EXPECT_VERSION" ]]; then echo"ERROR: OPENCLAW_INSTALL_UPDATE_EXPECT_VERSION is required for npm-global mode" >&2
return 1 fi if [[ -z "$UPDATE_TAG_URL" ]]; then echo"ERROR: OPENCLAW_INSTALL_UPDATE_TAG_URL is required for npm-global mode" >&2
return 1 fi
resolve_update_baseline_version
echo"package=$PACKAGE_NAME baseline=$UPDATE_BASELINE_VERSION target=$UPDATE_EXPECT_VERSION" echo"==> Direct npm global install candidate"
npm_install_global "direct npm global install candidate""$UPDATE_TAG_URL"
print_install_audit "direct npm fresh install"
verify_installed_cli "$PACKAGE_NAME""$UPDATE_EXPECT_VERSION"
echo"==> Direct npm global install baseline" if [[ -n "$UPDATE_BASELINE_TAG_URL" ]]; then
npm_install_global "direct npm global install baseline""$UPDATE_BASELINE_TAG_URL" else
npm_install_global "direct npm global install baseline""${PACKAGE_NAME}@${UPDATE_BASELINE_VERSION}" fi
print_install_audit "direct npm baseline install"
verify_installed_cli "$PACKAGE_NAME""$UPDATE_BASELINE_VERSION"
echo"==> Direct npm global update candidate"
npm_install_global "direct npm global update candidate""$UPDATE_TAG_URL"
print_install_audit "direct npm updated install"
verify_installed_cli "$PACKAGE_NAME""$UPDATE_EXPECT_VERSION"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.