Sfoglia il codice sorgente

Merge pull request #8931 from ThomasWaldmann/rel200b18

Release 2.0.0b18
TW 1 settimana fa
parent
commit
515019846f
49 ha cambiato i file con 128 aggiunte e 79 eliminazioni
  1. 5 5
      Vagrantfile
  2. 39 13
      docs/changes.rst
  3. 1 1
      docs/man/borg-analyze.1
  4. 1 1
      docs/man/borg-benchmark-cpu.1
  5. 1 1
      docs/man/borg-benchmark-crud.1
  6. 1 1
      docs/man/borg-benchmark.1
  7. 1 1
      docs/man/borg-break-lock.1
  8. 1 1
      docs/man/borg-check.1
  9. 1 1
      docs/man/borg-common.1
  10. 1 1
      docs/man/borg-compact.1
  11. 1 1
      docs/man/borg-compression.1
  12. 1 4
      docs/man/borg-create.1
  13. 1 1
      docs/man/borg-delete.1
  14. 1 1
      docs/man/borg-diff.1
  15. 1 1
      docs/man/borg-export-tar.1
  16. 1 1
      docs/man/borg-extract.1
  17. 1 1
      docs/man/borg-import-tar.1
  18. 1 1
      docs/man/borg-info.1
  19. 1 1
      docs/man/borg-key-change-location.1
  20. 1 1
      docs/man/borg-key-change-passphrase.1
  21. 1 1
      docs/man/borg-key-export.1
  22. 1 1
      docs/man/borg-key-import.1
  23. 1 1
      docs/man/borg-key.1
  24. 1 1
      docs/man/borg-list.1
  25. 1 1
      docs/man/borg-match-archives.1
  26. 1 1
      docs/man/borg-mount.1
  27. 1 1
      docs/man/borg-patterns.1
  28. 1 1
      docs/man/borg-placeholders.1
  29. 1 1
      docs/man/borg-prune.1
  30. 1 1
      docs/man/borg-recreate.1
  31. 1 1
      docs/man/borg-rename.1
  32. 1 1
      docs/man/borg-repo-compress.1
  33. 1 1
      docs/man/borg-repo-create.1
  34. 1 1
      docs/man/borg-repo-delete.1
  35. 1 1
      docs/man/borg-repo-info.1
  36. 1 1
      docs/man/borg-repo-list.1
  37. 1 1
      docs/man/borg-repo-space.1
  38. 30 5
      docs/man/borg-serve.1
  39. 1 1
      docs/man/borg-tag.1
  40. 1 1
      docs/man/borg-transfer.1
  41. 1 1
      docs/man/borg-umount.1
  42. 1 1
      docs/man/borg-undelete.1
  43. 1 1
      docs/man/borg-version.1
  44. 1 1
      docs/man/borg-with-lock.1
  45. 4 1
      docs/man/borg.1
  46. 1 1
      docs/man/borgfs.1
  47. 0 3
      docs/usage/create.rst.inc
  48. 6 6
      requirements.d/development.lock.txt
  49. 2 1
      scripts/borg.exe.spec

+ 5 - 5
Vagrantfile

@@ -213,7 +213,7 @@ def install_pythons(boxname)
   return <<-EOF
     . ~/.bash_profile
     echo "PYTHON_CONFIGURE_OPTS: ${PYTHON_CONFIGURE_OPTS}"
-    pyenv install 3.12.10
+    pyenv install 3.12.11
     pyenv rehash
   EOF
 end
@@ -231,8 +231,8 @@ def build_pyenv_venv(boxname)
     . ~/.bash_profile
     cd /vagrant/borg
     # use the latest 3.12 release
-    pyenv global 3.12.10
-    pyenv virtualenv 3.12.10 borg-env
+    pyenv global 3.12.11
+    pyenv virtualenv 3.12.11 borg-env
     ln -s ~/.pyenv/versions/borg-env .
   EOF
 end
@@ -281,8 +281,8 @@ def run_tests(boxname, skip_env)
     . ../borg-env/bin/activate
     if which pyenv 2> /dev/null; then
       # for testing, use the earliest point releases of the supported python versions:
-      pyenv global 3.12.10
-      pyenv local 3.12.10
+      pyenv global 3.12.11
+      pyenv local 3.12.11
     fi
     # otherwise: just use the system python
     # some OSes can only run specific test envs, e.g. because they miss FUSE support:

+ 39 - 13
docs/changes.rst

@@ -144,8 +144,8 @@ Compatibility notes:
 Change Log 2.x
 ==============
 
-Version 2.0.0b18 (not released yet)
------------------------------------
+Version 2.0.0b18 (2025-06-19)
+-----------------------------
 
 Please note:
 
@@ -156,7 +156,29 @@ above.
 
 New features:
 
-- new "buzhash64" chunker, init bh table using a 256bit key derived from ID key
+- experimental new "buzhash64" chunker (later, after testing, this shall become
+  the default chunker in borg2):
+
+  - add own cryptographically secure pseudo-random number generator (CSPRNG)
+    based on AES256-CTR to create deterministic random, based on a 256bit seed.
+  - use that to deterministically create a perfectly balanced buzhash64 table.
+  - "buzhash64" chunker computes 64bit hash values for the chunking decision.
+  - performance is similar to "buzhash" (measured on Apple M3P cpu).
+
+  That should also resolve these points of criticism about the old "buzhash"
+  32bit code:
+
+  - table_base: that the bits are not randomly distributed enough
+  - that an XORed seed cancels out for specific window sizes
+  - that XORing the table with a seed is equivalent to XORing the computed hash
+    value with another constant
+
+  Please test the chunkers extensively (e.g. with borg create, borg transfer),
+  we can hardly change them "in production", because chunking differently also
+  means not deduplicating with old chunks. So, in case there are changes
+  needed, we need to find and fix them now while borg is in beta.
+
+  See also some other chunker changes listed below "Other changes".
 - serve: add --permissions option as an alternative to BORG_REPO_PERMISSIONS env var
 - create: auto-exclude items based on xattrs or NODUMP, see #4972
 
@@ -165,15 +187,16 @@ New features:
 
   also: create: read stat attrs, xattrs, ACLs early, before file contents.
 
+Fixes:
+
+- compact: fix cleaning archives directory (catch correct exception, use
+  logger.warning, improve error msg)
+
 Other changes:
 
 - support Python 3.14
-- msgpack: allow 1.1.1
-- msgpack version check: ignore "rc" or other version elements
+- msgpack: allow 1.1.1, version check: ignore "rc" or other version elements
 - add derive_key to derive new keys from existing key material
-- fish: fix archive name completion
-- refactor: modularize tests
-- refactor: use pathlib.Path
 - refactor the chunkers, #8882 #8883:
 
   - transform buzhash chunker C code to Cython
@@ -183,12 +206,15 @@ Other changes:
       files and fmaps.
     - FileReader uses FileFMAPReader to fill its buffer and offers clients a
       `.read(size)` method so they can read pieces of the data.
-    - both chunkers now use the FileReader/FileFMAPReader code
+    - all chunkers now use the FileReader/FileFMAPReader code
   - split code and test module into packages
-- ChunkerFixed: add fixed chunker tests to selftest
-- ChunkerFixed: do not assert on short header read
-- Chunker: use safe_fadvise
-- ChunkerParams: reject even window size for buzhash, #8868
+- "fixed" chunker: add fixed chunker tests to selftest
+- "fixed" chunker: do not assert on short header read
+- "buzhash*" chunker: use safe_fadvise
+- "buzhash" chunker: reject even window size, #8868
+- fish: fix archive name completion
+- refactor: modularize tests
+- refactor: use pathlib.Path
 - tests / CI:
 
   - CI: add bandit, a security-oriented static analysis tool

+ 1 - 1
docs/man/borg-analyze.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-ANALYZE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-ANALYZE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-analyze \- Analyze archives
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-benchmark-cpu.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-BENCHMARK-CPU" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-BENCHMARK-CPU" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-benchmark-cpu \- Benchmark CPU bound operations.
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-benchmark-crud.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-BENCHMARK-CRUD" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-BENCHMARK-CRUD" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-benchmark-crud \- Benchmark Create, Read, Update, Delete for archives.
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-benchmark.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-BENCHMARK" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-BENCHMARK" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-benchmark \- benchmark command
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-break-lock.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-BREAK-LOCK" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-BREAK-LOCK" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-break-lock \- Break the repository lock (e.g. in case it was left by a dead borg.
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-check.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-CHECK" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-CHECK" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-check \- Check repository consistency
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-common.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-COMMON" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-COMMON" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-common \- Common options of Borg commands
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-compact.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-COMPACT" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-COMPACT" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-compact \- Collect garbage in repository
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-compression.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-COMPRESSION" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-COMPRESSION" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-compression \- Details regarding compression
 .SH DESCRIPTION

+ 1 - 4
docs/man/borg-create.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-CREATE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-CREATE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-create \- Create new archive
 .SH SYNOPSIS
@@ -202,9 +202,6 @@ exclude directories that are tagged by containing a filesystem object with the g
 .TP
 .B  \-\-keep\-exclude\-tags
 if tag objects are specified with \fB\-\-exclude\-if\-present\fP, don\(aqt omit the tag objects themselves from the backup archive
-.TP
-.B  \-\-exclude\-nodump
-exclude files flagged NODUMP
 .UNINDENT
 .SS Filesystem options
 .INDENT 0.0

+ 1 - 1
docs/man/borg-delete.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-DELETE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-DELETE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-delete \- Delete archives
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-diff.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-DIFF" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-DIFF" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-diff \- Diff contents of two archives
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-export-tar.1

@@ -28,7 +28,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-EXPORT-TAR" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-EXPORT-TAR" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-export-tar \- Export archive contents as a tarball
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-extract.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-EXTRACT" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-EXTRACT" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-extract \- Extract archive contents
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-import-tar.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-IMPORT-TAR" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-IMPORT-TAR" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-import-tar \- Create a backup archive from a tarball
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-info.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-INFO" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-INFO" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-info \- Show archive details such as disk space used
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-key-change-location.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-KEY-CHANGE-LOCATION" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-KEY-CHANGE-LOCATION" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-key-change-location \- Change repository key location
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-key-change-passphrase.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-KEY-CHANGE-PASSPHRASE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-KEY-CHANGE-PASSPHRASE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-key-change-passphrase \- Change repository key file passphrase
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-key-export.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-KEY-EXPORT" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-KEY-EXPORT" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-key-export \- Export the repository key for backup
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-key-import.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-KEY-IMPORT" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-KEY-IMPORT" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-key-import \- Import the repository key from backup
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-key.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-KEY" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-KEY" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-key \- Manage a keyfile or repokey of a repository
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-list.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-LIST" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-LIST" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-list \- List archive contents
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-match-archives.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-MATCH-ARCHIVES" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-MATCH-ARCHIVES" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-match-archives \- Details regarding match-archives
 .SH DESCRIPTION

+ 1 - 1
docs/man/borg-mount.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-MOUNT" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-MOUNT" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-mount \- Mount archive or an entire repository as a FUSE filesystem
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-patterns.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-PATTERNS" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-PATTERNS" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-patterns \- Details regarding patterns
 .SH DESCRIPTION

+ 1 - 1
docs/man/borg-placeholders.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-PLACEHOLDERS" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-PLACEHOLDERS" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-placeholders \- Details regarding placeholders
 .SH DESCRIPTION

+ 1 - 1
docs/man/borg-prune.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-PRUNE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-PRUNE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-prune \- Prune repository archives according to specified rules
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-recreate.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-RECREATE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-RECREATE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-recreate \- Re-create archives
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-rename.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-RENAME" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-RENAME" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-rename \- Rename an existing archive
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-repo-compress.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-REPO-COMPRESS" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-REPO-COMPRESS" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-repo-compress \- Repository (re-)compression
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-repo-create.1

@@ -28,7 +28,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-REPO-CREATE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-REPO-CREATE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-repo-create \- Create a new, empty repository
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-repo-delete.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-REPO-DELETE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-REPO-DELETE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-repo-delete \- Delete a repository
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-repo-info.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-REPO-INFO" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-REPO-INFO" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-repo-info \- Show repository infos
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-repo-list.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-REPO-LIST" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-REPO-LIST" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-repo-list \- List the archives contained in a repository
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-repo-space.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-REPO-SPACE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-REPO-SPACE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-repo-space \- Manage reserved space in repository
 .SH SYNOPSIS

+ 30 - 5
docs/man/borg-serve.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-SERVE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-SERVE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-serve \- Start in server mode. This command is usually not used manually.
 .SH SYNOPSIS
@@ -52,6 +52,23 @@ option if you do not want to use the default path for the socket and pid file).
 Please note that \fIborg serve\fP does not support giving a specific repository via the
 \fI\-\-repo\fP option or \fIBORG_REPO\fP environment variable. It is always the borg client which
 specifies the repo to use when talking to \fIborg serve\fP\&.
+.sp
+The \-\-permissions option allows enforcing repository permissions:
+.INDENT 0.0
+.IP \(bu 2
+\fIall\fP: All permissions are granted (default, permissions system is not used)
+.IP \(bu 2
+\fIno\-delete\fP: Allow reading and writing, disallow deleting and overwriting data.
+New archives can be created, existing archives can not be deleted. New chunks can
+be added, existing chunks can not be deleted or overwritten.
+.IP \(bu 2
+\fIwrite\-only\fP: Allow writing, disallow reading data.
+New archives can be created, existing archives can not be read.
+New chunks can be added, existing chunks can not be read, deleted or overwritten.
+.IP \(bu 2
+\fIread\-only\fP: Allow reading, disallow writing or deleting data.
+Existing archives can be read, but no archives can be created or deleted.
+.UNINDENT
 .SH OPTIONS
 .sp
 See \fIborg\-common(1)\fP for common options of Borg commands.
@@ -63,6 +80,9 @@ restrict repository access to PATH. Can be specified multiple times to allow the
 .TP
 .BI \-\-restrict\-to\-repository \ PATH
 restrict repository access. Only the repository located at PATH (no sub\-directories are considered) is accessible. Can be specified multiple times to allow the client access to several repositories. Unlike \fB\-\-restrict\-to\-path\fP sub\-directories are not accessible; PATH needs to point directly at a repository location. PATH may be an empty directory or the last element of PATH may not exist, in which case the client may initialize a repository there.
+.TP
+.B  \-\-permissions
+Set repository permission mode. Overrides BORG_REPO_PERMISSIONS environment variable.
 .UNINDENT
 .SH EXAMPLES
 .sp
@@ -94,9 +114,13 @@ locations like \fB/etc/environment\fP or in the forced command itself (example b
 $ cat ~/.ssh/authorized_keys
 command=\(dqborg serve \-\-restrict\-to\-path /path/to/repo\(dq,restrict ssh\-rsa AAAAB3[...]
 
+# Specify repository permissions for an SSH keypair.
+$ cat ~/.ssh/authorized_keys
+command=\(dqborg serve \-\-permissions=read\-only\(dq,restrict ssh\-rsa AAAAB3[...]
+
 # Set a BORG_XXX environment variable on the \(dqborg serve\(dq side
 $ cat ~/.ssh/authorized_keys
-command=\(dqexport BORG_XXX=value; borg serve [...]\(dq,restrict ssh\-rsa [...]
+command=\(dqBORG_XXX=value borg serve [...]\(dq,restrict ssh\-rsa [...]
 .EE
 .UNINDENT
 .UNINDENT
@@ -104,9 +128,10 @@ command=\(dqexport BORG_XXX=value; borg serve [...]\(dq,restrict ssh\-rsa [...]
 \fBNOTE:\fP
 .INDENT 0.0
 .INDENT 3.5
-The examples above use the \fBrestrict\fP directive. This does automatically
-block potential dangerous ssh features, even when they are added in a future
-update. Thus, this option should be preferred.
+The examples above use the \fBrestrict\fP directive and assume a POSIX
+compliant shell set as the user\(aqs login shell.
+This does automatically block potential dangerous ssh features, even when
+they are added in a future update. Thus, this option should be preferred.
 .sp
 If you\(aqre using openssh\-server < 7.2, however, you have to specify explicitly
 the ssh features to restrict and cannot simply use the restrict option as it

+ 1 - 1
docs/man/borg-tag.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-TAG" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-TAG" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-tag \- Manage tags
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-transfer.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-TRANSFER" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-TRANSFER" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-transfer \- archives transfer from other repository, optionally upgrade data format
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-umount.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-UMOUNT" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-UMOUNT" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-umount \- un-mount the FUSE filesystem
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-undelete.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-UNDELETE" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-UNDELETE" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-undelete \- Undelete archives
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-version.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-VERSION" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-VERSION" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-version \- Display the borg client / borg server version
 .SH SYNOPSIS

+ 1 - 1
docs/man/borg-with-lock.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG-WITH-LOCK" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG-WITH-LOCK" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg-with-lock \- run a user specified command with the repository lock held
 .SH SYNOPSIS

+ 4 - 1
docs/man/borg.1

@@ -28,7 +28,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORG" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORG" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borg \- deduplicating and encrypting backup tool
 .SH SYNOPSIS
@@ -448,6 +448,9 @@ the \fB\-\-rsh CMD\fP commandline option overrides the environment variable.
 When set, use the given path as borg executable on the remote (defaults to \(dqborg\(dq if unset).
 Using \fB\-\-remote\-path PATH\fP commandline option overrides the environment variable.
 .TP
+.B BORG_REPO_PERMISSIONS
+Set repository permissions, see also: \fIborg_serve\fP
+.TP
 .B BORG_FILES_CACHE_SUFFIX
 When set to a value at least one character long, instructs borg to use a specifically named
 (based on the suffix) alternative files cache. This can be used to avoid loading and saving

+ 1 - 1
docs/man/borgfs.1

@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "BORGFS" "1" "2025-05-22" "" "borg backup tool"
+.TH "BORGFS" "1" "2025-06-18" "" "borg backup tool"
 .SH NAME
 borgfs \- Mount archive or an entire repository as a FUSE filesystem
 .SH SYNOPSIS

+ 0 - 3
docs/usage/create.rst.inc

@@ -67,8 +67,6 @@ borg create
     +-------------------------------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
     |                                                       | ``--keep-exclude-tags``                           | if tag objects are specified with ``--exclude-if-present``, don't omit the tag objects themselves from the backup archive                                                                         |
     +-------------------------------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-    |                                                       | ``--exclude-nodump``                              | exclude files flagged NODUMP                                                                                                                                                                      |
-    +-------------------------------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
     | **Filesystem options**                                                                                                                                                                                                                                                                                        |
     +-------------------------------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
     |                                                       | ``-x``, ``--one-file-system``                     | stay in the same file system and do not store mount points of other file systems - this might behave different from your expectations, see the description below.                                 |
@@ -147,7 +145,6 @@ borg create
         --exclude-caches                  exclude directories that contain a CACHEDIR.TAG file (http://www.bford.info/cachedir/spec.html)
         --exclude-if-present NAME         exclude directories that are tagged by containing a filesystem object with the given NAME
         --keep-exclude-tags               if tag objects are specified with ``--exclude-if-present``, don't omit the tag objects themselves from the backup archive
-        --exclude-nodump                  exclude files flagged NODUMP
 
 
     Filesystem options

+ 6 - 6
requirements.d/development.lock.txt

@@ -1,12 +1,12 @@
 setuptools==78.1.1
-setuptools-scm==8.2.0
-pip==25.0.1
+setuptools-scm==8.3.1
+pip==25.1.1
 wheel==0.45.1
-virtualenv==20.30.0
-build==1.2.2
+virtualenv==20.31.2
+build==1.2.2.post1
 pkgconfig==1.5.5
-tox==4.26.0
-pytest==8.4.0
+tox==4.27.0
+pytest==8.4.1
 pytest-xdist==3.7.0
 coverage[toml]==7.9.1
 pytest-cov==6.2.1

+ 2 - 1
scripts/borg.exe.spec

@@ -12,7 +12,7 @@ basepath = os.path.abspath(os.path.join(here, '..'))
 if is_win32:
     hiddenimports = ['borghash']
 else:
-    hiddenimports = ['borg.platform.posix', 'pkg_resources.py2_warn', 'borghash']
+    hiddenimports = ['borg.platform.posix', 'borghash']
 
 block_cipher = None
 
@@ -27,6 +27,7 @@ a = Analysis([os.path.join(basepath, 'src', 'borg', '__main__.py'), ],
              runtime_hooks=[],
              excludes=[
                 '_ssl', 'ssl',
+                'pkg_resources',  # avoid pkg_resources related warnings
              ],
              win_no_prefer_redirects=False,
              win_private_assemblies=False,