#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" TOOL_DIR="${TOOL_DIR:-$PROJECT_DIR/../martial-tool}" CACHE_DIR="$PROJECT_DIR/.build-cache" STATE_FILE="$CACHE_DIR/martial-tool.state" log() { printf '[martial-tool] %s\n' "$*" } fail() { printf '[martial-tool] ERROR: %s\n' "$*" >&2 exit 1 } [[ -d "$TOOL_DIR" ]] || fail "martial-tool directory not found: $TOOL_DIR" [[ -f "$TOOL_DIR/pom.xml" ]] || fail "pom.xml not found in $TOOL_DIR" command -v mvn >/dev/null 2>&1 || fail "mvn command not found" revision="$(sed -n 's:.*\([^<]*\).*:\1:p' "$TOOL_DIR/pom.xml" | head -n 1)" [[ -n "$revision" ]] || fail "Unable to parse from $TOOL_DIR/pom.xml" mapfile -t modules < <(sed -n 's:.*\([^<]*\).*:\1:p' "$TOOL_DIR/pom.xml") (( ${#modules[@]} > 0 )) || fail "No modules found in $TOOL_DIR/pom.xml" missing=() for artifact in "${modules[@]}"; do if [[ "$artifact" == "blade-bom" ]]; then group_path="org/springblade/platform" else group_path="org/springblade" fi version_dir="$HOME/.m2/repository/$group_path/$artifact/$revision" if [[ ! -d "$version_dir" ]]; then missing+=("$artifact") continue fi if ! find "$version_dir" -maxdepth 1 -type f \( -name "$artifact-$revision.jar" -o -name "$artifact-$revision.pom" \) | grep -q .; then missing+=("$artifact") fi done if git -C "$TOOL_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then git_head="$(git -C "$TOOL_DIR" rev-parse HEAD)" git_status="$(git -C "$TOOL_DIR" status --porcelain)" if [[ -n "$git_status" ]]; then if command -v sha256sum >/dev/null 2>&1; then dirty_hash="$(printf '%s' "$git_status" | sha256sum | awk '{print $1}')" else dirty_hash="$(printf '%s' "$git_status" | shasum -a 256 | awk '{print $1}')" fi tool_state="${git_head}-dirty-${dirty_hash}" else tool_state="$git_head" fi else pom_hash="$(find "$TOOL_DIR" -name pom.xml -type f -print0 | sort -z | xargs -0 cat | sha256sum | awk '{print $1}')" tool_state="nogit-${pom_hash}" fi mkdir -p "$CACHE_DIR" previous_state="" if [[ -f "$STATE_FILE" ]]; then previous_state="$(cat "$STATE_FILE")" fi if [[ ${#missing[@]} -eq 0 && "$tool_state" == "$previous_state" ]]; then log "Artifacts already installed for revision $revision and source state unchanged, skip install." exit 0 fi if [[ ${#missing[@]} -gt 0 ]]; then log "Missing artifacts detected (${#missing[@]}): ${missing[*]}" else log "martial-tool source changed, reinstall required." log "cached state: ${previous_state:-}" log "current state: $tool_state" fi log "Installing martial-tool from $TOOL_DIR ..." ( cd "$TOOL_DIR" mvn -T 1C -DskipTests install ) printf '%s\n' "$tool_state" > "$STATE_FILE" log "Install complete. State cache updated: $STATE_FILE"