157 lines
4.4 KiB
Bash
157 lines
4.4 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
source "$repo_root/scripts/lib-hypertwist-gitnexus.sh"
|
|
analysis_root="$repo_root/.gitnexus-source-only-root"
|
|
max_size_kb="${HYPERTWIST_GITNEXUS_MAX_FILE_SIZE_KB:-256}"
|
|
analysis_timeout_seconds="${HYPERTWIST_GITNEXUS_ANALYZE_TIMEOUT_SECONDS:-300}"
|
|
|
|
copy_targets=(
|
|
"UnrealHyperTwist/Source"
|
|
"Content/Browser/src"
|
|
"website/src"
|
|
"website/server/src"
|
|
"scripts"
|
|
)
|
|
|
|
rm -rf "$analysis_root"
|
|
mkdir -p "$analysis_root"
|
|
|
|
for target in "${copy_targets[@]}"; do
|
|
source_path="$repo_root/$target"
|
|
if [[ ! -e "$source_path" ]]; then
|
|
continue
|
|
fi
|
|
|
|
destination_path="$analysis_root/$target"
|
|
mkdir -p "$(dirname "$destination_path")"
|
|
cp -R "$source_path" "$destination_path"
|
|
done
|
|
|
|
find "$analysis_root" -type f -size +"${max_size_kb}"k -delete
|
|
|
|
# GitNexus status and registry behavior assume a repository root, so give the
|
|
# disposable source-only mirror its own lightweight git boundary.
|
|
git -C "$analysis_root" init -q
|
|
git -C "$analysis_root" config user.name "HyperTwist GitNexus Mirror"
|
|
git -C "$analysis_root" config user.email "hypertwist-gitnexus@local.invalid"
|
|
git -C "$analysis_root" add -A
|
|
git -C "$analysis_root" commit -q -m "source-only snapshot"
|
|
|
|
cd "$analysis_root"
|
|
|
|
run_analysis_command() {
|
|
local -n command_ref="$1"
|
|
|
|
if command -v timeout >/dev/null 2>&1; then
|
|
timeout "${analysis_timeout_seconds}s" "${command_ref[@]}"
|
|
else
|
|
"${command_ref[@]}"
|
|
fi
|
|
}
|
|
|
|
read_indexed_commit() {
|
|
node -e '
|
|
const fs = require("fs");
|
|
const path = ".gitnexus/meta.json";
|
|
if (!fs.existsSync(path)) {
|
|
process.exit(1);
|
|
}
|
|
const meta = JSON.parse(fs.readFileSync(path, "utf8"));
|
|
if (typeof meta.lastCommit !== "string" || meta.lastCommit.length === 0) {
|
|
process.exit(1);
|
|
}
|
|
process.stdout.write(meta.lastCommit);
|
|
' 2>/dev/null || true
|
|
}
|
|
|
|
run_analysis_attempt() {
|
|
local cli_kind="$1"
|
|
shift
|
|
local command=("$@")
|
|
local analysis_exit_code=0
|
|
|
|
set +e
|
|
if [[ "$cli_kind" == "local" && "${HYPERTWIST_GITNEXUS_DEBUG_LOCAL:-0}" != "1" ]]; then
|
|
run_analysis_command command 2>/dev/null
|
|
else
|
|
run_analysis_command command
|
|
fi
|
|
analysis_exit_code=$?
|
|
set -e
|
|
|
|
if [[ "$analysis_exit_code" -eq 0 ]]; then
|
|
return 0
|
|
fi
|
|
|
|
local current_commit
|
|
current_commit="$(git rev-parse HEAD)"
|
|
local indexed_commit
|
|
indexed_commit="$(read_indexed_commit)"
|
|
|
|
if [[ "$analysis_exit_code" -eq 124 || "$analysis_exit_code" -eq 137 ]]; then
|
|
if [[ -n "$indexed_commit" && "$indexed_commit" == "$current_commit" ]]; then
|
|
echo "GitNexus analyze hit the configured timeout after indexing the current bounded mirror; treating the run as successful." >&2
|
|
echo "Indexed commit: ${indexed_commit:0:7} (${cli_kind} CLI, timeout ${analysis_timeout_seconds}s)." >&2
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
if [[ "$cli_kind" == "local" && -n "$indexed_commit" && "$indexed_commit" == "$current_commit" ]]; then
|
|
if node "$local_gitnexus_cli" status >/dev/null 2>&1; then
|
|
echo "Local GitNexus analyze exited with code $analysis_exit_code after indexing the current bounded mirror, but follow-up status confirmed the fresh index; treating the run as successful." >&2
|
|
echo "Indexed commit: ${indexed_commit:0:7} (local CLI, post-index non-zero exit)." >&2
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$indexed_commit" ]]; then
|
|
echo "GitNexus analyze exited with code $analysis_exit_code after indexing commit ${indexed_commit:0:7}, which did not match current mirror commit ${current_commit:0:7}." >&2
|
|
else
|
|
echo "GitNexus analyze exited with code $analysis_exit_code before a readable bounded-mirror index result was available." >&2
|
|
fi
|
|
|
|
return "$analysis_exit_code"
|
|
}
|
|
|
|
local_cli_command=(
|
|
node
|
|
analyze
|
|
.
|
|
--skip-agents-md
|
|
)
|
|
|
|
npx_cli_command=(
|
|
npx
|
|
-y
|
|
gitnexus@latest
|
|
analyze
|
|
.
|
|
--skip-agents-md
|
|
)
|
|
|
|
local_cli_command+=("$@")
|
|
npx_cli_command+=("$@")
|
|
|
|
local_cli_available=0
|
|
if local_gitnexus_cli="$(hypertwist_gitnexus_resolve_local_cli "$repo_root")"; then
|
|
local_cli_available=1
|
|
local_cli_command=(
|
|
node
|
|
"$local_gitnexus_cli"
|
|
analyze
|
|
.
|
|
--skip-agents-md
|
|
)
|
|
fi
|
|
|
|
if [[ "$local_cli_available" -eq 1 ]]; then
|
|
if run_analysis_attempt "local" "${local_cli_command[@]}"; then
|
|
exit 0
|
|
fi
|
|
|
|
echo "Local retained GitNexus CLI passed the runtime probe but did not complete cleanly. Falling back to npx gitnexus@latest." >&2
|
|
fi
|
|
|
|
run_analysis_attempt "npx" "${npx_cli_command[@]}"
|