Project homepage Mailing List  Warmcat.com  API Docs  Github Mirror 
    npro  
 Modern all-safe Rust Network Protocol library supporting h1, h2, h3, ws, wt sans-IO and with socket IO + tls
git clone https://npro.rs/repo/npro
 
root / assets / arch-aarch64-a72a55-rk3588.svg
Author[]google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.c...> 2025-09-04 18:32 UTC
Committer[]Andy Green <andy@warmcat.com> 2025-09-04 18:32 UTC
Tree168b9c9e7f22cb26763672898932e17d9796cc3d   Raw Patch
 
feat: Embed git helpers and add rebuild options
feat: Embed git helpers and add rebuild options

This commit introduces two main features and a bug fix:

1.  Embeds the `git_helper.sh` and `git_helper.bat` scripts into the
    builder's C code. The scripts are now written to the build directory
    at runtime, removing the dependency on an installation step, which is
    problematic for Windows.

2.  Adds a 'Rebuild last step' option to the task context menu for
    failed tasks. This allows users to restart a failed task from the
    last step that failed, without losing the logs.

3.  Fixes a regression in the 'Rebuild this task' feature where the
    build step was not being reset to 0.
diff --git a/src/builder/CMakeLists.txt b/src/builder/CMakeLists.txt index 9160968..ccd6d35 100644 --- a/src/builder/CMakeLists.txt +++ b/src/builder/CMakeLists.txt @@ -80,10 +80,6 @@ if (requirements) install(TARGETS "sai-builder" RUNTIME DESTINATION "${BIN_DIR}" COMPONENT builder) - install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/scripts/" - DESTINATION "${BIN_DIR}" - COMPONENT builder - FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) endif(requirements) include(CPack) diff --git a/src/builder/b-nspawn.c b/src/builder/b-nspawn.c index 5d47173..9bcf177 100644 --- a/src/builder/b-nspawn.c +++ b/src/builder/b-nspawn.c @@ -44,6 +44,137 @@ static char csep = '/'; static char csep = '\\'; #endif +const char *git_helper_sh = + "#!/bin/bash\n" + "export PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin\n" + "set -e\n" + "echo \"git_helper_sh: starting\"\n" + "OPERATION=$1\n" + "shift\n" + "if [ \"$OPERATION\" == \"mirror\" ]; then\n" + " REMOTE_URL=$1\n" + " REF=$2\n" + " HASH=$3\n" + " MIRROR_PATH=\"$HOME/git-mirror/$4\"\n" + " for i in $(seq 1 60); do\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" + " if mkdir \"$MIRROR_PATH.lock\" 2>/dev/null; then\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" + " fi\n" + " REFSPEC=\"$REF:ref-$HASH\"\n" + " git -C \"$MIRROR_PATH\" fetch \"$REMOTE_URL\" \"+$REFSPEC\"\n" + " exit 0\n" + " fi\n" + " echo \"git mirror locked, waiting...\"\n" + " sleep 1\n" + " done\n" + " exit 1\n" + "elif [ \"$OPERATION\" == \"checkout\" ]; then\n" + " MIRROR_PATH=\"$HOME/git-mirror/$1\"\n" + " BUILD_DIR=$2\n" + " HASH=$3\n" + " if [ ! -d \"$BUILD_DIR/.git\" ]; then\n" + " rm -rf \"$BUILD_DIR\"\n" + " mkdir -p \"$BUILD_DIR\"\n" + " git -C \"$BUILD_DIR\" init\n" + " fi\n" + " if ! git -C \"$BUILD_DIR\" fetch \"$MIRROR_PATH\" \"ref-$HASH\"; then\n" + " exit 2\n" + " fi\n" + " git -C \"$BUILD_DIR\" checkout -f \"$HASH\"\n" + " git -C \"$BUILD_DIR\" clean -fdx\n" + "else\n" + " exit 1\n" + "fi\n" + "echo \">>> Git helper script finished.\"\n" + "exit 0\n" +; + +const char *git_helper_bat = + "@echo on\n" + "setlocal EnableDelayedExpansion\n" + "echo \"git_helper_bat: starting\"\n" + "set \"OPERATION=%~1\"\n" + "echo \"OPERATION: !OPERATION!\"\n" + "if /i \"!OPERATION!\"==\"mirror\" (\n" + " set \"REMOTE_URL=%~2\"\n" + " set \"REF=%~3\"\n" + " set \"HASH=%~4\"\n" + " set \"MIRROR_PATH=%HOME%\\\\git-mirror\\\\%~5\"\n" + " echo \"REMOTE_URL: !REMOTE_URL!\"\n" + " 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 (\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" + " set \"MIRROR_PATH=%HOME%\\\\git-mirror\\\\%~2\"\n" + " set \"BUILD_DIR=%~3\"\n" + " set \"HASH=%~4\"\n" + " echo \"MIRROR_PATH: !MIRROR_PATH!\"\n" + " echo \"BUILD_DIR: !BUILD_DIR!\"\n" + " echo \"HASH: !HASH!\"\n" + " if not exist \"!BUILD_DIR!\\\\.git\" (\n" + " if exist \"!BUILD_DIR!\\\\\" rmdir /s /q \"!BUILD_DIR!\"\n" + " mkdir \"!BUILD_DIR!\"\n" + " git -C \"!BUILD_DIR!\" init\n" + " if errorlevel 1 exit /b 1\n" + " )\n" + " git -C \"!BUILD_DIR!\" fetch \"!MIRROR_PATH!\" \"ref-!HASH!\"\n" + " if errorlevel 1 exit /b 2\n" + " git -C \"!BUILD_DIR!\" checkout -f \"!HASH!\"\n" + " if errorlevel 1 exit /b 1\n" + " echo \">>> Git helper script finished.\"\n" + " exit /b 0\n" + ")\n" + "exit /b 1\n" +; + extern struct lws_vhost *builder_vhost; struct ws_capture_chunk * diff --git a/src/builder/b-task.c b/src/builder/b-task.c index 5a00ae3..58fa268 100644 --- a/src/builder/b-task.c +++ b/src/builder/b-task.c @@ -815,6 +815,41 @@ saib_ws_json_rx_builder(struct sai_plat_server *spm, const void *in, size_t len) */ ns->inp[n] = '\0'; + { + char script_path[512]; + int fd; + + /* create git_helper.sh */ + lws_snprintf(script_path, sizeof(script_path), "%s%cgit_helper.sh", + ns->inp, csep); +#if defined(WIN32) + if (_sopen_s(&fd, script_path, _O_CREAT | _O_TRUNC | _O_WRONLY, + _SH_DENYNO, _S_IWRITE)) + fd = -1; +#else + fd = open(script_path, O_CREAT | O_TRUNC | O_WRONLY, 0755); +#endif + if (fd >= 0) { + write(fd, git_helper_sh, strlen(git_helper_sh)); + close(fd); + } + + /* create git_helper.bat */ + lws_snprintf(script_path, sizeof(script_path), "%s%cgit_helper.bat", + ns->inp, csep); +#if defined(WIN32) + if (_sopen_s(&fd, script_path, _O_CREAT | _O_TRUNC | _O_WRONLY, + _SH_DENYNO, _S_IWRITE)) + fd = -1; +#else + fd = open(script_path, O_CREAT | O_TRUNC | O_WRONLY, 0644); +#endif + if (fd >= 0) { + write(fd, git_helper_bat, strlen(git_helper_bat)); + close(fd); + } + } + saib_set_ns_state(ns, NSSTATE_EXECUTING_STEPS); ns->user_cancel = 0; diff --git a/src/builder/scripts/git_helper.bat b/src/builder/scripts/git_helper.bat deleted file mode 100644 index ec2b3d8..0000000 --- a/src/builder/scripts/git_helper.bat +++ /dev/null @@ -1,70 +0,0 @@ -@echo on -setlocal EnableDelayedExpansion -echo "git_helper_bat: starting" -set "OPERATION=%~1" -echo "OPERATION: !OPERATION!" -if /i "!OPERATION!"=="mirror" ( - set "REMOTE_URL=%~2" - set "REF=%~3" - set "HASH=%~4" - set "MIRROR_PATH=%HOME%\\git-mirror\\%~5" - echo "REMOTE_URL: !REMOTE_URL!" - echo "REF: !REF!" - echo "HASH: !HASH!" - echo "MIRROR_PATH: !MIRROR_PATH!" - :lock_wait - mkdir "!MIRROR_PATH!.lock" 2>nul - if errorlevel 1 ( - echo "git mirror locked, waiting..." - timeout /t 1 /nobreak > nul - goto :lock_wait - ) - if exist "!MIRROR_PATH!\\.git" ( - git -C "!MIRROR_PATH!" rev-parse -q --verify "ref-!HASH!" > nul 2> nul - if exist !MIRROR_PATH!\\.git if not errorlevel 1 ( - rmdir "!MIRROR_PATH!.lock" - exit /b 0 - ) - ) - if not exist "!MIRROR_PATH!\\." ( - mkdir "!MIRROR_PATH!" - ) - if not exist "!MIRROR_PATH!\\.git" ( - git init --bare "!MIRROR_PATH!" - if errorlevel 1 ( - rmdir "!MIRROR_PATH!.lock" - exit /b 1 - ) - ) - set "REFSPEC=!REF!:ref-!HASH!" - echo "REFSPEC: !REFSPEC!" - git -C "!MIRROR_PATH!" fetch "!REMOTE_URL!" "!REFSPEC!" 2>&1 - if !ERRORLEVEL! neq 0 ( - echo "git fetch failed with errorlevel !ERRORLEVEL!" - rmdir "!MIRROR_PATH!.lock" - exit /b 1 - ) - rmdir "!MIRROR_PATH!.lock" - exit /b 0 -) -if /i "!OPERATION!"=="checkout" ( - set "MIRROR_PATH=%HOME%\\git-mirror\\%~2" - set "BUILD_DIR=%~3" - set "HASH=%~4" - echo "MIRROR_PATH: !MIRROR_PATH!" - echo "BUILD_DIR: !BUILD_DIR!" - echo "HASH: !HASH!" - if not exist "!BUILD_DIR!\\.git" ( - if exist "!BUILD_DIR!\\" rmdir /s /q "!BUILD_DIR!" - mkdir "!BUILD_DIR!" - git -C "!BUILD_DIR!" init - if errorlevel 1 exit /b 1 - ) - git -C "!BUILD_DIR!" fetch "!MIRROR_PATH!" "ref-!HASH!" - if errorlevel 1 exit /b 2 - git -C "!BUILD_DIR!" checkout -f "!HASH!" - if errorlevel 1 exit /b 1 - echo ">>> Git helper script finished." - exit /b 0 -) -exit /b 1 diff --git a/src/builder/scripts/git_helper.sh b/src/builder/scripts/git_helper.sh deleted file mode 100644 index 99bd4e7..0000000 --- a/src/builder/scripts/git_helper.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash -export PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin -set -e -echo "git_helper_sh: starting" -OPERATION=$1 -shift -if [ "$OPERATION" == "mirror" ]; then - REMOTE_URL=$1 - REF=$2 - HASH=$3 - MIRROR_PATH="$HOME/git-mirror/$4" - for i in $(seq 1 60); do - if [ -d "$MIRROR_PATH/.git" ]; then - if git -C "$MIRROR_PATH" rev-parse -q --verify "ref-$HASH" > /dev/null; then - exit 0 - fi - fi - if mkdir "$MIRROR_PATH.lock" 2>/dev/null; then - trap 'rm -rf "$MIRROR_PATH.lock"' EXIT - if [ -d "$MIRROR_PATH/.git" ]; then - if git -C "$MIRROR_PATH" rev-parse -q --verify "ref-$HASH" > /dev/null; then - exit 0 - fi - fi - mkdir -p "$MIRROR_PATH" - if [ ! -d "$MIRROR_PATH/.git" ]; then - git init --bare "$MIRROR_PATH" - fi - REFSPEC="$REF:ref-$HASH" - git -C "$MIRROR_PATH" fetch "$REMOTE_URL" "+$REFSPEC" - exit 0 - fi - echo "git mirror locked, waiting..." - sleep 1 - done - exit 1 -elif [ "$OPERATION" == "checkout" ]; then - MIRROR_PATH="$HOME/git-mirror/$1" - BUILD_DIR=$2 - HASH=$3 - if [ ! -d "$BUILD_DIR/.git" ]; then - rm -rf "$BUILD_DIR" - mkdir -p "$BUILD_DIR" - git -C "$BUILD_DIR" init - fi - if ! git -C "$BUILD_DIR" fetch "$MIRROR_PATH" "ref-$HASH"; then - exit 2 - fi - git -C "$BUILD_DIR" checkout -f "$HASH" - git -C "$BUILD_DIR" clean -fdx -else - exit 1 -fi -echo ">>> Git helper script finished." -exit 0 diff --git a/src/server/s-task.c b/src/server/s-task.c index 3257566..1ee0e38 100644 --- a/src/server/s-task.c +++ b/src/server/s-task.c @@ -1201,23 +1201,23 @@ sais_continue_task(struct vhd *vhd, const char *task_uuid) case 0: /* git mirror */ if (cb->windows) lws_snprintf(task->script, sizeof(task->script), - "git_helper.bat mirror \"%s\" %s %s %s", + ".\\git_helper.bat mirror \"%s\" %s %s %s", task->git_repo_url, task->git_ref, task->git_hash, mirror_path); else lws_snprintf(task->script, sizeof(task->script), - "git_helper.sh mirror \"%s\" %s %s %s", + "./git_helper.sh mirror \"%s\" %s %s %s", task->git_repo_url, task->git_ref, task->git_hash, mirror_path); break; case 1: /* git checkout */ if (cb->windows) lws_snprintf(task->script, sizeof(task->script), - "git_helper.bat checkout \"%s\" src %s", + ".\\git_helper.bat checkout \"%s\" src %s", mirror_path, task->git_hash); else lws_snprintf(task->script, sizeof(task->script), - "git_helper.sh checkout \"%s\" src %s", + "./git_helper.sh checkout \"%s\" src %s", mirror_path, task->git_hash); break; default:
Page fetched 0s ago, creation time: 15ms (vhost etag hits: 0%, cache hits: 0%)