Skip to content

vcpkg debug test for ci(windows): bust vcpkg cache on overlay/triplet/requirements changes#5955

Open
MaxRayskiy wants to merge 58 commits intoci/libzip-zlib-ng-vcpkgfrom
ci/libzip-zlib-ng-vcpkg-debug-test
Open

vcpkg debug test for ci(windows): bust vcpkg cache on overlay/triplet/requirements changes#5955
MaxRayskiy wants to merge 58 commits intoci/libzip-zlib-ng-vcpkgfrom
ci/libzip-zlib-ng-vcpkg-debug-test

Conversation

@MaxRayskiy
Copy link
Copy Markdown
Contributor

No description provided.

Grantim and others added 3 commits April 21, 2026 17:40
…5948)

* MRZlib: optional properties output (CRC-32 + sizes) on raw compress

Adds ZlibCompressProperties { crc32, uncompressedSize, compressedSize }
and an optional pointer to it on ZlibCompressParams. Populated only when
both non-null and rawDeflate is true — the zlib wrapper already carries
Adler-32, so this metadata is only needed for the raw/ZIP path.

Collection reuses the already-typed `stream.next_in` / `stream.avail_in`
zlib needs, so no new reinterpret_cast. Writing through a pointer under
`const ZlibCompressParams&` is fine — only the pointer is const.

Tests cover: populated values match crc32Ref/known sizes in raw mode at
levels 1 and 9; empty raw input zeroes sizes and CRC while pinning the
terminator-block bytes zlib emits; wrapped-mode passes sentinel props
through untouched.

* MRZlib: address review feedback

- Rename ZlibCompressProperties -> ZlibCompressStats; member `properties` -> `stats`.
- Struct doc describes its own purpose rather than pointing elsewhere.
- Collect CRC-32 + sizes whenever `stats` is non-null, in both wire modes
  (the zlib wrapper has Adler-32 embedded, but a caller may still want
  the CRC-32 for external checksums).
- No local `collectStats` flag — check `params.stats` directly at each
  site; drops the redundant "reuse already-typed pointers" comment.
- Rename MRTest/MRZlib.cpp -> MRZlibTests.cpp.
- Consolidate the three properties tests into two: one parameterized
  over {raw|wrapped} × {level 1|9} that checks CRC against an
  independent `crc32Ref` + expected sizes, and one empty-input test
  covering both modes.
* test: add sphere mesh compress-to-zip test

Creates a sphere with ~100K vertices, saves it as a .mrmesh file in a
temporary folder, then calls compressZip to produce a .zip archive in
a second temporary folder. Verifies:
  - mesh and zip files both exist and are non-empty
  - the zip is not absurdly larger than the source (envelope sanity)

Serves as a realistic end-to-end exercise of MeshLib's zip write path
(libzip + zlib deflate) against mesh-sized data. Suitable for timing
comparisons of different zlib backends (e.g., stock zlib vs zlib-ng
compat) when added to a run's measurement targets.

Placed in source/MRTest/ as MRZipCompressTests.cpp; no CMake changes
needed (the existing file(GLOB SOURCES "*.cpp") picks it up).

* fix

* test: log mesh and zip sizes via spdlog::info

* test: add many-small-files zip compression test

New GTest case MRMesh.CompressManySmallFilesToZip writes 100 binary
files and 100 JSON files to a temp folder (each 60 000 bytes,
12 000 000 bytes total — matching the sphere.mrmesh size from the
existing CompressSphereToZip test) and compresses the folder to a
.zip.

Binary file content is deterministic pseudo-random bytes from a
per-index-seeded LCG — low-compressibility, representative of mesh
coordinate floats and similar near-incompressible payloads. JSON file
content is deterministic structured-looking text padded to exactly
60 000 bytes with trailing whitespace — highly compressible,
representative of scene-description metadata and logs.

Pairs with CompressSphereToZip so a single run of MRTest produces
two direct data points: one-large-file vs many-small-files on roughly
the same total byte budget. Useful for assessing libzip's per-entry
overhead (separate deflate session, CRC pass, local file header) when
comparing zlib backends or compression-level changes.

Per-file byte count is constant and deterministic so the aggregate
input size and zip size are stable across runs (modulo whatever
small variation deflate itself introduces on different zlib builds).

Logs totals via spdlog::info for easy diff with the other test.

* CompressManySmallFilesToZip test only with 2 times more files

* reduce the test time for everyday run

* comment
* win: add _ITERATOR_DEBUG_LEVEL=2 distro

* test run: build with new matrix

* test

* test vcpkg mirror for msys

* replace mirror files with vcpkg cache

* Allow setting the vcpkg triplet for `generate.mk`.

* add missing msys2 files

* use vcpkg_triplet as job-level env

* add getopt

* force v142 vc toolset

* use s3 mirror for missing files

* test x-script for X_VCPKG_ASSET_SOURCES

* use s3 as assets provider

* use use_s3_assets-provider

* trigger build

* fix typo

* fix s3 dest

* use original url to fetch downloads first

Signed-off-by: Max Raiskii <max.raiskii@meshinspector.com>

* update arg parsing in asset-provider

* test disable python build

* skip Release build

* skip bindings for new triplet

* Python tests if matrix.vcpkg_triplet != 'x64-windows-meshlib-iterator-debug'

* codereview

* fix vcpkg_triplet var

* condition extraction

* updare example plugin compile

* fix WindowsArchive cleanup

* addf itterator debug config for full ci and standart builds

* update distr test

---------

Signed-off-by: Max Raiskii <max.raiskii@meshinspector.com>
Co-authored-by: Egor Mikhaylov <egor.mikhaylov@meshinspector.com>
Co-authored-by: Fedor Chelnokov <fedor.chelnokov@meshinspector.com>
@MaxRayskiy MaxRayskiy changed the base branch from master to ci/libzip-zlib-ng-vcpkg April 21, 2026 19:39
@MaxRayskiy MaxRayskiy changed the base branch from ci/libzip-zlib-ng-vcpkg to master April 21, 2026 19:40
@MaxRayskiy MaxRayskiy changed the base branch from master to ci/libzip-zlib-ng-vcpkg April 21, 2026 19:40
@MaxRayskiy MaxRayskiy added the skip-image-rebuild force to skip docker image rebuild label Apr 21, 2026
Fedr and others added 18 commits April 21, 2026 23:06
Creates a sphere with ~100K vertices, saves it as a .mrmesh file in a
temporary folder, then calls compressZip to produce a .zip archive in
a second temporary folder. Verifies:
  - mesh and zip files both exist and are non-empty
  - the zip is not absurdly larger than the source (envelope sanity)

Serves as a realistic end-to-end exercise of MeshLib's zip write path
(libzip + zlib deflate) against mesh-sized data. Suitable for timing
comparisons of different zlib backends (e.g., stock zlib vs zlib-ng
compat) when added to a run's measurement targets.

