Commit graph

10131 commits

Author SHA1 Message Date
Thomas Waldmann
1f00a1f4f3
nanorst: do not require 2 empty lines at end of string after code block, fixes #9714 2026-06-04 11:29:23 +02:00
Thomas Waldmann
043628cdd8
tests: invoke --help for all commands to check if it works, see #9714 2026-06-04 11:25:43 +02:00
dependabot[bot]
501e4798b7
build(deps): bump the pip-dependencies group
Bumps the pip-dependencies group in /requirements.d with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [pip](https://github.com/pypa/pip) | `26.1.1` | `26.1.2` |
| [wheel](https://github.com/pypa/wheel) | `0.46.3` | `0.47.0` |
| [build](https://github.com/pypa/build) | `1.4.4` | `1.5.0` |
| [tox](https://github.com/tox-dev/tox) | `4.53.0` | `4.53.1` |
| [pre-commit](https://github.com/pre-commit/pre-commit) | `4.5.1` | `4.6.0` |
| [pyinstaller](https://github.com/pyinstaller/pyinstaller) | `6.19.0` | `6.20.0` |


Updates `pip` from 26.1.1 to 26.1.2
- [Changelog](https://github.com/pypa/pip/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/pip/compare/26.1.1...26.1.2)

Updates `wheel` from 0.46.3 to 0.47.0
- [Release notes](https://github.com/pypa/wheel/releases)
- [Changelog](https://github.com/pypa/wheel/blob/main/docs/news.rst)
- [Commits](https://github.com/pypa/wheel/compare/0.46.3...0.47.0)

Updates `build` from 1.4.4 to 1.5.0
- [Release notes](https://github.com/pypa/build/releases)
- [Changelog](https://github.com/pypa/build/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/build/compare/1.4.4...1.5.0)

Updates `tox` from 4.53.0 to 4.53.1
- [Release notes](https://github.com/tox-dev/tox/releases)
- [Changelog](https://github.com/tox-dev/tox/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/tox/compare/4.53.0...4.53.1)

Updates `pre-commit` from 4.5.1 to 4.6.0
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v4.5.1...v4.6.0)

Updates `pyinstaller` from 6.19.0 to 6.20.0
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.19.0...v6.20.0)

---
updated-dependencies:
- dependency-name: pip
  dependency-version: 26.1.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: pip-dependencies
- dependency-name: wheel
  dependency-version: 0.47.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: pip-dependencies
- dependency-name: build
  dependency-version: 1.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: pip-dependencies
- dependency-name: tox
  dependency-version: 4.53.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: pip-dependencies
- dependency-name: pre-commit
  dependency-version: 4.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: pip-dependencies
- dependency-name: pyinstaller
  dependency-version: 6.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: pip-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-03 22:33:36 +00:00
dependabot[bot]
ec8fc5281d
build(deps): bump cross-platform-actions/action in the actions group
Bumps the actions group with 1 update: [cross-platform-actions/action](https://github.com/cross-platform-actions/action).


Updates `cross-platform-actions/action` from 1.1.0 to 1.2.0
- [Release notes](https://github.com/cross-platform-actions/action/releases)
- [Changelog](https://github.com/cross-platform-actions/action/blob/master/changelog.md)
- [Commits](https://github.com/cross-platform-actions/action/compare/v1.1.0...v1.2.0)

---
updated-dependencies:
- dependency-name: cross-platform-actions/action
  dependency-version: 1.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-03 22:33:18 +00:00
TW
4496904f48
Merge pull request #9710 from mr-raj12/pack-files-step4-chunkindex-pack-fields
Some checks are pending
Lint / lint (push) Waiting to run
CI / lint (push) Waiting to run
CI / security (push) Waiting to run
CI / asan_ubsan (push) Blocked by required conditions
CI / native_tests (push) Blocked by required conditions
CI / vm_tests (Haiku, false, haiku, r1beta5) (push) Blocked by required conditions
CI / vm_tests (NetBSD, false, netbsd, 10.1) (push) Blocked by required conditions
CI / vm_tests (OmniOS, false, omnios, r151056) (push) Blocked by required conditions
CI / vm_tests (OpenBSD, false, openbsd, 7.8) (push) Blocked by required conditions
CI / vm_tests (borg-freebsd-14-x86_64-gh, FreeBSD, true, freebsd, 14.3) (push) Blocked by required conditions
CI / windows_tests (push) Blocked by required conditions
CodeQL / Analyze (push) Waiting to run
hashindex: add pack_id, pack_offset, pack_size to ChunkIndexEntry
2026-06-03 17:59:00 +02:00
Mrityunjay Raj
8f28844a1e hashindex: add pack_id, obj_offset, obj_size to ChunkIndexEntry, refs #8572
Add three new fields to ChunkIndexEntry and update all call sites:
- pack_id (32 bytes): identifies the pack file containing the chunk
- obj_offset (uint32): byte offset of the chunk within the pack
- obj_size (uint32): stored (compressed) size of the chunk on disk

At N=1 (one chunk per pack), chunk_id == pack_id, obj_offset == 0,
and obj_size == pack_size. All sites use chunk_id as the ChunkIndex
key and extract pack_id as a separate variable with an N=1 comment.

compact_cmd.py: use obj_size (stored size) in repository_size sum.
cache.py: preserve pack fields when serializing the chunk index cache.
repository.py: populate pack_id/obj_size from borgstore object info.
archive.py: extract pack_id on its own line, obj_size=0 for now.
hashindex.pyx: update add(), namedtuple, format string, and docstring.
hashindex.pyi: add new fields to ChunkIndexEntry and CIE type alias.
testsuite/hashindex_test.py: update all ChunkIndexEntry constructions.
2026-06-03 18:21:13 +05:30
TW
6c143e201f
Merge pull request #9713 from ThomasWaldmann/build-nuitka2-master
nuitka build script refinements (master)
2026-06-03 12:59:23 +02:00
Thomas Waldmann
4431759d79
better script name 2026-06-03 12:57:45 +02:00
Thomas Waldmann
38cefed974
nuitka build script: simplify, see #3227
Including cffi is already enough to make it work.

Using --mode=onefile as suggested by Kay.
2026-06-03 12:55:11 +02:00
TW
d3fa580f42
Merge pull request #9711 from ThomasWaldmann/repo-list-borg1
allow 'borg repo-list' for Borg 1.x repositories via --from-borg1
2026-06-03 11:44:15 +02:00
TW
a1dc0dd6fa
Merge pull request #9712 from ThomasWaldmann/addtl-help-topics-master
list additional help topics in main borg help, fixes #3432
2026-06-03 09:58:34 +02:00
Thomas Waldmann
0311e891e6
list additional help topics in main borg help
- Add an epilog to the main ArgumentParser in src/borg/archiver/__init__.py.
- Import process_epilog and use it to format and list additional help topics: patterns, match-archives, placeholders, compression.
- Add test_main_help_epilog to help_cmd_test.py.
- Fixes #3432
2026-06-03 01:09:53 +02:00
Thomas Waldmann
8a13309539
allow 'borg repo-list' for Borg 1.x repositories via --from-borg1
- Add --from-borg1 option to borg repo-list command.
- Add allow_v1 argument to @with_repository decorator.
- If allow_v1 is True and v1_legacy is requested, allow version 1 repositories and load Manifest with RepoObj1 object class.
- Support LegacyRemoteRepository in Manifest class.
- Add test_repo_list_from_borg1.
2026-06-03 00:45:16 +02:00
TW
a135c8f302
Merge pull request #9709 from ThomasWaldmann/build-nuitka-master
scripts/build-nuitka.sh: generate single-file binary using nuitka, fixes #3227
2026-06-02 22:44:41 +02:00
Thomas Waldmann
b64d1dbc4d
scripts/build-nuitka.sh: generate single-file binary using nuitka, fixes #3227
Very experimental and little tested.
2026-06-02 18:56:43 +02:00
TW
ec331057a9
Merge pull request #9706 from ThomasWaldmann/py315
ci: add Python 3.15 to CI testing and tox configuration
2026-06-02 17:36:00 +02:00
Thomas Waldmann
a13f8a2f32
development.lock.txt: use Cython 3.2.5 2026-06-02 14:31:34 +02:00
Thomas Waldmann
b9a0a33a6e
ci: add Python 3.15 to CI testing and tox configuration 2026-06-02 14:31:32 +02:00
TW
98d6f2e3db
Merge pull request #9705 from ThomasWaldmann/update-changes
update CHANGES
2026-06-02 14:09:12 +02:00
Thomas Waldmann
d6eb910c21
update CHANGES 2026-06-02 11:34:42 +02:00
TW
968f7dae00
Merge pull request #9676 from ThomasWaldmann/support-rest-http-stdio
Support rest http stdio
2026-06-02 09:38:37 +02:00
Thomas Waldmann
5584bff830
CI: add test_rest_repo_basics tests to localhost openssh server 2026-06-02 03:07:15 +02:00
Thomas Waldmann
8dbfc50cde
require borgstore 0.5.1, always with rest extra 2026-06-02 02:12:08 +02:00
Thomas Waldmann
f53dd6c3c4
remote archiver tests: use rest:/// rather than ssh:// 2026-06-01 23:58:28 +02:00
TW
b8034fcf40
Merge pull request #9692 from mr-raj12/pack-files-step3-pack-id
repoobj, repository: add chunk_id to header, introduce packs/ namespace
2026-06-01 21:35:33 +02:00
Thomas Waldmann
39ac734b9c
support "rest:" repository URLs, fixes #9593
That is borgstore's REST http over stdio (over ssh, if a host is given).
2026-06-01 21:11:55 +02:00
TW
4d9369f897
Merge pull request #9701 from ThomasWaldmann/fix-9697-master
docs: update to 'borg key change-passphrase' in env help, fixes #9697
2026-06-01 21:01:12 +02:00
Thomas Waldmann
05994d2e4e
docs: update to 'borg key change-passphrase' in env help, fixes #9697 2026-06-01 20:55:56 +02:00
Mrityunjay Raj
d8564b90a4 repository: make N=1 chunk size assumption explicit in list(), refs #8572
info.size is the on-disk pack file size, which equals the chunk size only
when N=1 (one chunk per pack).  Extract it into a named variable with a
comment so the assumption is visible and easy to fix when N>1 is introduced.
2026-06-01 23:56:40 +05:30
Mrityunjay Raj
a4eac0b62c testsuite: move manifest corruption offset into data_encrypted region, refs #8572
Corruption at offset 123 lands inside meta_encrypted (header is 49 bytes),
causing extract_crypted_data to return a shifted slice whose first byte is
a random AES-OCB ciphertext byte.  When that byte equals 0x02 (PlaintextKey
type) key detection silently selects the wrong key, leading to a flaky
IntegrityError in rebuild_archives.

Move the insertion point to offset 250, which is safely inside data_encrypted
for any realistic manifest size, so key detection always reads the correct
type byte and the corruption is caught by AEAD authentication instead.
2026-06-01 23:56:26 +05:30
Mrityunjay Raj
0a9913b658 repository: drop PACK_HEADER wrapper, pack file is the raw RepoObj, refs #8572
accept only repo version 4
2026-06-01 23:55:55 +05:30
Mrityunjay Raj
2561acdba3 archiver: v4-only for -r/--repo, accept v4 in --other-repo, fix TypeError in error message 2026-06-01 23:55:54 +05:30
Mrityunjay Raj
395939b551 archiver: accept version 4 repos for -r/--repo, refs #8572
_common.py had a hard-coded version check that only allowed v3.
Now that repository.py creates v4 repos, every archiver command
failed to open the repo. Extend the guard to (3, 4).

The --other-repo check (v1 or v3 for borg transfer source) is
intentionally left unchanged.
2026-06-01 23:55:54 +05:30
Mrityunjay Raj
707f26b8e3 repository: address review: drop data/ namespace, fix chunk_id/pack_id semantics, refs #8572 2026-06-01 23:55:54 +05:30
Mrityunjay Raj
05ce0a1897 repository: add BORGPACK pack header, bump repo version to 4, refs #8572
Wrap each pack file in a 13-byte header (magic + version + blob_len) so
packs are self-identifying and the [len][blob] unit extends to N>1 without
a format revision. Bump version 3->4: packs/ and 49-byte ObjHeader are
incompatible with version-3 readers. Fix test_extra_chunks chunk_id mismatch.
2026-06-01 23:55:54 +05:30
Mrityunjay Raj
1cb8d99425 repository: introduce pack_id, move chunks to packs/ namespace, refs #8572
Introduces pack_id as the borgstore storage key (N=1: pack_id == chunk_id).
Chunks move from data/ to packs/ with single-level directory sharding (256
subdirs). check_object() validates the header chunk_id against the pack
filename. Adds packs/ to ns_config with levels=[1] and to the permissions
maps for no-delete and write-only modes.
2026-06-01 23:55:54 +05:30
Mrityunjay Raj
beab9b2711 repoobj: add chunk_id to blob header, extend to 49 bytes, refs #8572
Stores chunk_id unencrypted in the per-blob header so borg check can
rebuild the chunk_id -> pack location index without decryption. AEAD
uses chunk_id as additional data, making key-free recovery circular
without an explicit plaintext copy.

Header layout: OBJ_MAGIC(8) + version(1) + chunk_id(32) + meta_size(4)
+ data_size(4) = REPOOBJ_HEADER_SIZE = 49 bytes.
2026-06-01 23:55:54 +05:30
TW
c37fe1ff92
Merge pull request #9698 from ThomasWaldmann/fix-9695
potential fix for #9695
2026-06-01 20:19:44 +02:00
Thomas Waldmann
81c0c54529
potential fix for #9695 2026-06-01 19:26:11 +02:00
TW
bda3d5da48
Merge pull request #9693 from ThomasWaldmann/sha256-repokey
repokey: use same format as with external keyfile
2026-06-01 09:48:26 +02:00
Thomas Waldmann
9d2dd1d71f
keyfile: use binary mode to write 2026-05-31 23:55:40 +02:00
Thomas Waldmann
f13dd4ddc9
repokey: use same format as with external keyfile
- always have a starting line with FILE_ID repoid
- store repkeys content-addressed, name is sha256(content)
- search by repo id on load
- add keyfile_format / keyfile_parse / is_keyfile helpers
2026-05-31 22:50:25 +02:00
TW
a0448abde0
Merge pull request #9691 from mr-raj12/testsuite-argon2-wrong-passphrase
testsuite: add argon2 wrong-passphrase test for decrypt_key_file, refs #9686
2026-05-31 18:27:44 +02:00
TW
504be79208
Merge pull request #9685 from mr-raj12/testsuite-legacy-helpers
testsuite: add borg1_hardlink_master/slave/hardlinkable unit tests, refs #9556
2026-05-31 18:26:08 +02:00
TW
5bb4e85a16
Merge pull request #9684 from mr-raj12/pack-files-step2-obj-magic
repoobj: add OBJ_MAGIC blob header for pack file format
2026-05-31 17:20:07 +02:00
TW
76b77c748f
Merge pull request #9690 from ThomasWaldmann/sha256-key-filenames
keyfile: name key files by sha256(keyfile_contents)
2026-05-31 17:18:49 +02:00
Mrityunjay Raj
a6124fc284 testsuite: add argon2 wrong-passphrase test for decrypt_key_file, refs #9686 2026-05-31 20:30:58 +05:30
Mrityunjay Raj
de5590f398 testsuite: add borg1_hardlink_master/slave/hardlinkable unit tests, refs #9556 2026-05-31 20:19:57 +05:30
Mrityunjay Raj
1530688835 repository: use 'size mismatch' in check_object error messages, refs #8572 2026-05-31 20:09:08 +05:30
Mrityunjay Raj
8db4f4a19a repoobj: add OBJ_MAGIC blob header for pack file format, refs #8572 2026-05-31 18:54:56 +05:30