Author: Andy Green Date: Fri Aug 15 06:49:27 2025 +0100 git: make other instances wait for first to finish with mirror Co-developed-by: Gemini 2.5 Pro diff --git a/src/builder/b-mirror.c b/src/builder/b-mirror.c index 5e4e768..6822da4 100644 --- a/src/builder/b-mirror.c +++ b/src/builder/b-mirror.c @@ -43,6 +43,16 @@ static const char * const git_helper_sh = " REF=$2\n" " HASH=$3\n" " MIRROR_PATH=$4\n" + " while ! mkdir \"$MIRROR_PATH.lock\" 2>/dev/null; do\n" + " echo \"git mirror locked, waiting...\"\n" + " sleep 1\n" + " done\n" + " trap 'rm -rf \"$MIRROR_PATH.lock\"' EXIT\n" + " if [ -d \"$MIRROR_PATH/.git\" ]; then\n" + " if git -C \"$MIRROR_PATH\" rev-parse -q --verify \"ref-$HASH\" > /dev/null; then\n" + " exit 0\n" + " fi\n" + " fi\n" " mkdir -p \"$MIRROR_PATH\"\n" " if [ ! -d \"$MIRROR_PATH/.git\" ]; then\n" " git init --bare \"$MIRROR_PATH\"\n" @@ -85,20 +95,39 @@ static const char * const git_helper_bat = " echo \"REF: !REF!\"\n" " echo \"HASH: !HASH!\"\n" " echo \"MIRROR_PATH: !MIRROR_PATH!\"\n" + " :lock_wait\n" + " mkdir \"!MIRROR_PATH!.lock\" 2>nul\n" + " if errorlevel 1 (\n" + " echo \"git mirror locked, waiting...\"\n" + " timeout /t 1 /nobreak > nul\n" + " goto :lock_wait\n" + " )\n" + " if exist \"!MIRROR_PATH!\\.git\" (\n" + " git -C \"!MIRROR_PATH!\" rev-parse -q --verify \"ref-!HASH!\" > nul 2> nul\n" + " if exist !MIRROR_PATH!\\.git if not errorlevel 1 (\n" + " rmdir \"!MIRROR_PATH!.lock\"\n" + " exit /b 0\n" + " )\n" + " )\n" " if not exist \"!MIRROR_PATH!\\.\" (\n" " mkdir \"!MIRROR_PATH!\"\n" " )\n" " if not exist \"!MIRROR_PATH!\\.git\" (\n" " git init --bare \"!MIRROR_PATH!\"\n" - " if errorlevel 1 exit /b 1\n" + " if errorlevel 1 (\n" + " rmdir \"!MIRROR_PATH!.lock\"\n" + " exit /b 1\n" + " )\n" " )\n" " set \"REFSPEC=!REF!:ref-!HASH!\"\n" " echo \"REFSPEC: !REFSPEC!\"\n" " git -C \"!MIRROR_PATH!\" fetch \"!REMOTE_URL!\" \"!REFSPEC!\" 2>&1\n" " if !ERRORLEVEL! neq 0 (\n" " echo \"git fetch failed with errorlevel !ERRORLEVEL!\"\n" + " rmdir \"!MIRROR_PATH!.lock\"\n" " exit /b 1\n" " )\n" + " rmdir \"!MIRROR_PATH!.lock\"\n" " exit /b 0\n" ")\n" "if /i \"!OPERATION!\"==\"checkout\" (\n"