Placed in source/MRTest/ as MRZipCompressTests.cpp; no CMake changes
needed (the existing file(GLOB SOURCES "*.cpp") picks it up).
The Windows vcpkg cache key was only keyed by matrix.vcpkg-version,
so changes to:
  - thirdparty/vcpkg/ports/**   (MeshLib's overlay ports)
  - thirdparty/vcpkg/triplets/**
  - requirements/windows.txt
  - thirdparty/install.bat
didn't invalidate the cache. A pre-built C:\vcpkg\installed\ tree
was restored verbatim and install.bat's "vcpkg install ..." saw
every port as "already installed" (total install time: 3.57 ms in
the last PR run), so overlay ports never got consulted.

Concrete symptom observed on PR #5932 (zlib → zlib-ng-compat overlay):
  - Linux-vcpkg (which rebuilds vcpkg inside a Docker image every
    time `prepare-image / linux-vcpkg-build-upload` runs) picked up
    zlib-ng; compression tests showed -0.3% zip size and -41 to -45%
    wall time on Release builds.
  - Windows vcpkg served the cached pre-zlib-ng tree; zip sizes and
    test times were indistinguishable from master.

Fix: include a hashFiles() of the overlay/triplet/requirements/
install-script content in the cache key. First run after merging
this takes the full ~20 min vcpkg install; subsequent runs hit the
cache again as before.
Observed in run 24638998286: on Windows, a fresh install of our
zlib overlay (triggered by PR #5934 busting the vcpkg cache key)
failed with:

  error: building zlib:x64-windows-meshlib failed with: BUILD_FAILED
  Missing msys2-mingw-w64-x86_64-pkgconf-1~2.2.0-1-any.pkg.tar.zst
  ... 404 from every msys2 mirror

Root cause: our portfile called vcpkg_fixup_pkgconfig(), which on
Windows invokes vcpkg_acquire_msys to download the pinned
mingw-w64-pkgconf package from msys2 mirrors. That particular version
has been pruned from the live mirrors; every one of the six fallback
URLs 404s. Deterministic failure that re-runs won't fix.

The call is not needed by our consumers. Every MeshLib/vcpkg consumer
that depends on zlib finds it via the CMake target `ZLIB::ZLIB`
exported from lib/cmake/ZLIB/ZLIBConfig.cmake; nobody reads
lib/pkgconfig/zlib.pc via pkg-config. The .pc file is still generated
by zlib-ng's own CMake, with a correct `Libs: -lz` entry in compat
mode - it just doesn't get post-processed.

Removing the call sidesteps the msys2 dependency entirely. zlib-ng-compat
build steps (cmake configure, cmake install, copy_pdbs, cmake_config_fixup
for ZLIB, copyright install) are unaffected.
thirdparty/vcpkg/downloads/ is already used by thirdparty/install.bat
to pre-seed C:\vcpkg\downloads\ with msys2 .pkg.tar.zst archives
that vcpkg pins by SHA512 but msys2 mirrors have rotated out of
their live repos. This adds one more entry:

    msys2-mingw-w64-x86_64-pkgconf-1~2.2.0-1-any.pkg.tar.zst
    SHA512  eb6ba49d56b0edc4f605ad896ac9deb2202c853c821f1c28a26e3c71a5083e893c
            8697d174b141da9dc6561620ea218166bd041664d54a0ab51b93bad246ed7a

Pinned by vcpkg 2024.10.21's
scripts/cmake/vcpkg_find_acquire_program(PKGCONFIG).cmake. vcpkg
checks local downloads/ first: if the file exists and its SHA512
matches, the network fetch is skipped. msys2 mirrors currently serve
a newer -N suffix build of the same 2.2.0 upstream, so every pinned
URL returns 404; this workaround unblocks any port that rebuilds
from source and calls vcpkg_fixup_pkgconfig() (blosc, freetype,
libharu, ...).

Note: vcpkg 2026.03.18 (used by the msvc-2022 matrix entries) pins
a completely different URL (pkgconf-2.5.1-1 from the msys repo,
still available); that matrix entry is not affected and no file is
needed for it. This fix is scoped to the 2024.10.21 / msvc-2019
path.

Alternative long-term fix is to bump matrix.vcpkg-version off
2024.10.21. That's a bigger change with wider blast radius; this
PR is the minimal targeted workaround.
…-staged

Commit cb1edb5 dropped the vcpkg_fixup_pkgconfig() call from the overlay
portfile to work around the msys2 pkgconf 1~2.2.0-1 404. That workaround
broke Linux-vcpkg: the unrewritten lib/pkgconfig/zlib.pc left absolute
build-tree paths (`-I/root/vcpkg/packages/zlib_x64-linux-meshlib/include`)
baked into downstream pkg-config targets, so CMake's PkgConfig::curl
imported target pointed at a directory that no longer existed at
consumer time, producing:

  CMake Error in source/MRViewer/CMakeLists.txt:
    Imported target "PkgConfig::curl" includes non-existent path
      "/root/vcpkg/packages/zlib_x64-linux-meshlib/include"
    in its INTERFACE_INCLUDE_DIRECTORIES.

Commit e250677 on this branch pre-stages the msys2 pkgconf archive
vcpkg 2024.10.21 pins, so on Windows the vcpkg_acquire_msys() fetch
inside vcpkg_fixup_pkgconfig() now hits the local file and succeeds
instead of 404ing. vcpkg 2026.03.18 pins a different pkgconf build
that's still live on msys2 mirrors.

Both platforms therefore tolerate an unconditional
vcpkg_fixup_pkgconfig() call again. Restore it so Linux-vcpkg gets
the `.pc` rewriting it needs.
Run 24670365594 on this branch hit the same msys2 mirror-404 class
of failure we saw before, this time on a different pinned package:

  error: Missing msys2-msys2-runtime-3.5.3-3-x86_64.pkg.tar.zst
  and downloads are blocked by x-block-origin
  ...404 from all 6 mirrors
  error: building zlib:x64-windows-meshlib failed with: BUILD_FAILED

Same mechanism, different file. vcpkg_acquire_msys() downloads an
entire msys2 environment (bash, coreutils, file, gawk, grep, gzip,
diffutils, make, pkgconf, sed — plus transitive deps like
msys2-runtime), each pinned by SHA512 to a specific build. msys2
mirrors rotate old builds out of their live repos. We already
pre-staged pkgconf in #5943; this commit adds the msys2-runtime
file that failed next.

File: msys2-msys2-runtime-3.5.3-3-x86_64.pkg.tar.zst
  SHA512: 35fd12556a53aa57d8f9500c5c98d5e1fc64c6fbba34cc97e2ff78893e5b1b63c
          417bc1c8d1e62b26b2a93aef120fa1f9f82aad67dff4cc44af169d0d29d68f7

Matches the pin in vcpkg 2024.10.21's
scripts/cmake/vcpkg_acquire_msys.cmake (line 444-445).

thirdparty/install.bat copies thirdparty/vcpkg/downloads/ into
C:\vcpkg\downloads\ before vcpkg install; vcpkg_download_distfile()
checks the local file first and skips the network fetch if the
SHA matches.

Same caveat as with the pkgconf pre-staging: this is a point fix.
vcpkg_acquire_msys() pulls several more packages that are equally
exposed to msys2's retention policy; if any of those also fail in
a future run, they will need the same treatment. A bigger fix
(bump matrix.vcpkg-version off 2024.10.21 onto a release with
still-live msys2 pins) is out of scope for this branch.
The previous push (db7e6c0) triggered a workflow event before
skip-image-rebuild label was applied to this PR, so the current
run (24680023870) rebuilt all images unnecessarily. This commit
adds an empty marker comment so a new workflow event fires with
the label in the event payload, gating off the three need_*_rebuild
flags. Consumer jobs will pull the existing images pushed by the
previous (successful) prepare-image run.

Marker comment will be removed in a cleanup commit once CI confirms
the skip path works.
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.0.0 to 8.1.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](astral-sh/setup-uv@cec2083...0880764)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 8.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
The transform properties panel and its Ribbon header buttons (Reset /
Apply / context menu) now operate on the whole selection instead of
short-circuiting on multi-selection.

- When all selected objects share the same xf, edits are applied to every
  object under a single CombinedHistoryAction, so Ctrl+Z reverts the
  multi-object edit in one step. Selection source switched to the new
  SceneCache::getAllTopmostObjects so a parent-plus-child selection is
  not moved twice through the parent's cascade.
- When the selected objects' xfs differ, the scale / rotation / translation
  rows render read-only em-dashes via UI::inputTextCenteredReadOnly and
  cannot be edited.
- The Ribbon context menu, Reset and Apply header buttons are available
  in both cases. Copy / Save-to-file are disabled when the selection has
  mixed xfs (no shared value to serialise); Paste / Load / Reset / Apply
  remain enabled since they only write to the selection.
- Renamed selectionChangedToSingleObj_ to transformBlockShown_ and
  simplified the scroll-fix trigger to the "block just appeared"
  transition, now that the block can appear for multi-selections too.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* RibbonMenu: Add button for changing the UI language

* Use ASCII encoding
* fix(emscripten): restore apt mirror swap in builder stage

PR #5930 split docker/emscriptenDockerfile into a builder and a final
stage. The pre-#5930 Dockerfile executed

    sed -i 's http://ports.ubuntu.com/ubuntu-ports/ \
             http://mirror.eu.ossplanet.net/ubuntu-ports/ ' \
           /etc/apt/sources.list

before the very first `apt-get update`, redirecting Canonical's arm64
ports mirror to a faster / less geo-restricted alternative. The
multi-stage refactor kept that swap in the final stage's apt block but
dropped it from the builder stage's apt block, so the builder now
pulls `git pkg-config ninja-build gettext` from `ports.ubuntu.com`
directly. That is a performance regression on every PR that rebuilds
this image.

Restore the swap by prepending the sed command to the builder's RUN,
matching the original ordering.

Final stage is unchanged.

* emscripten Dockerfile: drop redundant comment about sed swap

The two-line comment above the RUN block explained what the sed
command does, which is self-evident from reading the command itself.
Keep the comment that's not obvious (why the apt set is minimal and
lacks firefox/xvfb/dbus).
after introduction of `segmentIntersectionOrder` in `MRContoursCut.cpp`
The Build step used an `if errorlevel 1 exit 1` check after each
command inside a parenthesized IF block in a cmd.exe batch script.
On windows-2025 runners, that check was failing to catch
`cmake --build` / ninja failures — observed in run 24691107383,
msvc-2019 Release CMake: ninja reported

    ninja: build stopped: subcommand failed.

(MRViewer.dll link failed with LNK1120 unresolved externals from
cpr.lib), but the `if errorlevel 1 exit 1` after `cmake --build`
didn't fire, so the script went on to `xcopy` and exited 0. GitHub
Actions marked the step as `success` even though MRCuda.lib and
other targets were never produced. The very next step,
`Generate and build Python bindings`, tried to link `mrcudapy.pyd`
against `MRCuda.lib` and failed with `lld-link: error: could not
open 'MRCuda.lib': No such file or directory` — a confusing error
67 seconds after the real failure the step should have reported.

`if errorlevel 1` inside parenthesized IF blocks in cmd.exe has
well-known parse-time expansion quirks that can cause it to miss
exit codes that were set by commands earlier in the same block.
Replace the pattern with `|| exit /b 1` chained directly onto each
command. `||` is evaluated at process-exit time and doesn't depend
on errorlevel-in-parens semantics. This is the documented idiom
for robust error propagation in cmd.exe batch files.

Functional change: the step now fails fast with the first
command's non-zero exit, instead of running to completion and
reporting success regardless. Applies to all three Windows matrix
entries (msvc-2019, msvc-2022 Debug, msvc-2022 Release). Does not
change behavior when the build succeeds.

Other steps in the same workflow (`Build MRBind`, `Generate C
bindings`, `Generate and build Python bindings`) use similar cmd
batch patterns and may have the same latent bug; left alone here
to keep the PR scoped to the Build step that has a concrete
reproducer. Worth auditing separately.
@MaxRayskiy MaxRayskiy force-pushed the ci/libzip-zlib-ng-vcpkg-debug-test branch from 7137168 to 2f153ed Compare April 21, 2026 20:08
Fedr and others added 26 commits April 21, 2026 23:19
Adds a MeshLib-specific vcpkg overlay port `thirdparty/vcpkg/ports/zlib`
that shadows the upstream `zlib` port. The overlay builds
zlib-ng/zlib-ng 2.3.3 with `ZLIB_COMPAT=ON`, producing:

  include/zlib.h, include/zconf.h
  lib/libz.{so,dylib} / z.lib
  lib/cmake/ZLIB/ZLIBConfig*.cmake (target ZLIB::ZLIB)
  lib/pkgconfig/zlib.pc

i.e. byte-layout-compatible with upstream zlib. Every vcpkg port that
depends on `zlib` (libzip, libpng, openvdb, gdcm, ...) picks up the
faster zlib-ng implementation at link time without source or link-flag
changes downstream.

Output format is standard deflate - HP 3D printer / OPC / 3MF
compatibility is preserved, as are any other consumers of the .zip
files MeshLib produces.

thirdparty/install.bat (Windows) now passes `--overlay-ports` alongside
the existing `--overlay-triplets`, matching the pattern rockylinux8-
vcpkgDockerfile already uses. Rocky side needs no change - its
Dockerfile already does `--overlay-ports=MeshLib/ports`.

Scope deliberately limited to vcpkg (Windows + Rocky). Ubuntu (apt
libz), macOS (brew zlib), and Emscripten (emsdk --use-port=zlib) are
left on stock zlib for this PR. Those paths would each need separate
mechanism changes (apt can't swap libz in place; brew's zlib-ng
formula doesn't install compat symbols by default; Emscripten would
need a new submodule replacing -s USE_ZLIB=1) and deserve independent
measurement. Follow-ups if vcpkg measurement is positive.

Risk notes:
- Some vcpkg ports may declare version constraints on `zlib`. The
  overlay keeps "version": "1.3.1" with "port-version": 100, so any
  `>=1.3.1` constraint is satisfied. A `==1.3.1` pin would fail on
  port-version mismatch; none known in current requirements.
- Upstream zlib-ng compat mode is battle-tested (used in production by
  Intel ISA-L, Chromium, ...), but the first build via this overlay is
  the validation step. CI on this PR is the test.

Measurement status: NOT measured. CI on this PR is the proof. Compare
image init times AND compression-time-dependent job step timings
(e.g., linux-vcpkg artifacts packaging) against master.
Creates a sphere with ~100K vertices, saves it as a .mrmesh file in a
temporary folder, then calls compressZip to produce a .zip archive in
a second temporary folder. Verifies:
  - mesh and zip files both exist and are non-empty
  - the zip is not absurdly larger than the source (envelope sanity)

Serves as a realistic end-to-end exercise of MeshLib's zip write path
(libzip + zlib deflate) against mesh-sized data. Suitable for timing
comparisons of different zlib backends (e.g., stock zlib vs zlib-ng
compat) when added to a run's measurement targets.

Placed in source/MRTest/ as MRZipCompressTests.cpp; no CMake changes
needed (the existing file(GLOB SOURCES "*.cpp") picks it up).
The Windows vcpkg cache key was only keyed by matrix.vcpkg-version,
so changes to:
  - thirdparty/vcpkg/ports/**   (MeshLib's overlay ports)
  - thirdparty/vcpkg/triplets/**
  - requirements/windows.txt
  - thirdparty/install.bat
didn't invalidate the cache. A pre-built C:\vcpkg\installed\ tree
was restored verbatim and install.bat's "vcpkg install ..." saw
every port as "already installed" (total install time: 3.57 ms in
the last PR run), so overlay ports never got consulted.

Concrete symptom observed on PR #5932 (zlib → zlib-ng-compat overlay):
  - Linux-vcpkg (which rebuilds vcpkg inside a Docker image every
    time `prepare-image / linux-vcpkg-build-upload` runs) picked up
    zlib-ng; compression tests showed -0.3% zip size and -41 to -45%
    wall time on Release builds.
  - Windows vcpkg served the cached pre-zlib-ng tree; zip sizes and
    test times were indistinguishable from master.

Fix: include a hashFiles() of the overlay/triplet/requirements/
install-script content in the cache key. First run after merging
this takes the full ~20 min vcpkg install; subsequent runs hit the
cache again as before.
Observed in run 24638998286: on Windows, a fresh install of our
zlib overlay (triggered by PR #5934 busting the vcpkg cache key)
failed with:

  error: building zlib:x64-windows-meshlib failed with: BUILD_FAILED
  Missing msys2-mingw-w64-x86_64-pkgconf-1~2.2.0-1-any.pkg.tar.zst
  ... 404 from every msys2 mirror

Root cause: our portfile called vcpkg_fixup_pkgconfig(), which on
Windows invokes vcpkg_acquire_msys to download the pinned
mingw-w64-pkgconf package from msys2 mirrors. That particular version
has been pruned from the live mirrors; every one of the six fallback
URLs 404s. Deterministic failure that re-runs won't fix.

The call is not needed by our consumers. Every MeshLib/vcpkg consumer
that depends on zlib finds it via the CMake target `ZLIB::ZLIB`
exported from lib/cmake/ZLIB/ZLIBConfig.cmake; nobody reads
lib/pkgconfig/zlib.pc via pkg-config. The .pc file is still generated
by zlib-ng's own CMake, with a correct `Libs: -lz` entry in compat
mode - it just doesn't get post-processed.

Removing the call sidesteps the msys2 dependency entirely. zlib-ng-compat
build steps (cmake configure, cmake install, copy_pdbs, cmake_config_fixup
for ZLIB, copyright install) are unaffected.
…-staged

Commit cb1edb5 dropped the vcpkg_fixup_pkgconfig() call from the overlay
portfile to work around the msys2 pkgconf 1~2.2.0-1 404. That workaround
broke Linux-vcpkg: the unrewritten lib/pkgconfig/zlib.pc left absolute
build-tree paths (`-I/root/vcpkg/packages/zlib_x64-linux-meshlib/include`)
baked into downstream pkg-config targets, so CMake's PkgConfig::curl
imported target pointed at a directory that no longer existed at
consumer time, producing:

  CMake Error in source/MRViewer/CMakeLists.txt:
    Imported target "PkgConfig::curl" includes non-existent path
      "/root/vcpkg/packages/zlib_x64-linux-meshlib/include"
    in its INTERFACE_INCLUDE_DIRECTORIES.

Commit e250677 on this branch pre-stages the msys2 pkgconf archive
vcpkg 2024.10.21 pins, so on Windows the vcpkg_acquire_msys() fetch
inside vcpkg_fixup_pkgconfig() now hits the local file and succeeds
instead of 404ing. vcpkg 2026.03.18 pins a different pkgconf build
that's still live on msys2 mirrors.

Both platforms therefore tolerate an unconditional
vcpkg_fixup_pkgconfig() call again. Restore it so Linux-vcpkg gets
the `.pc` rewriting it needs.
Run 24670365594 on this branch hit the same msys2 mirror-404 class
of failure we saw before, this time on a different pinned package:

  error: Missing msys2-msys2-runtime-3.5.3-3-x86_64.pkg.tar.zst
  and downloads are blocked by x-block-origin
  ...404 from all 6 mirrors
  error: building zlib:x64-windows-meshlib failed with: BUILD_FAILED

Same mechanism, different file. vcpkg_acquire_msys() downloads an
entire msys2 environment (bash, coreutils, file, gawk, grep, gzip,
diffutils, make, pkgconf, sed — plus transitive deps like
msys2-runtime), each pinned by SHA512 to a specific build. msys2
mirrors rotate old builds out of their live repos. We already
pre-staged pkgconf in #5943; this commit adds the msys2-runtime
file that failed next.

File: msys2-msys2-runtime-3.5.3-3-x86_64.pkg.tar.zst
  SHA512: 35fd12556a53aa57d8f9500c5c98d5e1fc64c6fbba34cc97e2ff78893e5b1b63c
          417bc1c8d1e62b26b2a93aef120fa1f9f82aad67dff4cc44af169d0d29d68f7

Matches the pin in vcpkg 2024.10.21's
scripts/cmake/vcpkg_acquire_msys.cmake (line 444-445).

thirdparty/install.bat copies thirdparty/vcpkg/downloads/ into
C:\vcpkg\downloads\ before vcpkg install; vcpkg_download_distfile()
checks the local file first and skips the network fetch if the
SHA matches.

Same caveat as with the pkgconf pre-staging: this is a point fix.
vcpkg_acquire_msys() pulls several more packages that are equally
exposed to msys2's retention policy; if any of those also fail in
a future run, they will need the same treatment. A bigger fix
(bump matrix.vcpkg-version off 2024.10.21 onto a release with
still-live msys2 pins) is out of scope for this branch.
The previous push (db7e6c0) triggered a workflow event before
skip-image-rebuild label was applied to this PR, so the current
run (24680023870) rebuilt all images unnecessarily. This commit
adds an empty marker comment so a new workflow event fires with
the label in the event payload, gating off the three need_*_rebuild
flags. Consumer jobs will pull the existing images pushed by the
previous (successful) prepare-image run.

Marker comment will be removed in a cleanup commit once CI confirms
the skip path works.
The Build step used an `if errorlevel 1 exit 1` check after each
command inside a parenthesized IF block in a cmd.exe batch script.
On windows-2025 runners, that check was failing to catch
`cmake --build` / ninja failures — observed in run 24691107383,
msvc-2019 Release CMake: ninja reported

    ninja: build stopped: subcommand failed.

(MRViewer.dll link failed with LNK1120 unresolved externals from
cpr.lib), but the `if errorlevel 1 exit 1` after `cmake --build`
didn't fire, so the script went on to `xcopy` and exited 0. GitHub
Actions marked the step as `success` even though MRCuda.lib and
other targets were never produced. The very next step,
`Generate and build Python bindings`, tried to link `mrcudapy.pyd`
against `MRCuda.lib` and failed with `lld-link: error: could not
open 'MRCuda.lib': No such file or directory` — a confusing error
67 seconds after the real failure the step should have reported.

`if errorlevel 1` inside parenthesized IF blocks in cmd.exe has
well-known parse-time expansion quirks that can cause it to miss
exit codes that were set by commands earlier in the same block.
Replace the pattern with `|| exit /b 1` chained directly onto each
command. `||` is evaluated at process-exit time and doesn't depend
on errorlevel-in-parens semantics. This is the documented idiom
for robust error propagation in cmd.exe batch files.

Functional change: the step now fails fast with the first
command's non-zero exit, instead of running to completion and
reporting success regardless. Applies to all three Windows matrix
entries (msvc-2019, msvc-2022 Debug, msvc-2022 Release). Does not
change behavior when the build succeeds.

Other steps in the same workflow (`Build MRBind`, `Generate C
bindings`, `Generate and build Python bindings`) use similar cmd
batch patterns and may have the same latent bug; left alone here
to keep the PR scoped to the Build step that has a concrete
reproducer. Worth auditing separately.
New GTest case MRMesh.CompressManySmallFilesToZip writes 100 binary
files and 100 JSON files to a temp folder (each 60 000 bytes,
12 000 000 bytes total — matching the sphere.mrmesh size from the
existing CompressSphereToZip test) and compresses the folder to a
.zip.

Binary file content is deterministic pseudo-random bytes from a
per-index-seeded LCG — low-compressibility, representative of mesh
coordinate floats and similar near-incompressible payloads. JSON file
content is deterministic structured-looking text padded to exactly
60 000 bytes with trailing whitespace — highly compressible,
representative of scene-description metadata and logs.

Pairs with CompressSphereToZip so a single run of MRTest produces
two direct data points: one-large-file vs many-small-files on roughly
the same total byte budget. Useful for assessing libzip's per-entry
overhead (separate deflate session, CRC pass, local file header) when
comparing zlib backends or compression-level changes.

Per-file byte count is constant and deterministic so the aggregate
input size and zip size are stable across runs (modulo whatever
small variation deflate itself introduces on different zlib builds).

Logs totals via spdlog::info for easy diff with the other test.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants