Browse Source

Merge pull request #5672 from ThomasWaldmann/rel120b2

Release 1.2.0b2
TW 4 years ago
parent
commit
940768ef2a

+ 1 - 1
AUTHORS

@@ -1,7 +1,7 @@
 E-mail addresses listed here are not intended for support, please see
 the `support section`_ instead.
 
-.. support section: https://borgbackup.readthedocs.io/en/stable/support.html
+.. _support section: https://borgbackup.readthedocs.io/en/stable/support.html
 
 Borg authors ("The Borg Collective")
 ------------------------------------

+ 27 - 5
docs/changes.rst

@@ -214,11 +214,9 @@ The best check that everything is ok is to run a dry-run extraction::
 
 .. _changelog:
 
-Changelog
-=========
 
-Version 1.2.0rc1 (not released yet)
------------------------------------
+Version 1.2.0b2 (2021-02-06)
+----------------------------
 
 Please note:
 
@@ -266,6 +264,8 @@ Compatibility notes:
 
 Fixes:
 
+- create: do not recurse into duplicate roots, #5603
+- create: only print stats if not ctrl-c'ed, fixes traceback, #5668
 - extract:
   improve exception handling when setting xattrs, #5092.
   emit a warning message giving the path, xattr key and error message.
@@ -274,23 +274,45 @@ Fixes:
 - export-tar:
   fix memory leak with ssh: remote repository, #5568.
   fix potential memory leak with ssh: remote repository with partial extraction.
+- remove empty shadowed_segments lists, #5275
+- fix bad default: manifest.archives.list(consider_checkpoints=False),
+  fixes tracebacks / KeyErros for missing objects in ChunkIndex, #5668
 
 New features:
 
+- create: improve sparse file support
+
+  - create --sparse (detect sparse file holes) and file map support,
+    only for the "fixed" chunker, #14
+  - detect all-zero chunks in read data in "buzhash" and "fixed" chunkers
+  - cached_hash: use a small LRU cache to accelerate all-zero chunks hashing
+  - use cached_hash also to generate all-zero replacement chunks
 - create --remote-buffer, add a upload buffer for remote repos, #5574
-- create --sparse, file map support for the "fixed" chunker, #14
 - prune: keep oldest archive when retention target not met
 
 Other changes:
 
+- use blake2 from python 3.6+ hashlib
+  (this removes the requirement for libb2 and the bundled blake2 code)
+- also accept msgpack up to 1.0.2.
+  exclude 1.0.1 though, which had some issues (not sure they affect borg).
 - create: add repository location to --stats output, #5491
 - check: debug log the segment filename
 - delete: add a --list switch to borg delete, #5116
+- borg debug dump-hints - implemented to e.g. to look at shadow_index
+- Tab completion support for additional archives for 'borg delete'
+- refactor: have one borg.constants.zero all-zero bytes object
+- refactor shadow_index updating repo.put/delete, #5661, #5636.
 - docs:
 
   - add another case of attempted hardlink usage
   - fix description of borg upgrade hardlink usage, #5518
   - use HTTPS everywhere
+  - add examples for --paths-from-stdin, --paths-from-command, --paths-separator, #5644
+  - fix typos/grammar
+  - update docs for dev environment installation instructions
+  - recomend running tests only on installed versions for setup
+  - add badge with current status of package
 - vagrant:
 
   - use brew install --cask ..., #5557

+ 7 - 7
docs/faq.rst

@@ -833,7 +833,7 @@ E.g., for this setup:
 - repository is remote (does not matter much for unchanged files)
 - backup job runs while machine is otherwise idle
 
-The observed performance is that |project_name| can process about
+The observed performance is that Borg can process about
 **1 million unchanged files (and a few small changed ones) in 4 minutes!**
 
 If you are seeing much less than that in similar circumstances, read the next
@@ -844,7 +844,7 @@ few FAQ entries below.
 Why is backup slow for me?
 --------------------------
 
-So, if you feel your |project_name| backup is too slow somehow, you should find out why.
+So, if you feel your Borg backup is too slow somehow, you should find out why.
 
 The usual way to approach this is to add ``--list --filter=AME --stats`` to your
 ``borg create`` call to produce more log output, including a file list (with file status
@@ -856,15 +856,15 @@ Then you do the backup and look at the log output:
   In the stats you can see the overall volume of changed data, which needed to be
   added to the repo. If that is a lot, that can be the reason why it is slow.
 - ``A`` status ("added") in the file list:
-  If you see that often, you have a lot of new files (files that |project_name| did not find
+  If you see that often, you have a lot of new files (files that Borg did not find
   in the files cache). If you think there is something wrong with that (the file was there
   already in the previous backup), please read the FAQ entries below.
 - ``M`` status ("modified") in the file list:
-  If you see that often, |project_name| thinks that a lot of your files might be modified
-  (|project_name| found them in the files cache, but the metadata read from the filesystem did
+  If you see that often, Borg thinks that a lot of your files might be modified
+  (Borg found them in the files cache, but the metadata read from the filesystem did
   not match the metadata stored in the files cache).
-  In such a case, |project_name| will need to process the files' contents completely, which is
-  much slower than processing unmodified files (|project_name| does not read their contents!).
+  In such a case, Borg will need to process the files' contents completely, which is
+  much slower than processing unmodified files (Borg does not read their contents!).
   The metadata values used in this comparison are determined by the ``--files-cache`` option
   and could be e.g. size, ctime and inode number (see the ``borg create`` docs for more
   details and potential issues).

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-BENCHMARK-CRUD 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-BENCHMARK-CRUD 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-benchmark-crud \- Benchmark Create, Read, Update, Delete for archives.
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-BENCHMARK 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-BENCHMARK 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-benchmark \- benchmark command
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-BREAK-LOCK 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-BREAK-LOCK 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-break-lock \- Break the repository lock (e.g. in case it was left by a dead borg.
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-CHECK 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-CHECK 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-check \- Check repository consistency
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-COMMON 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-COMMON 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-common \- Common options of Borg commands
 .
@@ -81,6 +81,9 @@ use PATH as borg executable on the remote (default: "borg")
 .BI \-\-remote\-ratelimit \ RATE
 set remote network upload rate limit in kiByte/s (default: 0=unlimited)
 .TP
+.BI \-\-remote\-buffer \ UPLOAD_BUFFER
+set upload buffer size in MiB. (default: 0=no buffer)
+.TP
 .B \-\-consider\-part\-files
 treat part files like normal files (e.g. to list/extract them)
 .TP

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-COMPACT 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-COMPACT 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-compact \- compact segment files in the repository
 .
@@ -48,7 +48,7 @@ Depending on the amount of segments that need compaction, it may take a while,
 so consider using the \fB\-\-progress\fP option.
 .sp
 A segment is compacted if the amount of saved space is above the percentage value
-given by the \fB\-\-threshold\fP option. If ommitted, a threshold of 10% is used.
+given by the \fB\-\-threshold\fP option. If omitted, a threshold of 10% is used.
 When using \fB\-\-verbose\fP, borg will output an estimate of the freed space.
 .sp
 After upgrading borg (server) to 1.2+, you can use \fBborg compact \-\-cleanup\-commits\fP

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-COMPRESSION 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-COMPRESSION 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-compression \- Details regarding compression
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-CONFIG 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-CONFIG 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-config \- get, set, and delete values in a repository or cache config file
 .

+ 19 - 2
docs/man/borg-create.1

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-CREATE 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-CREATE 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-create \- Create new archive
 .
@@ -231,6 +231,9 @@ deprecated, use \fB\-\-noflags\fP instead
 .B \-\-noflags
 do not read and store flags (e.g. NODUMP, IMMUTABLE) into archive
 .TP
+.B \-\-sparse
+detect sparse holes in input (supported only by fixed chunker)
+.TP
 .BI \-\-files\-cache \ MODE
 operate files cache in MODE. default: ctime,size,inode
 .TP
@@ -300,7 +303,10 @@ $ fusermount \-u sshfs\-mount
 $ borg create \-\-chunker\-params buzhash,10,23,16,4095 /path/to/repo::small /smallstuff
 
 # Backup a raw device (must not be active/in use/mounted at that time)
-$ dd if=/dev/sdx bs=4M | borg create \-\-chunker\-params fixed,4194304 /path/to/repo::my\-sdx \-
+$ borg create \-\-read\-special \-\-chunker\-params fixed,4194304 /path/to/repo::my\-sdx /dev/sdX
+
+# Backup a sparse disk image (must not be active/in use/mounted at that time)
+$ borg create \-\-sparse \-\-chunker\-params fixed,4194304 /path/to/repo::my\-disk my\-disk.raw
 
 # No compression (none)
 $ borg create \-\-compression none /path/to/repo::arch ~
@@ -328,6 +334,17 @@ $ borg create /path/to/repo::{hostname}\-{user}\-{now:%Y\-%m\-%dT%H:%M:%S.%f} ~
 $ cd /home/user/Documents
 # The root directory of the archive will be "projectA"
 $ borg create /path/to/repo::daily\-projectA\-{now:%Y\-%m\-%d} projectA
+
+# Use external command to determine files to archive
+# Use \-\-paths\-from\-stdin with find to only backup files less than 1MB in size
+$ find ~ \-size \-1000k | borg create \-\-paths\-from\-stdin /path/to/repo::small\-files\-only
+# Use \-\-paths\-from\-command with find to only backup files from a given user
+$ borg create \-\-paths\-from\-command /path/to/repo::joes\-files \-\- find /srv/samba/shared \-user joe
+# Use \-\-paths\-from\-stdin with \-\-paths\-delimiter (for example, for filenames with newlines in them)
+$ find ~ \-size \-1000k \-print0 | borg create \e
+    \-\-paths\-from\-stdin \e
+    \-\-paths\-delimiter "\e0" \e
+    /path/to/repo::smallfiles\-handle\-newline
 .ft P
 .fi
 .UNINDENT

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-DELETE 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-DELETE 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-delete \- Delete an existing repository or archives
 .
@@ -45,6 +45,8 @@ When you delete a complete repository, the security info and local cache for it
 with the \fB\-\-cache\-only\fP option, or keep the security info with the
 \fB\-\-keep\-security\-info\fP option.
 .sp
+When in doubt, use \fB\-\-dry\-run \-\-list\fP to see what would be deleted.
+.sp
 When using \fB\-\-stats\fP, you will get some statistics about how much data was
 deleted \- the "Deleted data" deduplicated size there is most interesting as
 that is how much your repository will shrink.
@@ -77,6 +79,9 @@ archives to delete
 .B \-n\fP,\fB  \-\-dry\-run
 do not change repository
 .TP
+.B \-\-list
+output verbose list of archives
+.TP
 .B \-s\fP,\fB  \-\-stats
 print statistics for the deleted archive
 .TP
@@ -128,7 +133,7 @@ $ borg delete \-\-prefix \(aq{hostname}\-\(aq /path/to/repo
 $ borg delete \-\-glob\-archives \(aq*\-2012\-*\(aq /path/to/repo
 
 # see what would be deleted if delete was run without \-\-dry\-run
-$ borg delete \-v \-\-dry\-run \-a \(aq*\-May\-*\(aq /path/to/repo
+$ borg delete \-\-list \-\-dry\-run \-a \(aq*\-May\-*\(aq /path/to/repo
 
 # delete the whole repository and the related local cache:
 $ borg delete /path/to/repo

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-DIFF 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-DIFF 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-diff \- Diff contents of two archives
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-EXPORT-TAR 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-EXPORT-TAR 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-export-tar \- Export archive contents as a tarball
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-EXTRACT 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-EXTRACT 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-extract \- Extract archive contents
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-INFO 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-INFO 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-info \- Show archive details such as disk space used
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-INIT 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-INIT 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-init \- Initialize an empty repository
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-KEY-CHANGE-PASSPHRASE 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-KEY-CHANGE-PASSPHRASE 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-key-change-passphrase \- Change repository key file passphrase
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-KEY-EXPORT 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-KEY-EXPORT 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-key-export \- Export the repository key for backup
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-KEY-IMPORT 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-KEY-IMPORT 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-key-import \- Import the repository key from backup
 .

+ 1 - 1
docs/man/borg-key-migrate-to-repokey.1

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-KEY-MIGRATE-TO-REPOKEY 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-KEY-MIGRATE-TO-REPOKEY 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-key-migrate-to-repokey \- Migrate passphrase -> repokey
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-KEY 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-KEY 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-key \- Manage a keyfile or repokey of a repository
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-LIST 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-LIST 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-list \- List archive or repository contents
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-MOUNT 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-MOUNT 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-mount \- Mount archive or an entire repository as a FUSE filesystem
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-PATTERNS 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-PATTERNS 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-patterns \- Details regarding patterns
 .
@@ -193,7 +193,7 @@ with the prefix \-, an exclude\-norecurse rule starts with !, all followed by a
 .INDENT 3.5
 Via \fB\-\-pattern\fP or \fB\-\-patterns\-from\fP you can define BOTH inclusion and exclusion
 of files using pattern prefixes \fB+\fP and \fB\-\fP\&. With \fB\-\-exclude\fP and
-\fB\-\-exlude\-from\fP ONLY excludes are defined.
+\fB\-\-exclude\-from\fP ONLY excludes are defined.
 .UNINDENT
 .UNINDENT
 .sp

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-PLACEHOLDERS 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-PLACEHOLDERS 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-placeholders \- Details regarding placeholders
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-PRUNE 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-PRUNE 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-prune \- Prune repository archives according to specified rules
 .
@@ -72,7 +72,11 @@ The rules are applied from secondly to yearly, and backups selected by previous
 rules do not count towards those of later rules. The time that each backup
 starts is used for pruning purposes. Dates and times are interpreted in
 the local timezone, and weeks go from Monday to Sunday. Specifying a
-negative number of archives to keep means that there is no limit.
+negative number of archives to keep means that there is no limit. As of borg
+1.2.0, borg will retain the oldest archive if any of the secondly, minutely,
+hourly, daily, weekly, monthly, or yearly rules was not otherwise able to meet
+its retention target. This enables the first chronological archive to continue
+aging until it is replaced by a newer archive that meets the retention criteria.
 .sp
 The \fB\-\-keep\-last N\fP option is doing the same as \fB\-\-keep\-secondly N\fP (and it will
 keep the last N archives under the assumption that you do not create more than one

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-RECREATE 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-RECREATE 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-recreate \- Re-create archives
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-RENAME 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-RENAME 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-rename \- Rename an existing archive
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-SERVE 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-SERVE 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-serve \- Start in server mode. This command is usually not used manually.
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-UMOUNT 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-UMOUNT 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-umount \- un-mount the FUSE filesystem
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-UPGRADE 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-UPGRADE 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-upgrade \- upgrade a repository from a previous version
 .

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

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG-WITH-LOCK 1 "2020-12-06" "" "borg backup tool"
+.TH BORG-WITH-LOCK 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg-with-lock \- run a user specified command with the repository lock held
 .

+ 5 - 3
docs/man/borg.1

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORG 1 "2020-12-06" "" "borg backup tool"
+.TH BORG 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borg \- deduplicating and encrypting backup tool
 .
@@ -205,7 +205,7 @@ borg create repo::archive \-s \-\-progress path  # BAD
 .UNINDENT
 .UNINDENT
 .sp
-This is due to a problem in the argparse module: \fI\%http://bugs.python.org/issue15112\fP
+This is due to a problem in the argparse module: \fI\%https://bugs.python.org/issue15112\fP
 .SS Repository URLs
 .sp
 \fBLocal filesystem\fP (or locally mounted network filesystem):
@@ -609,7 +609,9 @@ it should be a move (not a copy) operation, and in case of a directory
 it should fail if the destination exists and is not an empty directory,
 since this is used for locking.
 .IP \(bu 2
-Hardlinks are needed for \fIborg_upgrade\fP \fB\-\-inplace\fP
+Hardlinks are needed for \fIborg_upgrade\fP (if \fB\-\-inplace\fP option is not used).
+Also hardlinks are used for more safe and secure file updating (e.g. of the repo
+config file), but the code tries to work also if hardlinks are not supported.
 .UNINDENT
 .SS Units
 .sp

+ 1 - 1
docs/man/borgfs.1

@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH BORGFS 1 "2020-12-06" "" "borg backup tool"
+.TH BORGFS 1 "2021-02-06" "" "borg backup tool"
 .SH NAME
 borgfs \- Mount archive or an entire repository as a FUSE filesystem
 .

+ 1 - 1
docs/usage/common-options.rst.inc

@@ -14,7 +14,7 @@
 --umask M          set umask to M (local only, default: 0077)
 --remote-path PATH    use PATH as borg executable on the remote (default: "borg")
 --remote-ratelimit RATE    set remote network upload rate limit in kiByte/s (default: 0=unlimited)
---remote-buffer UPLOAD_BUFFER   set upload buffer size in MiB. (default: 0=no buffer)
+--remote-buffer UPLOAD_BUFFER    set upload buffer size in MiB. (default: 0=no buffer)
 --consider-part-files    treat part files like normal files (e.g. to list/extract them)
 --debug-profile FILE    Write execution profile in Borg format into FILE. For local use a Python-compatible file can be generated by suffixing FILE with ".pyprof".
 --rsh RSH          Use this command to connect to the 'borg serve' process (default: 'ssh')

+ 1 - 1
docs/usage/compact.rst.inc

@@ -66,7 +66,7 @@ Depending on the amount of segments that need compaction, it may take a while,
 so consider using the ``--progress`` option.
 
 A segment is compacted if the amount of saved space is above the percentage value
-given by the ``--threshold`` option. If ommitted, a threshold of 10% is used.
+given by the ``--threshold`` option. If omitted, a threshold of 10% is used.
 When using ``--verbose``, borg will output an estimate of the freed space.
 
 After upgrading borg (server) to 1.2+, you can use ``borg compact --cleanup-commits``

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

@@ -89,6 +89,8 @@ borg create
     +-------------------------------------------------------+---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
     |                                                       | ``--noflags``                                     | do not read and store flags (e.g. NODUMP, IMMUTABLE) into archive                                                                                    |
     +-------------------------------------------------------+---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
+    |                                                       | ``--sparse``                                      | detect sparse holes in input (supported only by fixed chunker)                                                                                       |
+    +-------------------------------------------------------+---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
     |                                                       | ``--files-cache MODE``                            | operate files cache in MODE. default: ctime,size,inode                                                                                               |
     +-------------------------------------------------------+---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
     |                                                       | ``--read-special``                                | open and read block and char device files as well as FIFOs as if they were regular files. Also follows symlinks pointing to these kinds of files.    |
@@ -162,6 +164,7 @@ borg create
         --nobirthtime             do not store birthtime (creation date) into archive
         --nobsdflags              deprecated, use ``--noflags`` instead
         --noflags                 do not read and store flags (e.g. NODUMP, IMMUTABLE) into archive
+        --sparse                  detect sparse holes in input (supported only by fixed chunker)
         --files-cache MODE        operate files cache in MODE. default: ctime,size,inode
         --read-special            open and read block and char device files as well as FIFOs as if they were regular files. Also follows symlinks pointing to these kinds of files.
 

+ 5 - 0
docs/usage/delete.rst.inc

@@ -23,6 +23,8 @@ borg delete
     +-----------------------------------------------------------------------------+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
     |                                                                             | ``-n``, ``--dry-run``                 | do not change repository                                                                                                                               |
     +-----------------------------------------------------------------------------+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
+    |                                                                             | ``--list``                            | output verbose list of archives                                                                                                                        |
+    +-----------------------------------------------------------------------------+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
     |                                                                             | ``-s``, ``--stats``                   | print statistics for the deleted archive                                                                                                               |
     +-----------------------------------------------------------------------------+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
     |                                                                             | ``--cache-only``                      | delete only the local cache for the given repository                                                                                                   |
@@ -68,6 +70,7 @@ borg delete
 
     optional arguments
         -n, --dry-run    do not change repository
+        --list          output verbose list of archives
         -s, --stats     print statistics for the deleted archive
         --cache-only    delete only the local cache for the given repository
         --force         force deletion of corrupted archives, use ``--force --force`` in case ``--force`` does not work.
@@ -99,6 +102,8 @@ When you delete a complete repository, the security info and local cache for it
 with the ``--cache-only`` option, or keep the security info with the
 ``--keep-security-info`` option.
 
+When in doubt, use ``--dry-run --list`` to see what would be deleted.
+
 When using ``--stats``, you will get some statistics about how much data was
 deleted - the "Deleted data" deduplicated size there is most interesting as
 that is how much your repository will shrink.

+ 1 - 1
docs/usage/help.rst.inc

@@ -156,7 +156,7 @@ Examples::
 
         Via ``--pattern`` or ``--patterns-from`` you can define BOTH inclusion and exclusion
         of files using pattern prefixes ``+`` and ``-``. With ``--exclude`` and
-        ``--exlude-from`` ONLY excludes are defined.
+        ``--exclude-from`` ONLY excludes are defined.
 
     Inclusion patterns are useful to include paths that are contained in an excluded
     path. The first matching pattern is used so if an include pattern matches before

+ 5 - 1
docs/usage/prune.rst.inc

@@ -134,7 +134,11 @@ The rules are applied from secondly to yearly, and backups selected by previous
 rules do not count towards those of later rules. The time that each backup
 starts is used for pruning purposes. Dates and times are interpreted in
 the local timezone, and weeks go from Monday to Sunday. Specifying a
-negative number of archives to keep means that there is no limit.
+negative number of archives to keep means that there is no limit. As of borg
+1.2.0, borg will retain the oldest archive if any of the secondly, minutely,
+hourly, daily, weekly, monthly, or yearly rules was not otherwise able to meet
+its retention target. This enables the first chronological archive to continue
+aging until it is replaced by a newer archive that meets the retention criteria.
 
 The ``--keep-last N`` option is doing the same as ``--keep-secondly N`` (and it will
 keep the last N archives under the assumption that you do not create more than one

+ 1 - 1
src/borg/testsuite/archiver.py

@@ -463,7 +463,7 @@ class ArchiverTestCase(ArchiverTestCaseBase):
         archive_list = self.cmd('list', '--json-lines', self.repository_location + '::test')
         paths = [json.loads(line)['path'] for line in archive_list.split('\n') if line]
         # we have all fs items exactly once!
-        assert paths == ['input', 'input/a', 'input/a/hardlink', 'input/b', 'input/b/hardlink']
+        assert sorted(paths) == ['input', 'input/a', 'input/a/hardlink', 'input/b', 'input/b/hardlink']
 
     def test_init_parent_dirs(self):
         parent_path = os.path.join(self.tmpdir, 'parent1', 'parent2')