Skip to content

CI: cross-platform-actions 1.5.0, haiku r1beta6 - #10319

Merged
ThomasWaldmann merged 4 commits into
borgbackup:1.4-maintfrom
ThomasWaldmann:ci-haiku-r1beta6-1.4
Sep 3, 2026
Merged

ThomasWaldmann merged 4 commits into
borgbackup:1.4-maintfrom
ThomasWaldmann:ci-haiku-r1beta6-1.4

Conversation

@ThomasWaldmann

Copy link
Copy Markdown
Member

Backports the haiku CI fixes from master (74d9430, 9004e3c) to 1.4-maint.

The haiku VM job is currently broken: it still runs r1beta5 (2024) with
cross-platform-actions 1.4.0.

  • cross-platform-actions/action 1.4.0 -> 1.5.0 (1.5.0 is what added Haiku
    R1/beta6 support)
  • haiku r1beta5 -> r1beta6
  • the r1beta6 image already ships git, pkgconfig, lz4, openssl3 and a usable
    python3, so the explicit python3.10 install is gone; cffi/libffi_devel
    are gone too (1.4 does not use argon2-cffi). zstd_devel/xxhash_devel are
    kept - unlike master, 1.4 links libzstd and libxxhash.
  • that VM corrupts data every now and then (rustc crashing on crate metadata it
    wrote itself, pip seeing sha256 mismatches when reading big wheels back from
    its own cache), so: build outside haiku's /tmp, one rustc at a time, and
    retry a pip install with a purged pip cache instead of failing the job.

Not backported, to keep the diff small:

  • master splits the VM step into "Start VM" + a shell: cpa.sh {0} test step.
    1.5.0 deprecates the run: input this branch still uses, so the VM jobs will
    emit a deprecation warning until that migration is backported as well. It
    still works.
  • master runs the haiku tests with -n auto and a pip wheel cache; this keeps
    1.4's plain pytest -v -rs ... -k "not remote and not socket".

Only CI can really test this, vm_tests is continue-on-error anyway.

🤖 Generated with Claude Code

Backport of 74d9430 and 9004e3c from master.

cross-platform-actions 1.5.0 adds support for Haiku R1/beta6, so use that
instead of r1beta5 (2024), which was too painful to work with, see borgbackup#9463.

The r1beta6 image already has git, pkgconfig, lz4 and openssl3, and it
comes with a usable python3, so it does not need a python or cffi package
installed anymore (1.4 does not use argon2-cffi).

Also, from master:

The VM corrupts data every now and then: rustc crashed on crate metadata
it had written itself ("assertion failed: bytes[len] == STR_SENTINEL")
and pip found sha256 mismatches reading big wheels back from its own
cache. So build outside /boot/system/cache/tmp (haiku's /tmp), run one
rustc at a time and retry a pip install with a purged cache, so a damaged
file does not fail the whole job.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@codecov

codecov Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 75.00000% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.13%. Comparing base (19a9295) to head (d2fb419).
⚠️ Report is 1 commits behind head on 1.4-maint.

Files with missing lines Patch % Lines
src/borg/locking.py 0.00% 2 Missing ⚠️
src/borg/archive.py 90.00% 1 Missing ⚠️
Additional details and impacted files
@@              Coverage Diff              @@
##           1.4-maint   #10319      +/-   ##
=============================================
+ Coverage      82.11%   82.13%   +0.02%     
=============================================
  Files             38       38              
  Lines          11475    11478       +3     
  Branches        1807     1808       +1     
=============================================
+ Hits            9423     9428       +5     
+ Misses          1466     1465       -1     
+ Partials         586      585       -1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

ThomasWaldmann and others added 3 commits September 3, 2026 14:34
Backport of 2fa73c9 from master.

kill_stale_lock() only expected FileNotFoundError from os.listdir(). Haiku
throws EBUSY there while the lock directory is concurrently replaced via
rename(), and sometimes "bad data" (B_BAD_DATA) instead, so the exception
escaped ExclusiveLock.acquire() and the lock race test saw it as unclean
concurrency handling.

Do not enumerate error codes: not being able to read the lock directory
means we can not call the lock stale, whatever the reason.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The overread check does not work on haiku: it builds its trap via
ctypes.util.find_library('c'), which haiku answers by walking
os.environ['LIBRARY_PATH'] - unset in a non-interactive shell, so the
check subprocess dies with a KeyError and the test reports an overread
that never happened.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
An archive made with "borg create ARCHIVE ." has an item whose path is
".", so extract_item computed <dest>/. and the "remove what is there
before (re)creating the item" block called os.rmdir(<dest>/.) on it.

posix requires rmdir() to fail with EINVAL for a path whose last
component is ".", so everywhere else this was a silently ignored no-op.
Haiku's dir_remove() strips a trailing "/." from the path instead and
then removed the extraction directory, which is empty at that point -
after which the extraction failed with B_ENTRY_NOT_FOUND for every item.

There is nothing to remove for such a path anyway (the item is the
directory we are extracting into), so skip the block.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ThomasWaldmann
ThomasWaldmann merged commit 50fa4a6 into borgbackup:1.4-maint Sep 3, 2026
14 of 15 checks passed
@ThomasWaldmann
ThomasWaldmann deleted the ci-haiku-r1beta6-1.4 branch September 3, 2026 15:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant