Serialize Gradle and test runs
This commit is contained in:
50
gradle-lock.sh
Normal file
50
gradle-lock.sh
Normal file
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env bash
|
||||
# Shared, process-safe lock for Gradle and IntelliJ platform test runs.
|
||||
# This file is sourced by jaigradle and jaitest; it is not a standalone command.
|
||||
|
||||
JAI_GRADLE_LOCK_DIR="${JAI_GRADLE_LOCK_DIR:-.gradle-test.lock}"
|
||||
JAI_GRADLE_LOCK_PID_FILE="$JAI_GRADLE_LOCK_DIR/pid"
|
||||
|
||||
jai_gradle_lock_acquire() {
|
||||
if [[ "${JAI_GRADLE_LOCK_HELD:-0}" == "1" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
local reported=0
|
||||
while ! mkdir "$JAI_GRADLE_LOCK_DIR" 2>/dev/null; do
|
||||
if [[ -f "$JAI_GRADLE_LOCK_PID_FILE" ]]; then
|
||||
local owner
|
||||
owner=$(<"$JAI_GRADLE_LOCK_PID_FILE")
|
||||
if [[ "$owner" =~ ^[0-9]+$ ]] && ! kill -0 "$owner" 2>/dev/null; then
|
||||
rm -rf "$JAI_GRADLE_LOCK_DIR"
|
||||
continue
|
||||
fi
|
||||
else
|
||||
# A process can be killed between mkdir and writing its PID. Give that
|
||||
# tiny window a chance to finish, then reclaim the incomplete lock.
|
||||
sleep 1
|
||||
if [[ ! -f "$JAI_GRADLE_LOCK_PID_FILE" ]]; then
|
||||
rm -rf "$JAI_GRADLE_LOCK_DIR"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
if ((reported == 0)); then
|
||||
echo "Waiting for another Gradle/test run in this worktree..." >&2
|
||||
reported=1
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
printf '%s\n' "$$" >"$JAI_GRADLE_LOCK_PID_FILE"
|
||||
JAI_GRADLE_LOCK_HELD=1
|
||||
JAI_GRADLE_LOCK_OWNER_PID=$$
|
||||
export JAI_GRADLE_LOCK_HELD JAI_GRADLE_LOCK_OWNER_PID
|
||||
}
|
||||
|
||||
jai_gradle_lock_release() {
|
||||
if [[ "${JAI_GRADLE_LOCK_OWNER_PID:-}" == "$$" ]]; then
|
||||
rm -rf "$JAI_GRADLE_LOCK_DIR"
|
||||
unset JAI_GRADLE_LOCK_OWNER_PID JAI_GRADLE_LOCK_HELD
|
||||
fi
|
||||
}
|
||||
Reference in New Issue
Block a user