Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
210 commits
Select commit Hold shift + click to select a range
2037cca
analyze: add --json output, fixes #9992
MannXo Aug 1, 2026
0550944
analyze: fix the hot-spot JSON test on Windows
MannXo Aug 3, 2026
afedfb6
check: keep the records of corrupt packs across check cycles
mr-raj12 Jul 21, 2026
4e3372e
check: add --max-age to reuse intact-pack check results across cycles
mr-raj12 Jul 22, 2026
cf00471
check: keep pack check results unconditionally, --max-age only contro…
mr-raj12 Jul 23, 2026
556daa2
check: re-verify future-dated records, reject --archives-only --max-a…
mr-raj12 Jul 28, 2026
e2c03cb
check: fail and report known-corrupt packs even on interrupted partia…
mr-raj12 Jul 28, 2026
d465231
check: test clock-skew reuse window and archives-only rejection, asse…
mr-raj12 Jul 29, 2026
8ec9224
check: cap max-age future-skew tolerance at the window, document pers…
mr-raj12 Jul 29, 2026
ff6bb8b
check: calendar-aware --max-age, symmetric clock-skew window
mr-raj12 Aug 3, 2026
0138c35
check: report missing chunks inverted as chunk -> files -> archives, …
mr-raj12 Jul 29, 2026
06f5889
check: bound the missing chunks report memory and test its grouping, …
mr-raj12 Jul 30, 2026
36b2967
check: use format_file_size for missing chunk report and test the per…
mr-raj12 Aug 3, 2026
63ab760
check: run truncation tests binary-safe, report missing-ref total, us…
mr-raj12 Aug 4, 2026
112cbca
check: stream one line per missing chunk id, run report on abort, low…
mr-raj12 Aug 4, 2026
23e2a21
check: re-verify records past max-age, guard on resolved window, tigh…
mr-raj12 Aug 4, 2026
7171b68
check: verify least-recently-checked packs first on partial runs, doc…
mr-raj12 Aug 4, 2026
3a8431c
completion: generate fish completions, remove hand-written ones, fixe…
ThomasWaldmann Aug 1, 2026
385a2ad
Merge pull request #9990 from ThomasWaldmann/fish-completions-9989
ThomasWaldmann Aug 5, 2026
bfb0f5c
add tcsh completion support
ThomasWaldmann Mar 18, 2026
710c272
lrucache: assigning to a key that is present replaces its value
ThomasWaldmann Aug 5, 2026
fce88ee
lrucache: make it thread-safe
ThomasWaldmann Aug 5, 2026
2ec4e87
check: drop obsolete --max-duration guard, credit oldest-first orderi…
mr-raj12 Aug 5, 2026
faa1cda
Merge pull request #10041 from ThomasWaldmann/lrucache-thread-safe
ThomasWaldmann Aug 5, 2026
0d6fffb
unify the 3 archive-as-filesystem implementations, fixes #10020
ThomasWaldmann Aug 5, 2026
d0b4ebd
Merge pull request #10023 from ThomasWaldmann/unify-vfs-10020
ThomasWaldmann Aug 5, 2026
cf5276a
update CHANGES
ThomasWaldmann Aug 5, 2026
effa698
Merge pull request #10045 from ThomasWaldmann/update-changes-master
ThomasWaldmann Aug 5, 2026
5e119f6
give each thread its own LZ4 scratch buffer, fixes #10032
ThomasWaldmann Aug 5, 2026
8ed5cc2
chunkers: add AVX-512 / VAES scan kernels
ThomasWaldmann Aug 5, 2026
17ded35
chunkers: add BORG_FASTCDC_NO_AVX2 / BORG_BUZHASH64_NO_AVX2
ThomasWaldmann Aug 5, 2026
674d9c6
Merge pull request #10047 from ThomasWaldmann/lz4-threadsafe-10032
ThomasWaldmann Aug 5, 2026
ddd54be
chunkers: build the aligned domain in the vector kernels
ThomasWaldmann Aug 5, 2026
aa21d6f
goldilocks-aes: keep the field reductions out of the branch predictor
ThomasWaldmann Aug 6, 2026
2020888
chunkers: store the AES chunkers' digests pre-spread
ThomasWaldmann Aug 6, 2026
a9e5d03
fastcdc: test against a limit instead of masking, on aarch64
ThomasWaldmann Aug 6, 2026
193a26f
buzhash64: drop the NEON kernel, blocked scalar is faster there
ThomasWaldmann Aug 6, 2026
063edc0
chunkers: keep the AES chunkers' cut test in the vector domain on aar…
ThomasWaldmann Aug 6, 2026
e310b89
goldilocks-aes: drop the multiply's redundant canonicalization
ThomasWaldmann Aug 6, 2026
18744d6
chunkers: rename the "blocked" scan kernel to "blockwise"
ThomasWaldmann Aug 6, 2026
350748c
chunkers: one BORG_*_KERNEL env var per chunker family
ThomasWaldmann Aug 6, 2026
423bc31
Merge pull request #9965 from mr-raj12/invert-missing-chunk-report-9218
ThomasWaldmann Aug 6, 2026
2163abf
buzhash64: keep the NEON kernel, selectable but not auto-selected
ThomasWaldmann Aug 6, 2026
f00a8ce
check: fix partial-run startup log line, soften --max-age cadence wor…
mr-raj12 Aug 6, 2026
eaef6ac
check: handle soft interrupt (Ctrl-C) at safe boundaries, always run …
mr-raj12 Jul 29, 2026
566f643
check: report honest status on Ctrl-C interrupt
mr-raj12 Aug 5, 2026
e848f1f
check: honest interrupt summary, precise SIGINT docs, align tests
mr-raj12 Aug 5, 2026
f71c3de
build: bundle borg.chunkers.kernel_env into the binary
ThomasWaldmann Aug 6, 2026
5257426
check: honest interrupt summary in all branches, precise boundaries, …
mr-raj12 Aug 6, 2026
8174ad1
Merge pull request #9925 from mr-raj12/check-keep-corrupt-packs-9696
ThomasWaldmann Aug 6, 2026
4944f74
chunkers: run the simplest scan kernel unless told otherwise
ThomasWaldmann Aug 6, 2026
1284c47
chunkers: log the chunker and its scan kernel at debug level
ThomasWaldmann Aug 6, 2026
2cea337
Merge remote-tracking branch 'upstream/master' into check-soft-interr…
mr-raj12 Aug 6, 2026
be024a5
benchmark cpu: add a throughput column, #10049
ThomasWaldmann Aug 6, 2026
af3c172
benchmark cpu: buffer sizes that matter, and section selection, #10050
ThomasWaldmann Aug 6, 2026
7e11a20
benchmark cpu: compress compressible data, not random noise
ThomasWaldmann Aug 6, 2026
bf99d5a
benchmark cpu: measure blake3 the way borg uses it
ThomasWaldmann Aug 6, 2026
62127a5
benchmark cpu: use binary data sizes, 1 GiB and 10 MiB
ThomasWaldmann Aug 6, 2026
bdf3ab8
benchmark cpu: list the AEAD encryption modes first
ThomasWaldmann Aug 6, 2026
2a9f691
benchmark cpu: group the compression rows by buffer size
ThomasWaldmann Aug 6, 2026
c75b166
benchmark cpu: benchmark zlib,1 rather than zlib,0
ThomasWaldmann Aug 6, 2026
d927fc7
benchmark cpu: order the hashes fastest first
ThomasWaldmann Aug 6, 2026
46dc79f
benchmark cpu: fix the help text, align the columns
ThomasWaldmann Aug 7, 2026
2b39538
docs: document the chunker scan kernel env vars
ThomasWaldmann Aug 7, 2026
cf02c5a
Merge pull request #9503 from ThomasWaldmann/tcsh-completions
ThomasWaldmann Aug 7, 2026
896e8f5
benchmark cpu: name the section flags consistently
ThomasWaldmann Aug 7, 2026
8f2de9e
tests: cover every scan kernel, not just the default one
ThomasWaldmann Aug 7, 2026
5e12eb9
Merge pull request #10043 from ThomasWaldmann/chunkers-avx512
ThomasWaldmann Aug 7, 2026
5bdbf31
Merge pull request #10052 from ThomasWaldmann/benchmark-cpu-throughput
ThomasWaldmann Aug 7, 2026
9cf947f
update CHANGES
ThomasWaldmann Aug 7, 2026
1eb2dbf
Merge pull request #10053 from ThomasWaldmann/update-changes-master
ThomasWaldmann Aug 7, 2026
7839e9f
check: honest per-run interrupt count, drop redundant save, fix stale…
mr-raj12 Aug 8, 2026
488b411
compress: do not copy chunk data to bytes, use the buffer protocol
ThomasWaldmann Aug 8, 2026
2913209
crypto: AEAD encrypt/decrypt directly into the result bytes object
ThomasWaldmann Aug 9, 2026
10fbb99
compress: lz4 decompresses directly into the result bytes object
ThomasWaldmann Aug 9, 2026
b63e7b9
Merge pull request #10059 from ThomasWaldmann/memory-perf
ThomasWaldmann Aug 9, 2026
bfc12c0
chunkers: fixed chunker reads directly into per-chunk buffers
ThomasWaldmann Aug 9, 2026
e481b32
remove unused optr code, fixes #5762
ThomasWaldmann Aug 9, 2026
8998a5a
chunkers: read file data directly into the caller's buffer
ThomasWaldmann Aug 9, 2026
a7a8759
Merge pull request #10062 from ThomasWaldmann/remove-optr
ThomasWaldmann Aug 9, 2026
39d0e27
borg help environment: new help topic about env variables, fixes #10061
ThomasWaldmann Aug 9, 2026
849b71c
Merge pull request #10063 from ThomasWaldmann/help-env-10061
ThomasWaldmann Aug 9, 2026
4bad620
CI: give the test VMs 4 cpus / 8 GiB RAM
ThomasWaldmann Aug 9, 2026
a14622d
CI: time out the "Start VM" step after 15 minutes
ThomasWaldmann Aug 9, 2026
f9e6756
CI: fail hung tests after 5 minutes on the test VMs
ThomasWaldmann Aug 9, 2026
2494b29
Merge pull request #10060 from ThomasWaldmann/fixed-chunker
ThomasWaldmann Aug 9, 2026
e69236b
Merge pull request #10064 from ThomasWaldmann/ci-vm-hangs
ThomasWaldmann Aug 9, 2026
d38a3cc
tests: benchmark crud json-lines: io throughput may round to 0
ThomasWaldmann Aug 9, 2026
613a45c
Merge pull request #10066 from ThomasWaldmann/fix-benchmark-crud-io
ThomasWaldmann Aug 9, 2026
800a4b8
chunkers: only use the direct read path for known regular files
ThomasWaldmann Aug 9, 2026
a5d833e
Merge pull request #10065 from ThomasWaldmann/reader-direct-regular-only
ThomasWaldmann Aug 9, 2026
992fc79
check: reflow SIGINT epilog paragraph so --help has no short mid-line
mr-raj12 Aug 9, 2026
da6f388
check: report invalid pack names instead of crashing
mr-raj12 Aug 9, 2026
19cb850
Merge pull request #10068 from mr-raj12/fix-check-invalid-pack-name
ThomasWaldmann Aug 9, 2026
4211d49
check --repair: flush pack writer in ArchiveChecker.finish() before d…
mr-raj12 Aug 10, 2026
a8a2084
FAME.md: update contributor statistics
ThomasWaldmann Aug 10, 2026
e60f7f5
Merge pull request #10070 from borgbackup/auto/update-fame
ThomasWaldmann Aug 10, 2026
8d7569b
Merge pull request #9966 from mr-raj12/check-soft-interrupt-7893
ThomasWaldmann Aug 10, 2026
67e0573
build(deps-dev): bump the pip-dependencies group
dependabot[bot] Aug 11, 2026
3f9c362
build(deps): bump github/codeql-action in the actions group
dependabot[bot] Aug 11, 2026
77e41ce
Merge pull request #10073 from borgbackup/dependabot/pip/requirements…
ThomasWaldmann Aug 11, 2026
31c7aa8
Merge pull request #10074 from borgbackup/dependabot/github_actions/a…
ThomasWaldmann Aug 11, 2026
ec7eb5f
Merge pull request #10072 from mr-raj12/fix-check-finish-flush
ThomasWaldmann Aug 11, 2026
c058be3
CI: upgrade cross-platform-actions to 1.4.0, NetBSD to 11.0
ThomasWaldmann Aug 10, 2026
5de8211
tests: time-bound LRUCache.test_threaded_access
ThomasWaldmann Aug 11, 2026
9e552cc
CI: NetBSD: use Python 3.13
ThomasWaldmann Aug 10, 2026
5509d2d
NetBSD 11: / has EAs enabled, use a TMPDIR for tests there
ThomasWaldmann Aug 10, 2026
c9f03ef
tests: compute the TMPDIR-based runtime dir fallback
ThomasWaldmann Aug 11, 2026
b62cdeb
Merge pull request #10071 from ThomasWaldmann/ci-cpa-1.4.0-netbsd-11
ThomasWaldmann Aug 11, 2026
eae8f6d
export-tar/import-tar: zstd (de)compression in-process, see #10067
ThomasWaldmann Aug 11, 2026
02af3a4
Merge pull request #10076 from ThomasWaldmann/tar-zstd-10067
ThomasWaldmann Aug 11, 2026
a68c660
CI: OpenBSD: put TMPDIR on an mfs
ThomasWaldmann Aug 11, 2026
9b3c4c5
CI: upgrade to OpenBSD 7.9
ThomasWaldmann Aug 11, 2026
284ca3b
CI: cache pip-built wheels for the VM tests
ThomasWaldmann Aug 11, 2026
f829946
Merge pull request #10075 from ThomasWaldmann/ci-openbsd-speed
ThomasWaldmann Aug 11, 2026
8d9e5e5
CI: cache pip-built wheels for the Windows jobs
ThomasWaldmann Aug 11, 2026
4f861a3
write_chunkindex_to_repo: reduce memory needs, fixes #9886
ThomasWaldmann Aug 11, 2026
440b5dd
Merge pull request #10079 from ThomasWaldmann/ci-windows-speed
ThomasWaldmann Aug 11, 2026
0b838c3
Merge pull request #10078 from ThomasWaldmann/chunkindex-mem-9886
ThomasWaldmann Aug 11, 2026
acf222a
add ProgressIndicatorSpinner, for work of unknown duration
ThomasWaldmann Aug 11, 2026
91129b2
Merge pull request #10081 from ThomasWaldmann/spinner
ThomasWaldmann Aug 11, 2026
bf6a449
compression: support zstd negative ("fast") levels, fixes #9950
ThomasWaldmann Aug 12, 2026
6f8249c
Merge branch 'master' into feat/9992-analyze-json
MannXo Aug 12, 2026
593698a
Merge pull request #10084 from ThomasWaldmann/zstd-negative-levels-9950
ThomasWaldmann Aug 12, 2026
17b1c22
check: detect missing packs referenced by the index (#9898)
mr-raj12 Aug 10, 2026
dfcc12b
check: report orphan packs, tidy missing-pack messages (#9898)
mr-raj12 Aug 12, 2026
3c07f9e
update CHANGES
ThomasWaldmann Aug 12, 2026
b6b8ec0
Merge pull request #10086 from ThomasWaldmann/update-changes-master
ThomasWaldmann Aug 12, 2026
98b8b4f
create --progress: show big sizes with more decimals, fixes #3559
ThomasWaldmann Aug 12, 2026
5212ded
helpers: add sorting.py for --sort-by style multi-field sorting
ThomasWaldmann Aug 12, 2026
cc44942
diff: use the shared sorting helper, no behaviour change
ThomasWaldmann Aug 12, 2026
43b29ee
list: add --sort-by=SPEC, fixes #9009
ThomasWaldmann Aug 12, 2026
78fec4e
tests: borg list --sort-by
ThomasWaldmann Aug 12, 2026
465e9fa
completion: complete the --sort-by fields of list and diff
ThomasWaldmann Aug 12, 2026
fa66d83
docs: list --sort-by
ThomasWaldmann Aug 12, 2026
d5eabd2
diff: --sort-by can only be given once
ThomasWaldmann Aug 12, 2026
46cfdd8
tests: make the --sort-by completion wiring checks CRLF-proof
ThomasWaldmann Aug 12, 2026
0b451c1
CI: force colored tox/pytest output in all jobs
ThomasWaldmann Aug 12, 2026
a817622
Merge pull request #10091 from ThomasWaldmann/ci-color
ThomasWaldmann Aug 12, 2026
654fbb2
Merge pull request #10088 from ThomasWaldmann/progress-digits-3559
ThomasWaldmann Aug 12, 2026
766f6a1
Merge pull request #10089 from ThomasWaldmann/list-sortby-9009
ThomasWaldmann Aug 12, 2026
0ccf95b
validate object headers when walking a pack, see #8476
mr-raj12 Aug 12, 2026
3a46540
check: guard cross-check on interrupt, make missing-pack message acti…
mr-raj12 Aug 12, 2026
578c93a
check: cross-check index from fragments only, skip on partial runs (#…
mr-raj12 Aug 12, 2026
b675495
Merge pull request #10083 from mr-raj12/iter-headers-validate-8476
ThomasWaldmann Aug 12, 2026
2b2bff3
check: cross-check index before pack loop so partial runs detect miss…
mr-raj12 Aug 13, 2026
4d9fb17
check: raise CorruptChunkIndexFragment for unreadable fragments so a …
Aug 13, 2026
f500b0f
compact/repo-compress: single stale-pack message form for any count (…
mr-raj12 Aug 13, 2026
5b9da3b
create: add --read-special-timeout option, fixes #5422
ThomasWaldmann Aug 13, 2026
6fd5665
Merge pull request #10090 from ThomasWaldmann/read-special-timeout-5422
ThomasWaldmann Aug 13, 2026
e0f5068
Merge pull request #10069 from mr-raj12/vanished-packs-detection-9898
ThomasWaldmann Aug 13, 2026
8c32fae
check --repair: rebuild a corrupt repository index from the packs, #1…
mr-raj12 Aug 9, 2026
e1fdba6
check --repair: only rebuild the index when every pack was verified i…
mr-raj12 Aug 12, 2026
8b80d14
check --repair: scope the corrupt-pack index note to the repository c…
mr-raj12 Aug 13, 2026
8640a75
create --encryption: new none-* and authenticated-* modes, #9104
ThomasWaldmann Aug 13, 2026
6f4d3e2
Merge pull request #10095 from ThomasWaldmann/borg-new-authenticated-…
ThomasWaldmann Aug 13, 2026
9f07fd8
with-lock: fix epilog about leftover lock auto-removal, see #9870
ThomasWaldmann Aug 13, 2026
e15404a
locking: ignore locks vanishing between listing and loading them
ThomasWaldmann Aug 14, 2026
8b4e98a
CI: daily canary probing Python 3.12 on ubuntu-26.04
ThomasWaldmann Aug 14, 2026
4f4dcc3
Merge pull request #10097 from ThomasWaldmann/canary-py312-ubuntu2604
ThomasWaldmann Aug 14, 2026
ac1b415
Merge pull request #10096 from ThomasWaldmann/storelocking-fixes
ThomasWaldmann Aug 14, 2026
b8546e9
docs: add generated man page borg-environment.1
ThomasWaldmann Aug 14, 2026
b7fc599
Merge pull request #10098 from ThomasWaldmann/man-environment
ThomasWaldmann Aug 14, 2026
cfd3686
find: new command to search files across archives, #9974
ThomasWaldmann Aug 14, 2026
448f1c6
create: support --stats with --dry-run, fixes #1648
ThomasWaldmann Aug 14, 2026
b893d49
chunkers: release the GIL in the AES chunkers' scan kernels
ThomasWaldmann Aug 14, 2026
bce7398
Merge pull request #10099 from ThomasWaldmann/find-9974
ThomasWaldmann Aug 14, 2026
9cc3712
docs: NetBSD xattr support is implemented, update platform feature ta…
ThomasWaldmann Aug 14, 2026
a707ca7
Merge pull request #10106 from ThomasWaldmann/netbsd-xattr-docs-1332
ThomasWaldmann Aug 14, 2026
54a3a61
Merge pull request #10103 from ThomasWaldmann/aes-chunkers-nogil
ThomasWaldmann Aug 14, 2026
64d622c
illumos/Solaris: add xattr support, see #1337
ThomasWaldmann Aug 14, 2026
0ada4c7
tests: relax wall-clock bound in read-special-timeout test
ThomasWaldmann Aug 14, 2026
76d1b73
Merge pull request #10107 from ThomasWaldmann/read-special-timeout-te…
ThomasWaldmann Aug 14, 2026
664b6ef
Merge pull request #10102 from ThomasWaldmann/solaris-xattr-1337
ThomasWaldmann Aug 14, 2026
4dfcf29
CI: pin all GitHub Actions to commit SHAs
ThomasWaldmann Aug 14, 2026
daa1944
CI: add a Dependabot cooldown for GitHub Actions
ThomasWaldmann Aug 14, 2026
3340057
Merge pull request #10108 from ThomasWaldmann/ci-pin-actions
ThomasWaldmann Aug 14, 2026
18def9b
docs: FAQ, 2 ways to limit bandwidth, fixes #8838
ThomasWaldmann Aug 14, 2026
531d524
Merge pull request #10110 from ThomasWaldmann/faq-ratelimit-8838
ThomasWaldmann Aug 14, 2026
9dd91fc
create: do not use ctime for the files cache on Windows, fixes #7193
ThomasWaldmann Aug 14, 2026
527fc57
compression: cap the default zstd MT workers at 4 for chunks
ThomasWaldmann Aug 14, 2026
9ef3695
tests: keep pytest out of the chunkers testsuite package __init__
ThomasWaldmann Aug 14, 2026
e7824f6
Merge pull request #10114 from ThomasWaldmann/files-cache-win32-7193
ThomasWaldmann Aug 14, 2026
206b5c6
Merge pull request #10115 from ThomasWaldmann/zstd-mt-workers-default
ThomasWaldmann Aug 14, 2026
a8c58d8
Merge pull request #10116 from ThomasWaldmann/no-pytest-in-selftest
ThomasWaldmann Aug 14, 2026
d8abb74
CI: add big-endian (s390x) test under qemu emulation
ThomasWaldmann Aug 14, 2026
5656344
Merge pull request #10117 from ThomasWaldmann/ci-bigendian-s390x
ThomasWaldmann Aug 15, 2026
49bed0c
CI: give the black workflow read-only token permissions
ThomasWaldmann Aug 15, 2026
a11fdb3
Merge pull request #10118 from ThomasWaldmann/ci-black-permissions
ThomasWaldmann Aug 15, 2026
abd9c3d
CI: release automation for PyPI and GitHub releases
ThomasWaldmann Aug 15, 2026
929652f
Merge pull request #10119 from ThomasWaldmann/release-workflow
ThomasWaldmann Aug 15, 2026
ebf483d
Merge pull request #10105 from ThomasWaldmann/dryrun-stats-1648
ThomasWaldmann Aug 15, 2026
6030db8
Merge pull request #10001 from MannXo/feat/9992-analyze-json
ThomasWaldmann Aug 15, 2026
d0baab4
windows: restore timestamps via SetFileTime, fixes #7269
ThomasWaldmann Aug 15, 2026
64c79e1
check --repair: report index-referenced missing packs as errors, not …
mr-raj12 Aug 15, 2026
9bf6d5c
check --repair: test the interrupted-rebuild guard and missing-pack e…
mr-raj12 Aug 15, 2026
8e9294b
Merge pull request #10121 from ThomasWaldmann/restore-attrs-7269
ThomasWaldmann Aug 15, 2026
7433e1c
create: follow symlinks given as recursion roots, fixes #4737
ThomasWaldmann Aug 15, 2026
d7855ad
tests: expect the warning's exit code, not the error's
ThomasWaldmann Aug 15, 2026
d06c2b2
Merge pull request #10120 from ThomasWaldmann/follow-root-symlinks-4737
ThomasWaldmann Aug 15, 2026
6d99e87
Merge pull request #10048 from mr-raj12/check-repair-index-rebuild-10026
ThomasWaldmann Aug 15, 2026
91b030e
tests: do not pin the zsh --sort-by label, shtab 1.11.0 changed it
ThomasWaldmann Aug 16, 2026
d5d489c
Merge pull request #10125 from ThomasWaldmann/fix-zsh-sortby-test-sht…
ThomasWaldmann Aug 16, 2026
db2ff30
fix daemonizing: don't lose an early notify signal from the backgroun…
ThomasWaldmann Jun 14, 2026
54b1b3d
conftest: fix rmtree cleanup crash on Linux (os.lchflags does not exist)
ThomasWaldmann Jun 14, 2026
def9383
get rid of master/slave terminology for hard links, #5248
ThomasWaldmann Aug 16, 2026
25a4163
Merge pull request #10124 from ThomasWaldmann/fix-conftest-rmtree-linux
ThomasWaldmann Aug 16, 2026
f221016
Merge pull request #10126 from ThomasWaldmann/hardlink-terminology-5248
ThomasWaldmann Aug 16, 2026
114bd1e
Merge pull request #10123 from ThomasWaldmann/fix-daemonizing-early-s…
ThomasWaldmann Aug 16, 2026
69acada
create --sparse: fix stale help text, sparse input works with all chu…
ThomasWaldmann Aug 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ updates:
directory: "/"
schedule:
interval: "weekly"
cooldown:
# default-days also covers patch releases and actions not using semver.
default-days: 14
semver-major-days: 90
semver-minor-days: 30
groups:
actions:
patterns:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/backport.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ jobs:
startsWith(github.event.comment.body, '/backport')
)
steps:
- uses: actions/checkout@v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Create backport pull requests
uses: korthout/backport-action@v4
uses: korthout/backport-action@2e830a1d0b8269505846ddd407a70876913ad1f8 # v4.6.0
with:
label_pattern: '^port/(.+)$'
200 changes: 200 additions & 0 deletions .github/workflows/bigendian.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
# Big-endian test: build and test borg on s390x (big-endian) under qemu
# user-mode emulation, and check that a repository written on a big-endian
# machine can be read on a little-endian one and the other way round.
#
# Why: borg's repository format is architecture independent and the native code
# has explicit big-endian code paths (e.g. the __builtin_bswap64 calls in the
# chunker kernels), but every other machine we test on is little-endian, so
# those code paths are never executed and a bug in them would only be found by
# the users of s390x, some ppc64 and some mips machines.
#
# Everything inside the container is emulated instruction by instruction, so
# this is slow. Therefore it does not run for every pull request, but only when
# native code or format relevant code was touched (plus weekly and on demand).

name: Big-endian

on:
pull_request:
branches: [ master ]
paths:
- '**.pyx'
- '**.pxd'
- 'src/borg/**/*.c'
- 'src/borg/**/*.h'
- 'src/borg/chunkers/**'
- 'src/borg/crypto/**'
- 'src/borg/repository.py'
- 'src/borg/repoobj.py'
- 'src/borg/archive.py'
- 'scripts/endian_interop_test.py'
- '.github/workflows/bigendian.yml'
schedule:
- cron: '43 5 * * 3' # Wednesdays at 05:43 UTC
workflow_dispatch: # Allow manual trigger

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

env:
PY_COLORS: "1"

jobs:
s390x:
name: s390x (big-endian, emulated)
runs-on: ubuntu-24.04
timeout-minutes: 120

env:
# Debian trixie has python 3.13, and all our dependencies that ship binary
# wheels (blake3, backports-zstd, PyYAML, cffi) have s390x wheels for it -
# only the small C/Cython extensions are compiled (emulated) from source.
IMAGE: docker.io/s390x/debian:trixie-slim
CONTAINER: borg-s390x
# both sides of the interoperability test share this directory:
INTEROP: ${{ github.workspace }}/.interop
# a hung emulated test must fail instead of eating the job timeout:
PYTEST_TIMEOUT: "600"
# The endianness sensitive parts: the native code (chunkers, crypto,
# compression, hashindex, item) and the code that reads/writes the
# repository format. Extend this if it turns out to be too narrow.
PYTEST_TARGETS: >-
borg.testsuite.chunkers
borg.testsuite.crypto
borg.testsuite.compress_test
borg.testsuite.hashindex_test
borg.testsuite.item_test
borg.testsuite.repoobj_test
borg.testsuite.repository_test
borg.testsuite.archive_test
borg.testsuite.helpers.msgpack_test

steps:
- uses: actions/checkout@v7
with:
# Just fetching one commit is not enough for setuptools-scm, so we fetch all.
fetch-depth: 0
fetch-tags: true

- name: Set up Python
uses: actions/setup-python@v7
with:
# same python version as in the container, so both sides are comparable
python-version: '3.13'

# The wheels pip has to build from source inside the emulated container
# (msgpack, argon2-cffi-bindings, borghash, borgstore) are the expensive
# part of the container setup, so keep them from run to run.
- name: Cache pip-built wheels (s390x)
uses: actions/cache@v6
with:
path: .pip-cache-s390x
key: s390x-pip-${{ hashFiles('pyproject.toml') }}
restore-keys: |
s390x-pip-

- name: Install Linux packages
run: |
sudo apt-get update
sudo apt-get install -y pkg-config build-essential
sudo apt-get install -y libssl-dev libacl1-dev liblz4-dev

- name: Build borg (native, little-endian)
run: |
set -euxo pipefail
# Note: a non-editable install on purpose - the s390x build below uses
# the same source tree and an editable install would put the extension
# modules of one architecture in there for the other one to pick up.
python -m venv "$RUNNER_TEMP/venv-native"
"$RUNNER_TEMP/venv-native/bin/pip" install --upgrade pip wheel
# Note: no pytest and no other development dependencies in this venv on
# purpose - this is what a normal borg installation looks like.
"$RUNNER_TEMP/venv-native/bin/pip" install .
"$RUNNER_TEMP/venv-native/bin/borg" --version
"$RUNNER_TEMP/venv-native/bin/python" -c 'import sys; assert sys.byteorder == "little", sys.byteorder'
# the container has no git, so tell setuptools-scm the version we got here:
echo "BORG_VERSION=$("$RUNNER_TEMP/venv-native/bin/borg" --version | cut -d' ' -f2)" >> $GITHUB_ENV

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: s390x

- name: Start the s390x container
run: |
set -euxo pipefail
mkdir -p .pip-cache-s390x
docker run -d --name "$CONTAINER" --platform linux/s390x \
-v "${{ github.workspace }}:/borg" -w /borg \
-e PIP_CACHE_DIR=/borg/.pip-cache-s390x \
-e SETUPTOOLS_SCM_PRETEND_VERSION_FOR_BORGBACKUP="$BORG_VERSION" \
-e HOST_UID="$(id -u)" -e HOST_GID="$(id -g)" \
"$IMAGE" sleep infinity
# if this says anything but s390x, the emulation did not kick in:
test "$(docker exec "$CONTAINER" uname -m)" = "s390x"

- name: Build borg (s390x, big-endian)
run: |
docker exec -i "$CONTAINER" bash -s <<'EOF'
set -euxo pipefail
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y --no-install-recommends \
python3 python3-dev python3-venv \
build-essential pkg-config libssl-dev libacl1-dev liblz4-dev
python3 -c 'import sys; assert sys.byteorder == "big", sys.byteorder; print("byteorder:", sys.byteorder)'
python3 -m venv /venv
/venv/bin/pip install --upgrade pip wheel
/venv/bin/pip install pytest pytest-xdist pytest-benchmark pytest-timeout
/venv/bin/pip install /borg
/venv/bin/borg --version
chown -R "$HOST_UID:$HOST_GID" /borg/.pip-cache-s390x
EOF

- name: Run the endianness sensitive tests on s390x
run: |
docker exec -i \
-e PYTEST_TARGETS="$PYTEST_TARGETS" \
-e PYTEST_TIMEOUT="$PYTEST_TIMEOUT" \
-e PY_COLORS="$PY_COLORS" \
"$CONTAINER" bash -s <<'EOF'
set -euxo pipefail
# run against the installed borg, not against the source tree:
cd /tmp
/venv/bin/python -m pytest -v -n4 -rs --benchmark-skip --pyargs $PYTEST_TARGETS
EOF

- name: Write test data and a repository on s390x
run: |
set -euxo pipefail
"$RUNNER_TEMP/venv-native/bin/python" scripts/endian_interop_test.py testdata "$INTEROP"
docker exec -i -e INTEROP=/borg/.interop "$CONTAINER" bash -s <<'EOF'
set -euxo pipefail
BORG=/venv/bin/borg /venv/bin/python /borg/scripts/endian_interop_test.py write "$INTEROP" be
chown -R "$HOST_UID:$HOST_GID" "$INTEROP"
EOF

- name: Read the s390x repository on x86_64 (and write to it)
run: |
set -euxo pipefail
export BORG="$RUNNER_TEMP/venv-native/bin/borg"
PY="$RUNNER_TEMP/venv-native/bin/python"
$PY scripts/endian_interop_test.py verify "$INTEROP" be --as le
$PY scripts/endian_interop_test.py write "$INTEROP" le
$PY scripts/endian_interop_test.py compare "$INTEROP" be le

- name: Read the x86_64 archives on s390x
run: |
docker exec -i -e INTEROP=/borg/.interop "$CONTAINER" bash -s <<'EOF'
set -euxo pipefail
BORG=/venv/bin/borg /venv/bin/python /borg/scripts/endian_interop_test.py verify "$INTEROP" le --as be
chown -R "$HOST_UID:$HOST_GID" "$INTEROP"
EOF

- name: Stop the s390x container
if: ${{ always() }}
run: docker rm -f "$CONTAINER" || true
5 changes: 4 additions & 1 deletion .github/workflows/black.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,15 @@ concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

jobs:
lint:
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- uses: actions/checkout@v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: psf/black@87928e6d6761a4a6d22250e1fee5601b3998086e # 26.5.1
with:
version: "~= 24.0"
49 changes: 49 additions & 0 deletions .github/workflows/canary-py312-ubuntu2604.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Inverted canary: watch for Python 3.12 becoming available on ubuntu-26.04.
#
# ubuntu-26.04 runners currently only work with the image's default Python
# (3.14) - actions/setup-python has no cached builds of older Pythons for
# this image yet, so requesting 3.12 fails. This probe tries daily.
#
# The logic is inverted on purpose: while 3.12 is still unavailable, the
# run stays GREEN (expected state, no noise). The day setup-python 3.12
# succeeds, the job FAILS loudly - GitHub emails scheduled-workflow
# failures to the user who last modified the cron line, so a red run here
# is the "3.12 works now" notification. When it fires: add ubuntu-26.04
# / 3.12 jobs to ci.yml and delete this workflow.

name: Canary (Python 3.12 on ubuntu-26.04)

on:
schedule:
- cron: '0 6 * * *' # Run at 06:00 UTC
workflow_dispatch: # Allow manual trigger

permissions: {}

jobs:
probe:
name: Probe setup-python 3.12
runs-on: ubuntu-26.04
timeout-minutes: 30

steps:
- name: Try to set up Python 3.12
id: setup
continue-on-error: true
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.12'

- name: Still unsupported - stay green
if: steps.setup.outcome == 'failure'
run: |
echo "::notice::Python 3.12 is still unavailable on ubuntu-26.04 (expected - nothing to do)."

- name: Python 3.12 works now - fail to trigger the notification email
if: steps.setup.outcome == 'success'
run: |
python --version
python -c 'import ssl, sqlite3, zlib, lzma'
python -m pip --version
echo "::error::Python 3.12 is NOW AVAILABLE on ubuntu-26.04! Add it to ci.yml and delete this canary workflow. (This failure is the notification - see the comment at the top of the workflow file.)"
exit 1
31 changes: 26 additions & 5 deletions .github/workflows/canary.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ on:
permissions:
contents: read

env:
# Force colored tox and pytest output even without a tty - the GitHub
# Actions log viewer renders ANSI colors. tox passes both vars through
# to pytest (pass_env = ["*"]).
PY_COLORS: "1" # pytest
TOX_COLORED: "yes" # tox's own output

jobs:
canary_tests:
name: Canary (${{ matrix.os }}, ${{ matrix.python-version }}, ${{ matrix.toxenv }})
Expand Down Expand Up @@ -37,13 +44,13 @@ jobs:
toxenv: py314-none

steps:
- uses: actions/checkout@v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
fetch-tags: true

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v7
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: ${{ matrix.python-version }}

Expand Down Expand Up @@ -107,20 +114,34 @@ jobs:
timeout-minutes: 180

env:
PY_COLORS: 1
MSYS2_ARG_CONV_EXCL: "*"
MSYS2_ENV_CONV_EXCL: "*"
# see the "Cache pip-built wheels" step. MSYS2_ENV_CONV_EXCL above keeps
# this a Windows path when it enters the msys2 shell.
PIP_CACHE_DIR: ${{ github.workspace }}\.pip-cache

defaults:
run:
shell: msys2 {0}

steps:
- uses: actions/checkout@v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0

- uses: msys2/setup-msys2@v2
# Same as the "Cache pip-built wheels" step in ci.yml (MSYS2's mingw
# Python cannot use PyPI's win_amd64 wheels). Own key, because the
# unlocked requirements may resolve to different versions; falls back
# to (and gets picked up by) the ci.yml cache via the shared prefix.
- name: Cache pip-built wheels
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: .pip-cache
key: windows-msys2-pip-canary-${{ hashFiles('pyproject.toml', 'requirements.d/pyinstaller.txt') }}
restore-keys: |
windows-msys2-pip-

- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2.32.0
with:
msystem: UCRT64
update: true
Expand Down
Loading
Loading