borgstore 0.7.0 adds Store.gather (many byte ranges with one call, one
roundtrip for REST) and fixes partial loads with a negative offset from
cached namespaces.
Store.defrag now requires all sources to be items of the given namespace,
which borg's defrag calls (hex pack names in "packs") already satisfy.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Opening a borg 1.x repository without --from-borg1 crashed with a traceback while
loading the config/config store object, because a borg 1.x repository has a config
*file* where borg 2 has the config/ namespace (NotADirectoryError for a local
repository, HTTP 500 via ssh://; InvalidRepository on Windows).
borgstore 0.6.4 reports a name below an object as ObjectNotFound on all platforms,
so require it. If config/config is not found, look at "config" via the store
backend and raise Repository.LegacyRepository (rc 29) if it is a file, telling the
user to use --from-borg1 (e.g. with borg transfer).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
mfusepy already knows how to talk to the FUSE 2 API of WinFsp, so this is
about the borg side:
- mountpoint: WinFsp mounts on an unused drive (X:) or creates (and later
removes) the mountpoint directory, so it must not exist yet.
- there is no fork: borg mount always stays in the foreground. Ctrl-C or
Ctrl-Break unmount. borg umount is not supported there.
- WinFsp ignores the "ro" mount option, a read-only volume has to be
requested from the init callback (FSP_FUSE_CAP_READ_ONLY).
- WinFsp makes a security descriptor from uid / gid / mode and checks all
access against it. The archived uids / gids do not mean anything on
Windows, so the uid and gid mount options are left to WinFsp and default
to -1 (the user who mounts).
- volname gives the volume label (default: borgfs).
- st_birthtime is given to mfusepy, WinFsp uses it as the creation time.
- readlink of something that is not a symlink fails with EINVAL (WinFsp
tries that for "/" to find out whether symlinks are supported).
Tests: on Windows, fuse_mount runs borg mount as a child process and stops
it like Ctrl-Break does. WinFsp does not support hard link counts. With
mfusepy 3.1.1, symlinks show up as regular files, because WinFsp has getdir
and readlink in a different order in struct fuse_operations than libfuse has.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
${pyenv which python} is parameter expansion and a "bad substitution"
error in bash/zsh; command substitution $(pyenv which python) was meant.
Co-Authored-By: Claude Fable 5 <[email protected]>
Remove the specific glibc / OS release version numbers (they rot every
time the build hosts change) and the outdated third-party ARM binaries
pointer; refer to the 00_README.txt released alongside the binaries for
the exact platform requirements.
Co-Authored-By: Claude Fable 5 <[email protected]>
install -D with a glob of 56 man pages and a single-file target cannot
work (and -D is GNU-only). Create the man1 directory first and install
the pages into it; works with both GNU and BSD/macOS install.
Co-Authored-By: Claude Fable 5 <[email protected]>
- borgstore extras: 0.3.0 -> 0.6.1 (matching pyproject.toml), add the
missing rclone backend and the cockpit extra, add a note that a Rust
toolchain is only needed when pip must build blake3 from source.
- macOS: the pkg-config example pointed at the long-dead Homebrew
[email protected] (and Intel-only /usr/local); use
"$(brew --prefix openssl@3)" which works on both architectures.
Recommend the mfusepy extra (FUSE 2 + 3, first choice of the default
BORG_FUSE_IMPL) instead of llfuse-only for macFUSE.
- Cygwin: python39 packages -> python311 (borg requires Python >= 3.11).
- Replace dead links: Guix package search, nixpkgs by-name path,
OpenBSD ports on GitHub, macfuse/macfuse (renamed from osxfuse),
archlinux.org package URL.
- mention mfusepy in the pip/git install examples.
- remove a stray blank line that made a bullet list render loose.
Co-Authored-By: Claude Fable 5 <[email protected]>
- src/borg/crypto/low_level.pyx: implement `argon2_hash` using OpenSSL's
`EVP_KDF` API for ARGON2 (requires OpenSSL >= 3.2.0).
- src/borg/crypto/key.py: switch to the native `argon2_hash` implementation,
removing `argon2-cffi` dependency.
- setup.py: require OpenSSL >= 3.2.0 for the crypto extension to ensure
ARGON2 KDF support is available.
- pyproject.toml: drop `argon2-cffi` dependency.
- docs: update installation requirements and security documentation to
reflect the transition to OpenSSL for Argon2.
The lanes are computed in parallel via OpenSSL's thread pool: OpenSSL's
Argon2 only uses threads if OSSL_set_max_threads() enabled the thread pool
and a "threads" parameter > 1 is given. Passing threads=1 would compute the
4 lanes of our default parallelism=4 sequentially, and unlocking would get
slower than it was with argon2-cffi, which used real threads for the lanes.
The thread count only affects speed, never the derived key (only the lanes
parameter does), so this is fully compatible with existing keys.
Apple M-series (OpenSSL 3.6.3), borg defaults (t=3, m=64 MiB, p=4):
threads=1: 83 ms, threads=4: 29 ms (2.8x faster).
Co-Authored-By: Claude Opus 5 <[email protected]>
- fuse_impl: record the import error of each FUSE implementation that
failed to load. also catch non-ImportError failures: mfusepy raises
OSError at import time if libfuse is missing (and AttributeError /
NotImplementedError in other cases), which previously crashed borg
with a traceback instead of a clean error.
- borg mount: show the recorded errors, so users see the actual cause
(e.g. a missing shared library) instead of just "no FUSE support".
- sysinfo: report mfusepy as the active FUSE implementation (it showed
"fuse: None" although mounting worked) and include the recorded
import errors if no implementation loaded, so debug output pasted
into issues shows why.
- docs: note that third-party binaries might lack FUSE support.
Co-Authored-By: Claude Fable 5 <[email protected]>
This adds a runtime warning when running under MSYS2/Git Bash without the necessary environment variables to disable automatic path translation. The documentation is also updated to explain this behavior and how to mitigate it.
the python package pkgconfig does not need to be "preinstalled"
anymore, because our pyproject.toml cares for that. otoh, the cli tool
pkg-config must be preinstalled so that libs and headers can be found
automagically.
Also be a bit more clear about the FUSE stuff.
Hint for Cygwin users to make sure they use a virtual environment.
Not using a virtual environment will be likely troublesome if there is already a Python installed on Windows.
The "Building a development environment" section links to the
"Using git" section. This can result in developers overseeing
the os dependencies necessity.
re #7356
borg2's new repo format does not need computing crc32 over big amounts of
(content) data any more (we now use xxh64 for that).
thus, having a quick crc32 implementation via libdeflate is not important
enough any more to rectify having libdeflate as a requirement.