Subject: [PATCH v2] ci(win+Meson): build in Release mode

From: "Johannes Schindelin via GitGitGadget" <[email-masked]>
Date: Sat, 03 May 2025 14:25:46 +0000

From: Johannes Schindelin <[email-masked]>

When the `win+Meson` job was added to Git's CI, modeled after the
`win+vs` job, it overlooked that the latter built the Git artifacts in
release mode.

The reason for this is that there is code in `compat/mingw.c` that turns
on the modal assertion dialogs in debug mode, which are very useful when
debugging interactively (as they offer to attach Visual Studio's
debugger), but they are scarcely useful in CI builds (where that modal
dialog would sit around, waiting for a human being to see and deal with
it, which obviously won't ever happen).

This problem was not realized immediately because of a separate bug: the
`win+Meson` job erroneously built using the `gcc` that is in the `PATH`
by default on hosted GitHub Actions runners. Since that bug was fixed by
switching to `--vsenv`, though, the t7001-mv test consistently timed out
after six hours in the CI builds on GitHub, quite often, and wasting
build minutes without any benefit in return.

The reason for this timeout was a symptom of aforementioned debug mode
problem, where the test case 'nonsense mv triggers assertion failure and
partially updated index' in t7001-mv triggered an assertion.

I originally proposed this here patch to address the timeouts in CI
builds. The Git project decided to address this timeout differently,
though: by fixing the bug that the t7001-mv test case demonstrated. This
does not address the debug mode problem, though, as an `assert()` call
could be triggered in other ways in CI, and it should still not cause
the CI build to hang but should cause Git to error out instead. To avoid
having to accept this here patch, it was then proposed to replace all
`assert()` calls in Git's code base by `BUG()` calls. This might be
reasonable for independent reasons, but it obviously still does not
address the debug mode problem, as `assert()` calls could be easily
re-introduced by mistake, and besides, Git has a couple of dependencies
that all may have their own `assert()` calls (which are then safely
outside the control of the Git project to remove), therefore this here
patch is still needed.

Signed-off-by: Johannes Schindelin <[email-masked]>
---
    ci(win+Meson): build in Release mode, avoiding t7001-mv hangs
    
    I was surprised to find this issue today, and that this had not been
    addressed yet.
    
    Changes since v1:
    
     * Rewrote the commit message to reflect that this patch is still
       needed, even if the symptom that originally motivated the patch was
       addressed in a different manner, because it was merely a symptom of
       the underlying root cause that CI builds should not let Visual C
       build Git in debug mode.

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1908%2Fdscho%2Fdont-let-win%2BMeson-hang-in-t7001-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1908/dscho/dont-let-win+Meson-hang-in-t7001-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1908

Range-diff vs v1:

 1:  18d1d18c48a ! 1:  c04b6c97b25 ci(win+Meson): build in Release mode, avoiding t7001-mv hangs
     @@ Metadata
      Author: Johannes Schindelin <[email-masked]>
      
       ## Commit message ##
     -    ci(win+Meson): build in Release mode, avoiding t7001-mv hangs
     -
     -    Since switching to `--vsenv`, the t7001-mv test consistently times out
     -    after six hours in the CI builds on GitHub. This kind of waste is
     -    inconsistent with my values.
     -
     -    The reason for this timeout is the test case 'nonsense mv triggers
     -    assertion failure and partially updated index' in t7001-mv (which is
     -    not even a regression test, but instead merely demonstrates a bug that
     -    someone thought someone else should fix at some time). As the name
     -    suggests, it triggers an assertion. The problem with this is that an
     -    assertion on Windows, at least when run in Debug mode, will open a modal
     -    dialog that patiently awaits some buttons to be clicked. Which never
     -    happens in automated builds.
     -
     -    The solution is straight-forward: Just like the `win+VS` job already did
     -    in forever, build in Release mode (where that modal assertion dialog is
     -    never shown).
     +    ci(win+Meson): build in Release mode
     +
     +    When the `win+Meson` job was added to Git's CI, modeled after the
     +    `win+vs` job, it overlooked that the latter built the Git artifacts in
     +    release mode.
     +
     +    The reason for this is that there is code in `compat/mingw.c` that turns
     +    on the modal assertion dialogs in debug mode, which are very useful when
     +    debugging interactively (as they offer to attach Visual Studio's
     +    debugger), but they are scarcely useful in CI builds (where that modal
     +    dialog would sit around, waiting for a human being to see and deal with
     +    it, which obviously won't ever happen).
     +
     +    This problem was not realized immediately because of a separate bug: the
     +    `win+Meson` job erroneously built using the `gcc` that is in the `PATH`
     +    by default on hosted GitHub Actions runners. Since that bug was fixed by
     +    switching to `--vsenv`, though, the t7001-mv test consistently timed out
     +    after six hours in the CI builds on GitHub, quite often, and wasting
     +    build minutes without any benefit in return.
     +
     +    The reason for this timeout was a symptom of aforementioned debug mode
     +    problem, where the test case 'nonsense mv triggers assertion failure and
     +    partially updated index' in t7001-mv triggered an assertion.
     +
     +    I originally proposed this here patch to address the timeouts in CI
     +    builds. The Git project decided to address this timeout differently,
     +    though: by fixing the bug that the t7001-mv test case demonstrated. This
     +    does not address the debug mode problem, though, as an `assert()` call
     +    could be triggered in other ways in CI, and it should still not cause
     +    the CI build to hang but should cause Git to error out instead. To avoid
     +    having to accept this here patch, it was then proposed to replace all
     +    `assert()` calls in Git's code base by `BUG()` calls. This might be
     +    reasonable for independent reasons, but it obviously still does not
     +    address the debug mode problem, as `assert()` calls could be easily
     +    re-introduced by mistake, and besides, Git has a couple of dependencies
     +    that all may have their own `assert()` calls (which are then safely
     +    outside the control of the Git project to remove), therefore this here
     +    patch is still needed.
      
          Signed-off-by: Johannes Schindelin <[email-masked]>

 .github/workflows/main.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 83ca8e4182b..275240be5dc 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -265,7 +265,7 @@ jobs:
       run: pip install meson ninja
     - name: Setup
       shell: pwsh
-      run: meson setup build --vsenv -Dperl=disabled -Dcredential_helpers=wincred
+      run: meson setup build --vsenv -Dbuildtype=release -Dperl=disabled -Dcredential_helpers=wincred
     - name: Compile
       shell: pwsh
       run: meson compile -C build

base-commit: f65182a99e545d2f2bc22e6c1c2da192133b16a3
-- 
gitgitgadget