Hello community,

here is the log from the commit of package borgmatic for openSUSE:Factory 
checked in at 2020-08-31 16:52:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/borgmatic (Old)
 and      /work/SRC/openSUSE:Factory/.borgmatic.new.3399 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "borgmatic"

Mon Aug 31 16:52:54 2020 rev:24 rq:830717 version:1.5.10

Changes:
--------
--- /work/SRC/openSUSE:Factory/borgmatic/borgmatic.changes      2020-07-28 
17:29:23.762180962 +0200
+++ /work/SRC/openSUSE:Factory/.borgmatic.new.3399/borgmatic.changes    
2020-08-31 16:53:14.188441291 +0200
@@ -1,0 +2,16 @@
+Mon Aug 31 09:35:40 UTC 2020 - Antonio Larrosa <[email protected]>
+
+- Update to 1.5.10
+  * #347: Add hooks that run for the "extract" action:
+    "before_extract" and "after_extract".
+  * #350: Fix traceback when a configuration directory is
+    non-readable due to directory permissions.
+  * Add documentation navigation links on left side of all
+    documentation pages.
+  * Clarify documentation on configuration overrides, specifically
+    the portion about list syntax:
+    
http://torsion.org/borgmatic/docs/how-to/make-per-application-backups/#configuration-overrides
+  * Clarify documentation overview of monitoring options:
+    http://torsion.org/borgmatic/docs/how-to/monitor-your-backups/
+
+-------------------------------------------------------------------
@@ -5,4 +21,4 @@
-* #300: Add “borgmatic export-tar” action to export an archive to a
-  tar-formatted file or stream.
-* #339: Fix for intermittent timing-related test failure of logging
-  function.
+  * #300: Add “borgmatic export-tar” action to export an archive to
+    a tar-formatted file or stream.
+  * #339: Fix for intermittent timing-related test failure of
+    logging function.
@@ -10,2 +26 @@
-  character/block devices to prevent
-  hangs.
+    character/block devices to prevent hangs.

Old:
----
  borgmatic-1.5.9.tar.gz

New:
----
  borgmatic-1.5.10.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ borgmatic.spec ++++++
--- /var/tmp/diff_new_pack.jusBsI/_old  2020-08-31 16:53:15.036441702 +0200
+++ /var/tmp/diff_new_pack.jusBsI/_new  2020-08-31 16:53:15.044441706 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           borgmatic
-Version:        1.5.9
+Version:        1.5.10
 Release:        0
 Summary:        Automation tool for borgbackup
 License:        GPL-3.0-only

++++++ borgmatic-1.5.9.tar.gz -> borgmatic-1.5.10.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/.eleventy.js 
new/borgmatic-1.5.10/.eleventy.js
--- old/borgmatic-1.5.9/.eleventy.js    2020-07-23 06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/.eleventy.js   2020-08-21 23:27:47.000000000 +0200
@@ -1,9 +1,11 @@
 const pluginSyntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight");
 const inclusiveLangPlugin = 
require("@11ty/eleventy-plugin-inclusive-language");
+const navigationPlugin = require("@11ty/eleventy-navigation");
 
 module.exports = function(eleventyConfig) {
     eleventyConfig.addPlugin(pluginSyntaxHighlight);
     eleventyConfig.addPlugin(inclusiveLangPlugin);
+    eleventyConfig.addPlugin(navigationPlugin);
 
     let markdownIt = require("markdown-it");
     let markdownItAnchor = require("markdown-it-anchor");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/NEWS new/borgmatic-1.5.10/NEWS
--- old/borgmatic-1.5.9/NEWS    2020-07-23 06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/NEWS   2020-08-21 23:27:47.000000000 +0200
@@ -1,3 +1,12 @@
+1.5.10
+ * #347: Add hooks that run for the "extract" action: "before_extract" and 
"after_extract".
+ * #350: Fix traceback when a configuration directory is non-readable due to 
directory permissions.
+ * Add documentation navigation links on left side of all documentation pages.
+ * Clarify documentation on configuration overrides, specifically the portion 
about list syntax:
+   
http://torsion.org/borgmatic/docs/how-to/make-per-application-backups/#configuration-overrides
+ * Clarify documentation overview of monitoring options:
+   http://torsion.org/borgmatic/docs/how-to/monitor-your-backups/
+
 1.5.9
  * #300: Add "borgmatic export-tar" action to export an archive to a 
tar-formatted file or stream.
  * #339: Fix for intermittent timing-related test failure of logging function.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/README.md 
new/borgmatic-1.5.10/README.md
--- old/borgmatic-1.5.9/README.md       2020-07-23 06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/README.md      2020-08-21 23:27:47.000000000 +0200
@@ -22,8 +22,8 @@
 
     # Paths of local or remote repositories to backup to.
     repositories:
-        - [email protected]:backups.borg
         - [email protected]:repo
+        - [email protected]:backups.borg
         - /var/lib/backups/local.borg
 
 retention:
@@ -66,31 +66,19 @@
 <a href="https://healthchecks.io/";><img src="docs/static/healthchecks.png" 
alt="Healthchecks" height="60px" 
style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://cronitor.io/";><img src="docs/static/cronitor.png" 
alt="Cronitor" height="60px" 
style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://cronhub.io/";><img src="docs/static/cronhub.png" alt="Cronhub" 
height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-<a href="https://www.pagerduty.com/";><img src="docs/static/pagerduty.png" 
alt="PagerDuty" height="60px" 
style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-<a 
href="https://www.rsync.net/cgi-bin/borg.cgi?campaign=borg&adgroup=borgmatic";><img
 src="docs/static/rsyncnet.png" alt="rsync.net" height="60px" 
style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://www.pagerduty.com/";><img src="docs/static/pagerduty.png" 
alt="PagerDuty" height="60px" style="margin-bottom:20px;"></a>
 <a href="https://www.borgbase.com/?utm_source=borgmatic";><img 
src="docs/static/borgbase.png" alt="BorgBase" height="60px" 
style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<img src="docs/static/rsyncnet.png" alt="rsync.net" height="60px" 
style="margin-bottom:20px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
 
-## How-to guides
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/) ⬅ *Start 
here!*
- * [Make per-application 
backups](https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/)
- * [Make backups 
redundant](https://torsion.org/borgmatic/docs/how-to/make-backups-redundant/)
- * [Deal with very large 
backups](https://torsion.org/borgmatic/docs/how-to/deal-with-very-large-backups/)
- * [Inspect your 
backups](https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/)
- * [Monitor your 
backups](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/)
- * [Extract a 
backup](https://torsion.org/borgmatic/docs/how-to/extract-a-backup/)
- * [Backup your 
databases](https://torsion.org/borgmatic/docs/how-to/backup-your-databases/)
- * [Add preparation and cleanup steps to 
backups](https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/)
- * [Backup to a removable drive or an intermittent 
server](https://torsion.org/borgmatic/docs/how-to/backup-to-a-removable-drive-or-an-intermittent-server/)
- * [Upgrade borgmatic](https://torsion.org/borgmatic/docs/how-to/upgrade/)
- * [Develop on 
borgmatic](https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/)
-
+## Getting started
 
-## Reference guides
+Your first step is to [install and configure
+borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/).
 
- * [borgmatic configuration 
reference](https://torsion.org/borgmatic/docs/reference/configuration/)
- * [borgmatic command-line 
reference](https://torsion.org/borgmatic/docs/reference/command-line/)
+For additional documentation, check out the links above for <a
+href="https://torsion.org/borgmatic/#documentation";>borgmatic how-to and
+reference guides</a>.
 
 
 ## Hosting providers
@@ -101,8 +89,8 @@
 links, but without any tracking scripts or cookies.)
 
 <ul>
- <li class="referral"><a 
href="https://www.rsync.net/cgi-bin/borg.cgi?campaign=borg&adgroup=borgmatic";>rsync.net</a>:
 Cloud Storage provider with full support for borg and any other SSH/SFTP 
tool</li>
  <li class="referral"><a 
href="https://www.borgbase.com/?utm_source=borgmatic";>BorgBase</a>: Borg 
hosting service with support for monitoring, 2FA, and append-only repos</li>
+ <li>rsync.net: Cloud Storage provider with full support for borg and any 
other SSH/SFTP tool</li>
 </ul>
 
 ## Support and contributing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/borgmatic/commands/borgmatic.py 
new/borgmatic-1.5.10/borgmatic/commands/borgmatic.py
--- old/borgmatic-1.5.9/borgmatic/commands/borgmatic.py 2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/borgmatic/commands/borgmatic.py        2020-08-21 
23:27:47.000000000 +0200
@@ -91,6 +91,14 @@
                 'pre-check',
                 global_arguments.dry_run,
             )
+        if 'extract' in arguments:
+            command.execute_hook(
+                hooks.get('before_extract'),
+                hooks.get('umask'),
+                config_filename,
+                'pre-extract',
+                global_arguments.dry_run,
+            )
         if prune_create_or_check:
             dispatch.call_hooks(
                 'ping_monitor',
@@ -165,6 +173,14 @@
                     'post-check',
                     global_arguments.dry_run,
                 )
+            if 'extract' in arguments:
+                command.execute_hook(
+                    hooks.get('after_extract'),
+                    hooks.get('umask'),
+                    config_filename,
+                    'post-extract',
+                    global_arguments.dry_run,
+                )
             if prune_create_or_check:
                 dispatch.call_hooks(
                     'ping_monitor',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/borgmatic/config/collect.py 
new/borgmatic-1.5.10/borgmatic/config/collect.py
--- old/borgmatic-1.5.9/borgmatic/config/collect.py     2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/borgmatic/config/collect.py    2020-08-21 
23:27:47.000000000 +0200
@@ -44,6 +44,9 @@
             yield path
             continue
 
+        if not os.access(path, os.R_OK):
+            continue
+
         for filename in sorted(os.listdir(path)):
             full_filename = os.path.join(path, filename)
             matching_filetype = full_filename.endswith('.yaml') or 
full_filename.endswith('.yml')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/borgmatic/config/schema.yaml 
new/borgmatic-1.5.10/borgmatic/config/schema.yaml
--- old/borgmatic-1.5.9/borgmatic/config/schema.yaml    2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/borgmatic/config/schema.yaml   2020-08-21 
23:27:47.000000000 +0200
@@ -123,7 +123,7 @@
                     patterns" for more details.
                 example:
                     - '*.pyc'
-                    - ~/*/.cache
+                    - /home/*/.cache
                     - /etc/ssl
             exclude_from:
                 seq:
@@ -473,6 +473,14 @@
                     before consistency checks, run once per configuration file.
                 example:
                     - echo "Starting checks."
+            before_extract:
+                seq:
+                    - type: str
+                desc: |
+                    List of one or more shell commands or scripts to execute
+                    before extracting a backup, run once per configuration 
file.
+                example:
+                    - echo "Starting extracting."
             after_backup:
                 seq:
                     - type: str
@@ -497,6 +505,14 @@
                     after consistency checks, run once per configuration file.
                 example:
                     - echo "Finished checks."
+            after_extract:
+                seq:
+                    - type: str
+                desc: |
+                    List of one or more shell commands or scripts to execute
+                    after extracting a backup, run once per configuration file.
+                example:
+                    - echo "Finished extracting."
             on_error:
                 seq:
                     - type: str
@@ -506,6 +522,26 @@
                     "check" action or an associated before/after hook.
                 example:
                     - echo "Error during prune/create/check."
+            before_everything:
+                seq:
+                    - type: str
+                desc: |
+                    List of one or more shell commands or scripts to execute
+                    before running all actions (if one of them is "create").
+                    These are collected from all configuration files and then
+                    run once before all of them (prior to all actions).
+                example:
+                    - echo "Starting actions."
+            after_everything:
+                seq:
+                    - type: str
+                desc: |
+                    List of one or more shell commands or scripts to execute
+                    after running all actions (if one of them is "create").
+                    These are collected from all configuration files and then
+                    run once after all of them (after any action).
+                example:
+                    - echo "Completed actions."
             postgresql_databases:
                 seq:
                     - map:
@@ -693,26 +729,6 @@
                     documentation for details.
                 example:
                     
https://cronhub.io/start/1f5e3410-254c-11e8-b61d-55875966d01
-            before_everything:
-                seq:
-                    - type: str
-                desc: |
-                    List of one or more shell commands or scripts to execute
-                    before running all actions (if one of them is "create").
-                    These are collected from all configuration files and then
-                    run once before all of them (prior to all actions).
-                example:
-                    - echo "Starting actions."
-            after_everything:
-                seq:
-                    - type: str
-                desc: |
-                    List of one or more shell commands or scripts to execute
-                    after running all actions (if one of them is "create").
-                    These are collected from all configuration files and then
-                    run once before all of them (prior to all actions).
-                example:
-                    - echo "Completed actions."
             umask:
                 type: scalar
                 desc: |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/Dockerfile 
new/borgmatic-1.5.10/docs/Dockerfile
--- old/borgmatic-1.5.9/docs/Dockerfile 2020-07-23 06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/Dockerfile        2020-08-21 23:27:47.000000000 
+0200
@@ -16,6 +16,7 @@
 RUN npm install @11ty/eleventy \
     @11ty/eleventy-plugin-syntaxhighlight \
     @11ty/eleventy-plugin-inclusive-language \
+    @11ty/eleventy-navigation \
     markdown-it \
     markdown-it-anchor \
     markdown-it-replace-link
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/_includes/components/lists.css 
new/borgmatic-1.5.10/docs/_includes/components/lists.css
--- old/borgmatic-1.5.9/docs/_includes/components/lists.css     2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/_includes/components/lists.css    2020-08-21 
23:27:47.000000000 +0200
@@ -1,8 +1,7 @@
 /* Buzzwords */
 @keyframes rainbow {
        0% { background-position: 0% 50%; }
-       50% { background-position: 100% 50%; }
-       100% { background-position: 0% 50%; }
+       100% { background-position: 100% 50%; }
 }
 .buzzword-list,
 .inlinelist {
@@ -25,6 +24,7 @@
        margin: 4px 4px 4px 0;
        transition: .15s linear outline;
 }
+
 .inlinelist .inlinelist-item.active {
        background-color: #222;
        color: #fff;
@@ -36,6 +36,38 @@
 }
 .inlinelist .inlinelist-item code {
        background-color: transparent;
+       font-size: 80%;
+       margin-left: 6px;
+       padding-left: 6px;
+       display: inline-block;
+       position: relative;
+}
+@media (max-width: 26.8125em) { /* 429px */
+       .inlinelist .inlinelist-item {
+               overflow: hidden;
+       }
+       .inlinelist .inlinelist-item code {
+               float: right;
+               line-height: 1.75;
+       }
+}
+@media (min-width: 26.875em) { /* 430px */
+       .inlinelist .inlinelist-item code {
+               float: none;
+       }
+       .inlinelist .inlinelist-item code:before {
+               content: " ";
+               border-left: 1px solid rgba(255,255,255,.8);
+               position: absolute;
+               left: -2px;
+               top: -2px;
+               bottom: 2px;
+       }
+       @media (prefers-color-scheme: dark) {
+               .inlinelist .inlinelist-item code:before {
+                       border-left-color: rgba(0,0,0,.8);
+               }
+       }
 }
 a.buzzword {
        text-decoration: underline;
@@ -59,44 +91,74 @@
 .buzzword {
        background-color: #f7f7f7;
 }
+@media (prefers-color-scheme: dark) {
+       .buzzword-list li,
+       .buzzword {
+               background-color: #080808;
+       }
+}
 .inlinelist .inlinelist-item {
        background-color: #e9e9e9;
 }
+@media (prefers-color-scheme: dark) {
+       .inlinelist .inlinelist-item {
+               background-color: #000;
+       }
+       .inlinelist .inlinelist-item a {
+               color: #fff;
+       }
+       .inlinelist .inlinelist-item code {
+               color: inherit;
+       }
+}
 .inlinelist .inlinelist-item:hover,
 .inlinelist .inlinelist-item:focus,
 .buzzword-list li:hover,
 .buzzword-list li:focus,
 .buzzword:hover,
-.buzzword:focus {
+.buzzword:focus,
+.rainbow-active:hover,
+.rainbow-active:focus {
        position: relative;
        background-image: linear-gradient(238deg, #ff0000, #ff8000, #ffff00, 
#80ff00, #00ff00, #00ff80, #00ffff, #0080ff, #0000ff, #8000ff, #ff0080);
        background-size: 1200% 1200%;
+       background-position: 2% 80%;
        color: #fff;
        text-shadow: 0 0 2px rgba(0,0,0,.9);
-       animation: rainbow 1.6s infinite;
+       animation: rainbow 4s ease-out alternate infinite;
+}
+.rainbow-active-noanim {
+       animation: none !important;
 }
 .inlinelist .inlinelist-item:hover a,
 .inlinelist .inlinelist-item:focus a,
 .buzzword-list li:hover a,
 .buzzword-list li:focus a,
 a.buzzword:hover,
-a.buzzword:focus {
+a.buzzword:focus,
+a.rainbow-active:hover,
+a.rainbow-active:focus {
        color: #fff;
        text-decoration: none;
 }
-/*
-I wish there were a PE friendly way to do this but media queries don’t work 
work with @supports
-@media (prefers-reduced-motion: no-preference) {
+@media (prefers-reduced-motion: reduce) {
+       .inlinelist .inlinelist-item:hover,
+       .inlinelist .inlinelist-item:focus,
+       .buzzword-list li:hover,
+       .buzzword-list li:focus,
        .buzzword:hover,
-       .buzzword:focus {
-               animation: rainbow 1s infinite;
+       .buzzword:focus,
+       .rainbow-active:hover,
+       .rainbow-active:focus {
+               animation: none;
        }
-}*/
+}
+
 .buzzword-list li:hover:after,
 .buzzword-list li:focus:after,
 .buzzword:hover:after,
 .buzzword:focus:after {
-       font-family: system-ui, sans-serif;
+       font-family: system-ui, -apple-system, sans-serif;
        content: "Buzzword alert!!!";
        position: absolute;
        left: 0;
@@ -123,4 +185,94 @@
 main h3 a.buzzword,
 main p a.buzzword {
        text-decoration: underline;
-}
\ No newline at end of file
+}
+
+/* Small viewport */
+@media (max-width: 26.8125em) { /* 429px */
+       .inlinelist .inlinelist-item {
+               display: block;
+               width: auto;
+               padding: 0;
+               line-height: 1.4;
+       }
+       .inlinelist .inlinelist-item > a {
+               display: block;
+               padding: .2em .5em;
+       }
+}
+@media (min-width: 26.875em) { /* 430px */
+       .inlinelist .inlinelist-item > a {
+               display: inline-block;
+               white-space: nowrap;
+       }
+}
+
+.numberflag {
+       display: inline-flex;
+       align-items: center;
+       justify-content: center;
+       background-color: #dff7ff;
+       border-radius: 50%;
+       width: 1.75em;
+       height: 1.75em;
+       font-weight: 600;
+}
+@media (prefers-color-scheme: dark) {
+       .numberflag {
+               background-color: #00bcd4;
+               color: #222;
+       }
+}
+h1 .numberflag,
+h2 .numberflag,
+h3 .numberflag,
+h4 .numberflag,
+h5 .numberflag {
+       width: 1.25em;
+       height: 1.25em;
+}
+h2 .numberflag {
+       position: relative;
+       margin-right: 0.25em; /* 10px /40 */
+}
+h2 .numberflag:after {
+       content: " ";
+       position: absolute;
+       bottom: -1px;
+       left: 0;
+       height: 1px;
+       background-color: #fff;
+       width: calc(100% + 0.4em); /* 16px /40 */
+}
+@media (prefers-color-scheme: dark) {
+       h2 .numberflag:after {
+               background-color: #222;
+       }
+}
+
+/* Super featured list on home page */
+.list-superfeatured .avatar {
+       width: calc(30px + 5vw);
+       height: calc(30px + 5vw);
+       max-width: 60px;
+       max-height: 60px;
+       margin-left: 0;
+}
+@media (max-width: 26.8125em) { /* 429px */
+       .list-superfeatured .inlinelist-item > a {
+               white-space: nowrap;
+               overflow: hidden;
+               text-overflow: ellipsis;
+       }
+}
+@media (min-width: 26.875em) { /* 430px */
+       .list-superfeatured .inlinelist-item {
+               font-size: 110%;
+       }
+}
+
+/* Only top level */
+.inlinelist-no-nest ul,
+.inlinelist-no-nest ol {
+       display: none;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/borgmatic-1.5.9/docs/_includes/components/minilink.css 
new/borgmatic-1.5.10/docs/_includes/components/minilink.css
--- old/borgmatic-1.5.9/docs/_includes/components/minilink.css  2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/_includes/components/minilink.css 2020-08-21 
23:27:47.000000000 +0200
@@ -10,7 +10,20 @@
        font-weight: 500;
        margin: 0 0.4285714285714em 0.07142857142857em 0; /* 0 6px 1px 0 /14 */
        line-height: 1.285714285714; /* 18px /14 */
-       font-family: system-ui, sans-serif;
+       font-family: system-ui, -apple-system, sans-serif;
+}
+@media (prefers-color-scheme: dark) {
+  .minilink {
+    background-color: #222;
+    /*
+      !important to override .elv-callout a
+      see _includes/components/callout.css
+     */
+    color: #fff !important;
+  }
+}
+table .minilink {
+       margin-top: 6px;
 }
 .minilink[href] {
        box-shadow: 0 1px 1px 0 rgba(0,0,0,.5);
@@ -19,6 +32,12 @@
 .minilink[href]:focus {
        background-color: #bbb;
 }
+@media (prefers-color-scheme: dark) {
+  .minilink[href]:hover,
+  .minilink[href]:focus {
+    background-color: #444;
+  }
+}
 pre + .minilink {
        color: #fff;
        border-radius: 0 0 0.2857142857143em 0.2857142857143em; /* 4px /14 */
@@ -35,6 +54,54 @@
        margin-left: 2em;
        margin-bottom: 2em;
 }
+h1 .minilink,
+h2 .minilink,
+h3 .minilink,
+h4 .minilink {
+       font-size: 0.9375rem; /* 15px /16 */
+       vertical-align: middle;
+       margin-left: 1em;
+}
+h3 .minilink,
+h4 .minilink {
+       font-size: 0.8125rem; /* 13px /16 */
+}
 .minilink + pre[class*=language-] {
        clear: both;
-}
\ No newline at end of file
+}
+
+.minilink-addedin {
+       text-transform: none;
+       box-shadow: 0 0 0 1px rgba(0,0,0,0.3);
+}
+@media (prefers-color-scheme: dark) {
+  .minilink-addedin {
+    box-shadow: 0 0 0 1px rgba(255,255,255,0.3);
+  }
+}
+.minilink-addedin:not(:first-child) {
+       margin-left: .5em;
+}
+.minilink-addedin.minilink-inline {
+       margin: 0 4px;
+       background-color: #fff;
+}
+
+.minilink-lower {
+       text-transform: none;
+       background-color: transparent;
+}
+.minilink-lower[href] {
+       box-shadow: 0 0 0 1px rgba(0,0,0,0.5);
+}
+.minilink-lower[href]:hover,
+.minilink-lower[href]:focus {
+       background-color: #eee;
+}
+
+.minilink > .minilink {
+       margin: -.125em .375em -.125em -.375em;
+       box-shadow: none;
+       border-top-right-radius: 0;
+       border-bottom-right-radius: 0;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/_includes/components/toc.css 
new/borgmatic-1.5.10/docs/_includes/components/toc.css
--- old/borgmatic-1.5.9/docs/_includes/components/toc.css       2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/_includes/components/toc.css      2020-08-21 
23:27:47.000000000 +0200
@@ -1,63 +1,111 @@
 .elv-toc {
        font-size: 1rem; /* Reset */
 }
+.elv-toc details {
+       --details-force-closed: (max-width: 63.9375em); /* 1023px */
+}
+.elv-toc details > summary {
+       font-size: 1.375rem; /* 22px /16 */
+       margin-bottom: .5em;
+}
 @media (min-width: 64em) { /* 1024px */
        .elv-toc {
                position: absolute;
-               left: -17rem;
+               left: 3rem;
                width: 16rem;
+               z-index: 1;
+       }
+       .elv-toc details > summary {
+               margin-top: 0;
+       }
+       .js .elv-toc details > summary {
+               display: none;
        }
 }
 
-
 .elv-toc-list {
+       display: flex;
+       flex-wrap: wrap;
+       justify-content: space-between;
        padding-left: 0;
        padding-right: 0;
+       margin: 0 0 2.5em;
        list-style: none;
 }
+.elv-toc-list li {
+       font-size: 0.9375em; /* 15px /16 */
+       line-height: 1.466666666667; /* 22px /15 */
+}
 /* Nested lists */
 .elv-toc-list ul {
-       padding: 0;
-       display: none;
-       margin-bottom: 1.5em;
+       padding: 0 0 .75em 0;
+       margin: 0;
        list-style: none;
 }
-.elv-toc-list ul li {
-       padding-left: 0.875em; /* 14px /16 */
+
+/* Menus nested 2 or more deep */
+.elv-toc-list ul ul {
+       padding-bottom: 0;
+       padding-left: 0.625rem; /* 10px /16 */
 }
-@media (min-width: 64em) and (min-height: 48em) { /* 1024 x 768px */
-       .elv-toc-list ul {
-               display: block;
-       }
+/* Hide inactive menus 3 or more deep */
+.elv-toc-list ul ul > li:not(.elv-toc-active) > ul > li:not(.elv-toc-active) {
+       display: none;
 }
 
 /* List items */
+.elv-toc summary,
+.elv-toc-list a {
+       padding: .15em .25em;
+}
+.elv-toc-list a {
+       display: block;
+}
 .elv-toc-list a:not(:hover) {
        text-decoration: none;
 }
 .elv-toc-list li {
-       padding-top: 0;
-       padding-bottom: 0;
-       margin: .1em 0 .5em;
+       margin: 0;
+       padding: 0;
+}
+.elv-toc-list > li {
+       flex-grow: 1;
+       flex-basis: 14.375rem; /* 230px /16 */
 }
 /* Top level links */
 .elv-toc-list > li > a {
-       font-weight: 400;
-       font-size: 1.0625em; /* 17px /16 */
        color: #222;
+       font-weight: 600;
+       border-bottom: 1px solid #ddd;
+       margin-bottom: 0.25em; /* 4px /16 */
+}
+@media (prefers-color-scheme: dark) {
+  .elv-toc-list > li > a {
+    color: #fff;
+    border-color: #444;
+  }
 }
 
 /* Active links */
 .elv-toc-list li.elv-toc-active > a {
-       font-weight: 700;
-       text-decoration: underline;
+       background-color: #dff7ff;
+}
+@media (prefers-color-scheme: dark) {
+  .elv-toc-list li.elv-toc-active > a {
+    background-color: #353535;
+  }
 }
-.elv-toc-active > a:after {
-       content: " ⬅";
-       line-height: .5;
+.elv-toc-list ul .elv-toc-active > a:after {
+       content: "";
 }
+
 /* Show only active nested lists */
 .elv-toc-list ul.elv-toc-active,
 .elv-toc-list li.elv-toc-active > ul {
        display: block;
-}
\ No newline at end of file
+}
+
+/* Footer catgory navigation */
+.elv-cat-list-active {
+       font-weight: 600;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/_includes/index.css 
new/borgmatic-1.5.10/docs/_includes/index.css
--- old/borgmatic-1.5.9/docs/_includes/index.css        2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/_includes/index.css       2020-08-21 
23:27:47.000000000 +0200
@@ -234,6 +234,9 @@
        max-width: 42rem;
        clear: both;
 }
+header.elv-layout {
+       padding: 0 1rem;
+}
 footer.elv-layout {
        margin-bottom: 5em;
 }
@@ -242,7 +245,7 @@
 }
 @media (min-width: 64em) { /* 1024px */
        .elv-layout-toc {
-               margin-left: 18rem;
+               padding-left: 15rem;
                max-width: 60rem;
                margin-right: 1rem;
                position: relative;
@@ -254,7 +257,6 @@
 
 /* Header */
 .elv-header {
-       color: #222;
        position: relative;
 }
 .elv-header-default {
@@ -262,6 +264,13 @@
        flex-direction: column;
        justify-content: center;
        align-items: center;
+       padding-top: 0;
+}
+.elv-header-c {
+       width: 100%;
+}
+.elv-header-docs .elv-header-c {
+       padding: 1rem 0;
 }
 .elv-header-docs:before,
 .elv-header-docs:after {
@@ -272,53 +281,89 @@
        clear: both;
 }
 /* Header Hero */
-.elv-hero img {
-       max-width: 80vw;
-       max-height: 60vh;
+.elv-hero {
+       background-color: #222;
+}
+@media (prefers-color-scheme: dark) {
+       .elv-hero {
+               background-color: #292929;
+       }
+}
+.elv-hero img,
+.elv-hero svg {
+       width: 42.95774646vh;
+       height: 60vh;
+}
+.elv-hero:hover img,
+.elv-hero:hover svg {
+       background-color: inherit;
+}
+.elv-header-default .elv-hero {
+       display: flex;
+       justify-content: center;
+       width: calc(100% + 2rem);
+       margin-left: -1rem;
+       margin-right: -1rem;
+}
+.elv-hero:hover {
+       background-color: #333;
 }
+
 .elv-header-docs .elv-hero {
        float: left;
-       margin-right: 1.5em;
+       margin-right: .5em;
+}
+.elv-header-default .elv-hero img,
+.elv-header-default .elv-hero svg {
+       position: relative;
+       background-color: transparent;
+       z-index: 1;
 }
-.elv-header-docs .elv-hero img {
+.elv-header-docs .elv-hero img,
+.elv-header-docs .elv-hero svg {
+       width: auto;
        height: 3em;
 }
-@media (min-width: 37.5em) { /* 600px */
-       .elv-header-docs .elv-hero img {
+@media (min-width: 43.75em) { /* 700px */
+       .elv-header-docs .elv-hero {
+               margin-right: 1em;
+       }
+       .elv-header-docs .elv-hero img,
+       .elv-header-docs .elv-hero svg {
                width: 4.303125em; /* 68.85px /16 */
                height: 6em;
        }
 }
 /* Header Possum */
+.elv-possum-anchor {
+       display: block;
+}
 .elv-possum {
-       display: none;
        position: absolute;
-       right: 1em;
-       top: 1em;
-       width: 16vmin;
-}
-@media (min-width: 31.25em) { /* 500px */
-       .elv-possum {
-               display: block;
-       }
+       right: .5rem;
+       top: 1rem;
+       transition: .3s opacity ease-out;
+}
+.elv-header-docs .elv-possum {
+       width: 15vw;
+       max-width: 6.25rem; /* 100px /16 */
 }
-
-/* Header Heading */
-.elv-hed {
-       font-size: 3em;
-       margin-top: 1.5em;
-       margin-bottom: .25em;
-       text-align: center;
-       text-transform: none;
-}
-.elv-header-docs .elv-hed {
-       font-size: 2.3em;
-       margin: 0;
-       text-align: left;
-}
-@media (min-width: 37.5em) { /* 600px */
-       .elv-header-docs .elv-hed {
-               font-size: 3em;
+.elv-header-default {
+       overflow: hidden;
+}
+.elv-header-default .elv-possum {
+       pointer-events: none;
+       width: auto;
+       height: calc((60vh - 2rem) / 1.6);
+       top: 36%;
+       left: 1vw;
+       right: auto;
+       animation-duration: 180s;
+       animation-name: balloonFloat;
+}
+@media (prefers-reduced-motion: reduce) {
+       .elv-header-default .elv-possum {
+               display: none;
        }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/_includes/layouts/main.njk 
new/borgmatic-1.5.10/docs/_includes/layouts/main.njk
--- old/borgmatic-1.5.9/docs/_includes/layouts/main.njk 2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/_includes/layouts/main.njk        2020-08-21 
23:27:47.000000000 +0200
@@ -6,9 +6,27 @@
 {% include "header.njk" %}
 
 <main class="elv-layout{% if layoutClass %} {{ layoutClass }}{% endif %}">
-    <article>
-        {{ content | safe }}
+    <div id="documentation" class="elv-toc">
+        <div>
+            {% set navPages = collections.all | eleventyNavigation %}
+            {% macro renderNavListItem(entry) -%}
+            <li{% if entry.url == page.url %} class="elv-toc-active"{% endif 
%}>
+              <a {% if entry.url %}href="https://torsion.org/borgmatic/docs{{ 
entry.url | url }}"{% endif %}>{{ entry.title }}</a>
+            {%- if entry.children.length -%}
+              <ul>
+                {%- for child in entry.children %}{{ renderNavListItem(child) 
}}{% endfor -%}
+              </ul>
+            {%- endif -%}
+            </li>
+            {%- endmacro %}
 
-        {% include 'components/suggestion-form.html' %}
-    </article>
+            <ul class="elv-toc-list">
+            {%- for entry in navPages %}{{ renderNavListItem(entry) }}{%- 
endfor -%}
+            </ul>
+        </div>
+    </div>
+
+    {{ content | safe }}
+
+    {% include 'components/suggestion-form.html' %}
 </main>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/borgmatic-1.5.9/docs/how-to/add-preparation-and-cleanup-steps-to-backups.md 
new/borgmatic-1.5.10/docs/how-to/add-preparation-and-cleanup-steps-to-backups.md
--- 
old/borgmatic-1.5.9/docs/how-to/add-preparation-and-cleanup-steps-to-backups.md 
    2020-07-23 06:53:55.000000000 +0200
+++ 
new/borgmatic-1.5.10/docs/how-to/add-preparation-and-cleanup-steps-to-backups.md
    2020-08-21 23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to add preparation and cleanup steps to backups
+eleventyNavigation:
+  key: Add preparation and cleanup steps
+  parent: How-to guides
+  order: 8
 ---
 ## Preparation and cleanup hooks
 
@@ -73,11 +77,3 @@
 injection or privilege escalation, do not forget to set secure permissions
 on borgmatic configuration files (`chmod 0600`) and scripts (`chmod 0700`)
 invoked by hooks.
-
-
-## Related documentation
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/)
- * [Backup your 
databases](https://torsion.org/borgmatic/docs/how-to/backup-your-databases/)
- * [Inspect your 
backups](https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/)
- * [Monitor your 
backups](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/borgmatic-1.5.9/docs/how-to/backup-to-a-removable-drive-or-an-intermittent-server.md
 
new/borgmatic-1.5.10/docs/how-to/backup-to-a-removable-drive-or-an-intermittent-server.md
--- 
old/borgmatic-1.5.9/docs/how-to/backup-to-a-removable-drive-or-an-intermittent-server.md
    2020-07-23 06:53:55.000000000 +0200
+++ 
new/borgmatic-1.5.10/docs/how-to/backup-to-a-removable-drive-or-an-intermittent-server.md
   2020-08-21 23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to backup to a removable drive or an intermittent server
+eleventyNavigation:
+  key: Backup to a removable drive or server
+  parent: How-to guides
+  order: 9
 ---
 ## Occasional backups
 
@@ -98,11 +102,3 @@
  * The soft failure feature also works for `before_prune`, `after_prune`,
    `before_check`, and `after_check` hooks. But it is not implemented for
    `before_everything` or `after_everything`.
-
-## Related documentation
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/)
- * [Make per-application 
backups](https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/)
- * [Make backups 
redundant](https://torsion.org/borgmatic/docs/how-to/make-backups-redundant/)
- * [Add preparation and cleanup steps to 
backups](https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/)
- * [Monitor your 
backups](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/how-to/backup-your-databases.md 
new/borgmatic-1.5.10/docs/how-to/backup-your-databases.md
--- old/borgmatic-1.5.9/docs/how-to/backup-your-databases.md    2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/how-to/backup-your-databases.md   2020-08-21 
23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to backup your databases
+eleventyNavigation:
+  key: Backup your databases
+  parent: How-to guides
+  order: 7
 ---
 ## Database dump hooks
 
@@ -217,11 +221,3 @@
 See Limitations above about `read_special`. You may need to exclude certain
 paths with named pipes, block devices, or character devices on which borgmatic
 is hanging.
-
-
-## Related documentation
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/)
- * [Add preparation and cleanup steps to 
backups](https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/)
- * [Inspect your 
backups](https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/)
- * [Extract a 
backup](https://torsion.org/borgmatic/docs/how-to/extract-a-backup/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/borgmatic-1.5.9/docs/how-to/deal-with-very-large-backups.md 
new/borgmatic-1.5.10/docs/how-to/deal-with-very-large-backups.md
--- old/borgmatic-1.5.9/docs/how-to/deal-with-very-large-backups.md     
2020-07-23 06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/how-to/deal-with-very-large-backups.md    
2020-08-21 23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to deal with very large backups
+eleventyNavigation:
+  key: Deal with very large backups
+  parent: How-to guides
+  order: 3
 ---
 ## Biggish data
 
@@ -120,8 +124,3 @@
 
 This should make the client keep the connection alive while validating
 backups.
-
-
-## Related documentation
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/how-to/develop-on-borgmatic.md 
new/borgmatic-1.5.10/docs/how-to/develop-on-borgmatic.md
--- old/borgmatic-1.5.9/docs/how-to/develop-on-borgmatic.md     2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/how-to/develop-on-borgmatic.md    2020-08-21 
23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to develop on borgmatic
+eleventyNavigation:
+  key: Develop on borgmatic
+  parent: How-to guides
+  order: 11
 ---
 ## Source code
 
@@ -139,7 +143,3 @@
 To close the documentation server, ctrl-C the script. Note that it does not
 currently auto-reload, so you'll need to stop it and re-run it for any
 additional documentation changes to take effect.
-
-## Related documentation
-
- * [Inspect your 
backups](https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/how-to/extract-a-backup.md 
new/borgmatic-1.5.10/docs/how-to/extract-a-backup.md
--- old/borgmatic-1.5.9/docs/how-to/extract-a-backup.md 2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/how-to/extract-a-backup.md        2020-08-21 
23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to extract a backup
+eleventyNavigation:
+  key: Extract a backup
+  parent: How-to guides
+  order: 6
 ---
 ## Extract
 
@@ -132,11 +136,3 @@
 ```bash
 borgmatic umount --mount-point /mnt
 ```
-
-
-## Related documentation
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/)
- * [Inspect your 
backups](https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/)
- * [Monitor your 
backups](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/)
- * [Backup your 
databases](https://torsion.org/borgmatic/docs/how-to/backup-your-databases/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/how-to/index.md 
new/borgmatic-1.5.10/docs/how-to/index.md
--- old/borgmatic-1.5.9/docs/how-to/index.md    1970-01-01 01:00:00.000000000 
+0100
+++ new/borgmatic-1.5.10/docs/how-to/index.md   2020-08-21 23:27:47.000000000 
+0200
@@ -0,0 +1,5 @@
+---
+eleventyNavigation:
+  key: How-to guides
+permalink: false
+---
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/how-to/inspect-your-backups.md 
new/borgmatic-1.5.10/docs/how-to/inspect-your-backups.md
--- old/borgmatic-1.5.9/docs/how-to/inspect-your-backups.md     2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/how-to/inspect-your-backups.md    2020-08-21 
23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to inspect your backups
+eleventyNavigation:
+  key: Inspect your backups
+  parent: How-to guides
+  order: 4
 ---
 ## Backup progress
 
@@ -98,11 +102,3 @@
 the log file so it doesn't grow too large, for example with
 [logrotate](https://wiki.archlinux.org/index.php/Logrotate). Also, there is a
 `--log-file-verbosity` flag to customize the log file's log level.
-
-
-## Related documentation
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/)
- * [Monitor your 
backups](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/)
- * [Add preparation and cleanup steps to 
backups](https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/)
- * [Develop on 
borgmatic](https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/borgmatic-1.5.9/docs/how-to/make-backups-redundant.md 
new/borgmatic-1.5.10/docs/how-to/make-backups-redundant.md
--- old/borgmatic-1.5.9/docs/how-to/make-backups-redundant.md   2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/how-to/make-backups-redundant.md  2020-08-21 
23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to make backups redundant
+eleventyNavigation:
+  key: Make backups redundant
+  parent: How-to guides
+  order: 2
 ---
 ## Multiple repositories
 
@@ -16,8 +20,8 @@
 
     # Paths of local or remote repositories to backup to.
     repositories:
-        - [email protected]:backups.borg
         - [email protected]:repo
+        - [email protected]:backups.borg
         - /var/lib/backups/local.borg
 ```
 
@@ -28,8 +32,8 @@
 
 Here's a way of visualizing what borgmatic does with the above configuration:
 
-1. Backup `/home` and `/etc` to `[email protected]:backups.borg`
 2. Backup `/home` and `/etc` to `[email protected]:repo`
+1. Backup `/home` and `/etc` to `[email protected]:backups.borg`
 3. Backup `/home` and `/etc` to `/var/lib/backups/local.borg`
 
 This gives you redundancy of your data across repositories and even
@@ -38,10 +42,3 @@
 See [Borg repository URLs
 
documentation](https://borgbackup.readthedocs.io/en/stable/usage/general.html#repository-urls)
 for more information on how to specify local and remote repository paths.
-
-
-## Related documentation
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/)
- * [Make per-application 
backups](https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/)
- * [Backup to a removable drive or an intermittent 
server](https://torsion.org/borgmatic/docs/how-to/backup-to-a-removable-drive-or-an-intermittent-server/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/borgmatic-1.5.9/docs/how-to/make-per-application-backups.md 
new/borgmatic-1.5.10/docs/how-to/make-per-application-backups.md
--- old/borgmatic-1.5.9/docs/how-to/make-per-application-backups.md     
2020-07-23 06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/how-to/make-per-application-backups.md    
2020-08-21 23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to make per-application backups
+eleventyNavigation:
+  key: Make per-application backups
+  parent: How-to guides
+  order: 1
 ---
 ## Multiple backup configurations
 
@@ -129,12 +133,12 @@
 command-line via the `--override` flag. Here's an example:
 
 ```bash
-borgmatic create --override location.remote_path=borg1
+borgmatic create --override location.remote_path=/usr/local/bin/borg1
 ```
 
 What this does is load your configuration files, and for each one, disregard
 the configured value for the `remote_path` option in the `location` section,
-and use the value of `borg1` instead.
+and use the value of `/usr/local/bin/borg1` instead.
 
 Note that the value is parsed as an actual YAML string, so you can even set
 list values by using brackets. For instance:
@@ -143,14 +147,21 @@
 borgmatic create --override location.repositories=[test1.borg,test2.borg]
 ```
 
+Or even a single list element:
+
+```bash
+borgmatic create --override location.repositories=[/root/test1.borg]
+```
+
 There is not currently a way to override a single element of a list without
 replacing the whole list.
 
+Note that if you override an option of the list type (like
+`location.repositories`), you do need to use the `[ ]` list syntax. See the
+[configuration
+reference](https://torsion.org/borgmatic/docs/reference/configuration/) for
+which options are list types. (YAML list values look like `- this` with an
+indentation and a leading dash.)
+
 Be sure to quote your overrides if they contain spaces or other characters
 that your shell may interpret.
-
-
-## Related documentation
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/)
- * [Make backups 
redundant](https://torsion.org/borgmatic/docs/how-to/make-backups-redundant/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/how-to/monitor-your-backups.md 
new/borgmatic-1.5.10/docs/how-to/monitor-your-backups.md
--- old/borgmatic-1.5.9/docs/how-to/monitor-your-backups.md     2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/how-to/monitor-your-backups.md    2020-08-21 
23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
 title: How to monitor your backups
+eleventyNavigation:
+  key: Monitor your backups
+  parent: How-to guides
+  order: 5
 ---
 
 ## Monitoring and alerting
@@ -10,48 +14,68 @@
 
 There are several different ways you can monitor your backups and find out
 whether they're succeeding. Which of these you choose to do is up to you and
-your particular infrastructure:
+your particular infrastructure.
 
-1. **Job runner alerts**: The easiest place to start is with failure alerts
-from the [scheduled job
-runner](https://torsion.org/borgmatic/docs/how-to/set-up-backups/#autopilot) 
(cron,
-systemd, etc.) that's running borgmatic. But note that if the job doesn't even
-get scheduled (e.g. due to the job runner not running), you probably won't get
-an alert at all! Still, this is a decent first line of defense, especially
-when combined with some of the other approaches below.
-2. **borgmatic error hooks**: The `on_error` hook allows you to run an 
arbitrary
-command or script when borgmatic itself encounters an error running your
-backups. So for instance, you can run a script to send yourself a text message
-alert. But note that if borgmatic doesn't actually run, this alert won't fire.
-See [error
+### Job runner alerts
+
+The easiest place to start is with failure alerts from the [scheduled job
+runner](https://torsion.org/borgmatic/docs/how-to/set-up-backups/#autopilot)
+(cron, systemd, etc.) that's running borgmatic. But note that if the job
+doesn't even get scheduled (e.g. due to the job runner not running), you
+probably won't get an alert at all! Still, this is a decent first line of
+defense, especially when combined with some of the other approaches below.
+
+### Commands run on error
+
+The `on_error` hook allows you to run an arbitrary command or script when
+borgmatic itself encounters an error running your backups. So for instance,
+you can run a script to send yourself a text message alert. But note that if
+borgmatic doesn't actually run, this alert won't fire.  See [error
 
hooks](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#error-hooks)
 below for how to configure this.
-4. **borgmatic monitoring hooks**: This feature integrates with monitoring
-   services like [Healthchecks](https://healthchecks.io/),
-[Cronitor](https://cronitor.io), [Cronhub](https://cronhub.io), and
-[PagerDuty](https://www.pagerduty.com/) and pings these services whenever
-borgmatic runs. That way, you'll receive an alert when something goes wrong or
-(for certain hooks) the service doesn't hear from borgmatic for a configured
-interval. See [Healthchecks
-hook](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#healthchecks-hook),
 [Cronitor
-hook](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#cronitor-hook),
 [Cronhub
-hook](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#cronhub-hook),
 and
-[PagerDuty 
hook](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#pagerduty-hook)
+
+### Third-party monitoring services
+
+borgmatic integrates with monitoring services like
+[Healthchecks](https://healthchecks.io/), [Cronitor](https://cronitor.io),
+[Cronhub](https://cronhub.io), and [PagerDuty](https://www.pagerduty.com/) and
+pings these services whenever borgmatic runs. That way, you'll receive an
+alert when something goes wrong or (for certain hooks) the service doesn't
+hear from borgmatic for a configured interval. See [Healthchecks
+hook](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#healthchecks-hook),
+[Cronitor
+hook](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#cronitor-hook),
+[Cronhub
+hook](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#cronhub-hook),
+and [PagerDuty
+hook](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#pagerduty-hook)
 below for how to configure this.
-3. **Third-party monitoring software**: You can use traditional monitoring
-software to consume borgmatic JSON output and track when the last
-successful backup occurred. See [scripting
+
+While these services offer different features, you probably only need to use
+one of them at most.
+
+### Third-party monitoring software
+
+You can use traditional monitoring software to consume borgmatic JSON output
+and track when the last successful backup occurred. See [scripting
 
borgmatic](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#scripting-borgmatic)
-and [related 
software](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#related-software)
+and [related
+software](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#related-software)
 below for how to configure this.
-5. **Borg hosting providers**: Most [Borg hosting
+
+### Borg hosting providers
+
+Most [Borg hosting
 providers](https://torsion.org/borgmatic/#hosting-providers) include
 monitoring and alerting as part of their offering. This gives you a dashboard
 to check on all of your backups, and can alert you if the service doesn't hear
 from borgmatic for a configured interval.
-6. **borgmatic consistency checks**: While not strictly part of monitoring, if 
you
-really want confidence that your backups are not only running but are
-restorable as well, you can configure particular [consistency
+
+### Consistency checks
+
+While not strictly part of monitoring, if you really want confidence that your
+backups are not only running but are restorable as well, you can configure
+particular [consistency
 
checks](https://torsion.org/borgmatic/docs/how-to/deal-with-very-large-backups/#consistency-check-configuration)
 or even script full [extract
 tests](https://torsion.org/borgmatic/docs/how-to/extract-a-backup/).
@@ -289,12 +313,3 @@
 ```bash
 borgmatic info --archive latest
 ```
-
-
-## Related documentation
-
- * [Set up backups with 
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/)
- * [Inspect your 
backups](https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/)
- * [Add preparation and cleanup steps to 
backups](https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/)
- * [Extract a 
backup](https://torsion.org/borgmatic/docs/how-to/extract-a-backup/)
- * [Develop on 
borgmatic](https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/how-to/set-up-backups.md 
new/borgmatic-1.5.10/docs/how-to/set-up-backups.md
--- old/borgmatic-1.5.9/docs/how-to/set-up-backups.md   2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/how-to/set-up-backups.md  2020-08-21 
23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
-title: How to set up backups with borgmatic
+title: How to set up backups
+eleventyNavigation:
+  key: Set up backups
+  parent: How-to guides
+  order: 0
 ---
 ## Installation
 
@@ -65,8 +69,7 @@
 The main downside of a global install is that borgmatic is less cleanly
 separated from the rest of your Python software, and there's the theoretical
 possibility of libary conflicts. But if you're okay with that, for instance
-on a relatively dedicated system, then a global install can work out just
-fine.
+on a relatively dedicated system, then a global install can work out fine.
 
 
 ### Other ways to install
@@ -96,8 +99,8 @@
 links, but without any tracking scripts or cookies.)
 
 <ul>
- <li class="referral"><a 
href="https://www.rsync.net/cgi-bin/borg.cgi?campaign=borg&adgroup=borgmatic";>rsync.net</a>:
 Cloud Storage provider with full support for borg and any other SSH/SFTP 
tool</li>
  <li class="referral"><a 
href="https://www.borgbase.com/?utm_source=borgmatic";>BorgBase</a>: Borg 
hosting service with support for monitoring, 2FA, and append-only repos</li>
+ <li>rsync.net: Cloud Storage provider with full support for borg and any 
other SSH/SFTP tool</li>
 </ul>
 
 ## Configuration
@@ -135,9 +138,8 @@
 
 ### Encryption
 
-Note that if you plan to run borgmatic on a schedule with cron, and you
-encrypt your Borg repository with a passphrase instead of a key file, you'll
-either need to set the borgmatic `encryption_passphrase` configuration
+If you encrypt your Borg repository with a passphrase instead of a key file,
+you'll either need to set the borgmatic `encryption_passphrase` configuration
 variable or set the `BORG_PASSPHRASE` environment variable. See the
 [repository encryption
 
section](https://borgbackup.readthedocs.io/en/stable/quickstart.html#repository-encryption)
@@ -313,15 +315,3 @@
 correctly even without the C YAML library. And borgmatic won't be any faster
 with the C library present, so you don't need to go out of your way to install
 it.
-
-
-## Related documentation
-
- * [Make per-application 
backups](https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/)
- * [Make backups 
redundant](https://torsion.org/borgmatic/docs/how-to/make-backups-redundant/)
- * [Deal with very large 
backups](https://torsion.org/borgmatic/docs/how-to/deal-with-very-large-backups/)
- * [Inspect your 
backups](https://torsion.org/borgmatic/docs/how-to/inspect-your-backups/)
- * [Monitor your 
backups](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/)
- * [Upgrade borgmatic](https://torsion.org/borgmatic/docs/how-to/upgrade/)
- * [borgmatic configuration 
reference](https://torsion.org/borgmatic/docs/reference/configuration/)
- * [borgmatic command-line 
reference](https://torsion.org/borgmatic/docs/reference/command-line/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/how-to/upgrade.md 
new/borgmatic-1.5.10/docs/how-to/upgrade.md
--- old/borgmatic-1.5.9/docs/how-to/upgrade.md  2020-07-23 06:53:55.000000000 
+0200
+++ new/borgmatic-1.5.10/docs/how-to/upgrade.md 2020-08-21 23:27:47.000000000 
+0200
@@ -1,5 +1,9 @@
 ---
 title: How to upgrade borgmatic
+eleventyNavigation:
+  key: Upgrade borgmatic
+  parent: How-to guides
+  order: 10
 ---
 ## Upgrading
 
@@ -111,8 +115,3 @@
 
 That's it! borgmatic will continue using your /etc/borgmatic configuration
 files.
-
-
-## Related documentation
-
- * [Develop on 
borgmatic](https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/reference/command-line.md 
new/borgmatic-1.5.10/docs/reference/command-line.md
--- old/borgmatic-1.5.9/docs/reference/command-line.md  2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/reference/command-line.md 2020-08-21 
23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
-title: borgmatic command-line reference
+title: Command-line reference
+eleventyNavigation:
+  key: Command-line reference
+  parent: Reference guides
+  order: 1
 ---
 ## borgmatic options
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/reference/configuration.md 
new/borgmatic-1.5.10/docs/reference/configuration.md
--- old/borgmatic-1.5.9/docs/reference/configuration.md 2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/docs/reference/configuration.md        2020-08-21 
23:27:47.000000000 +0200
@@ -1,5 +1,9 @@
 ---
-title: borgmatic configuration reference
+title: Configuration reference
+eleventyNavigation:
+  key: Configuration reference
+  parent: Reference guides
+  order: 0
 ---
 ## Configuration file
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/docs/reference/index.md 
new/borgmatic-1.5.10/docs/reference/index.md
--- old/borgmatic-1.5.9/docs/reference/index.md 1970-01-01 01:00:00.000000000 
+0100
+++ new/borgmatic-1.5.10/docs/reference/index.md        2020-08-21 
23:27:47.000000000 +0200
@@ -0,0 +1,5 @@
+---
+eleventyNavigation:
+  key: Reference guides
+permalink: false
+---
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/setup.py 
new/borgmatic-1.5.10/setup.py
--- old/borgmatic-1.5.9/setup.py        2020-07-23 06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/setup.py       2020-08-21 23:27:47.000000000 +0200
@@ -1,6 +1,6 @@
 from setuptools import find_packages, setup
 
-VERSION = '1.5.9'
+VERSION = '1.5.10'
 
 
 setup(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/borgmatic-1.5.9/tests/unit/commands/test_borgmatic.py 
new/borgmatic-1.5.10/tests/unit/commands/test_borgmatic.py
--- old/borgmatic-1.5.9/tests/unit/commands/test_borgmatic.py   2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/tests/unit/commands/test_borgmatic.py  2020-08-21 
23:27:47.000000000 +0200
@@ -54,6 +54,17 @@
     list(module.run_configuration('test.yaml', config, arguments))
 
 
+def test_run_configuration_calls_hooks_for_extract_action():
+    flexmock(module.borg_environment).should_receive('initialize')
+    flexmock(module.command).should_receive('execute_hook').twice()
+    flexmock(module.dispatch).should_receive('call_hooks').never()
+    flexmock(module).should_receive('run_actions').and_return([])
+    config = {'location': {'repositories': ['foo']}}
+    arguments = {'global': flexmock(monitoring_verbosity=1, dry_run=False), 
'extract': flexmock()}
+
+    list(module.run_configuration('test.yaml', config, arguments))
+
+
 def test_run_configuration_does_not_trigger_hooks_for_list_action():
     flexmock(module.borg_environment).should_receive('initialize')
     flexmock(module.command).should_receive('execute_hook').never()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/borgmatic-1.5.9/tests/unit/config/test_collect.py 
new/borgmatic-1.5.10/tests/unit/config/test_collect.py
--- old/borgmatic-1.5.9/tests/unit/config/test_collect.py       2020-07-23 
06:53:55.000000000 +0200
+++ new/borgmatic-1.5.10/tests/unit/config/test_collect.py      2020-08-21 
23:27:47.000000000 +0200
@@ -45,6 +45,7 @@
     
mock_path.should_receive('isdir').with_args('config.yaml').and_return(False)
     
mock_path.should_receive('isdir').with_args('/etc/borgmatic.d').and_return(True)
     
mock_path.should_receive('isdir').with_args('/etc/borgmatic.d/foo.yml').and_return(False)
+    flexmock(module.os).should_receive('access').and_return(True)
     flexmock(module.os).should_receive('listdir')
     
flexmock(sys.modules['builtins']).should_receive('sorted').and_return(['foo.yml'])
 
@@ -62,6 +63,7 @@
     
mock_path.should_receive('isdir').with_args('/etc/borgmatic.d/foo.yaml').and_return(False)
     
mock_path.should_receive('isdir').with_args('/etc/borgmatic.d/bar').and_return(True)
     
mock_path.should_receive('isdir').with_args('/etc/borgmatic.d/baz.yaml').and_return(False)
+    flexmock(module.os).should_receive('access').and_return(True)
     flexmock(module.os).should_receive('listdir')
     flexmock(sys.modules['builtins']).should_receive('sorted').and_return(
         ['foo.yaml', 'bar', 'baz.yaml']
@@ -84,6 +86,7 @@
     
mock_path.should_receive('isdir').with_args('/etc/borgmatic.d/foo.yaml').and_return(False)
     
mock_path.should_receive('isdir').with_args('/etc/borgmatic.d/bar.yaml~').and_return(False)
     
mock_path.should_receive('isdir').with_args('/etc/borgmatic.d/baz.txt').and_return(False)
+    flexmock(module.os).should_receive('access').and_return(True)
     flexmock(module.os).should_receive('listdir')
     flexmock(sys.modules['builtins']).should_receive('sorted').and_return(
         ['foo.yaml', 'bar.yaml~', 'baz.txt']
@@ -94,6 +97,21 @@
     assert config_filenames == ('/etc/borgmatic.d/foo.yaml',)
 
 
+def test_collect_config_filenames_skips_permission_denied_directories():
+    config_paths = ('config.yaml', '/etc/borgmatic.d')
+    mock_path = flexmock(module.os.path)
+    mock_path.should_receive('exists').and_return(True)
+    
mock_path.should_receive('isdir').with_args('config.yaml').and_return(False)
+    
mock_path.should_receive('isdir').with_args('/etc/borgmatic.d').and_return(True)
+    flexmock(module.os).should_receive('access').and_return(False)
+    flexmock(module.os).should_receive('listdir')
+    
flexmock(sys.modules['builtins']).should_receive('sorted').and_return(['config.yaml'])
+
+    config_filenames = tuple(module.collect_config_filenames(config_paths))
+
+    assert config_filenames == ('config.yaml',)
+
+
 def 
test_collect_config_filenames_skips_etc_borgmatic_config_dot_yaml_if_it_does_not_exist():
     config_paths = ('config.yaml', '/etc/borgmatic/config.yaml')
     mock_path = flexmock(module.os.path)


Reply via email to