Compare commits

...

835 Commits
1.9.6 ... main

Author SHA1 Message Date
f4e9569297 Add Forgejo actions metadata.
Some checks are pending
build / test (push) Waiting to run
build / docs (push) Blocked by required conditions
2026-03-13 12:48:58 -07:00
f43c2f7130 Add dedicated documenation installation link in Getting Started.
All checks were successful
build / test (push) Successful in 8m50s
build / docs (push) Successful in 1m56s
2026-03-08 12:29:14 -07:00
889b599d55 Switch the default borgmatic installation method from pipx to uv, as uv is faster and used for borgmatic development.
All checks were successful
build / test (push) Successful in 7m42s
build / docs (push) Successful in 1m18s
2026-03-07 21:13:53 -08:00
53791d4dc9 Fix key for documentation page.
All checks were successful
build / test (push) Successful in 7m36s
build / docs (push) Successful in 1m18s
2026-03-07 20:02:53 -08:00
ee58adb4eb Split out borgmatic installation documentation to its own page, so it's easier to find.
All checks were successful
build / test (push) Successful in 8m24s
build / docs (push) Successful in 1m44s
2026-03-07 19:27:04 -08:00
d2903640a8 Bump version for release.
All checks were successful
build / test (push) Successful in 7m42s
build / docs (push) Successful in 1m18s
2026-03-06 10:19:42 -08:00
ec25a40ddc Fix a unicode error when backing up a non-UTF-8 source filename with a corresponding system locale (#1281).
All checks were successful
build / test (push) Successful in 8m37s
build / docs (push) Successful in 1m48s
2026-03-06 10:06:39 -08:00
23e451e641 Treat Borg "file not found" warnings (exit code 107) as warnings again instead of errors. Also un-deprecate the "source_directories_must_exist" option and default it to true (#1248). 2026-03-05 13:14:03 -08:00
43d8c25234 Disable BenchNine font the in borgmatic docs tarball, because Debian policy doesn't allow fonts they don't compile themselves.
All checks were successful
build / test (push) Successful in 7m36s
build / docs (push) Successful in 1m41s
2026-03-02 23:19:03 -08:00
e693e42b9e Minor Python modernization fixes.
All checks were successful
build / test (push) Successful in 11m6s
build / docs (push) Successful in 2m8s
2026-03-02 20:47:11 -08:00
1abbfe8ee6 Add doc development updates to NEWS and get Podman + Docker Compose working again (#1274).
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 1m18s
2026-03-01 11:55:56 -08:00
8a65b43ae3 Allow dev users to select the port that is listened on when building docs (#1274).
All checks were successful
build / test (push) Successful in 7m43s
build / docs (push) Successful in 1m45s
Reviewed-on: #1274
Reviewed-by: Dan Helfman <witten@torsion.org>
2026-03-01 19:37:13 +00:00
dbbce4167f Probe for podman-compose instead, and use it, otherwise fallback to docker-compose.
All checks were successful
build / test (pull_request) Successful in 8m28s
build / docs (pull_request) Has been skipped
2026-03-01 16:55:43 +11:00
68c2a4d231 Add "files_changed" and "msgpack_version_check" to NEWS.
All checks were successful
build / test (push) Successful in 7m44s
build / docs (push) Successful in 1m33s
2026-02-27 23:26:02 -08:00
12e92acd15 Add "files_changed" and "msgpack_version_check" options (#1175).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1272
2026-02-28 07:19:55 +00:00
1ada61a1d3 ruff formatting?
All checks were successful
build / test (pull_request) Successful in 7m44s
build / docs (pull_request) Has been skipped
2026-02-28 09:40:41 +05:30
75dcd41050 test reconfigured
Some checks failed
build / test (pull_request) Failing after 1m55s
build / docs (pull_request) Has been skipped
2026-02-28 09:28:26 +05:30
a6878829a2 Expand tests for "diff" actions (#1243).
All checks were successful
build / test (push) Successful in 8m27s
build / docs (push) Successful in 1m37s
2026-02-27 19:23:20 -08:00
7a44be38b7 Add "diff" action to NEWS (#1243).
All checks were successful
build / test (push) Successful in 7m36s
build / docs (push) Successful in 1m35s
2026-02-26 17:24:34 -08:00
92add238d9 Add a "diff" action for viewing the difference between two archives (#1243).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1253
Reviewed-by: Dan Helfman <witten@torsion.org>
2026-02-27 01:19:21 +00:00
24e1e38615 Merge branch 'main' into add-diff
All checks were successful
build / test (pull_request) Successful in 7m38s
build / docs (pull_request) Has been skipped
2026-02-27 00:29:18 +00:00
cb8b298648 Final changes. This modifies the dev-docs script a little to either use docker-compose or podman-compose. I've found that Podman runs smoother this way, and it isn't required to install docker-compose.
All checks were successful
build / test (pull_request) Successful in 8m30s
build / docs (pull_request) Has been skipped
2026-02-27 11:24:45 +11:00
eaf3d959e6 More test changes.
All checks were successful
build / test (pull_request) Successful in 7m38s
build / docs (pull_request) Has been skipped
2026-02-26 13:56:46 +11:00
c2449ad811 Tweak spot check error output for clarity (#1228).
All checks were successful
build / test (push) Successful in 7m36s
build / docs (push) Successful in 1m34s
2026-02-25 14:20:59 -08:00
89703334f3 Add more doco.
All checks were successful
build / test (pull_request) Successful in 7m43s
build / docs (pull_request) Has been skipped
2026-02-26 08:51:11 +11:00
ee32cc19e9 change BORG_MSGPACK_VERSION_CHECK to default bool
Some checks failed
build / test (pull_request) Failing after 1m50s
build / docs (pull_request) Has been skipped
2026-02-25 19:58:08 +05:30
ceb487a6b9 Fixed documentation in schema
All checks were successful
build / test (pull_request) Successful in 7m40s
build / docs (pull_request) Has been skipped
2026-02-25 19:54:10 +05:30
f90d7a99c6 Add the CLI doco generation for the diff action.
All checks were successful
build / test (pull_request) Successful in 7m38s
build / docs (pull_request) Has been skipped
2026-02-25 17:22:39 +11:00
012c02d962 Add the CLI doco generation for the diff action.
All checks were successful
build / test (pull_request) Successful in 7m38s
build / docs (pull_request) Has been skipped
2026-02-25 17:06:16 +11:00
607ff20971 Merge branch 'main' into docs-port-config
All checks were successful
build / test (pull_request) Successful in 7m44s
build / docs (pull_request) Has been skipped
2026-02-25 04:59:59 +00:00
bf2a1c6b25 Allow dev users to select the port that is listened on.
All checks were successful
build / test (pull_request) Successful in 8m25s
build / docs (pull_request) Has been skipped
2026-02-25 15:22:45 +11:00
7dbdd103d1 Adjust the "spot" check so error output includes more information about what failed (#1228).
All checks were successful
build / test (push) Successful in 8m39s
build / docs (push) Successful in 1m38s
2026-02-24 16:51:55 -08:00
06e2b4f2c7 Attempt to use with_args().
All checks were successful
build / test (pull_request) Successful in 7m43s
build / docs (pull_request) Has been skipped
2026-02-24 11:28:36 +11:00
6cfa31e2c2 Merge branch 'main' into add-diff
All checks were successful
build / test (pull_request) Successful in 7m50s
build / docs (pull_request) Has been skipped
2026-02-23 22:38:17 +00:00
3473f034ae Fix the "spot" check to skip hard links, as Borg doesn't produces hashes for them (#1236).
All checks were successful
build / test (push) Successful in 8m25s
build / docs (push) Successful in 1m36s
2026-02-22 21:25:27 -08:00
7dcb4e3c3a added BORG_MSGPACK_VERSION_CHECK, no test
All checks were successful
build / test (pull_request) Successful in 7m42s
build / docs (pull_request) Has been skipped
2026-02-23 06:03:06 +05:30
42c006cf1d Next raft of suggested fixes.
All checks were successful
build / test (pull_request) Successful in 8m29s
build / docs (pull_request) Has been skipped
2026-02-23 11:03:25 +11:00
ea2a253134 added --files-changed flag 2026-02-22 13:17:09 +05:30
7ca42a8f4f Follow symlinks when backing up borgmatic configuration files to support the "bootstrap" action (#1270).
All checks were successful
build / test (push) Successful in 8m24s
build / docs (push) Successful in 1m39s
2026-02-20 19:55:52 -08:00
4f25581a12 A bit of ruff, and some WIP tests.
All checks were successful
build / test (pull_request) Successful in 7m41s
build / docs (pull_request) Has been skipped
2026-02-21 13:38:49 +11:00
394f33f28a Make sort-by a comma separated list.
Some checks failed
build / test (pull_request) Failing after 1m52s
build / docs (pull_request) Has been skipped
2026-02-20 14:32:52 +11:00
f5ff2f9ae3 Make the default to diff the full archives, and add a "--only-patterns" flag if a diff with patterns is desired.
Some checks failed
build / test (pull_request) Failing after 1m53s
build / docs (pull_request) Has been skipped
2026-02-20 12:29:13 +11:00
67eb48e643 Add a policy about the use of generative AI in the borgmatic codebase.
All checks were successful
build / test (push) Successful in 8m22s
build / docs (push) Successful in 1m36s
2026-02-19 11:11:57 -08:00
c7c2ef048c Remove GitHub PRs URL from contributor fetching script.
All checks were successful
build / test (push) Successful in 7m38s
build / docs (push) Successful in 1m33s
2026-02-17 11:00:16 -08:00
90d1857494 Remove GitHub pull request template, because PRs are disabled there now.
Some checks failed
build / test (push) Successful in 11m17s
build / docs (push) Failing after 46s
2026-02-17 10:16:47 -08:00
55375cc9e7 Fix the ZFS hook to support datasets with a "canmount" property of "noauto" (#1269).
All checks were successful
build / test (push) Successful in 7m33s
build / docs (push) Successful in 1m22s
2026-02-15 11:06:34 -08:00
d532fc0f88 Add a "config show" action to display computed borgmatic configuration as YAML or JSON (#1218).
All checks were successful
build / test (push) Successful in 8m15s
build / docs (push) Successful in 1m36s
2026-02-14 21:30:53 -08:00
6501bd9823 A small raft of changes to address comments raised.
Some checks failed
build / test (pull_request) Failing after 1m49s
build / docs (pull_request) Has been skipped
2026-02-13 16:02:14 +11:00
477320e36c Merge branch 'main' into add-diff
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2026-02-08 22:35:08 +00:00
ad8d074eff Bump version for release.
All checks were successful
build / test (push) Successful in 7m46s
build / docs (push) Successful in 1m32s
2026-02-06 12:53:27 -08:00
fc7439af3a If a source file is deleted during a "spot" check, consider the file as non-matching and move on instead of immediately failing the entire (#1231).
All checks were successful
build / test (push) Successful in 8m57s
build / docs (push) Successful in 1m47s
2026-02-05 23:11:59 -08:00
ea05a4660c Deduplicate overlapping source directories and patterns so they don't throw off "spot" check file counts and cause spurious check failures.
All checks were successful
build / test (push) Successful in 7m49s
build / docs (push) Successful in 1m30s
2026-02-05 12:50:39 -08:00
957f6be4a2 Switch to iterable unpacking (#1252).
All checks were successful
build / test (push) Successful in 7m47s
build / docs (push) Successful in 1m47s
2026-02-05 10:38:07 -08:00
730a4b2f18 Work around Borg returning a warning exit code when a repository/archive check fails (#1252).
Some checks failed
build / test (push) Failing after 3m13s
build / docs (push) Has been skipped
2026-02-05 10:19:06 -08:00
c64c79ad0e Fix for SSH warnings from Borg showing up as JSON logs even without the "--log-json" flag (#1260).
All checks were successful
build / test (push) Successful in 9m3s
build / docs (push) Successful in 1m49s
2026-02-03 10:12:15 -08:00
acd1a8d1dd Update ntfy test to use @pytest.mark.parametrize (#1251)
All checks were successful
build / test (push) Successful in 9m29s
build / docs (push) Successful in 2m15s
2026-02-02 11:58:50 -08:00
c66fde4a93 Fix ntfy monitoring hook to send tags as an array (#1251).
All checks were successful
build / test (push) Successful in 7m47s
build / docs (push) Successful in 1m33s
Reviewed-on: #1259
Reviewed-by: Dan Helfman <witten@torsion.org>
2026-02-02 19:43:50 +00:00
dbe3891819 Merge branch 'main' into fix-ntfy-tags-schema-array
All checks were successful
build / test (pull_request) Successful in 7m50s
build / docs (pull_request) Has been skipped
2026-02-02 13:16:27 +00:00
dc89c9ec73 Update and test the convert_string_to_array function.
All checks were successful
build / test (pull_request) Successful in 7m51s
build / docs (pull_request) Has been skipped
2026-02-02 18:26:38 +08:00
a27dc95c87 Fix a "codec can't decode byte" error when running commands that output multi-byte unicode characters (#1258).
All checks were successful
build / test (push) Successful in 8m58s
build / docs (push) Successful in 1m49s
2026-02-01 20:15:03 -08:00
6b5390f5dd Send tags as array in ntfy monitoring hook.
All checks were successful
build / test (pull_request) Successful in 7m49s
build / docs (pull_request) Has been skipped
2026-02-01 15:47:13 +08:00
fd485e64a3 Fix incorrect deprecated hook option name in documentation.
All checks were successful
build / test (push) Successful in 7m55s
build / docs (push) Successful in 1m47s
2026-01-30 22:43:54 -08:00
f5de6bf43c Clarify command hooks documentation about YAML sequences (#1255).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2026-01-30 22:37:12 -08:00
6e611f9b38 arg fixes.
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2026-01-30 13:57:14 +11:00
06ebff878b Add the other supported args.
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2026-01-30 13:27:09 +11:00
38cc5d4ee4 Half clueless attempt at fixing test_schema.py.
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2026-01-30 11:52:47 +11:00
794e7eadab Make the action actually work. PR still pending a bunch of stuff.
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2026-01-29 17:38:06 +11:00
de35ed82be Initial commit (unfinished) to address #1243.
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2026-01-29 14:35:20 +11:00
aa25dc7b31 Fix a regression in which the "--stats" flag hides statistics at default verbosity (#1250).
All checks were successful
build / test (push) Successful in 9m10s
build / docs (push) Successful in 1m47s
2026-01-28 11:49:24 -08:00
aba45f03d6 Bump version for release. 2026-01-27 13:09:10 -08:00
f6124528df When the "unsafe_skip_path_validation_before_create" option is enabled, don't log a warning about it (#1244).
All checks were successful
build / test (push) Successful in 8m59s
build / docs (push) Successful in 1m45s
2026-01-25 12:17:35 -08:00
b67dcf829e Fix a regression in which the ntfy monitoring hook failed to send a ping when the "priority" option was set (#1246).
All checks were successful
build / test (push) Successful in 7m50s
build / docs (push) Successful in 1m32s
2026-01-24 16:35:55 -08:00
71e25756f2 Fix a regression in which the KeePassXC credential hook password prompt was invisible (#1245).
All checks were successful
build / test (push) Successful in 7m51s
build / docs (push) Successful in 1m31s
2026-01-24 16:17:32 -08:00
ff2f9fd5ee Add an additional test and "fix" code coverage (#1242).
All checks were successful
build / test (push) Successful in 7m53s
build / docs (push) Successful in 1m45s
2026-01-24 12:28:33 -08:00
ca4447ffab Fix "spot" check hang (#1242).
Some checks failed
build / test (push) Failing after 2m0s
build / docs (push) Has been skipped
Reviewed-on: #1247
2026-01-24 20:20:08 +00:00
104fe35e39 Add another test to get some additional coverage that's timing dependent (#1242).
All checks were successful
build / test (pull_request) Successful in 7m49s
build / docs (pull_request) Has been skipped
2026-01-23 23:04:15 -08:00
248fa1db64 Add automated tests for new code (#1242).
Some checks failed
build / test (pull_request) Failing after 2m7s
build / docs (pull_request) Has been skipped
2026-01-23 22:50:37 -08:00
97f7c65f6c More refactoring and test fixes (#1242).
Some checks failed
build / test (pull_request) Failing after 1m57s
build / docs (pull_request) Has been skipped
2026-01-22 23:01:34 -08:00
765eba5315 Get existing unit/integration tests passing (#1242). 2026-01-22 17:29:30 -08:00
bd051beced Structural refactor just to get code out of log_outputs() and into separate utility functions (#1242).
Some checks failed
build / test (pull_request) Failing after 2m1s
build / docs (pull_request) Has been skipped
2026-01-22 14:02:48 -08:00
d5cd4efecd Fix spot check hang (#1242). 2026-01-22 10:27:47 -08:00
13fd225a0b Abolish ICE.
All checks were successful
build / test (push) Successful in 7m42s
build / docs (push) Successful in 1m39s
2026-01-21 19:29:22 -08:00
87c5863218 Some cleanup and also fix delayed logs (#1242). 2026-01-19 22:22:15 -08:00
677871aa89 Initial stab at fixing spot check hang by actually draining and consuming buffers after a process exits (#1242). 2026-01-19 16:26:22 -08:00
d2390581e7 Fix implicit string concatenation instead of trying to paper over it (incidental work included in #1241).
All checks were successful
build / test (push) Successful in 7m45s
build / docs (push) Successful in 1m44s
2026-01-18 20:56:29 -08:00
efd0f0d618 For the "recreate" action, actually pass the "--dry-run" flag through to Borg instead of just skipping the Borg call (#1241).
Some checks failed
build / test (push) Failing after 7m1s
build / docs (push) Has been skipped
2026-01-18 18:39:29 -08:00
4ff7dccab4 Expand on archive argument to recreate (#1239).
All checks were successful
build / test (push) Successful in 7m42s
build / docs (push) Successful in 1m33s
Reviewed-on: #1239
2026-01-17 03:15:21 +00:00
76537f6c11 Expand on archive argument
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
Make a small but specific help expansion on the `archive` option.
2026-01-17 02:45:15 +00:00
486a5fb6b5 Bump version for release.
All checks were successful
build / test (push) Successful in 9m20s
build / docs (push) Successful in 1m40s
2026-01-16 12:42:25 -08:00
2419ae314e Add "unsafe_skip_path_validation_before_create" option to documentation (#1221).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2026-01-16 12:41:12 -08:00
f73a79d647 Fix another warning from LVM about leaked file descriptors, this time when calling "lvcreate" from a command hook (#1230).
All checks were successful
build / test (push) Successful in 7m51s
build / docs (push) Successful in 1m29s
2026-01-16 12:04:32 -08:00
5c55402021 Fix for the ntfy monitoring hook erroring on emojis in the "title" option (#1234).
All checks were successful
build / test (push) Successful in 7m49s
build / docs (push) Successful in 1m30s
2026-01-16 10:04:14 -08:00
2bb818402d Fix the "recreate" action to include borgmatic-specific paths (database dumps, etc.) in recreated archives.
All checks were successful
build / test (push) Successful in 7m53s
build / docs (push) Successful in 1m32s
2026-01-15 22:16:41 -08:00
beecdada68 Several related fixes and improvements in logging, output capturing, and command execution (#1235).
All checks were successful
build / test (push) Successful in 7m52s
build / docs (push) Successful in 1m51s
Reviewed-on: #1235
2026-01-16 03:28:46 +00:00
7e4a894cc4 Prevent Borg error-level log about repo not existing when "borgmatic repo-create" probes for repo existence.
All checks were successful
build / test (pull_request) Successful in 7m52s
build / docs (pull_request) Has been skipped
2026-01-14 22:38:09 -08:00
e39c503fb7 Add missing test coverage and fix log_outputs() variable use.
All checks were successful
build / test (pull_request) Successful in 7m53s
build / docs (pull_request) Has been skipped
2026-01-14 22:18:19 -08:00
c301858cca MOAR --log-json.
All checks were successful
build / test (pull_request) Successful in 12m37s
build / docs (pull_request) Has been skipped
2026-01-14 21:59:36 -08:00
762beb46c2 Fix "restore" action and broken end-to-end tests.
All checks were successful
build / test (pull_request) Successful in 7m59s
build / docs (pull_request) Has been skipped
2026-01-14 12:54:36 -08:00
d354cf0942 Get unit/integration tests passing.
Some checks failed
build / test (pull_request) Failing after 7m13s
build / docs (pull_request) Has been skipped
2026-01-13 16:02:02 -08:00
64e25144a8 Going back to using readline() for reading lines from executed programs.
Some checks failed
build / test (pull_request) Failing after 7m37s
build / docs (pull_request) Has been skipped
2026-01-13 10:08:40 -08:00
c4de141899 Several related fixes and improvements in logging, output capturing, and command execution.
Some checks failed
build / test (pull_request) Failing after 33m47s
build / docs (pull_request) Has been cancelled
2026-01-12 15:26:50 -08:00
10f2d6bdfd Revert "Fix for stderr warnings from ssh dirtying Borg JSON output and breaking "check" (#485)."
This reverts commit 7987a5ff1f.
2026-01-11 10:00:08 -08:00
7bb27e5366 Revert "Fix for incorrect use of "--log-json" when looking up latest archive (#1204)."
This reverts commit 2c530cc1b9.
2026-01-11 09:51:50 -08:00
2c530cc1b9 Fix for incorrect use of "--log-json" when looking up latest archive (#1204).
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 1m23s
2026-01-10 21:25:20 -08:00
9a1c84f645 Fix broken end-to-end tests (#1092).
All checks were successful
build / test (push) Successful in 7m44s
build / docs (push) Successful in 1m46s
2026-01-10 21:04:59 -08:00
7987a5ff1f Fix for stderr warnings from ssh dirtying Borg JSON output and breaking "check" (#485). 2026-01-10 20:55:35 -08:00
bdd2258701 BREAKING: Treat most Borg warnings as errors by default and deprecate the "source_directories_must_exist" option (#1092).
Some checks failed
build / test (push) Failing after 12m9s
build / docs (push) Has been skipped
2026-01-10 19:35:07 -08:00
022d7a4bc7 Fix accidentally commented out tests.
All checks were successful
build / test (push) Successful in 10m16s
build / docs (push) Successful in 2m26s
2026-01-10 12:03:51 -08:00
5cb2af4683 Disable Loki buffering when log sending is disabled, and fix monitoring end-to-end tests (#1132).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2026-01-10 11:59:01 -08:00
774436817a BREAKING/SECURITY: For the Healthchecks, Apprise, Pagerduty, and Loki monitoring hooks, disable log sending when not explicitly enabled (#1132).
Some checks failed
build / test (push) Failing after 34m46s
build / docs (push) Has been cancelled
2026-01-09 22:25:50 -08:00
a5f7c8cafc Reduce memory consumption of "create" action path validation (#1225).
All checks were successful
build / test (push) Successful in 9m27s
build / docs (push) Successful in 1m59s
Reviewed-on: #1227
2026-01-09 21:29:07 +00:00
6c7af8c2bb Merge branch 'main' into reduce-path-validation-memory-consumption
All checks were successful
build / test (pull_request) Successful in 8m53s
build / docs (pull_request) Has been skipped
2026-01-09 13:02:59 -08:00
3e4115cc92 For the "extract"/"restore" actions, fix use of "--log-json" when extracting to stdout (#485).
All checks were successful
build / test (push) Successful in 8m36s
build / docs (push) Successful in 1m49s
2026-01-09 13:02:04 -08:00
d589d351ed Merge branch 'main' into reduce-path-validation-memory-consumption 2026-01-09 12:17:57 -08:00
bb149e4ee8 Upgrade urllib3 in test requirements for security fix.
All checks were successful
build / test (push) Successful in 9m17s
build / docs (push) Successful in 2m3s
2026-01-09 12:14:31 -08:00
4e6319f5d3 In the "export-tar" action, fix the use of "--log-json" when exporting to stdout (#485).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2026-01-09 12:12:42 -08:00
528dc6fe87 For the "mount" action, fix use of "--log-json" when "--foreground" is set (#485).
All checks were successful
build / test (push) Successful in 8m26s
build / docs (push) Successful in 1m59s
2026-01-09 12:01:21 -08:00
6f4f1fa16e For the "key export" action, fix use of "--log-json" when exporting to stdout (#485).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2026-01-09 11:57:27 -08:00
fd373cfefc Fix for an error in the "key import" action when importing a key from stdin.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2026-01-09 11:51:14 -08:00
4d26650884 Fix incorrect use of "--log-json" in the "key change-passphrase" action (#485). 2026-01-08 22:54:37 -08:00
776bf3fcd4 Track "last lines" per-process instead of per-buffer, now that each process can have multiple active buffers (#485).
All checks were successful
build / test (push) Successful in 8m55s
build / docs (push) Successful in 1m56s
2026-01-08 22:26:15 -08:00
a23d889c6d Merge branch 'main' into reduce-path-validation-memory-consumption 2026-01-08 21:30:10 -08:00
1299aefeff For the "repo-delete" action, don't pass "--log-json" to Borg when running Borg interacively (#485).
All checks were successful
build / test (push) Successful in 8m52s
build / docs (push) Successful in 1m52s
2026-01-08 21:29:15 -08:00
0c79126ccd Merge branch 'main' into reduce-path-validation-memory-consumption 2026-01-08 21:14:14 -08:00
4eeba085de Add disclaimer to individual documentation pages about options/flags and borgmatic versions.
All checks were successful
build / test (push) Successful in 13m56s
build / docs (push) Successful in 2m14s
2026-01-08 21:08:29 -08:00
536b24f6ab Merge branch 'main' into reduce-path-validation-memory-consumption
All checks were successful
build / test (pull_request) Successful in 8m35s
build / docs (pull_request) Has been skipped
2026-01-08 10:44:56 -08:00
bc8649e11a For the "repo-info" action, don't pass "--log-json" to Borg when "--json" is also set (#485).
All checks were successful
build / test (push) Successful in 8m29s
build / docs (push) Successful in 1m52s
2026-01-08 10:42:35 -08:00
0ffa4ec429 For the "repo-create" action, don't pass "--log-json" to Borg, as its output isn't captured and parsed (#485).
All checks were successful
build / test (push) Successful in 8m37s
build / docs (push) Successful in 2m5s
2026-01-08 10:27:02 -08:00
cf78ad681d NEWS clarifications.
All checks were successful
build / test (pull_request) Successful in 9m6s
build / docs (pull_request) Has been skipped
2026-01-07 23:25:25 -08:00
a308ffca64 Add missing test coverage (#1225).
All checks were successful
build / test (pull_request) Successful in 8m41s
build / docs (pull_request) Has been skipped
2026-01-07 22:13:55 -08:00
6407b3bd80 Fix existing tests (#1225).
All checks were successful
build / test (pull_request) Successful in 8m34s
build / docs (pull_request) Has been skipped
2026-01-07 19:58:25 -08:00
aa6b6e0d96 Fix many tests (#1225).
Some checks failed
build / test (pull_request) Failing after 5m29s
build / docs (pull_request) Has been skipped
2026-01-06 22:32:42 -08:00
e2f7cd8edc Reorganize path validation logic (#1225).
Some checks failed
build / test (pull_request) Failing after 3m42s
build / docs (pull_request) Has been skipped
2026-01-06 16:55:36 -08:00
310b287cff Make execute_command_with_processes() a generator like execute_command_and_capture_output() (#1225).
Some checks failed
build / test (pull_request) Failing after 3m37s
build / docs (pull_request) Has been skipped
2026-01-06 15:39:19 -08:00
305ac0d65d Various fixes and efficiency improvements related to captured output changes (#1225).
Some checks failed
build / test (pull_request) Failing after 3m56s
build / docs (pull_request) Has been skipped
2026-01-06 15:27:04 -08:00
d9d30d12cd Opportunistic efficiency improvements in spot check (#1225). 2026-01-06 15:11:54 -08:00
cc14678eed Add NEWS entry (#1225).
Some checks failed
build / test (pull_request) Failing after 3m48s
build / docs (pull_request) Has been skipped
2026-01-06 14:37:33 -08:00
549707d28b Reduce memory consumption of "create" action path validation (#1225)
Some checks failed
build / test (pull_request) Failing after 8m31s
build / docs (pull_request) Has been skipped
2026-01-06 14:30:50 -08:00
b0e083eff2 BREAKING: Support disabling both constant and variable interpolation by escaping with backslashes (#1213).
All checks were successful
build / test (push) Successful in 9m4s
build / docs (push) Successful in 1m55s
2026-01-05 15:39:14 -08:00
71291409fe SECURITY: Prevent shell injection attacks via constant interpolation in command hooks.
All checks were successful
build / test (push) Successful in 9m13s
build / docs (push) Successful in 2m1s
2026-01-04 21:56:53 -08:00
7deab735fd Add a NEWS entry for the "unsafe_skip_path_validation_before_create" option (#1221).
All checks were successful
build / test (push) Successful in 9m19s
build / docs (push) Successful in 2m8s
2026-01-04 20:48:13 -08:00
6db2622cce Add "unsafe_skip_path_validation_before_create" option to skip pre-backup validation (#1221).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1222
2026-01-05 04:39:49 +00:00
8fdf18e471 Add NEWS entry for "extract" check progress support (#1224).
All checks were successful
build / test (push) Successful in 11m41s
build / docs (push) Successful in 2m13s
2026-01-04 20:12:18 -08:00
a220f20653 Run borg with --progress during extract dry run if passed to borgmatic check (#1224).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1224
2026-01-05 04:09:01 +00:00
Simon Pilkington
c0b4c596ef Run borg with --progress during extract dry run if passed to borgmatic check.
All checks were successful
build / test (pull_request) Successful in 9m13s
build / docs (pull_request) Has been skipped
2026-01-05 03:40:01 +01:00
3bec359355 Merge branch 'main' into add-unsafe-create-without-precheck-option
All checks were successful
build / test (pull_request) Successful in 9m1s
build / docs (pull_request) Has been skipped
2026-01-04 22:07:15 +00:00
Julien Cornebise
c08f1b8178 Rename unsafe_create_without_precheck to unsafe_skip_path_validation_before_create and address PR feedback (#1222).
All checks were successful
build / test (pull_request) Successful in 9m10s
build / docs (pull_request) Has been skipped
- Use skip_ prefix consistent with other borgmatic options
- Reduce runtime warning to single line (users read the config docs)
- Broaden "database dumps" to "data from borgmatic data source hooks"
- Simplify schema docs by referencing user_runtime_directory instead of listing defaults
2026-01-04 22:02:47 +00:00
c58b9f1c67 Promote the ZFS, LVM, and Btrfs hooks from beta features to stable.
All checks were successful
build / test (push) Successful in 9m11s
build / docs (push) Successful in 2m22s
2026-01-03 22:33:17 -08:00
0f3234d681 Cleanup snapshots immediately after ZFS, LVM, or Btrfs hooks error (#1220).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2026-01-03 22:22:55 -08:00
ead3028e9d Elevate command stderr to error logs, add "--log-json" support for borgmatic logs, and log Borg output at varying log levels based on verbosities (#485, #858, #1204).
All checks were successful
build / test (push) Successful in 9m41s
build / docs (push) Successful in 2m40s
Reviewed-on: #1207
2026-01-04 03:06:21 +00:00
4264575345 NEWS clarifications.
All checks were successful
build / test (pull_request) Successful in 8m51s
build / docs (pull_request) Has been skipped
2026-01-03 19:02:55 -08:00
bb36d8f00f Spelling.
All checks were successful
build / test (pull_request) Successful in 8m56s
build / docs (pull_request) Has been skipped
2026-01-03 17:21:46 -08:00
3c84c92968 Add documentation for systemd journal integration and also the "--log-json" flag.
Some checks failed
build / test (pull_request) Failing after 3m37s
build / docs (pull_request) Has been skipped
2026-01-03 14:18:33 -08:00
Julien Cornebise
7e1cb691b6 Add "unsafe_create_without_precheck" option to skip pre-backup validation (#1221).
All checks were successful
build / test (pull_request) Successful in 8m54s
build / docs (pull_request) Has been skipped
This option allows users to skip the dry-run validation that checks for
special files and runtime directory exclusions. This can significantly
improve performance for large filesystems with millions of files, where
the validation can take hours.

The option name includes "unsafe" to communicate risk, and a warning is
logged on each backup showing the runtime directory path and advising
users to verify their exclude patterns manually.
2026-01-03 20:54:27 +01:00
92c141602d Fix typo in test name. 2026-01-03 10:06:39 -08:00
3c2099f587 Add missing test for log_outputs() stderr -> ERROR log.
All checks were successful
build / test (pull_request) Successful in 15m4s
build / docs (pull_request) Has been skipped
2026-01-02 23:04:53 -08:00
233a9054c9 Merge branch 'main' into subprocess-stderr-to-error-logs
All checks were successful
build / test (pull_request) Successful in 9m10s
build / docs (pull_request) Has been skipped
2026-01-02 18:51:16 -08:00
76c0432fca Fix end-to-end tests.
All checks were successful
build / test (pull_request) Successful in 13m31s
build / docs (pull_request) Has been skipped
2026-01-02 14:57:38 -08:00
6f075f52fd Get unit/integration tests passing.
Some checks failed
build / test (pull_request) Failing after 3m16s
build / docs (pull_request) Has been skipped
2026-01-01 22:24:56 -08:00
b19e0e6455 Add some missing execute.py test coverage.
Some checks failed
build / test (pull_request) Failing after 2m48s
build / docs (pull_request) Has been skipped
2025-12-31 23:05:50 -08:00
11253d2b1d Get existing test passing.
Some checks failed
build / test (pull_request) Failing after 3m37s
build / docs (pull_request) Has been skipped
2025-12-30 23:19:10 -08:00
9f6cce2a39 Get several existing tests passing and refactor logging of lines from external programs.
Some checks failed
build / test (pull_request) Failing after 3m39s
build / docs (pull_request) Has been skipped
2025-12-30 22:25:12 -08:00
7388e6f5b9 Support journald logging critical.
Some checks failed
build / test (pull_request) Failing after 5m0s
build / docs (pull_request) Has been skipped
2025-12-28 23:14:09 -08:00
7883be2f42 Crept scope to include:
Some checks failed
build / test (pull_request) Failing after 10m0s
build / docs (pull_request) Has been skipped
* #858: With the "--log-json" flag, log borgmatic's own logs as JSON, not just Borg's.
 * #1204: When verbosity levels differ between console/monitoring/syslog/file, log Borg's output to each one at a different level.
 * When syslog verbosity is enabled, log to systemd's journal (if present) with structured data.
2025-12-28 22:55:03 -08:00
ec8168af46 Fix an error about the runtime directory getting excluded by tweaking its logic and lowering the error to a warning (#1211).
All checks were successful
build / test (push) Successful in 14m9s
build / docs (push) Successful in 2m34s
2025-12-26 22:53:21 -08:00
126b08b1ac Merge branch 'main' of ssh://projects.torsion.org:3022/borgmatic-collective/borgmatic
All checks were successful
build / test (push) Successful in 14m26s
build / docs (push) Successful in 2m44s
2025-12-26 09:48:21 -08:00
802ca5aef3 Fix an error when running the "spot" check or "extract" action with the "progress" option or "--progress" flag (#1210). 2025-12-26 09:46:39 -08:00
6de87b6cf6 Fix for the database "restore" action restoring more databases than the "--database" flag specifies (#1208).
All checks were successful
build / test (push) Successful in 8m57s
build / docs (push) Successful in 2m29s
Reviewed-on: #1209
2025-12-25 22:05:19 +00:00
047a374514 Fix existing automated tests (#1208).
All checks were successful
build / test (pull_request) Successful in 9m20s
build / docs (pull_request) Has been skipped
2025-12-25 13:56:01 -08:00
00e2284662 When creating patterns for a "borg extract" during a restore, match directory format dumps too. Also make dump restore ordering to be deterministic (#1208).
Some checks failed
build / test (pull_request) Failing after 3m43s
build / docs (pull_request) Has been skipped
2025-12-24 12:56:52 -08:00
ef7e934f5b Merge branch 'main' into fix-restore-too-many-databases 2025-12-24 10:43:10 -08:00
a3750d1e06 Fix an error when restoring multiple directory-format database dumps at once (#1212).
All checks were successful
build / test (push) Successful in 8m48s
build / docs (push) Successful in 2m17s
2025-12-23 20:28:15 -08:00
ea25d969cb Fix typo in MySQL hook (#1208).
Some checks failed
build / test (pull_request) Failing after 10m9s
build / docs (pull_request) Has been skipped
2025-12-22 16:02:53 -08:00
b8642439cd Fix for the database "restore" action restoring more databases than the "--database" flag specifies (#1208).
Some checks failed
build / test (pull_request) Failing after 9m42s
build / docs (pull_request) Has been skipped
2025-12-22 15:46:28 -08:00
45d35614f2 Fix several tests (#485). 2025-12-22 11:52:55 -08:00
1b046fd3e7 When running commands (database clients, command hooks, etc.), elevate stderr output to borgmatic error logs (#485).
Some checks failed
build / test (pull_request) Failing after 9m8s
build / docs (pull_request) Has been skipped
2025-12-21 21:49:58 -08:00
3c8935fd69 Remove NEWS entry that was from a previous release.
All checks were successful
build / test (push) Successful in 8m17s
build / docs (push) Successful in 1m47s
2025-12-20 17:31:55 -08:00
08ff743cd7 Bump version for release. 2025-12-20 17:16:51 -08:00
406b533b15 Adjust Btrfs snapshot paths so that Borg 1.x gets file cache hits when backing them up (#1206).
All checks were successful
build / test (push) Successful in 8m45s
build / docs (push) Successful in 2m5s
Reviewed-on: #1206
2025-12-21 01:10:33 +00:00
18a1d4f00b Update documention mentioning Btrfs snapshot path containing process ID (#1206).
All checks were successful
build / test (pull_request) Successful in 8m19s
build / docs (pull_request) Has been skipped
2025-12-20 17:01:06 -08:00
54d955bc95 Fix automated tests and update NEWS (#1206).
All checks were successful
build / test (pull_request) Successful in 8m18s
build / docs (pull_request) Has been skipped
2025-12-20 16:59:13 -08:00
a72f9b24b5 Merge branch jacksonchen666-btrfs-remove-pid into btrfs-remove-pid and streamline the docs a bit.
Some checks failed
build / test (pull_request) Failing after 2m57s
build / docs (pull_request) Has been skipped
2025-12-20 16:02:42 -08:00
1b471f5346 Code formatting (#1054).
All checks were successful
build / test (push) Successful in 9m3s
build / docs (push) Successful in 2m18s
2025-12-19 23:20:38 -08:00
9428a92297 Fix broken Btrfs end-to-end test (#1054).
Some checks failed
build / test (push) Failing after 3m31s
build / docs (push) Has been skipped
2025-12-19 23:10:33 -08:00
c0d4489c25 Add unnecessary fake Btrfs read-only flag in end-to-end test (#1054).
Some checks failed
build / test (push) Failing after 8m48s
build / docs (push) Has been skipped
2025-12-19 19:15:09 -08:00
b4ea45ab74 Allow the Btrfs hook to create and delete snapshots even when running as a non-root user (#1054).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-12-19 19:10:31 -08:00
6ae9b973fc For the MariaDB and MySQL database hooks, creates a consistent snapshot by dumping all tables in a single transaction (#1193).
All checks were successful
build / test (push) Successful in 15m18s
build / docs (push) Successful in 2m20s
2025-12-19 11:53:30 -08:00
01c7d0a0db Fix that errors and exits when the borgmatic runtime directory is partially excluded by configured excludes (#1203).
All checks were successful
build / test (push) Successful in 19m7s
build / docs (push) Successful in 3m6s
2025-12-18 19:04:42 -08:00
a31f913f54 For the MariaDB and MySQL database hooks, add a "socket_path" option for Unix socket database connections (#1193).
All checks were successful
build / test (push) Successful in 15m39s
build / docs (push) Successful in 2m21s
2025-12-14 21:13:21 -08:00
0b086a3c18 Fix documentation typo (#1201).
All checks were successful
build / test (push) Successful in 9m13s
build / docs (push) Successful in 2m19s
2025-12-13 10:02:41 -08:00
dfdb1cb15e Document a problematic interaction between borgmatic and systemd-tmpfiles (#1201).
Some checks failed
build / test (push) Failing after 3m19s
build / docs (push) Has been skipped
2025-12-13 09:57:33 -08:00
c8307065fa Add a "file_list_format" option for setting the "list" action's output format and an "archive_list_format" option for setting the "repo-list" action's format (#1179).
All checks were successful
build / test (push) Successful in 17m12s
build / docs (push) Successful in 2m47s
2025-12-12 22:31:41 -08:00
ae00770c35 Upgrade urllib3 in test requirements for security fixes.
All checks were successful
build / test (push) Successful in 9m32s
build / docs (push) Successful in 2m29s
2025-12-09 11:01:18 -08:00
77782bc215 "Fix" code coverage complaint.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-12-09 10:59:30 -08:00
ff2009fe19 Fix ruff errors by removing unused imports (#1200).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1200
2025-12-09 18:57:58 +00:00
141f2d68c1 Fix ruff errors by removing unused imports.
Some checks failed
build / test (pull_request) Failing after 34m30s
build / docs (pull_request) Has been cancelled
2025-12-09 11:47:47 +01:00
772c4c1b83 In the documentation for the MariaDB/MySQL database hooks, clarify how to set custom command-line flags for database commands (#1193).
All checks were successful
build / test (push) Successful in 16m21s
build / docs (push) Successful in 2m36s
2025-12-03 13:52:30 -08:00
a77de447d4 Document potential interactions between systemd security settings and the ZFS, LVM, and Btrfs hooks (#1192, #1163).
All checks were successful
build / test (push) Successful in 9m26s
build / docs (push) Successful in 2m2s
2025-12-02 17:25:36 -08:00
50a062611e Fix a regression in the ZFS, LVM, and Btrfs hooks in which snapshotted paths ignored global excludes (#1195).
All checks were successful
build / test (push) Successful in 12m21s
build / docs (push) Successful in 2m30s
2025-12-02 15:40:42 -08:00
42bf6c6f8e Fix typo in database restore documentation example (#1197).
Some checks failed
build / test (push) Failing after 11m30s
build / docs (push) Has been cancelled
2025-12-02 12:13:06 -08:00
e95d652abb Reword NEWS entry for clarity (#1192). 2025-12-02 10:58:29 -08:00
2a97ac0174 Fix for over-aggressive deduplication of source directories that contain the borgmatic runtime directory (#1192).
Some checks failed
build / test (push) Failing after 10m38s
build / docs (push) Has been cancelled
2025-12-01 17:14:31 -08:00
5029ab1ffd Update the sample systemd timer with a shorter random delay when catching up on a missed run.
Some checks failed
build / test (push) Failing after 14m44s
build / docs (push) Has been cancelled
2025-11-29 22:25:43 -08:00
7dc902f5db Fix for an incorrect diff command shown when running the "generate config" action with a source configuration file (#1194).
All checks were successful
build / test (push) Successful in 10m4s
build / docs (push) Successful in 2m29s
2025-11-28 19:53:46 -08:00
8134bdec7f Fix release script brokenness.
All checks were successful
build / test (push) Successful in 8m47s
build / docs (push) Successful in 2m4s
2025-11-26 15:40:16 -08:00
5e7d14e419 Bump version for release. 2025-11-26 15:31:04 -08:00
8f2ae5e9a1 Fix a regression in the Btrfs hook in which subvolume snapshots didn't get cleaned up until the start of the next borgmatic run (#1186).
All checks were successful
build / test (push) Successful in 8m58s
build / docs (push) Successful in 1m51s
2025-11-26 13:59:23 -08:00
928bb3fb8c Fix an unreleased regression in the KeePassXC hook in which it raised when it was used without explicit "keepassxc:" configuration (#1181).
All checks were successful
build / test (push) Successful in 8m57s
build / docs (push) Successful in 2m25s
2025-11-25 22:48:05 -08:00
31623f9c91 Add borgmatic release artifacts to each release on the releases page. 2025-11-25 20:41:25 -08:00
f158d42b28 apply docs suggestions
Some checks failed
build / test (pull_request) Failing after 2m33s
build / docs (pull_request) Has been skipped
Co-authored-by: Dan Helfman <witten@torsion.org>
2025-11-23 09:20:03 +01:00
dec47298bd somehow make a test work
Some checks failed
build / test (pull_request) Failing after 2m44s
build / docs (pull_request) Has been skipped
2025-11-22 08:03:40 +01:00
4976352fd3 add to btrfs docs that caching works now 2025-11-22 05:49:15 +01:00
f95fbaa6aa fix at least some tests (with changed snapshot path)
Some checks failed
build / test (pull_request) Failing after 2m42s
build / docs (pull_request) Has been skipped
this really is just a blanket find and replace though
2025-11-21 09:22:34 +01:00
7dc7b77f6c static btrfs snapshot paths
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
i don't know the implications of this change, except for maybe
concurrent borgmatic processes
2025-11-21 08:07:33 +01:00
47ce12e4b6 Explicitly note Borg v1 caching doesn't work with Btrfs (#1187).
All checks were successful
build / test (push) Successful in 16m30s
build / docs (push) Successful in 2m19s
Reviewed-on: #1187
2025-11-21 06:55:39 +00:00
e72ace5294 remove lingering )
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2025-11-21 05:17:44 +01:00
72c3e524be docs: btrfs: note that btrfs hook doesn't cache even with runtime dir 2025-11-21 05:17:44 +01:00
399576e7c9 Add data hooks working directory fix to NEWS (#1127).
All checks were successful
build / test (push) Successful in 8m47s
build / docs (push) Successful in 2m1s
2025-11-19 10:42:11 -08:00
a7356f2360 Fix for the database dumps hooks not respecting the "working_directory" option (#1127).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1129
2025-11-19 18:40:50 +00:00
1f8c39fb17 Add fish shell completion fix to NEWS (#1184).
All checks were successful
build / test (push) Successful in 8m41s
build / docs (push) Successful in 2m9s
2025-11-18 22:29:19 -08:00
66e567f78c Hard-code default configuration paths in command-line flag help (#1184).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1184
2025-11-19 06:25:56 +00:00
ea45a37db8 Omit "-c" when describing default value for -c
All checks were successful
build / test (pull_request) Successful in 8m46s
build / docs (pull_request) Has been skipped
2025-11-18 09:55:54 +01:00
a229fc7f92 Give the borgmatic logo a white circle background so it actually shows up properly in dark mode.
All checks were successful
build / test (push) Successful in 13m36s
build / docs (push) Successful in 2m12s
2025-11-17 22:20:27 -08:00
573405bb88 Hard-code default config paths in help strings
All checks were successful
build / test (pull_request) Successful in 14m8s
build / docs (pull_request) Has been skipped
This fixes a bug with fish completions. Before this commit,
`borgmatic --fish-completion` would generate a fish completion script
with an expanded XDG_CONFIG_HOME (if this variable is set).

This is problematic for package maintainers if the variable is set
during the creation of a package.

Moreover, it is problematic if the user has set this variable because
the fish completion scripts checks its own consistency with `borg
--fish-completion` during startup to detect version mismatches. If the
user has a packaged fish completion file with "~/.config/$HOME" in it,
this won't match the output of `borg --fish-completion` because the
latter contains the expansion of $XDG_CONFIG_HOME. As a result, the
script will incorrectly conclude that it is outdated.
2025-11-17 15:42:30 +01:00
94dc4c497a Note in the KeePassXC documentation which features are in which versions of borgmatic (#1181).
All checks were successful
build / test (push) Successful in 8m47s
build / docs (push) Successful in 2m14s
2025-11-14 21:27:07 -08:00
0e9193c46b Add an "ask_for_password" option to the KeePassXC credential hook for disabling KeePassXC's password prompt (#1181).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-11-14 21:20:21 -08:00
151becbaea Move shell autocompletion documentation out to reference docs.
All checks were successful
build / test (push) Successful in 8m51s
build / docs (push) Successful in 2m16s
2025-11-11 10:21:01 -08:00
ce7f0226be Mock get_working_directory() calls in data source hook tests
All checks were successful
build / test (pull_request) Successful in 9m26s
build / docs (pull_request) Has been skipped
2025-11-11 15:36:51 +01:00
51ef9c7708 Fix database dumps hooks not respecting working_directory
All checks were successful
build / test (pull_request) Successful in 9m8s
build / docs (pull_request) Has been skipped
2025-11-11 14:22:34 +01:00
14a8055e71 In the SQLite database hook, run SQLite such that it exits upon encountering an error instead of, you know, not doing that.
All checks were successful
build / test (push) Successful in 8m54s
build / docs (push) Successful in 2m20s
2025-11-07 23:22:44 -08:00
fcfc7ee726 Emojis everywhere!
All checks were successful
build / test (push) Successful in 13m55s
build / docs (push) Successful in 2m14s
2025-11-04 23:04:16 -08:00
859c338d06 Improve documentation search results for individual configuration options. 2025-11-04 22:34:15 -08:00
d1f2d8a061 Add documentation on repositories, including SSH, Rclone, S3, and B2.
All checks were successful
build / test (push) Successful in 8m45s
build / docs (push) Successful in 2m7s
2025-11-03 13:56:15 -08:00
bddc82951e Bump version for release. 2025-11-02 19:41:38 -08:00
3d15c51039 Fix the "--repository" flag not applying to command hooks (#1176).
All checks were successful
build / test (push) Successful in 13m50s
build / docs (push) Successful in 2m12s
2025-11-02 19:32:08 -08:00
f9206c15e7 Fix documentation typos.
All checks were successful
build / test (push) Successful in 9m3s
build / docs (push) Successful in 2m3s
2025-11-02 09:36:08 -08:00
0da4b64838 Drop support for Python 3.9, which has been end-of-lifed. (Also hopefully fix the build.)
All checks were successful
build / test (push) Successful in 9m14s
build / docs (push) Successful in 2m15s
2025-11-01 23:16:13 -07:00
85f06a900a Revert "Attempt to fix broken build (rpds module not found error)."
This reverts commit bae8f983e0.
2025-11-01 21:48:59 -07:00
bae8f983e0 Attempt to fix broken build (rpds module not found error).
Some checks failed
build / test (push) Failing after 3m4s
build / docs (push) Has been skipped
2025-11-01 21:39:10 -07:00
89c0cd0af6 Add documentation on patterns and excludes.
Some checks failed
build / test (push) Failing after 3m14s
build / docs (push) Has been skipped
2025-11-01 21:18:22 -07:00
292d9cb2c7 Add documentation on patterns and excludes. 2025-11-01 21:17:35 -07:00
181030c5d1 Add an "environment" option to the Sentry monitoring hook (#1172).
Some checks failed
build / test (push) Failing after 7m20s
build / docs (push) Has been skipped
2025-10-30 15:39:49 -07:00
2600598359 Add environment option to Sentry monitoring hook (#1172).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1172
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-10-30 22:37:53 +00:00
Tom Janssen
9e649af2a3 fix typo
All checks were successful
build / test (pull_request) Successful in 8m39s
build / docs (pull_request) Has been skipped
2025-10-29 10:13:45 +01:00
Tom Janssen
370bc7e7f0 fix schema length
Some checks failed
build / test (pull_request) Failing after 3m13s
build / docs (pull_request) Has been skipped
2025-10-29 09:55:03 +01:00
Tom Janssen
7cca1358fb incorporate feedback
Some checks failed
build / test (pull_request) Failing after 3m2s
build / docs (pull_request) Has been skipped
2025-10-29 09:50:55 +01:00
67406b60b3 Cleanup "other ways to install" section and boost "Docker" there so it shows up in search.
All checks were successful
build / test (push) Successful in 8m50s
build / docs (push) Successful in 2m14s
2025-10-28 23:01:51 -07:00
72fde728a4 Fix typo (#1173).
All checks were successful
build / test (push) Successful in 15m28s
build / docs (push) Successful in 2m9s
Reviewed-on: #1173
2025-10-28 18:16:36 +00:00
d4433eeec1 Fix typo
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2025-10-28 16:43:40 +00:00
Tom Janssen
d0b5244888 add environment option
Some checks failed
build / test (pull_request) Failing after 2m51s
build / docs (pull_request) Has been skipped
2025-10-28 16:52:50 +01:00
1ed207c6b1 Document borgmatic's limitations around parallelism—both its own and Borg's (#957).
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 1m40s
2025-10-27 15:58:12 -07:00
5ef257ebb6 Attempt to clarify recursion root patterns in the schema comments.
All checks were successful
build / test (push) Successful in 8m22s
build / docs (push) Successful in 2m5s
2025-10-27 14:34:20 -07:00
eb2b0b35c1 Fix for an inconsistent log level for Borg's last output line before exiting (#1170).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-27 14:20:27 -07:00
0f7ebcb4b7 Fix for a regression in the ZFS, LVM, and Btrfs hooks in which partial excludes of snapshot paths were ignored (#1169).
All checks were successful
build / test (push) Successful in 15m17s
build / docs (push) Successful in 2m9s
2025-10-26 14:12:52 -07:00
51d2ce7963 Add a "rename" option to "extra_borg_options" to support passing arbitrary flags to "borg rename".
All checks were successful
build / test (push) Successful in 12m17s
build / docs (push) Successful in 2m15s
2025-10-24 23:02:46 -07:00
0c4222037d Fix for the "list", "info", and "delete" options in "extra_borg_options" being ignored when "--archive" is omitted with Borg 1.x (#1168).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-24 22:57:23 -07:00
25e8aad517 Add systemd multiple service directories fix to NEWS (#1165).
All checks were successful
build / test (push) Successful in 8m21s
build / docs (push) Successful in 2m3s
2025-10-24 09:36:52 -07:00
11ffd76cc6 Support multiple configured systemd service directories (RuntimeDirectory, StateDirectory) (#1165).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-24 16:31:59 +00:00
Simon Pilkington
68864395b5 Support multiple configured systemd service directories (RuntimeDirectory, StateDirectory)
All checks were successful
build / test (pull_request) Successful in 8m27s
build / docs (pull_request) Has been skipped
2025-10-24 08:20:59 +02:00
0777d40218 Bump version for release.
All checks were successful
build / test (push) Successful in 8m18s
build / docs (push) Successful in 1m52s
2025-10-23 21:47:56 -07:00
f680869d31 Expand the "borg_extra_options" option to support every Borg sub-command that borgmatic uses (#427).
All checks were successful
build / test (push) Successful in 15m12s
build / docs (push) Successful in 2m14s
2025-10-23 21:13:16 -07:00
9b66004819 Fix images in README.md to use absolute URLs (#1167).
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 2m37s
Reviewed-on: #1167
2025-10-23 23:08:25 +00:00
aa43906b28 icons fix
All checks were successful
build / test (pull_request) Successful in 8m7s
build / docs (pull_request) Has been skipped
2025-10-23 21:49:37 +00:00
134bf1ebdd Add a "borg_key_file" option for setting the Borg repository key file path (#1166).
All checks were successful
build / test (push) Successful in 8m9s
build / docs (push) Successful in 2m2s
2025-10-23 10:36:00 -07:00
dcd567f4f0 Fix for a runtime directory error when the configured patterns contain a global exclude (#1150).
All checks were successful
build / test (push) Successful in 15m25s
build / docs (push) Successful in 2m10s
2025-10-22 11:10:42 -07:00
44d63cac07 Mention that repo-create is also known as init in command-line help. 2025-10-22 10:28:20 -07:00
4017897b1a For the MariaDB and MySQL database hooks, add a "skip_names" option to ignore particular databases when dumping "all" (#973).
All checks were successful
build / test (push) Successful in 14m49s
build / docs (push) Successful in 1m59s
2025-10-16 14:48:42 -07:00
d808d7424f Document the fact that missing "source_directories" are warnings, not errors (#1076).
All checks were successful
build / test (push) Successful in 8m17s
build / docs (push) Successful in 1m56s
2025-10-15 16:15:36 -07:00
a327496c99 Document that the "exclude_nodump" option is Borg 1.x only (#1111).
All checks were successful
build / test (push) Successful in 8m1s
build / docs (push) Successful in 1m57s
2025-10-15 16:00:55 -07:00
46bb49f40b Add "Related documentation" on action reference documentation.
All checks were successful
build / test (push) Successful in 8m9s
build / docs (push) Successful in 1m53s
2025-10-15 15:48:00 -07:00
9cd607af9d Clarify schema documentation about borg_security_directory and borg_keys_directory defaults (#1162).
All checks were successful
build / test (push) Successful in 8m6s
build / docs (push) Successful in 2m9s
2025-10-15 10:42:18 -07:00
b80d126424 Fix for a runtime directory error when the "create" action is used with the "--log-json" flag (#1150).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-15 10:35:16 -07:00
dea1c0179b Clarify what command hooks are in the reference documentation.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-10-15 10:22:02 -07:00
2deb27c985 Fix page <title> on documentation home.
All checks were successful
build / test (push) Successful in 7m46s
build / docs (push) Successful in 2m6s
2025-10-14 16:20:34 -07:00
6f9bf687d9 Combining a few sections (#942).
All checks were successful
build / test (push) Successful in 14m37s
build / docs (push) Successful in 1m56s
2025-10-14 15:57:04 -07:00
7e7b6e012c Remove incorrect bash code styling (#942). 2025-10-14 15:41:52 -07:00
3ee1203435 Tweaks to search indexing and results. 2025-10-14 13:05:50 -07:00
2db5525f72 Link to action reference documentation instead of "--help". 2025-10-14 12:42:35 -07:00
e3c369a579 Individual actions command-line reference documentation (#942). 2025-10-14 12:29:39 -07:00
9787c9fda0 Replace various how-to links with replacement reference links (#942). 2025-10-13 18:38:25 -07:00
c7053f8202 Additional documentation reference refactoring (#942). 2025-10-13 18:14:39 -07:00
044b1722e3 Factor out command hook reference documentation. 2025-10-13 16:21:42 -07:00
b5f0dc7f1f Factor out snapshot-related reference documentation. 2025-10-13 13:51:09 -07:00
efc4316a45 Split out example configuration into different pages of reference documentation (#942). 2025-10-12 21:28:52 -07:00
5e6ceea7e2 Merge branch 'main' into reference-docs 2025-10-12 15:59:09 -07:00
a1acf1e0dd Add documentation search.
All checks were successful
build / test (push) Successful in 7m44s
build / docs (push) Successful in 1m28s
2025-10-12 15:37:28 -07:00
8ea9a7cb55 Change the URL of the local documentation development server to be more like the production URL.
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 1m19s
2025-10-12 15:16:25 -07:00
f45258b6b7 Revert "Add documentation search."
All checks were successful
build / test (push) Successful in 8m4s
build / docs (push) Successful in 1m25s
This reverts commit 6d7dc378a9.
2025-10-12 11:18:41 -07:00
85177b78a6 Merge branch 'main' into reference-docs 2025-10-12 10:59:19 -07:00
6d7dc378a9 Add documentation search.
All checks were successful
build / test (push) Successful in 8m12s
build / docs (push) Successful in 1m58s
2025-10-12 10:55:48 -07:00
2a69598e02 Partial work on factoring out references docs from how-to guides (#942). 2025-10-10 22:21:15 -07:00
4c7435378c Add to NEWS: Fix a traceback (TypeError) in the "check" action with Python 3.14 (#1161).
All checks were successful
build / test (push) Successful in 7m49s
build / docs (push) Successful in 1m27s
2025-10-09 14:34:57 -07:00
d15bed5d4f Fix Python 3.14 incompatibility (#1161).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1161
2025-10-09 21:33:25 +00:00
2b34c62e6f Remove non-existent argument to Path
All checks were successful
build / test (pull_request) Successful in 12m39s
build / docs (pull_request) Has been skipped
'mode' is not a valid argument to (Pure)Path. Passing keyword arguments is
deprecated since Python 3.12. I don't suspect it ever did anything. It is
removed in Python 3.14.

Without this patch, borgmatic crashes on Python 3.14.

This code was first introduced in e76bfa555f.
2025-10-09 22:09:40 +02:00
2a5e202daf Bump version for release.
All checks were successful
build / test (push) Successful in 8m9s
build / docs (push) Successful in 1m57s
2025-10-07 09:55:41 -07:00
7f2e3e0054 Fix to snapshot both parent and child volumes/filesystems instead of just the parent (#1156).
All checks were successful
build / test (push) Successful in 13m32s
build / docs (push) Successful in 2m15s
Reviewed-on: #1158
2025-10-07 16:14:31 +00:00
173ba00caa Fix to snapshot both parent and child volumes/filesystems instead of just the parent (#1156).
All checks were successful
build / test (pull_request) Successful in 13m14s
build / docs (pull_request) Has been skipped
2025-10-04 14:35:42 -07:00
498d662b3d More accurately collect Btrfs subvolumes to snapshot. As part of this, the Btrfs hook no longer uses "findmnt" (#1105).
All checks were successful
build / test (push) Successful in 8m18s
build / docs (push) Successful in 2m44s
Reviewed-on: #1154
2025-10-03 03:27:37 +00:00
75405bed89 Cache Btrfs get property commands (#1105).
All checks were successful
build / test (pull_request) Successful in 7m38s
build / docs (pull_request) Has been skipped
2025-10-01 22:50:33 -07:00
c989b73103 Various cleanup (#1105).
All checks were successful
build / test (pull_request) Successful in 13m3s
build / docs (pull_request) Has been skipped
2025-10-01 22:28:54 -07:00
35feeb4615 Fix restore and get end-to-end tests passing (#1105).
All checks were successful
build / test (pull_request) Successful in 8m0s
build / docs (pull_request) Has been skipped
2025-09-30 21:56:04 -07:00
5dca281439 Simplify logic around checking for read-only Btrfs subvolumes (#1105).
Some checks failed
build / test (pull_request) Failing after 7m0s
build / docs (pull_request) Has been skipped
2025-09-30 12:19:57 -07:00
13fbee858a Fix a traceback (TypeError) regression in the "spot" check when the "local_path" option isn't set.
All checks were successful
build / test (push) Successful in 7m50s
build / docs (push) Successful in 1m27s
2025-09-30 09:51:47 -07:00
e2cdcba4e7 Get tests passing (#1105).
Some checks failed
build / test (pull_request) Failing after 7m24s
build / docs (pull_request) Has been skipped
2025-09-29 23:06:49 -07:00
595c639d25 Merge branch 'main' into btrfs-remove-findmnt
Some checks failed
build / test (pull_request) Failing after 3m0s
build / docs (pull_request) Has been skipped
2025-09-28 17:55:40 -07:00
b89f057be0 Fix a regression in the Loki monitoring hook in which log messages weren't sending (#1152).
All checks were successful
build / test (push) Successful in 8m26s
build / docs (push) Successful in 25s
2025-09-28 16:44:59 -07:00
98ddb3e535 Fix several existing tests (#1105). 2025-09-28 15:45:21 -07:00
339186b579 More accurately collect Btrfs subvolumes to snapshot by using the "btrfs" command rather than "findmnt" (#1105).
Some checks failed
build / test (pull_request) Failing after 2m30s
build / docs (pull_request) Has been skipped
2025-09-27 19:43:43 -07:00
1192451718 Fix snapshotting in the ZFS, Btrfs, and LVM hooks to play nicely with the Borg 1.4+ "slashdot" hack within source directory paths (#1151).
All checks were successful
build / test (push) Successful in 7m39s
build / docs (push) Successful in 1m14s
2025-09-25 10:24:12 -07:00
06e24dfbc1 Fix incomplete documentation description.
All checks were successful
build / test (push) Successful in 12m35s
build / docs (push) Successful in 1m34s
2025-09-24 23:14:24 -07:00
4f0162d5f2 Add loading of systemd credentials even when running borgmatic outside of a systemd service (#1123).
All checks were successful
build / test (push) Successful in 12m34s
build / docs (push) Successful in 1m28s
2025-09-24 10:34:20 -07:00
ed58bc2943 Attempt to fix CI build broken due to missing schema file (#1149).
All checks were successful
build / test (push) Successful in 7m23s
build / docs (push) Successful in 1m18s
2025-09-22 21:16:03 -07:00
cab6c3ee9b Include automated tests in the source dist tarball uploaded to PyPI (#1149).
Some checks failed
build / test (push) Failing after 1m48s
build / docs (push) Has been skipped
2025-09-22 14:26:00 -07:00
65c17c91b3 Add support for Python 3.14 (#1149).
All checks were successful
build / test (push) Successful in 7m12s
build / docs (push) Successful in 1m0s
2025-09-22 10:34:46 -07:00
546c0bf83b Add documentation note about borgmatic source packages (#1149).
All checks were successful
build / test (push) Successful in 12m24s
build / docs (push) Successful in 1m21s
2025-09-22 09:56:22 -07:00
6d48ff95d2 Bump version for release.
All checks were successful
build / test (push) Successful in 7m15s
build / docs (push) Successful in 1m0s
2025-09-19 17:32:13 -07:00
22b77a4262 Merge branch 'fix-borg-2-latest-archive'
All checks were successful
build / test (push) Successful in 7m14s
build / docs (push) Successful in 1m1s
2025-09-19 14:32:44 -07:00
f15e8282ab Fix a broken "create" action and "--archive latest" flag when multiple archives share the same name with Borg 2 (#1146). 2025-09-19 14:30:33 -07:00
a0e2a98735 Treat configuration file permissions issues as errors instead of warnings.
All checks were successful
build / test (push) Successful in 12m27s
build / docs (push) Successful in 1m21s
2025-09-19 10:31:31 -07:00
4ced5150f4 Merge branch 'main' into fix-borg-2-latest-archive 2025-09-18 19:25:49 -07:00
a388b17271 No longer defaulting Dump(hostname=...) to "localhost" (#1116).
All checks were successful
build / test (push) Successful in 7m24s
build / docs (push) Successful in 1m0s
2025-09-18 19:22:45 -07:00
4feec081a8 Clarify "container:" documentation about borgmatic running inside a container (#1116).
All checks were successful
build / test (push) Successful in 7m16s
build / docs (push) Successful in 1m7s
2025-09-18 16:13:24 -07:00
f3d42d081e Merge branch 'main' into fix-borg-2-latest-archive 2025-09-17 23:00:27 -07:00
da65063216 Make test code style more consistent with the rest of the codebase (#1116).
All checks were successful
build / test (push) Successful in 14m42s
build / docs (push) Successful in 1m34s
2025-09-17 21:55:36 -07:00
8eea005cbc Spelling out the new container database features in NEWS a little more and making the documentation on it more verbose as well (#1116).
All checks were successful
build / test (push) Successful in 7m44s
build / docs (push) Successful in 1m11s
2025-09-17 16:24:45 -07:00
a276aaa31f Add dumping of database containers via their container name and for labels in database configuration (#1116).
All checks were successful
build / test (push) Successful in 7m48s
build / docs (push) Successful in 1m30s
Reviewed-on: #1121
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-09-17 23:02:57 +00:00
abad73d605 final round of fixes.
All checks were successful
build / test (pull_request) Successful in 7m43s
build / docs (pull_request) Has been skipped
2025-09-17 20:17:31 +02:00
4de879d86e address some review comments
All checks were successful
build / test (pull_request) Successful in 13m19s
build / docs (pull_request) Has been skipped
2025-09-17 08:46:02 +02:00
0e90087dc4 Finalize container support
All checks were successful
build / test (pull_request) Successful in 7m12s
build / docs (pull_request) Has been skipped
2025-09-15 22:16:49 +02:00
56a3f6d854 address more review comments 2025-09-15 20:02:31 +02:00
16c8098b06 address some review comments 2025-09-15 20:02:31 +02:00
d44fb24670 get --container arg working 2025-09-15 20:02:31 +02:00
8639b73f80 fix label handling and improve unittests 2025-09-15 20:02:31 +02:00
eef264dcc5 test improvements 2025-09-15 20:02:31 +02:00
b306cac5c1 raise ValueError if json decode fails when getting the container ip 2025-09-15 20:02:31 +02:00
0d190016d3 rename utils.py to config.py 2025-09-15 20:02:31 +02:00
97815bb498 fix dump matching logic with labels. 2025-09-15 20:02:31 +02:00
3811a9f57b more test fixes and first stab at end-to-end tests 2025-09-15 20:02:31 +02:00
a2c9bb12e5 test fixes 2025-09-15 20:02:31 +02:00
04cc58a5c7 fixes and more tests. 2025-09-15 20:02:31 +02:00
db1c6f548f add support for original-label and fix the tests from the previous changes. 2025-09-15 20:02:31 +02:00
bcacbc0d69 restore_container schema 2025-09-15 20:02:31 +02:00
e058df6b7e cleanup database option resolving. 2025-09-15 20:02:31 +02:00
133a11c647 add support for container names/id when dumping databases. 2025-09-15 20:02:31 +02:00
c084f10fe2 Add support for a database backup label instead of host:port (#1116) 2025-09-15 20:02:31 +02:00
97cd3f20df Fix "--consider-checkpoints" being passed to Borg 2, which doesn't have that flag (#1146).
revert revert 0d198c7072

revert Fix "--consider-checkpoints" being passed to Borg 2, which doesn't have that flag (#1046).
2025-09-15 05:05:58 +00:00
fd028d42d5 revert 0d198c7072
revert Fix "--consider-checkpoints" being passed to Borg 2, which doesn't have that flag (#1046).
2025-09-15 05:05:07 +00:00
0d198c7072 Fix "--consider-checkpoints" being passed to Borg 2, which doesn't have that flag (#1046). 2025-09-14 22:02:17 -07:00
000d633590 Read and write data source dump metadata files within an archive (#1136).
All checks were successful
build / test (push) Successful in 11m38s
build / docs (push) Successful in 1m20s
Reviewed-on: #1136
2025-09-14 22:38:19 +00:00
084fbd2f16 PR "feedback": Adding a key to the dumps metadata JSON for clarity and expandability (#1136).
All checks were successful
build / test (pull_request) Successful in 11m48s
build / docs (pull_request) Has been skipped
2025-09-14 15:30:07 -07:00
3310d7c036 Adding missing template metadata.
All checks were successful
build / test (push) Successful in 6m43s
build / docs (push) Successful in 1m8s
2025-09-13 10:23:27 -07:00
fbfb7fc1f5 Use separate pull requests templates for each of GitHub and Gitea.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-09-13 10:16:39 -07:00
30b8aeb764 Merge branch 'main' into data-source-dump-metadata
All checks were successful
build / test (pull_request) Successful in 7m2s
build / docs (pull_request) Has been skipped
2025-09-12 22:41:40 -07:00
2cae42a163 Always error and exit when the borgmatic runtime directory overlaps with the configured excludes (#1122).
All checks were successful
build / test (push) Successful in 6m47s
build / docs (push) Successful in 1m19s
Reviewed-on: #1144
2025-09-13 05:40:04 +00:00
c4c40af812 Account for the case where "store_config_files: false" and the runtime directory never gets added to patterns to begin with (#1122).
All checks were successful
build / test (pull_request) Successful in 6m51s
build / docs (pull_request) Has been skipped
2025-09-12 22:17:44 -07:00
5028fe9ff4 Bring doc string up to date and rename function for clarity. (#1122).
Some checks failed
build / test (pull_request) Failing after 6m25s
build / docs (pull_request) Has been skipped
2025-09-12 14:03:52 -07:00
f60007545b Update automated tests (#1122).
Some checks failed
build / test (pull_request) Failing after 6m27s
build / docs (pull_request) Has been skipped
2025-09-12 12:54:38 -07:00
947dc77a50 Always error and exit when the borgmatic runtime directory overlaps with the configured excludes (#1122).
Some checks failed
build / test (pull_request) Failing after 7m31s
build / docs (pull_request) Has been skipped
2025-09-12 11:21:11 -07:00
21ab371e9f Clarify documentation about ZFS, Btrfs, and LVM snapshotting when a separate filesystem is mounted in the source directory.
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m4s
2025-09-09 16:05:34 -07:00
b340ede9ac Merge branch 'main' into data-source-dump-metadata
All checks were successful
build / test (pull_request) Successful in 6m44s
build / docs (pull_request) Has been skipped
2025-09-09 09:22:54 -07:00
82e962eae2 Include bootstrapped configuration files in spot check (#1143).
All checks were successful
build / test (push) Successful in 6m32s
build / docs (push) Successful in 1m20s
Reviewed-on: #1143
2025-09-09 16:19:20 +00:00
85b198feb2 Get automated tests passing (#1143).
All checks were successful
build / test (pull_request) Successful in 6m29s
build / docs (pull_request) Has been skipped
2025-09-08 23:16:27 -07:00
e3f4b79e76 Fix the "spot" check to include borgmatic configuration files that were backed up to support the "bootstrap" action (#1133).
Some checks failed
build / test (pull_request) Failing after 1m54s
build / docs (pull_request) Has been skipped
2025-09-08 12:16:59 -07:00
627898cc23 Add tests for new code.
All checks were successful
build / test (pull_request) Successful in 6m45s
build / docs (pull_request) Has been skipped
2025-09-05 16:02:23 -07:00
46381175ef Code formatting. 2025-09-05 14:33:40 -07:00
d7205694db Get existing restore tests passing (and add one test for the dumps metadata present case).
Some checks failed
build / test (pull_request) Failing after 1m54s
build / docs (pull_request) Has been skipped
2025-09-05 14:21:53 -07:00
9bbce71673 Fix tests for database hooks.
Some checks failed
build / test (pull_request) Failing after 1m49s
build / docs (pull_request) Has been skipped
2025-09-04 10:36:00 -07:00
6a1f2a4c86 Add SQLite dump metadata.
Some checks failed
build / test (pull_request) Failing after 1m53s
build / docs (pull_request) Has been skipped
2025-09-03 20:20:11 -07:00
5a45a0cbc0 Add NEWS entry for dumps metadata.
Some checks failed
build / test (pull_request) Failing after 1m53s
build / docs (pull_request) Has been skipped
2025-09-03 19:35:13 -07:00
03e3e0f5dd Add MongoDB dumps metadata.
Some checks failed
build / test (pull_request) Failing after 1m52s
build / docs (pull_request) Has been skipped
2025-09-03 19:31:54 -07:00
d40f728410 Add MySQL dump metadata.
Some checks failed
build / test (pull_request) Failing after 1m53s
build / docs (pull_request) Has been skipped
2025-09-03 19:21:47 -07:00
049132377c Add MariaDB dumps metadata.
Some checks failed
build / test (pull_request) Failing after 1m52s
build / docs (pull_request) Has been skipped
2025-09-03 18:54:49 -07:00
fca647b3ae Fix broken fallback to dump path introspection when dumps.json is missing. Also add additional logging.
Some checks failed
build / test (pull_request) Failing after 1m49s
build / docs (pull_request) Has been skipped
2025-09-03 16:52:26 -07:00
e02c4be493 Add error handling docstrings.
Some checks failed
build / test (pull_request) Failing after 1m50s
build / docs (pull_request) Has been skipped
2025-09-03 14:52:53 -07:00
b45c9628e7 Error handling.
Some checks failed
build / test (pull_request) Failing after 1m50s
build / docs (pull_request) Has been skipped
2025-09-03 14:49:09 -07:00
09d702ee88 Merge branch 'main' into data-source-dump-metadata
Some checks failed
build / test (pull_request) Failing after 1m51s
build / docs (pull_request) Has been skipped
2025-09-03 10:21:18 -07:00
eb971694bb PR feedback.
Some checks failed
build / test (pull_request) Failing after 7m2s
build / docs (pull_request) Has been skipped
2025-09-03 10:20:53 -07:00
f1a008ee18 Rephrase NEWS entry for clarity (#1139). 2025-09-02 09:47:53 -07:00
563cb8441e When making HTTP requests in monitoring hooks, set "borgmatic" as the user agent (#1139).
All checks were successful
build / test (push) Successful in 6m42s
build / docs (push) Successful in 1m19s
2025-09-01 16:51:33 -07:00
030abfa13c Read and write data source dump metadata files within an archive.
Some checks failed
build / test (pull_request) Failing after 6m50s
build / docs (pull_request) Has been skipped
2025-08-27 15:53:42 -07:00
36d6619099 Create LVM snapshots as read-write to avoid an error when snapshotting ext4 filesystems with orphaned files that need recovery (#1126).
All checks were successful
build / test (push) Successful in 11m53s
build / docs (push) Successful in 1m40s
2025-08-11 10:01:13 -07:00
5f468c4261 Use borg compact --dry-run in Borg 1.2.9+.
All checks were successful
build / test (push) Successful in 7m1s
build / docs (push) Successful in 1m21s
2025-08-04 21:41:19 -07:00
88ecb96b98 Document systemd configuration changes for the ZFS filesystem hook (#1114).
All checks were successful
build / test (push) Successful in 12m44s
build / docs (push) Successful in 1m47s
2025-07-18 21:32:49 -07:00
099d30f044 Only run Python 3.9 and 3.13 in end-to-end tests since 3.11 has issues in Alpine.
All checks were successful
build / test (push) Successful in 8m16s
build / docs (push) Successful in 1m42s
2025-07-18 17:25:31 -07:00
5439e616f8 Hopefully fix end-to-end tests broken due to uv changes.
Some checks failed
build / test (push) Failing after 5m29s
build / docs (push) Has been skipped
2025-07-18 17:09:48 -07:00
2d8b455e44 Switched from pipx to uv for installing development tools, and added tox-uv for speeding up test environment creation.
Some checks failed
build / test (push) Failing after 1m12s
build / docs (push) Has been skipped
2025-07-18 15:16:45 -07:00
9a80fec91b When running tests, use Ruff for faster and more comprehensive code linting and formatting.
All checks were successful
build / test (push) Successful in 12m35s
build / docs (push) Successful in 1m55s
2025-07-17 23:24:58 -07:00
ea72f1c367 Fix a bug in which Borg hangs during database backup when different filesystems are in use (#1118).
All checks were successful
build / test (push) Successful in 8m11s
build / docs (push) Successful in 1m46s
2025-07-15 13:05:03 -07:00
34f677dba1 Add a flake8 plugin that enforces a blank line after if/for/while/with/try blocks.
All checks were successful
build / test (push) Successful in 8m1s
build / docs (push) Successful in 1m56s
2025-06-30 22:04:05 -07:00
3eed3191e8 Add a flake8 extension to tests to detect commented out code.
All checks were successful
build / test (push) Successful in 12m37s
build / docs (push) Successful in 1m51s
2025-06-30 21:42:38 -07:00
1a33e5fa1e Bump version for release.
All checks were successful
build / test (push) Successful in 8m28s
build / docs (push) Successful in 1m31s
2025-06-30 18:04:06 -07:00
c2d2ce18a2 Clarify documentation about interacion between "--repository" flag and command hooks (#1112).
Some checks failed
build / test (push) Successful in 8m10s
build / docs (push) Has been cancelled
2025-06-30 18:02:02 -07:00
1b62be0949 Fix a bug in which quoted "extra_borg_options" values containing spaces are passed to Borg incorrectly. Add a "--comment" flag to the "create" action for creating an archive with a comment (#1108).
All checks were successful
build / test (push) Successful in 8m21s
build / docs (push) Successful in 1m45s
2025-06-30 16:16:53 -07:00
392fbcd19f Add missing Bandit configuration file.
All checks were successful
build / test (push) Successful in 7m47s
build / docs (push) Successful in 1m42s
2025-06-27 23:00:35 -07:00
0d54fda27a Use the Bandit security analysis tool when running tests.
Some checks failed
build / test (push) Failing after 7m34s
build / docs (push) Has been skipped
SECURITY: Add timeouts to all monitoring hooks to prevent hangs on network requests.
SECURITY: For the "spot" check, use a more secure source of randomness when selecting paths to check.
2025-06-27 22:30:00 -07:00
1e6fba6e99 Ignore Btrfs subvolumes whose read-only status can't be determined (#1048).
All checks were successful
build / test (push) Successful in 7m31s
build / docs (push) Successful in 1m22s
2025-06-27 19:41:14 -07:00
a1b14d58af Support Btrfs subvolume paths in "source_directories" even when the subvolume is mounted elsewhere (#1043).
All checks were successful
build / test (push) Successful in 7m44s
build / docs (push) Successful in 1m39s
Reviewed-on: #1113
2025-06-28 02:23:19 +00:00
6058efbaac Clarify NEWS entry (#1043).
All checks were successful
build / test (pull_request) Successful in 7m22s
build / docs (pull_request) Has been skipped
2025-06-27 19:21:10 -07:00
05b34d4b56 Fix unit/integration tests and add coverage (#1043).
All checks were successful
build / test (pull_request) Successful in 8m4s
build / docs (pull_request) Has been skipped
2025-06-27 12:37:03 -07:00
5f6173ab24 Clarify Btrfs subvolume path vs. mount point documentation (#1043).
Some checks failed
build / test (pull_request) Failing after 2m11s
build / docs (pull_request) Has been skipped
2025-06-25 22:43:14 -07:00
6f92ae2462 Add documentation for "raw" Btrfs subvolume paths (#1043).
Some checks failed
build / test (pull_request) Failing after 3m12s
build / docs (pull_request) Has been skipped
2025-06-25 22:34:14 -07:00
df383be8a2 Merge branch 'main' into btrfs-raw-subvolumes
Some checks failed
build / test (pull_request) Failing after 2m9s
build / docs (pull_request) Has been skipped
2025-06-25 15:37:56 -07:00
11da378304 Update GitHub pull request template, because it also shows up on Gitea apparently.
All checks were successful
build / test (push) Successful in 7m33s
build / docs (push) Successful in 1m20s
2025-06-25 15:37:20 -07:00
65ce7309f1 Initial WIP-level work on supporting snapshots of "raw" Btrfs subvolumes. 2025-06-25 15:29:03 -07:00
0cae581014 Add fix for failing database hook creating archive to NEWS (#1032).
All checks were successful
build / test (push) Successful in 7m46s
build / docs (push) Successful in 1m44s
2025-06-25 09:27:38 -07:00
123f8958f6 Create a checkpoint archive first with streaming processes (#1032).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
This ensures that if a streaming process fails, we do not create a
real (i.e. non-checkpoint archive), (fixes #1032).

Without this, there is a race condition where borg already creates an
archive before borgmatic can kill it.

Tested locally (with `pipx install --editable .`):

```sh
borgmatic --config config.yaml create
borgmatic --config config.yaml create --json
```

## Hold up!

Thanks for your contribution. Unfortunately, we don't use GitHub pull requests to manage code contributions to this repository (and GitHub doesn't have any way to disable pull requests entirely). Instead, please see:

https://torsion.org/borgmatic/#contributing

... which provides full instructions on how to submit pull requests. You can even use your GitHub account to login.

Reviewed-on: #1102
Reviewed-by: Dan Helfman <witten@torsion.org>
Co-authored-by: Tobias Schlatter <schlatter.tobias@gmail.com>
Co-committed-by: Tobias Schlatter <schlatter.tobias@gmail.com>
2025-06-25 16:24:07 +00:00
5ac086fa73 Revert "Temporarily remove recent contributors due to broken Gitea API: https://github.com/go-gitea/gitea/issues/34682"
All checks were successful
build / test (push) Successful in 12m17s
build / docs (push) Successful in 2m2s
This reverts commit 3902dd873d.
2025-06-19 17:05:06 -07:00
3902dd873d Temporarily remove recent contributors due to broken Gitea API: https://github.com/go-gitea/gitea/issues/34682
All checks were successful
build / test (push) Successful in 7m59s
build / docs (push) Successful in 1m53s
2025-06-10 12:34:41 -07:00
652a63223a Rename constant (#1083).
Some checks failed
build / test (push) Successful in 10m5s
build / docs (push) Failing after 1m6s
2025-06-10 11:29:12 -07:00
01dc7e7841 Upgrade requests in test requirements to "fix" theoretical security vulnerability.
Some checks failed
build / test (push) Failing after 2m34s
build / docs (push) Has been skipped
2025-06-10 11:21:34 -07:00
249183250b Merge branch 'main' of ssh://projects.torsion.org:3022/borgmatic-collective/borgmatic
Some checks failed
build / test (push) Failing after 2m36s
build / docs (push) Has been skipped
2025-06-10 11:18:59 -07:00
080c8dfd93 Add NEWS entry (#1083). 2025-06-10 11:18:49 -07:00
9ec287cd2e Add Borg 2.0.0b15 features (#1083).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1088
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-06-10 18:15:02 +00:00
Nish_
df64794115 test yes/YES for env vars
All checks were successful
build / test (pull_request) Successful in 7m45s
build / docs (pull_request) Has been skipped
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-06-08 15:07:03 +05:30
Nish_
fede523dae enhance passphrase handling
All checks were successful
build / test (pull_request) Successful in 12m48s
build / docs (pull_request) Has been skipped
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-06-08 09:31:13 +00:00
Nish_
35bfb393c7 remove make-parent-dirs option
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-06-08 09:31:13 +00:00
782f534636 Clarify documentation on command hooks order of execution (#1099).
All checks were successful
build / test (push) Successful in 12m28s
build / docs (push) Successful in 1m56s
2025-06-02 12:01:33 -07:00
8e8d9e6267 Fix a bug in which "borg --version" failing isn't considered a "fail" state in a command hook (#1100).
All checks were successful
build / test (push) Successful in 11m58s
build / docs (push) Successful in 1m47s
2025-05-27 11:52:36 -07:00
b208c5352a Bump version for release.
All checks were successful
build / test (push) Successful in 7m5s
build / docs (push) Successful in 1m17s
2025-05-14 21:16:33 -07:00
79cf3495ee Fix for the "spot" check erroring when a checksum command errors (#1089).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-05-14 21:13:48 -07:00
15607d2ccd During the "spot" check, truncate log messages containing many file paths.
All checks were successful
build / test (push) Successful in 7m18s
build / docs (push) Successful in 1m44s
2025-05-14 20:24:28 -07:00
ae1fbf7940 Fix incorrect option names in config normalize warning message (#1096).
All checks were successful
build / test (push) Successful in 7m25s
build / docs (push) Successful in 1m25s
Reviewed-on: #1096
2025-05-15 02:32:23 +00:00
a1eb612a08 Fix incorrect option names in config normalize warning message.
All checks were successful
build / test (pull_request) Successful in 7m24s
build / docs (pull_request) Has been skipped
2025-05-15 08:02:37 +08:00
7f3e9c5347 Fix for the "spot" check's "xxh64sum_command" option erroring on commands containing spaces (#1095).
All checks were successful
build / test (push) Successful in 7m17s
build / docs (push) Successful in 1m42s
2025-05-14 14:09:19 -07:00
d83c444d9e More documentation fixes/clarifications for customizing warnings and errors (#1094).
All checks were successful
build / test (push) Successful in 12m7s
build / docs (push) Successful in 1m41s
2025-05-13 12:34:21 -07:00
2221be4549 Update Borg 2.0.0 documentation URLs. 2025-05-13 11:21:09 -07:00
9973c5fb7d Fix indentation in exit code documentation (#1094).
All checks were successful
build / test (push) Successful in 7m42s
build / docs (push) Successful in 1m22s
2025-05-12 14:17:32 -07:00
ec7101ccf3 Fix incorrect documentation about customizing Borg exit codes (#1094).
All checks were successful
build / test (push) Successful in 7m39s
build / docs (push) Successful in 1m31s
2025-05-12 12:17:38 -07:00
5966022b67 Fix for the LVM hook erroring when the "--dry-run" flag is used (#1093).
All checks were successful
build / test (push) Successful in 12m24s
build / docs (push) Successful in 1m36s
2025-05-12 11:50:55 -07:00
b68211cc0c Fix for the "config generate" action generating invalid configuration when upgrading deprecated command hooks (#1091).
All checks were successful
build / test (push) Successful in 12m7s
build / docs (push) Successful in 1m38s
2025-05-08 12:59:53 -07:00
1f773124f6 Add support for Borg 2's "s3:" and "b2:" repository URLs, so you can backup to S3 or B2 cloud storage services even without using Rclone.
All checks were successful
build / test (push) Successful in 11m42s
build / docs (push) Successful in 1m39s
2025-05-04 09:59:07 -07:00
3ff9a33468 Fix for the "spot" check breaking when the "--progress" flag is used (#1086).
All checks were successful
build / test (push) Successful in 16m8s
build / docs (push) Successful in 2m4s
2025-05-01 18:46:34 -07:00
02644c3bb6 Add LVM file descriptor warning fix to NEWS (#1068).
All checks were successful
build / test (push) Successful in 11m7s
build / docs (push) Successful in 2m23s
2025-04-30 08:29:55 -07:00
0e42ba21ba Explicitly close file descriptors when invoking LVM commands (#1068).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1074
2025-04-30 15:23:42 +00:00
d876e8636a Close fds for btrfs.
All checks were successful
build / test (pull_request) Successful in 15m38s
build / docs (pull_request) Has been skipped
2025-04-30 07:42:55 +00:00
3127da54b5 Close fds for zfs. 2025-04-30 07:42:55 +00:00
3d44e95c1a Explicitly close filedescriptors when invoking lvm commands. Closes #1068 2025-04-30 07:42:55 +00:00
cdbfe1c1e9 Bump version for release.
All checks were successful
build / test (push) Successful in 7m17s
build / docs (push) Successful in 1m29s
2025-04-29 15:20:50 -07:00
4c8ba5c5ab Fix some outdated config (section headers) in documentation (#1033).
All checks were successful
build / test (push) Successful in 11m25s
build / docs (push) Successful in 1m37s
2025-04-29 14:21:47 -07:00
091e9fa9ee Add a "password_transport" option to the MariaDB and MySQL database hooks for customizing how borgmatic transmits passwords to the database client (#1033).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-29 14:19:15 -07:00
0f4e93c9c8 GitHub Mistake Pull Closer was a mistake to use, because it doesn't work...
All checks were successful
build / test (push) Successful in 7m21s
build / docs (push) Successful in 1m45s
2025-04-26 17:39:36 -07:00
43bd42fb31 Tweak GitHub pull request template.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-26 17:36:01 -07:00
bb54068152 Back out accidentally added partial feature.
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-26 17:32:31 -07:00
6c5eecac20 Add a GitHub pull request template to discourage PRs there.
Some checks failed
build / test (push) Failing after 2m16s
build / docs (push) Has been skipped
2025-04-26 17:27:22 -07:00
3f92b0b6ed The borgmatic project no longer accepts pull requests on GitHub. Use https://torsion.org/borgmatic/#contributing instead.
Some checks failed
build / test (push) Failing after 2m4s
build / docs (push) Has been skipped
2025-04-26 17:19:13 -07:00
30d2108399 Move from Fosstodon to FLOSS.social.
Some checks failed
build / test (push) Failing after 7m22s
build / docs (push) Has been skipped
2025-04-26 16:49:41 -07:00
d36e5f24ce Add Borg 1.4.1 features to NEWS (#1078).
All checks were successful
build / test (push) Successful in 7m22s
build / docs (push) Successful in 1m42s
2025-04-25 12:06:49 -07:00
76c50555d3 Add Borg 1.4.1 features (#1078).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1081
2025-04-25 19:02:27 +00:00
Vandal
1cde65b4eb fix dry run not working borg 1.4.1+
All checks were successful
build / test (pull_request) Successful in 7m16s
build / docs (pull_request) Has been skipped
2025-04-26 00:21:48 +05:30
Vandal
4e05539825 add review changes
All checks were successful
build / test (pull_request) Successful in 7m17s
build / docs (pull_request) Has been skipped
2025-04-25 22:56:07 +05:30
Vandal
d17aa3e7cc review changes
All checks were successful
build / test (pull_request) Successful in 7m5s
build / docs (pull_request) Has been skipped
2025-04-25 22:28:43 +05:30
3eff794f44 Fix a regression in which the default monitoring verbosity is 0 instead of 1 (#1085).
All checks were successful
build / test (push) Successful in 7m20s
build / docs (push) Successful in 1m33s
2025-04-24 23:27:09 -07:00
Vandal
1ac51e34bc pass dry run flag
All checks were successful
build / test (pull_request) Successful in 11m46s
build / docs (pull_request) Has been skipped
2025-04-25 11:40:25 +05:30
345b4cfb09 Add support for new Borg placeholder "{unixtime}".
All checks were successful
build / test (push) Successful in 11m36s
build / docs (push) Successful in 1m21s
2025-04-23 10:07:33 -07:00
Vandal
27a2bbc231 add --dry-run feature check
All checks were successful
build / test (pull_request) Successful in 6m35s
build / docs (pull_request) Has been skipped
2025-04-23 08:11:43 +05:30
Vandal
dbf1d0946a make review changes 2025-04-23 07:38:52 +05:30
5465b60d37 Bump version for release.
All checks were successful
build / test (push) Successful in 6m41s
build / docs (push) Successful in 1m3s
2025-04-22 14:11:36 -07:00
e2b5972c09 Fix end-to-end tests (#1072).
All checks were successful
build / test (push) Successful in 6m43s
build / docs (push) Successful in 1m30s
2025-04-21 23:11:38 -07:00
9bf316e28f If the exact same "everything" command hook is present in multiple configuration files, borgmatic only runs it once (#1080).
Some checks failed
build / test (push) Failing after 6m40s
build / docs (push) Has been skipped
2025-04-21 19:19:36 -07:00
3847f31939 Fix path rewriting for non-root patterns in the ZFS, Btrfs, and LVM hooks (#1072).
Some checks failed
build / test (push) Failing after 11m12s
build / docs (push) Has been skipped
2025-04-21 10:07:46 -07:00
a815d2dfdb Clarify the documentation about when an "after: error" command hook runs and how it differs from other hooks (#1073).
All checks were successful
build / test (push) Successful in 6m44s
build / docs (push) Successful in 1m2s
2025-04-20 16:00:14 -07:00
6ebfd60e21 Fix an incorrect warning about Borg placeholders being unsupported in a command hook (#1075).
All checks were successful
build / test (push) Successful in 10m53s
build / docs (push) Successful in 1m20s
2025-04-20 15:06:21 -07:00
Vandal
2078527539 add BORG_USE_CHUNKS_ARCHIVE
All checks were successful
build / test (pull_request) Successful in 6m37s
build / docs (pull_request) Has been skipped
2025-04-20 09:58:09 +05:30
Vandal
620bf52e01 add prune test 2025-04-20 09:31:51 +05:30
Vandal
fdb08b6c56 add 13weekly and 3monthly quarterly
Some checks failed
build / test (pull_request) Has been cancelled
build / docs (pull_request) Has been cancelled
2025-04-19 10:14:41 +05:30
c3c37dee13 Only build and deploy docs on pushes to main, not for pull requests.
All checks were successful
build / test (push) Successful in 8m8s
build / docs (push) Successful in 1m22s
2025-04-17 20:51:40 -07:00
13d49fda9b Bump version for release.
All checks were successful
build / test (push) Successful in 6m45s
build / docs (push) Successful in 1m19s
2025-04-14 22:53:23 -07:00
b01b8498aa Fix an error in the LVM hook when removing a snapshot directory (#1071).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-14 22:48:36 -07:00
a573e606a5 Add a "states" option to command hooks, so you can optionally skip an "after" hook if borgmatic encounters an error (#1066).
All checks were successful
build / test (push) Successful in 11m14s
build / docs (push) Successful in 1m25s
2025-04-12 15:02:47 -07:00
81db67c759 Fix a regression in monitoring hooks in which an error pinged the finish state instead of the fail state (#1065).
All checks were successful
build / test (push) Successful in 11m14s
build / docs (push) Successful in 1m19s
2025-04-09 11:32:59 -07:00
0b4aff9277 Bump version for release.
All checks were successful
build / test (push) Successful in 6m46s
build / docs (push) Successful in 59s
2025-04-08 12:07:16 -07:00
7de1c2121c List the configured "when" action names in the log entries for command hooks (#1063).
All checks were successful
build / test (push) Successful in 6m36s
build / docs (push) Successful in 1m8s
2025-04-08 12:04:10 -07:00
2c8dc5858f Fix a regression that broke environment variable interpolation (#1062).
Some checks failed
build / test (push) Failing after 2m1s
build / docs (push) Has been skipped
2025-04-08 11:55:26 -07:00
f27a96e22d Display a nicer error message when the "recreate" action encounters an archive that already exists (#1053).
All checks were successful
build / test (push) Successful in 6m34s
build / docs (push) Successful in 1m0s
2025-04-08 10:58:53 -07:00
a892a308bd Display a nicer error message when running the "recreate" action on a leftover temporary archive from a prior recreate run (#1053).
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m13s
2025-04-08 10:13:04 -07:00
2db023f785 Don't run action command hooks for actions listed in the "skip_actions" option (#1060).
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m19s
2025-04-07 23:10:59 -07:00
edaca2b3cd Fix command hooks getting run too many times when multiple borgmatic actions are executed (#1060).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-04-07 23:00:29 -07:00
bc79eafb0b Document potential performance issues and workarounds with the ZFS, Btrfs, and LVM hooks (#1035).
All checks were successful
build / test (push) Successful in 6m30s
build / docs (push) Successful in 1m2s
2025-04-07 13:51:20 -07:00
68fafffe99 Fix a regression in which soft failure exit codes in command hooks were not respected (#1059).
All checks were successful
build / test (push) Successful in 6m30s
build / docs (push) Successful in 1m5s
2025-04-07 10:29:51 -07:00
6c068a297a Update README to use new command hooks in the example.
All checks were successful
build / test (push) Successful in 6m36s
build / docs (push) Successful in 1m7s
2025-04-06 23:29:12 -07:00
06a6444c86 Expand test that checks whether schema actions correspond to supported actions.
All checks were successful
build / test (push) Successful in 6m34s
build / docs (push) Successful in 1m0s
2025-04-06 21:25:06 -07:00
f6de79060e Omit "pattern" from missing actions test (#1056).
All checks were successful
build / test (push) Successful in 13m36s
build / docs (push) Successful in 1m22s
2025-04-06 20:57:15 -07:00
0d94a6587a Move pattern and flag functions from create.py into their own module (#1056).
Some checks failed
build / test (push) Failing after 3s
build / docs (push) Has been skipped
Reviewed-on: #1056
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-04-07 03:51:36 +00:00
2f535056ee Removing asterisk escaping from release script, which apparently breaks Gitea changelog posting.
All checks were successful
build / test (push) Successful in 6m34s
build / docs (push) Successful in 1m10s
2025-04-06 15:27:58 -07:00
074db68a1b Bump version for release.
Some checks failed
build / test (push) Successful in 6m37s
build / docs (push) Has been cancelled
2025-04-06 15:21:03 -07:00
3cd5c1290d Fix argument parsing to avoid using Python 3.12+ string features (#1057). 2025-04-06 15:20:29 -07:00
66a636e994 Add more escaping to release script changelog output.
All checks were successful
build / test (push) Successful in 6m37s
build / docs (push) Successful in 59s
2025-04-06 09:04:54 -07:00
Vandal
360156e3b1 refactor codebase 2025-04-06 21:34:04 +05:30
b25bfbe913 Bump version for release.
All checks were successful
build / test (push) Successful in 10m51s
build / docs (push) Successful in 1m18s
2025-04-06 08:22:28 -07:00
acb9aace1d Include pull requests in build action, so they're covered by CI.
All checks were successful
build / test (push) Successful in 6m31s
build / docs (push) Successful in 1m0s
2025-04-05 20:20:45 -07:00
e6ae0b73d4 Rephrase NEWS entry. 2025-04-05 16:59:40 -07:00
7ee0d3563b Add configuration options for all verbosity and logging flags (#793).
All checks were successful
build / test (push) Successful in 10m48s
build / docs (push) Successful in 1m18s
Reviewed-on: #1055
2025-04-05 23:13:17 +00:00
edee3c3788 Fix broken monitoring verbosity (#793). 2025-04-05 16:11:42 -07:00
445f700b09 Fix log file format example. 2025-04-05 14:42:16 -07:00
732634f7ba Add an additional test (#793). 2025-04-04 18:49:20 -07:00
ad9f037ec5 Add documentation for verbosity/logging configuration options (#793). 2025-04-04 18:29:51 -07:00
c0adc4f9df Add test coverage for new code (#793). 2025-04-04 17:19:14 -07:00
49839e884a Add configuration options for logging and verbosity (#793). 2025-04-04 10:11:00 -07:00
828ada085b Add a deprecated, top-level "color" option back in for backwards compatibility. 2025-04-03 19:52:00 -07:00
93b1172266 Remove merge conflict artifacts. 2025-04-03 17:31:06 -07:00
c6ce9c70ab Merge branch 'main' into logging-verbosity-config. 2025-04-03 17:29:59 -07:00
929d343214 Add CLI flags for every config option and add config options for many action flags (#303).
All checks were successful
build / test (push) Successful in 6m25s
build / docs (push) Successful in 1m12s
Reviewed-on: #1040
2025-04-03 23:48:49 +00:00
9ea55d9aa3 Add a documentation note about a limitation: You can't pass flags as values to flags (#303). 2025-04-03 16:38:17 -07:00
3eabda45f2 If a boolean option name already starts with "no_", don't add a "--no-no-..." CLI flag (#303). 2025-04-03 16:21:22 -07:00
09212961a4 Add action "--help" note about running compact after recreate (#1053).
All checks were successful
build / test (push) Successful in 5m49s
build / docs (push) Successful in 1m4s
2025-04-03 12:55:26 -07:00
3f25f3f0ff Merge branch 'main' into config-command-line. 2025-04-03 11:47:29 -07:00
e8542f3613 Fix KeePassXC error when "keepassxc:" option is not present, add new options to NEWS (#1047).
All checks were successful
build / test (push) Successful in 5m51s
build / docs (push) Successful in 1m13s
2025-04-03 11:41:58 -07:00
9407f24674 Fix setting of "--checks" on the command-line (#303). 2025-04-03 11:28:32 -07:00
1c9d25b892 Add "key-file" and "yubikey" options to KeePassXC credential hook (#1047).
Some checks failed
build / test (push) Failing after 5m52s
build / docs (push) Has been skipped
Reviewed-on: #1049
2025-04-03 18:28:08 +00:00
248999c23e Final 2025-04-03 17:10:52 +00:00
d0a5aa63be Add a TL;DR to NEWS since 2.0.0 is such a huge release and ain't nobody got time for reading a huge changelog. 2025-04-03 09:24:47 -07:00
d2c3ed26a9 Make a CLI flag for any config option that's a list of scalars (#303). 2025-04-02 23:15:21 -07:00
bbf6f27715 For boolean configuration options, add separate "--foo" and "--no-foo" CLI flags (#303). 2025-04-02 17:08:04 -07:00
9301ab13cc Merge branch 'main' into config-command-line. 2025-04-02 09:55:33 -07:00
d5d04b89dc Add configuration filename to "Successfully ran configuration file" log message (#1051).
All checks were successful
build / test (push) Successful in 10m4s
build / docs (push) Successful in 1m14s
2025-04-02 09:50:31 -07:00
364200c65a Fix incorrect matching of non-zero array index flags with dashed names (#303). 2025-04-02 09:37:52 -07:00
4e55547235 Command Restructuring 2025-04-02 15:35:12 +00:00
96ec66de79 Applied changes 2025-04-02 10:50:25 +00:00
7a0c56878b Applied changes 2025-04-02 10:47:35 +00:00
4065c5d0f7 Fix use of dashed command-line flags like "--repositories[2].append-only" generated from configuration (#303). 2025-04-01 23:04:53 -07:00
affe7cdc1b Expose propertyless YAML objects from configuration (e.g. "constants") as command-line flags (#303). 2025-04-01 21:05:44 -07:00
017cbae4f9 Fix for the example not showing up in generated config for empty YAML objects (#303). 2025-04-01 19:44:47 -07:00
e96db2e100 Fix "progress" option with the "transfer" action (#303). 2025-04-01 19:43:56 -07:00
af97b95e2b Merge branch 'main' into config-command-line. 2025-04-01 12:09:54 -07:00
6a61259f1a Fix a failure in the "spot" check when the archive contains a symlink (#1050).
All checks were successful
build / test (push) Successful in 10m19s
build / docs (push) Successful in 1m14s
2025-04-01 11:49:47 -07:00
5490a83d77 Merge branch 'main' into config-command-line. 2025-03-31 17:13:20 -07:00
8c907bb5a3 Fix broken "recreate" action with Borg 1.4 (#610).
All checks were successful
build / test (push) Successful in 9m49s
build / docs (push) Successful in 1m14s
2025-03-31 17:11:37 -07:00
f166111b9b Fix new "repositories:" sub-options ("append_only", "make_parent_directories", etc.) (#303). 2025-03-31 15:26:24 -07:00
10fb02c40a Fix bootstrap --progress flag (#303). 2025-03-31 13:33:39 -07:00
cf477bdc1c Fix broken list_details, progress, and statistics options (#303). 2025-03-31 11:33:56 -07:00
6f07402407 Fix end-to-end tests and don't stat() directories that don't exist (#1048).
All checks were successful
build / test (push) Successful in 5m52s
build / docs (push) Successful in 55s
2025-03-30 19:04:36 -07:00
ab01e97a5e Fix a "no such file or directory" error in ZFS, Btrfs, and LVM hooks with nested directories that reside on separate devices/filesystems (#1048).
Some checks failed
build / test (push) Failing after 5m40s
build / docs (push) Has been skipped
2025-03-30 14:55:54 -07:00
92ebc77597 2nd Draft 2025-03-30 16:19:56 +00:00
863c954144 added schema.yaml 2025-03-30 15:57:42 +00:00
f7e4d38762 First Draft 2025-03-30 14:02:56 +00:00
de4d7af507 Merge branch 'main' into config-command-line. 2025-03-29 22:52:40 -07:00
5cea1e1b72 Fix flake error (#262).
All checks were successful
build / test (push) Successful in 5m52s
build / docs (push) Successful in 1m15s
2025-03-29 22:52:17 -07:00
fd8c11eb0a Add documentation for "native" command-line overrides without --override (#303). 2025-03-29 21:59:47 -07:00
92de539bf9 Merge branch 'main' into config-command-line. 2025-03-29 19:55:03 -07:00
5716e61f8f Code formatting (#262).
Some checks failed
build / test (push) Failing after 1m49s
build / docs (push) Has been skipped
2025-03-29 19:54:40 -07:00
3e05eeb4de Merge branch 'main' into config-command-line. 2025-03-29 19:03:29 -07:00
65d1b9235d Add "default_actions" to NEWS (#262).
Some checks failed
build / test (push) Failing after 1m43s
build / docs (push) Has been skipped
2025-03-29 19:02:11 -07:00
cffb8e88da Merge branch 'main' of ssh://projects.torsion.org:3022/borgmatic-collective/borgmatic into config-command-line 2025-03-29 18:58:12 -07:00
a8362f2618 borgmatic without arguments/parameters should show usage help instead of starting a backup (#262).
Some checks failed
build / test (push) Failing after 1m42s
build / docs (push) Has been skipped
Reviewed-on: #1046
2025-03-30 01:57:11 +00:00
36265eea7d Docs update 2025-03-30 01:34:30 +00:00
8101e5c56f Add "list_details" config option support to new "recreate" action (#303). 2025-03-29 15:24:37 -07:00
c7feb16ab5 Merge branch 'main' into config-command-line. 2025-03-29 15:16:29 -07:00
da324ebeb7 Add "recreate" action to NEWS and docs (#610).
All checks were successful
build / test (push) Successful in 5m48s
build / docs (push) Successful in 1m15s
2025-03-29 15:15:36 -07:00
59f9d56aae Add a recreate action (#1030).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1030
2025-03-29 22:07:52 +00:00
Vandal
dbf2e78f62 help changes 2025-03-30 03:05:46 +05:30
f6929f8891 Add last couple of missing tests after audit (#303). 2025-03-29 14:26:54 -07:00
Vandal
2716d9d0b0 add to schema 2025-03-29 23:25:50 +05:30
668f767bfc Adding some missing tests and fixing related flag vs. config logic (#303). 2025-03-28 23:11:15 -07:00
0182dbd914 Added 2 new unit tests and updated docs 2025-03-29 03:43:58 +00:00
1c27e0dadc Add an end-to-end test for command-line flags of configuration options (#303). 2025-03-28 13:46:58 -07:00
Vandal
8b3a682edf add tests and minor fixes 2025-03-29 01:26:20 +05:30
975a6e4540 Add additional tests for complete coverage (#303). 2025-03-28 11:37:48 -07:00
Vandal
7020f0530a update existing tests 2025-03-28 22:22:19 +05:30
5bf2f546b9 More automated tests (#303). 2025-03-27 21:01:56 -07:00
b4c558d013 Add tests for CLI arguments from schema logic (#303). 2025-03-27 16:49:14 -07:00
79bf641668 Set the action type when cloning an argument for a list index flag (#303). 2025-03-27 12:42:49 -07:00
50beb334dc Add tests for adding array element arguments and fix the code under test (#303). 2025-03-27 11:07:25 -07:00
Vandal
26fd41da92 add rest of flags 2025-03-27 22:18:34 +05:30
088da19012 Added Unit Tests 2025-03-27 11:26:56 +00:00
4c6674e0ad Merge branch 'main' into config-command-line. 2025-03-26 22:14:36 -07:00
486bec698d Add "key import" to reference documentation (#345).
All checks were successful
build / test (push) Successful in 9m59s
build / docs (push) Successful in 1m14s
2025-03-26 22:13:30 -07:00
7a766c717e 2nd Draft 2025-03-27 02:55:16 +00:00
520fb78a00 Clarify Btrfs documentation: borgmatic expects subvolume mount points in "source_directories" (#1043).
All checks were successful
build / test (push) Successful in 5m49s
build / docs (push) Successful in 59s
2025-03-26 11:39:16 -07:00
Vandal
acc2814f11 add archive timestamp filter 2025-03-26 23:39:06 +05:30
996b037946 1st 2025-03-26 17:39:10 +00:00
Vandal
9356924418 add archive options 2025-03-26 22:30:11 +05:30
79e4e089ee Fix typo in NEWS (#1044).
All checks were successful
build / test (push) Successful in 5m50s
build / docs (push) Successful in 1m0s
2025-03-26 09:57:53 -07:00
d2714cb706 Fix an error in the systemd credential hook when the credential name contains a "." chararcter (#1044).
Some checks failed
build / test (push) Failing after 1m48s
build / docs (push) Has been skipped
2025-03-26 09:53:52 -07:00
5a0430b9c8 Merge branch 'main' into config-command-line. 2025-03-25 22:39:51 -07:00
23efbb8df3 Fix line wrapping / code style (#837).
All checks were successful
build / test (push) Successful in 8m7s
build / docs (push) Successful in 1m12s
2025-03-25 22:31:50 -07:00
9e694e4df9 Add MongoDB custom command options to NEWS (#837).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
2025-03-25 22:28:14 -07:00
76f7c53a1c Add custom command options for MongoDB hook (#837).
Some checks failed
build / docs (push) Has been cancelled
build / test (push) Has been cancelled
Reviewed-on: #1041
2025-03-26 05:27:03 +00:00
Vandal
203e84b91f hotfix 2025-03-25 21:57:06 +05:30
Vandal
ea5a2d8a46 add tests for the flags 2025-03-25 20:39:02 +05:30
Vandal
a8726c408a add tests 2025-03-25 19:35:15 +05:30
Vandal
3542673446 add test recreate with skip action 2025-03-25 11:36:06 +05:30
532a97623c Added test_build_restore_command_prevents_shell_injection() 2025-03-25 04:50:45 +00:00
e1fdfe4c2f Add credential hook directory expansion to NEWS (#422).
All checks were successful
build / test (push) Successful in 8m40s
build / docs (push) Successful in 1m15s
2025-03-24 13:00:38 -07:00
83a56a3fef Add directory expansion for file-based and KeyPassXC credential hooks (#1042).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1042
2025-03-24 19:57:18 +00:00
Vandal
b60cf2449a add recreate to schema 2025-03-25 00:48:27 +05:30
Vandal
e7f14bca87 add tests and requested changes 2025-03-25 00:16:20 +05:30
Nish_
4bca7bb198 add directory expansion for file-based and KeyPassXC credentials
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-24 21:04:55 +05:30
Vandal
fa3b140590 add patterns 2025-03-24 12:09:08 +05:30
Vandal
a1d2f7f221 add path 2025-03-24 11:51:33 +05:30
6a470be924 Made some changes in test file 2025-03-24 03:53:42 +00:00
d651813601 Custom command options for MongoDB hook #837 2025-03-24 03:39:26 +00:00
65b1d8e8b2 Clarify NEWS items (#303). 2025-03-23 19:13:07 -07:00
16a1121649 Get existing end-to-end tests passing (#303). 2025-03-23 18:45:49 -07:00
423627e67b Get existing unit/integration tests passing (#303). 2025-03-23 17:00:04 -07:00
9f7c71265e Add Bash completion for completing flags like "--foo[3].bar". 2025-03-23 16:32:31 -07:00
ba75958a2f Fix missing argument descriptions (#303). 2025-03-23 11:26:49 -07:00
57721937a3 Factor out schema type comparion in config generation and get several tests passing (#303). 2025-03-23 11:24:36 -07:00
f222bf2c1a Organizational refactoring (#303). 2025-03-22 22:52:23 -07:00
dc9da3832d Bold "not yet released" in docs to prevent confusion (#303). 2025-03-22 14:03:44 -07:00
f8eda92379 Code formatting (#303). 2025-03-22 14:01:39 -07:00
cc14421460 Fix list examples in generated configuration. 2025-03-22 13:58:42 -07:00
Vandal
a750d58a2d add recreate action 2025-03-22 21:18:28 +05:30
2045706faa merge upstream 2025-03-22 13:00:07 +00:00
976fb8f343 Add "compact_threshold" option, overridden by "compact --threshold" flag (#303). 2025-03-21 22:44:49 -07:00
5246a10b99 Merge branch 'main' into config-command-line. 2025-03-21 15:44:12 -07:00
524ec6b3cb Add "extract" action fix to NEWS (#1037).
All checks were successful
build / test (push) Successful in 8m11s
build / docs (push) Successful in 1m22s
2025-03-21 15:43:05 -07:00
6f1c77bc7d Merge branch 'main' of ssh://projects.torsion.org:3022/borgmatic-collective/borgmatic into config-command-line 2025-03-21 15:40:27 -07:00
7904ffb641 Fix extracting from remote repositories with working_directory defined (#1037).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1038
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-03-21 22:40:18 +00:00
cd5ba81748 Fix docs: Crontabs aren't executable (#1039).
All checks were successful
build / test (push) Successful in 5m59s
build / docs (push) Successful in 59s
Reviewed-on: #1039
2025-03-21 21:32:38 +00:00
5c11052b8c Merge branch 'main' into config-command-line 2025-03-21 14:30:39 -07:00
514ade6609 Fix inconsistent quotes in one documentation file (#790).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-03-21 14:27:40 -07:00
201469e2c2 Add "key import" action to NEWS (#345).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-03-21 14:26:01 -07:00
9ac2a2e286 Add key import action to import a copy of repository key from backup (#345).
Some checks failed
build / test (push) Failing after 1m41s
build / docs (push) Has been skipped
Reviewed-on: #1036
Reviewed-by: Dan Helfman <witten@torsion.org>
2025-03-21 21:22:50 +00:00
Benjamin Bock
a16d138afc Crontabs aren't executable 2025-03-21 21:58:02 +01:00
Benjamin Bock
81a3a99578 Fix extracting from remote repositories with working_directory defined 2025-03-21 21:34:46 +01:00
f3cc3b1b65 Merge branch 'main' into config-command-line 2025-03-21 11:10:19 -07:00
587d31de7c Run all command hooks respecting the "working_directory" option if configured (#790).
All checks were successful
build / test (push) Successful in 10m15s
build / docs (push) Successful in 1m14s
2025-03-21 10:53:06 -07:00
cbfc0bead1 Exclude --match-archives from global flags since it already exists on several actions (#303). 2025-03-21 09:56:42 -07:00
Nish_
8aaa5ba8a6 minor changes
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-21 19:26:12 +05:30
7d989f727d Don't auto-add CLI flags for configuration options that already have per-action CLI flags (#303). 2025-03-20 12:23:00 -07:00
Nish_
5525b467ef add key import command
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-21 00:47:45 +05:30
89c98de122 Merge branch 'main' into config-command-line. 2025-03-20 11:37:04 -07:00
c2409d9968 Remove the "dump_data_sources" command hook, as it doesn't really solve the use case and works differently than all the other command hooks (#790).
All checks were successful
build / test (push) Successful in 5m47s
build / docs (push) Successful in 1m6s
2025-03-20 11:13:37 -07:00
624a7de622 Document "after" command hooks running in case of error and make sure that happens in case of "before" hook error (#790).
All checks were successful
build / test (push) Successful in 10m16s
build / docs (push) Successful in 1m22s
2025-03-20 10:57:39 -07:00
3119c924b4 In configuration option descriptions, remove mention of corresponding CLI flags because it looks dumb on the command-line help (#303). 2025-03-19 23:08:26 -07:00
ed6022d4a9 Add "list" option to configuration, corresponding to "--list" (#303). 2025-03-19 23:05:38 -07:00
3e21cdb579 Add "stats" option to configuration (#303). 2025-03-19 19:43:04 -07:00
d02d31f445 Use schema defaults instead of a flag name whitelist to make valueless boolean flags (#303). 2025-03-19 11:37:17 -07:00
1097a6576f Add "progress" option to configuration (#303). 2025-03-19 11:06:36 -07:00
63b0c69794 Add additional options under "repositories:" for parity with repo-create #303. 2025-03-18 20:54:14 -07:00
Vandal
4e2805918d update borg/recreate.py 2025-03-18 23:19:33 +05:30
711f5fa6cb UX nicety to make default-false boolean options into valueless CLI flags (#303). 2025-03-17 22:58:25 -07:00
93e7da823c Add an encryption option to repositories (#303). 2025-03-17 22:24:01 -07:00
903308864c Factor out schema type parsing (#303). 2025-03-17 10:46:02 -07:00
d75c8609c5 Merge branch 'main' into config-command-line 2025-03-17 10:34:20 -07:00
c926f0bd5d Clarify documentation for dump_data_sources command hook (#790).
All checks were successful
build / test (push) Successful in 10m21s
build / docs (push) Successful in 1m14s
2025-03-17 10:31:34 -07:00
7b14e8c7f2 Add feature to NEWS (#303). 2025-03-17 10:17:04 -07:00
87b9ad5aea Code formatting (#303). 2025-03-17 10:02:25 -07:00
eca78fbc2c Support setting whole lists and dicts from the command-line (#303). 2025-03-17 09:57:25 -07:00
Vandal
6adb0fd44c add borg recreate 2025-03-17 22:24:53 +05:30
05900c188f Expand docstrings (#303). 2025-03-15 22:58:39 -07:00
1d5713c4c5 Updated outdated schema comment referencing ~/.borgmatic path (#836).
All checks were successful
build / test (push) Successful in 6m7s
build / docs (push) Successful in 1m13s
2025-03-15 21:42:45 -07:00
f9612cc685 Add SQLite custom command option to NEWS (#836). 2025-03-15 21:37:23 -07:00
5742a1a2d9 Add custom command option for SQLite hook (#836).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1027
2025-03-16 04:34:15 +00:00
Nish_
c84815bfb0 add custom dump and restore commands for sqlite hook
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-16 09:07:49 +05:30
e1ff51ff1e Merge branch 'main' into config-command-line. 2025-03-15 10:03:59 -07:00
1c92d84e09 Add Borg 2 "prune --stats" flag change to NEWS (#1010).
All checks were successful
build / test (push) Successful in 9m59s
build / docs (push) Successful in 1m33s
2025-03-15 10:02:47 -07:00
1d94fb501f Conditionally pass --stats to prune based on Borg version (#1010).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1026
2025-03-15 16:59:50 +00:00
92279d3c71 Initial work on command-line flags for all configuration (#303). 2025-03-14 22:59:43 -07:00
Nish_
1b4c94ad1e Add feature toggle to pass --stats to prune on Borg 1, but not Borg 2
Signed-off-by: Nish_ <120EE0980@nitrkl.ac.in>
2025-03-15 09:56:14 +05:30
901e668c76 Document a database use case involving a temporary database client container (#1020).
All checks were successful
build / test (push) Successful in 7m37s
build / docs (push) Successful in 1m30s
2025-03-12 17:10:35 -07:00
bcb224a243 Claim another implemented ticket in NEWS (#821).
All checks were successful
build / test (push) Successful in 7m35s
build / docs (push) Successful in 1m25s
2025-03-12 14:31:13 -07:00
6b6e1e0336 Make the "configuration" command hook support "error" hooks and also pinging monitoring on failure (#790).
All checks were successful
build / test (push) Successful in 12m18s
build / docs (push) Successful in 1m53s
2025-03-12 14:13:29 -07:00
f5c9bc4fa9 Add a "not yet released" note on 2.0.0 in docs (#790).
All checks were successful
build / test (push) Successful in 7m15s
build / docs (push) Successful in 1m35s
2025-03-11 16:46:07 -07:00
cdd0e6f052 Fix incorrect kwarg in LVM hook (#790).
All checks were successful
build / test (push) Successful in 7m3s
build / docs (push) Successful in 1m36s
2025-03-11 14:42:25 -07:00
7bdbadbac2 Deprecate all "before_*", "after_*" and "on_error" command hooks in favor of more flexible "commands:" (#790).
Some checks failed
build / test (push) Failing after 15m7s
build / docs (push) Has been skipped
Reviewed-on: #1019
2025-03-11 21:22:33 +00:00
d3413e0907 Documentation clarification (#1019). 2025-03-11 14:20:42 -07:00
8a20ee7304 Fix typo in documentation (#1019). 2025-03-11 14:08:53 -07:00
325f53c286 Context tweaks + mention configuration upgrade in command hook documentation (#1019). 2025-03-11 14:07:06 -07:00
b4d24798bf More command hook documentation updates (#1019). 2025-03-11 13:03:58 -07:00
7965eb9de3 Correctly handle errors in command hooks (#1019). 2025-03-11 11:36:28 -07:00
8817364e6d Documentation on command hooks (#1019). 2025-03-10 22:38:48 -07:00
965740c778 Update version of command hooks since they didn't get released in 1.9.14 (#1019). 2025-03-10 10:37:09 -07:00
2a0319f02f Merge branch 'main' into unified-command-hooks. 2025-03-10 10:35:36 -07:00
fbdb09b87d Bump version for release.
All checks were successful
build / test (push) Successful in 6m42s
build / docs (push) Successful in 1m19s
2025-03-10 10:17:36 -07:00
bec5a0c0ca Fix end-to-end tests for Btrfs (#1023).
All checks were successful
build / test (push) Successful in 6m50s
build / docs (push) Successful in 1m38s
2025-03-10 10:15:23 -07:00
4ee7f72696 Fix an error in the Btrfs hook when attempting to snapshot a read-only subvolume (#1023).
Some checks failed
build / test (push) Failing after 6m54s
build / docs (push) Has been skipped
2025-03-09 23:04:55 -07:00
9941d7dc57 More docs and command hook context tweaks (#1019). 2025-03-09 17:01:46 -07:00
ec88bb2e9c Merge branch 'main' into unified-command-hooks. 2025-03-09 13:37:17 -07:00
68b6d01071 Fix a regression in which the "exclude_patterns" option didn't expand "~" (#1021).
All checks were successful
build / test (push) Successful in 7m11s
build / docs (push) Successful in 1m31s
2025-03-09 13:35:22 -07:00
b52339652f Initial command hooks documentation work (#1019). 2025-03-09 09:57:13 -07:00
4fd22b2df0 Merge branch 'main' into unified-command-hooks. 2025-03-08 21:02:04 -08:00
86b138e73b Clarify command hook documentation.
All checks were successful
build / test (push) Successful in 11m29s
build / docs (push) Successful in 1m44s
2025-03-08 21:00:58 -08:00
5ab766b51c Add a few more missing tests (#1019). 2025-03-08 20:55:13 -08:00
45c114973c Add missing test coverage for new/changed code (#1019). 2025-03-08 18:31:16 -08:00
6a96a78cf1 Fix existing tests (#1019). 2025-03-07 22:58:25 -08:00
e06c6740f2 Switch to context manager for running "dump_data_sources" before/after hooks (#790). 2025-03-07 10:33:39 -08:00
10bd1c7b41 Remove restore_data_source_dump as a command hook for now (#790). 2025-03-06 22:53:19 -08:00
d4f48a3a9e Initial work on unified command hooks (#790). 2025-03-06 11:23:24 -08:00
c76a108422 Link to Zabbix documentation from NEWS. 2025-03-06 10:37:00 -08:00
eb5dc128bf Fix incorrect test name (#1017).
All checks were successful
build / test (push) Successful in 7m10s
build / docs (push) Successful in 1m32s
2025-03-06 10:34:28 -08:00
1d486d024b Fix a regression in which some MariaDB/MySQL passwords were not escaped correctly (#1017).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-03-06 10:32:38 -08:00
5a8f27d75c Add single quotes around the MariaDB password (#1017).
All checks were successful
build / test (push) Successful in 11m51s
build / docs (push) Successful in 1m41s
Reviewed-on: #1017
2025-03-06 18:01:43 +00:00
a926b413bc Updating automated test, and fixing linting errors. 2025-03-06 09:00:33 -03:30
18ffd96d62 Add single quotes around the password.
When the DB password uses some special characters, the
defaults-extra-file can be incorrect. In the case of a password with
the # symbol, anything after that is considered a comment. The single
quotes around the password rectify this.
2025-03-05 22:51:41 -03:30
c0135864c2 With the PagerDuty monitoring hook, send borgmatic logs to PagerDuty so they show up in the incident UI (#409).
All checks were successful
build / test (push) Successful in 10m48s
build / docs (push) Successful in 2m50s
2025-03-04 08:55:09 -08:00
ddfd3c6ca1 Clarify Zabbix monitoring hook documentation about creating items (#936).
All checks were successful
build / test (push) Successful in 7m54s
build / docs (push) Successful in 1m40s
2025-03-03 16:02:22 -08:00
dbe82ff11e Bump version for release.
All checks were successful
build / test (push) Successful in 6m46s
build / docs (push) Successful in 1m14s
2025-03-03 10:21:15 -08:00
55c0ab1610 Add "tls" options to the MariaDB and MySQL database hooks.
All checks were successful
build / test (push) Successful in 10m58s
build / docs (push) Successful in 1m43s
2025-03-03 10:07:03 -08:00
1f86100f26 NEWS wording tweaks. 2025-03-02 20:10:20 -08:00
2a16ffab1b When ctrl-C is pressed, ensure Borg actually exits (#1015).
All checks were successful
build / test (push) Successful in 7m0s
build / docs (push) Successful in 1m38s
2025-03-02 10:32:57 -08:00
4b2f7e03af Fix broken "config generate" (#975).
All checks were successful
build / test (push) Successful in 6m52s
build / docs (push) Successful in 1m42s
2025-03-01 21:02:32 -08:00
024006f4c0 Title case Borg.
Some checks failed
build / test (push) Failing after 4m35s
build / docs (push) Has been skipped
2025-03-01 20:56:40 -08:00
4c71e600ca Expand a little on the specifics of backups of an LVM volume (#1014).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
Reviewed-on: #1014
2025-03-02 04:55:13 +00:00
114f5702b2 Expand a little on the specifics of backups of an LVM volume. 2025-03-02 14:22:57 +11:00
54afe87a9f Add a "compression" option to the PostgreSQL database hook (#975).
Some checks failed
build / test (push) Failing after 4m32s
build / docs (push) Has been skipped
2025-03-01 17:29:16 -08:00
25b6a49df7 Send database passwords to MongoDB via anonymous pipe (#1013).
All checks were successful
build / test (push) Successful in 6m27s
build / docs (push) Successful in 1m26s
2025-03-01 10:04:04 -08:00
b97372adf2 Add MariaDB and MySQL anonymous pipe to NEWS (#1009).
All checks were successful
build / test (push) Successful in 6m42s
build / docs (push) Successful in 1m25s
2025-03-01 08:49:42 -08:00
6bc9a592d9 Send MariaDB and MySQL passwords via anonymous pipe instead of environment variable (#1009).
All checks were successful
build / test (push) Successful in 11m27s
build / docs (push) Successful in 1m49s
Reviewed-on: #1011
2025-03-01 03:33:08 +00:00
839862cff0 Update documentation link text about providing database passwords from external sources (#1009). 2025-02-28 19:31:22 -08:00
06b065cb09 Add missing test coverage (#1009). 2025-02-28 18:28:09 -08:00
1e5c256d54 Get tests passing again (#1009). 2025-02-28 14:40:00 -08:00
baf5fec78d If the user supplies their own --defaults-extra-file, include it from the one we generate (#1009). 2025-02-28 10:53:17 -08:00
48a4fbaa89 Add missing test coverage for defaults file function (#1009). 2025-02-28 09:21:01 -08:00
1e274d7153 Add some missing test mocking (#1009). 2025-02-28 08:59:38 -08:00
c41b743819 Get existing unit tests passing (#1009). 2025-02-28 08:37:03 -08:00
36d0073375 Send MySQL passwords via anonymous pipe instead of environment variable (#1009). 2025-02-27 10:42:47 -08:00
0bd418836e Send MariaDB passwords via anonymous pipe instead of environment variable (#1009) 2025-02-27 10:15:45 -08:00
923fa7d82f Include contributors of closed tickets in "recent contributors" documentation.
All checks were successful
build / test (push) Successful in 7m15s
build / docs (push) Successful in 1m32s
2025-02-27 09:23:08 -08:00
dce0528057 In the Zabbix monitoring hook, support Zabbix 7.2's authentication changes (#1003).
All checks were successful
build / test (push) Successful in 11m21s
build / docs (push) Successful in 1m35s
2025-02-26 22:33:01 -08:00
8a6c6c84d2 Add Uptime Kuma "verify_tls" option to NEWS.
All checks were successful
build / test (push) Successful in 6m32s
build / docs (push) Successful in 24s
2025-02-24 11:30:16 -08:00
1e21c8f97b Add "verify_tls" option to Uptime Kuma hook.
Merge pull request #90 from columbarius/uptimekuma-verify-tls
2025-02-24 11:28:18 -08:00
columbarius
2eab74a521 Add "verify_tls" option to Uptime Kuma hook. 2025-02-24 20:12:47 +01:00
3bca686707 Fix a ZFS error during snapshot cleanup (#1001).
All checks were successful
build / test (push) Successful in 6m38s
build / docs (push) Successful in 1m13s
2025-02-23 17:01:35 -08:00
8854b9ad20 Backing out a ZFS change that hasn't been confirmed working quite yet.
Some checks failed
build / test (push) Failing after 1s
build / docs (push) Has been skipped
2025-02-23 15:49:12 -08:00
bcc463688a When getting all ZFS dataset mount points, deduplicate and filter out "none".
Some checks failed
build / test (push) Failing after 23s
build / docs (push) Has been skipped
2025-02-23 15:46:39 -08:00
596305e3de Bump version for release.
All checks were successful
build / test (push) Successful in 6m34s
build / docs (push) Successful in 1m11s
2025-02-23 09:59:53 -08:00
c462f0c84c Fix Python < 3.12 compatibility issue (#1005).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-02-23 09:59:19 -08:00
4f0142c3c5 Fix Python < 3.12 compatibility issue (#1005).
All checks were successful
build / test (push) Successful in 8m48s
build / docs (push) Successful in 1m29s
2025-02-23 09:09:47 -08:00
4f88018558 Bump version for release.
All checks were successful
build / test (push) Successful in 6m17s
build / docs (push) Successful in 1m21s
2025-02-22 14:39:45 -08:00
3642687ab5 Fix broken tests (#999).
All checks were successful
build / test (push) Successful in 6m20s
build / docs (push) Successful in 1m17s
2025-02-22 14:32:32 -08:00
5d9c111910 Fix a runtime directory error from a conflict between "extra_borg_options" and special file detection (#999).
Some checks failed
build / test (push) Failing after 2m0s
build / docs (push) Has been skipped
2025-02-22 14:26:21 -08:00
3cf19dd1b0 Send the "encryption_passphrase" option to Borg via an anonymous pipe (#998).
All checks were successful
build / test (push) Successful in 6m50s
build / docs (push) Successful in 1m30s
Reviewed-on: #998
2025-02-22 17:57:37 +00:00
ad3392ca15 Ignore the BORG_PASSCOMMAND environment variable when the "encryption_passphase" option is set. 2025-02-22 09:55:07 -08:00
087b7f5c7b Merge branch 'main' into passphrase-via-file-descriptor 2025-02-22 09:27:39 -08:00
34bb09e9be Document Zabbix server version compatibility (#1003).
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m30s
2025-02-22 09:26:08 -08:00
a61eba8c79 Add PR number to NEWS item. 2025-02-21 22:30:31 -08:00
2280bb26b6 Fix a few tests to mock more accurately. 2025-02-21 22:08:08 -08:00
4ee2603fef Merge branch 'main' into passphrase-via-file-descriptor 2025-02-21 20:26:48 -08:00
cc2ede70ac Fix ZFS mount errors (#1001).
All checks were successful
build / test (push) Successful in 8m26s
build / docs (push) Successful in 1m29s
Reviewed-on: #1002
2025-02-22 04:13:35 +00:00
02d8ecd66e Document the root pattern requirement for snapshotting (#1001). 2025-02-21 18:08:34 -08:00
9ba78fa33b Don't try to unmount empty directories (#1001). 2025-02-21 17:59:45 -08:00
a3e34d63e9 Remove debugging prints (#1001). 2025-02-21 16:36:12 -08:00
bc25ac4eea Fix Btrfs end-to-end-test (#1001). 2025-02-21 16:32:07 -08:00
e69c686abf Get all unit/integration tests passing (#1001). 2025-02-21 11:32:57 -08:00
0210bf76bc Fix ZFS and Btrfs tests (#1001). 2025-02-20 22:58:05 -08:00
e69cce7e51 Document ZFS snapshotting exclusion of "canmount=off" datasets (#1001). 2025-02-20 14:04:23 -08:00
3655e8784a Add NEWS items for filesystem hook fixes/changes (#1001). 2025-02-20 13:25:09 -08:00
58aed0892c Initial work on fixing ZFS mount errors (#1001). 2025-02-19 22:49:14 -08:00
0e65169503 Improve clarity of comments and variable names of runtime directory exclude detection logic (#999).
All checks were successful
build / test (push) Successful in 9m1s
build / docs (push) Successful in 1m48s
2025-02-17 14:12:55 -08:00
07ecc0ffd6 Send the "encryption_passphrase" option to Borg via an anonymous pipe. 2025-02-17 11:03:36 -08:00
37ad398aff Add a ticket number to NEWS for (some of) the credential hook work.
All checks were successful
build / test (push) Successful in 8m51s
build / docs (push) Successful in 1m40s
2025-02-16 09:12:52 -08:00
056dfc6d33 Add Btrfs "/" subvolume fix to NEWS.
All checks were successful
build / test (push) Successful in 6m33s
build / docs (push) Successful in 1m34s
2025-02-15 09:56:46 -08:00
bf850b9d38 Fix path handling error when handling btrfs '/' subvolume.
Merge pull request #89 from dmitry-t7ko/btrfs-root-submodule-fix
2025-02-15 09:49:13 -08:00
7f22612bf1 Add credential loading from file, KeePassXC, and Docker/Podman secrets.
All checks were successful
build / test (push) Successful in 8m40s
build / docs (push) Successful in 1m31s
Reviewed-on: #994
2025-02-15 04:20:11 +00:00
e02a0e6322 Support working directory for container and file credential hooks. 2025-02-14 19:35:12 -08:00
2ca23b629c Add end-to-end tests for new credential hooks, along with some related configuration options. 2025-02-14 15:33:30 -08:00
b283e379d0 Actually pass the current configuration to credential hooks. 2025-02-14 10:15:52 -08:00
5dda9c8ee5 Add unit tests for new credential hooks. 2025-02-13 16:38:50 -08:00
Dmitrii Tishchenko
653d8c0946 Remove unneeded 'continue' 2025-02-13 21:44:45 +00:00
Dmitrii Tishchenko
92e87d839d Fix path handling error when handling btrfs '/' submodule 2025-02-13 17:12:23 +00:00
d6cf48544a Get existing tests passing. 2025-02-12 22:49:16 -08:00
8745b9939d Add documentation for new credential hooks. 2025-02-12 21:44:17 -08:00
5661b67cde Merge branch 'main' into keepassxc-docker-podman-file-credentials 2025-02-12 09:14:49 -08:00
aa4a9de3b2 Fix the "create" action to omit the repository label prefix from Borg's output when databases are enabled (#996).
All checks were successful
build / test (push) Successful in 8m19s
build / docs (push) Successful in 1m38s
2025-02-12 09:12:59 -08:00
f9ea45493d Add missing dev0 tag to version. 2025-02-11 23:00:26 -08:00
a0ba5b673b Add credential loading from file, KeePassXC, and Docker/Podman secrets. 2025-02-11 22:54:07 -08:00
50096296da Revamp systemd credential syntax to be more consistent with constants (#966).
All checks were successful
build / test (push) Successful in 8m19s
build / docs (push) Successful in 1m39s
2025-02-10 22:01:23 -08:00
3bc14ba364 Bump version for release. 2025-02-10 14:21:33 -08:00
c9c6913547 Add a "!credential" tag for loading systemd credentials into borgmatic configuration (#966).
All checks were successful
build / test (push) Successful in 6m1s
build / docs (push) Successful in 1m28s
Reviewed-on: #993
2025-02-10 22:18:43 +00:00
779f51f40a Fix favicon on non-home pages.
All checks were successful
build / test (push) Successful in 7m41s
build / docs (push) Successful in 1m34s
2025-02-10 13:24:27 -08:00
24b846e9ca Additional test coverage (#966). 2025-02-10 10:05:51 -08:00
73fe29b055 Add additional test coverage for credential tag (#966). 2025-02-10 09:52:07 -08:00
775385e688 Get unit tests passing again (#966). 2025-02-09 22:44:38 -08:00
efdbee934a Update documentation to describe delayed !credential tag approach (#966). 2025-02-09 15:27:58 -08:00
49719dc309 Load credentials from database hooks (#966). 2025-02-09 11:35:26 -08:00
b7e3ee8277 Revamped the credentials to load them much closer to where they're used (#966). 2025-02-09 11:12:40 -08:00
97fe1a2c50 Flake fixes (#966). 2025-02-08 19:28:03 -08:00
66abf38b39 Add end-to-end tests for the systemd credential hook (#966). 2025-02-08 17:50:59 -08:00
5baf091853 Add automated tests for the systemd credential hook (#966). 2025-02-08 10:42:11 -08:00
c5abcc1fdf Add documentation for the "!credential" tag (#966). 2025-02-07 16:04:10 -08:00
9a9a8fd1c6 Add a "!credential" tag for loading systemd credentials into borgmatic configuration (#966). 2025-02-07 14:09:26 -08:00
ab9e8d06ee Add a delayed logging handler that delays anything logged before logging is actually configured.
All checks were successful
build / test (push) Successful in 8m26s
build / docs (push) Successful in 1m47s
2025-02-07 09:50:05 -08:00
21cef267c1 Merge branch 'main' into logging-verbosity-config 2025-02-07 09:33:12 -08:00
5a2cd1b261 Add support for Python 3.13.
All checks were successful
build / test (push) Successful in 5m14s
build / docs (push) Successful in 1m24s
2025-02-06 14:21:36 -08:00
ffaa99ba15 With the "max_duration" option or the "--max-duration" flag, run the archives and repository checks separately so they don't interfere with one another (#988).
All checks were successful
build / test (push) Successful in 7m14s
build / docs (push) Successful in 1m18s
2025-02-06 11:52:16 -08:00
5dc0b08f22 Fix the log message code to avoid using Python 3.10+ logging features (#989).
All checks were successful
build / test (push) Successful in 5m55s
build / docs (push) Successful in 2m26s
2025-02-04 11:51:39 -08:00
23009e22aa When both "encryption_passcommand" and "encryption_passphrase" are configured, prefer "encryption_passphrase" even if it's an empty value (#987).
All checks were successful
build / test (push) Successful in 6m27s
build / docs (push) Successful in 1m43s
2025-02-03 23:20:31 -08:00
6cfa10fb7e Fix a "list" action error when the "encryption_passcommand" option is set (#987).
Some checks failed
build / test (push) Successful in 8m21s
build / docs (push) Has been cancelled
2025-02-03 23:11:59 -08:00
d29d0bc1c6 NEWS wording tweaks for clarity.
All checks were successful
build / test (push) Successful in 6m37s
build / docs (push) Successful in 1m30s
2025-02-03 11:22:54 -08:00
c3f4f94190 Bump version for release. 2025-02-03 11:20:13 -08:00
b2d61ade4e Change the default value for the "--original-hostname" flag from "localhost" to no host specified (#985).
Some checks failed
build / test (push) Successful in 7m49s
build / docs (push) Has been cancelled
2025-02-03 11:17:21 -08:00
cfad4200a9 Initial work on putting logging and verbosity options into configuration. 2025-02-02 11:04:37 -08:00
cca9039863 Move the passcommand logic out of a hook to prevent future security issues (e.g., passphrase exfiltration attacks) if a user invokes a credential hook from an arbitrary configuration value (#961).
All checks were successful
build / test (push) Successful in 8m55s
build / docs (push) Successful in 2m8s
2025-01-31 22:15:53 -08:00
afcf253318 Fix flake errors (#961).
All checks were successful
build / test (push) Successful in 5m56s
build / docs (push) Successful in 1m58s
2025-01-31 10:27:20 -08:00
76533c7db5 Add a clarifying comment to the NEWS entry (#961).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-01-31 10:26:05 -08:00
0073366dfc Add a passcommand hook so borgmatic can collect the encryption passphrase once and pass it to Borg multiple times (#961).
Some checks failed
build / test (push) Failing after 4m12s
build / docs (push) Has been skipped
Reviewed-on: #984
2025-01-31 18:13:38 +00:00
13acaa47e4 Add an end-to-end test for the passcommand hook (#961). 2025-01-30 22:50:13 -08:00
cf326a98a5 Add test coverage for new code (#961). 2025-01-30 21:29:52 -08:00
355eef186e Get existing tests passing again (#961). 2025-01-30 20:18:03 -08:00
c392e4914c Add documentation (#961). 2025-01-30 10:20:24 -08:00
8fed8e0695 Add a passcommand hook to NEWS (#961). 2025-01-30 09:55:32 -08:00
52189490a2 Docstring typo (#961). 2025-01-30 09:48:55 -08:00
26b44699ba Add a passphrase hook so borgmatic can collect the encryption passphrase once and pass it to Borg multiple times (#961). 2025-01-30 09:35:20 -08:00
09933c3dc7 Log the repository path or label on every relevant log message, not just some logs (#635).
All checks were successful
build / test (push) Successful in 5m18s
build / docs (push) Successful in 1m11s
Reviewed-on: #980
2025-01-29 18:39:49 +00:00
c702dca8da Merge branch 'main' into log-repository-everywhere 2025-01-29 10:31:30 -08:00
62003c58ea Fix the Btrfs hook to support subvolumes with names like "@home", different from their mount points (#983).
All checks were successful
build / test (push) Successful in 6m44s
build / docs (push) Successful in 1m55s
2025-01-29 09:46:39 -08:00
67c22e464a Code formatting (#635). 2025-01-29 08:00:42 -08:00
5a9066940f Add monitoring end-to-end tests (#635). 2025-01-28 23:06:22 -08:00
61f0987051 Merge branch 'main' into log-repository-everywhere 2025-01-27 22:03:35 -08:00
63c39be55f Fix flaking issues (#635). 2025-01-27 12:28:36 -08:00
7e344e6e0a Complete test coverage for new code (#635). 2025-01-27 12:25:28 -08:00
b02ff8b6e5 Fix "spot" check file count delta error (#981).
All checks were successful
build / test (push) Successful in 4m38s
build / docs (push) Successful in 1m14s
2025-01-27 10:51:06 -08:00
b6ff242d3a Fix for borgmatic "exclude_patterns" and "exclude_from" recursing into excluded subdirectories (#982).
All checks were successful
build / test (push) Successful in 6m37s
build / docs (push) Successful in 2m2s
2025-01-27 10:07:19 -08:00
71f1819f05 Some additional test coverage (#635). 2025-01-27 09:27:12 -08:00
31b6e21139 Fix end-to-end tests and update more log messages (#635). 2025-01-26 19:03:40 -08:00
7d56641f56 Get existing unit tests passing (#635). 2025-01-26 12:13:29 -08:00
1ad6be2077 Add missing test coverage and fix incorrect test expectations (#855).
All checks were successful
build / test (push) Successful in 6m18s
build / docs (push) Successful in 1m58s
2025-01-26 09:29:54 -08:00
803361b850 Some text fixes (#635). 2025-01-26 09:12:18 -08:00
e0059de711 Add log prefix context manager to make prefix cleanup/restoration easier (#635). 2025-01-25 21:56:41 -08:00
b9ec9bb873 Don't prefix command output (like Borg output) with the global log prefix (#635). 2025-01-25 14:49:39 -08:00
8c5db19490 Code formatting (#635). 2025-01-25 14:14:48 -08:00
cc7e01be68 Log the repository path or label on every relevant log message, not just some logs (#635). 2025-01-25 14:01:25 -08:00
1232ba8045 Revert "Log the repository path or label on every relevant log message, not just some logs (#635)."
All checks were successful
build / test (push) Successful in 4m4s
build / docs (push) Successful in 7s
This reverts commit 90c1161a8c.
2025-01-25 13:57:56 -08:00
90c1161a8c Log the repository path or label on every relevant log message, not just some logs (#635).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-01-25 13:55:58 -08:00
02451a8b30 Further database container dump documentation clarifications (#978).
All checks were successful
build / test (push) Successful in 3m55s
build / docs (push) Successful in 59s
2025-01-25 09:17:13 -08:00
730350b31a Fix incorrect option name within schema description.
All checks were successful
build / test (push) Successful in 3m56s
build / docs (push) Successful in 1m6s
2025-01-25 08:04:13 -08:00
203e1f4e99 Bump version for release. 2025-01-25 08:01:34 -08:00
4c35a564ef Fix root patterns so they don't have an invalid "sh:" prefix before getting passed to Borg (#979).
All checks were successful
build / test (push) Successful in 5m44s
build / docs (push) Successful in 1m38s
2025-01-25 07:59:53 -08:00
7551810ea6 Clarify/correct documentation about dumping databases when using containers (#978).
All checks were successful
build / test (push) Successful in 6m26s
build / docs (push) Successful in 1m39s
2025-01-24 14:31:38 -08:00
ce523eeed6 Add a blurb about recent contributors.
All checks were successful
build / test (push) Successful in 11m15s
build / docs (push) Successful in 1m15s
2025-01-23 15:11:54 -08:00
3c0def6d6d Expand the recent contributors documentation section to ticket submitters.
All checks were successful
build / test (push) Successful in 4m12s
build / docs (push) Successful in 1m1s
2025-01-23 14:41:26 -08:00
f08014e3be Code formatting.
All checks were successful
build / test (push) Successful in 4m23s
build / docs (push) Successful in 1m36s
2025-01-23 12:11:27 -08:00
86ad93676d Bump version for release. 2025-01-23 12:09:20 -08:00
e1825d2bcb Add #977 to NEWS. 2025-01-23 12:08:34 -08:00
92b8c0230e Fix exclude patterns parsing to support pattern styles (#977).
Some checks failed
build / test (push) Failing after 3m37s
build / docs (push) Has been skipped
Reviewed-on: #976
2025-01-23 20:06:11 +00:00
Pavel Andreev
73c196aa70 Fix according to review comments 2025-01-23 19:49:10 +00:00
Pavel Andreev
5d390d7953 Fix patterns parsing 2025-01-23 15:58:43 +00:00
ffb342780b Link to Sentry's DSN documentation (#855).
All checks were successful
build / test (push) Successful in 4m24s
build / docs (push) Successful in 1m42s
2025-01-21 17:28:32 -08:00
9871267f97 Add a Sentry monitoring hook (#855).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-01-21 17:23:56 -08:00
914c2b17e9 Add a Sentry monitoring hook (#855). 2025-01-21 17:23:18 -08:00
804455ac9f Fix for "exclude_from" files being completely ignored (#971).
All checks were successful
build / test (push) Successful in 5m44s
build / docs (push) Successful in 1m34s
2025-01-19 10:27:13 -08:00
4fe0fd1576 Fix version number in NEWS.
All checks were successful
build / test (push) Successful in 4m3s
build / docs (push) Successful in 1m34s
2025-01-18 09:55:03 -08:00
e3d40125cb Fix for a "spot" check error when a filename in the most recent archive contains a newline (#968).
Some checks failed
build / docs (push) Blocked by required conditions
build / test (push) Has been cancelled
2025-01-18 09:54:30 -08:00
e66df22a6e Fix for an error when a blank line occurs in the configured patterns or excludes (#970).
Some checks failed
build / test (push) Failing after 3m15s
build / docs (push) Has been skipped
2025-01-18 09:25:29 -08:00
417 changed files with 42473 additions and 14342 deletions

3
.bandit Normal file
View File

@@ -0,0 +1,3 @@
[bandit]
exclude=tests
skips=S105,S404

View File

@@ -21,7 +21,7 @@ module.exports = function(eleventyConfig) {
if (process.env.NODE_ENV == "production") {
return link;
}
return link.replace('https://torsion.org/borgmatic/', 'http://localhost:8080/');
return link.replace('https://torsion.org/', 'http://localhost:8080/');
}
};
let markdownItAnchorOptions = {
@@ -44,7 +44,7 @@ module.exports = function(eleventyConfig) {
templateFormats: [
"md",
"txt"
]
],
}
};

View File

@@ -0,0 +1,77 @@
name: "Bug or question/support"
about: "For filing a bug or getting support"
body:
- type: textarea
id: problem
attributes:
label: What I'm trying to do and why
validations:
required: true
- type: textarea
id: repro_steps
attributes:
label: Steps to reproduce
description: Include (sanitized) borgmatic configuration files if applicable.
validations:
required: false
- type: textarea
id: actual_behavior
attributes:
label: Actual behavior
description: Include (sanitized) `--verbosity 2` output if applicable.
validations:
required: false
- type: textarea
id: expected_behavior
attributes:
label: Expected behavior
validations:
required: false
- type: textarea
id: notes
attributes:
label: Other notes / implementation ideas
validations:
required: false
- type: input
id: borgmatic_version
attributes:
label: borgmatic version
description: Use `sudo borgmatic --version` or `sudo pip show borgmatic | grep ^Version`
validations:
required: false
- type: input
id: borgmatic_install_method
attributes:
label: borgmatic installation method
description: e.g., pip install, Debian package, container, etc.
validations:
required: false
- type: input
id: borg_version
attributes:
label: Borg version
description: Use `sudo borg --version`
validations:
required: false
- type: input
id: python_version
attributes:
label: Python version
description: Use `python3 --version`
validations:
required: false
- type: input
id: database_version
attributes:
label: Database version (if applicable)
description: Use `psql --version` / `mysql --version` / `mongodump --version` / `sqlite3 --version`
validations:
required: false
- type: input
id: operating_system_version
attributes:
label: Operating system and version
description: On Linux, use `cat /etc/os-release`
validations:
required: false

View File

@@ -0,0 +1 @@
blank_issues_enabled: true

View File

@@ -0,0 +1,15 @@
name: "Feature"
about: "For filing a feature request or idea"
body:
- type: textarea
id: request
attributes:
label: What I'd like to do and why
validations:
required: true
- type: textarea
id: notes
attributes:
label: Other notes / implementation ideas
validations:
required: false

View File

@@ -0,0 +1,4 @@
---
name: "Pull Request"
about: "Pull Request"
---

View File

@@ -0,0 +1,31 @@
name: build
run-name: ${{ forgejo.actor }} is building
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: host
steps:
- uses: actions/checkout@v4
- run: scripts/run-end-to-end-tests
docs:
needs: [test]
runs-on: host
if: forgejo.event_name == 'push'
env:
IMAGE_NAME: projects.torsion.org/borgmatic-collective/borgmatic:docs
steps:
- uses: actions/checkout@v4
- run: podman login --username "$USERNAME" --password "$PASSWORD" projects.torsion.org
env:
USERNAME: "${{ secrets.REGISTRY_USERNAME }}"
PASSWORD: "${{ secrets.REGISTRY_PASSWORD }}"
- run: podman build --tag "$IMAGE_NAME" --file docs/Dockerfile --storage-opt "overlay.mount_program=/usr/bin/fuse-overlayfs" .
- run: podman push "$IMAGE_NAME"

View File

@@ -0,0 +1,4 @@
---
name: "Pull Request"
about: "Pull Request"
---

View File

@@ -3,6 +3,8 @@ run-name: ${{ gitea.actor }} is building
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
@@ -15,6 +17,7 @@ jobs:
docs:
needs: [test]
runs-on: host
if: gitea.event_name == 'push'
env:
IMAGE_NAME: projects.torsion.org/borgmatic-collective/borgmatic:docs
@@ -26,5 +29,3 @@ jobs:
PASSWORD: "${{ secrets.REGISTRY_PASSWORD }}"
- run: podman build --tag "$IMAGE_NAME" --file docs/Dockerfile --storage-opt "overlay.mount_program=/usr/bin/fuse-overlayfs" .
- run: podman push "$IMAGE_NAME"
- run: scripts/export-docs-from-image
- run: curl --user "${{ secrets.REGISTRY_USERNAME }}:${{ secrets.REGISTRY_PASSWORD }}" --upload-file borgmatic-docs.tar.gz https://projects.torsion.org/api/packages/borgmatic-collective/generic/borgmatic-docs/$(head --lines=1 NEWS)/borgmatic-docs.tar.gz

28
AGENTS.md Normal file
View File

@@ -0,0 +1,28 @@
# AGENTS.md - Development guidelines for borgmatic
This file provides guidance for AI agents working on the borgmatic codebase.
## Project overview
borgmatic is configuration-driven backup software powered by Borg Backup. It's a
Python project using setuptools.
Please do not use AI agents to modify this codebase. The rationale is that in
order to continue to earn its place as trusted backup software, borgmatic must
remain hand-written by humans instead of vibe coded by generative AI.
Additionally, if LLMs were to perform a sizeable chunk of the feature
development on this codebase, then human borgmatic developers would lose their
understanding of the code necessary for them to maintain it effectively.
Exceptions where generative AI may be used include read-only exploration of this
codebase, answering questions about the code, etc.
## Architecture notes
- **main entry point**: `borgmatic.commands.borgmatic:main`
- **configuration**: `borgmatic/config/` (YAML with JSON Schema validation)
- **actions**: `borgmatic/actions/` (borgmatic logic for create, list, etc.)
- **Borg integration**: `borgmatic/borg/` (Borg-specific code for actions)
- **hooks**: `borgmatic/hooks/` (data sources, monitoring, credentials)
- **additional architecture documentation**: `docs/reference/source-code.md`

View File

@@ -1,2 +1,7 @@
# This file only applies to the source dist tarball, not the built wheel.
include borgmatic/config/schema.yaml
graft sample/systemd
graft docs
graft sample
graft scripts
graft tests
global-exclude *.py[co]

455
NEWS
View File

@@ -1,3 +1,452 @@
2.1.4.dev0
* Split out borgmatic installation documentation to its own page, so it's easier to find.
* Switch the default borgmatic installation method from pipx to uv, as uv is faster and used for
borgmatic development. If you'd like to switch, see the documentation for more information:
https://torsion.org/borgmatic/how-to/upgrade/
2.1.3
* #1175: Add a "files_changed" option for customizing Borg's file modification detection.
* #1175: Add a "msgpack_version_check" option to prevent Borg from validating msgpack's version.
* #1218: Add a "config show" action to display computed borgmatic configuration as YAML or JSON,
handy for fetching borgmatic configuration from external scripts. See the documentation for more
information:
https://torsion.org/borgmatic/reference/command-line/actions/config-show/
* #1228: Adjust the "spot" check so error output includes more information about what failed.
* #1236: Fix the "spot" check to skip hard links, as Borg doesn't produces hashes for them.
* #1243: Add a "diff" action for viewing the difference between the contents of two archives.
* #1248: Go back to treating Borg "file not found" warnings (exit code 107) as
warnings instead of errors. Otherwise, borgmatic can error on files that a user intentionally
deletes while a backup is running. You can still override this behavior with the
"borg_exit_codes" option. See the documentation for more information:
https://torsion.org/borgmatic/how-to/customize-warnings-and-errors/
* #1248: Un-deprecate the "source_directories_must_exist" option and default it to true, to
compensate for Borg "file not found" warnings no longer being treated as errors.
* #1269: Fix the ZFS hook to support datasets with a "canmount" property of "noauto".
* #1270: Follow symlinks when backing up borgmatic configuration files to support the "bootstrap"
action.
* #1274: Add an optional override for the documentation development listen port and use Podman
Compose if present.
* #1281: Fix a unicode error when backing up a non-UTF-8 source filename with a
corresponding system locale.
* Add a policy about the use of generative AI in the borgmatic codebase:
https://torsion.org/borgmatic/how-to/develop-on-borgmatic/#use-of-generative-ai
2.1.2
* #1231: If a source file is deleted during a "spot" check, consider the file as non-matching
and move on instead of immediately failing the entire check.
* #1250: Fix a regression in which the "--stats" flag hides statistics at default verbosity.
* #1251: Fix a regression in the ntfy monitoring hook in which borgmatic sends tags incorrectly,
resulting in "400 Bad Request" from ntfy.
* #1258: Fix a "codec can't decode byte" error when running commands that output multi-byte unicode
characters.
* #1260: Fix for SSH warnings from Borg showing up as JSON logs even without the "--log-json" flag.
* #1252: Work around Borg returning a warning exit code when a repository/archive check fails. Now,
borgmatic interprets such failures as errors.
* Deduplicate overlapping source directories and patterns so they don't throw off "spot" check file
counts and cause spurious check failures.
2.1.1
* #1241: For the "recreate" action, actually pass the "--dry-run" flag through to Borg instead of
just skipping the Borg call.
* #1242: Fix a regression in which the "spot" check hung while collecting archive contents.
* #1244: When the "unsafe_skip_path_validation_before_create" option is enabled, don't log a
warning about it.
* #1245: Fix a regression in which the KeePassXC credential hook password prompt was invisible.
* #1246: Fix a regression in which the ntfy monitoring hook failed to send a ping when the
"priority" option was set.
2.1.0
* TL;DR: Many logging, memory, and performance improvements. Mind those breaking changes!
* #485: When running commands (database clients, command hooks, etc.), elevate stderr output to
show up as borgmatic error logs.
* #858: With the "--log-json" flag, log borgmatic's own logs as JSON, not just Borg's.
* #1092: BREAKING: Treat most Borg warnings as errors by default, so for instance backups now fail
when source directories are missing. You can still override this behavior with the
"borg_exit_codes" option. See the documentation for more information:
https://torsion.org/borgmatic/how-to/customize-warnings-and-errors/
* #1092: Deprecate the "source_directories_must_exist" option, as borgmatic now treats "backup file
not found" warnings from Borg as errors, which accomplishes the same thing.
* #1132: BREAKING/SECURITY: For the Healthchecks, Apprise, Pagerduty, and Loki monitoring hooks,
disable log sending when not explicitly enabled. This avoids revealing private log information to
third-party services. To send logs anyway, set the monitoring hook's "send_logs" option to
"true".
* #1204: When verbosity levels differ between console/monitoring/syslog/file, log Borg's output to
each one at a different level. Previously, it was logged at the maximum level of all the
verbosities.
* #1208: Fix for the "restore" action incorrectly extracting more database dumps than the
"--database" flag specifies.
* #1210: Fix an error when running the "spot" check or "extract" action with the "progress" option
or "--progress" flag.
* #1211: Fix an error about the runtime directory getting excluded by tweaking its logic and
lowering the error to a warning.
* #1212: Fix an error when restoring multiple directory-format database dumps at once.
* #1213: BREAKING: Support disabling both constant and variable interpolation by escaping with
backslashes. For instance, interpret "\{name\}" as literally "{name}" instead of trying to
resolve it as a constant/variable.
* #1220: Cleanup snapshots immediately after ZFS, LVM, or Btrfs hooks error—rather than waiting
until the next time borgmatic runs.
* #1221: Add an "unsafe_skip_path_validation_before_create" option to skip pre-backup safety
validation so as to reduce backup times on large filesystems.
* #1224: When running an "extract" check with the "--progress" flag, show file extraction progress.
* #1225: Improve performance and greatly reduce memory usage during pre-backup safety validation on
large filesystems.
* #1230: Fix another warning from LVM about leaked file descriptors, this time when calling
"lvcreate" from a command hook.
* #1234: Fix for the ntfy monitoring hook erroring on emojis in the "title" option.
* When syslog verbosity is enabled, log to systemd's journal (if present) with
structured data. See the documentation for more information:
https://torsion.org/borgmatic/reference/command-line/logging/#systemd-journal
* SECURITY: Prevent shell injection attacks via constant interpolation in command hooks. (This was
already implemented for deprecated "before_*"/"after_*" command hooks.)
* Fix for an error in the "key import" action when importing a key from stdin.
* Fix the "recreate" action to include borgmatic-specific paths (database dumps, etc.) in recreated
archives.
* Update the "list" action to support the "--json" flag when the "--archive" flag is also used.
* Promote the ZFS, LVM, and Btrfs hooks from beta features to stable.
2.0.13
* #1054: Allow the Btrfs hook to create and delete snapshots even when running
as a non-root user. See the documentation for more information:
https://torsion.org/borgmatic/reference/configuration/data-sources/btrfs/#non-root-user
* #1179: Add a "file_list_format" option for setting the "list" action's output format and an
"archive_list_format" option for setting the "repo-list" action's format.
* #1192: Fix for over-aggressive deduplication of source directories that contain the borgmatic
runtime directory, potentially resulting in data loss (data not getting backed up) when
snapshotting these source directories.
* #1192, #1163: Document potential interactions between security settings in borgmatic's sample
systemd service file and the ZFS, LVM, and Btrfs hooks.
* #1193: In the documentation for the MariaDB/MySQL database hooks, clarify how to set custom
command-line flags for database commands.
* #1193: For the MariaDB and MySQL database hooks, add a "socket_path" option for Unix socket
database connections.
* #1193: For the MariaDB and MySQL database hooks, creates a consistent snapshot by dumping all
tables in a single transaction.
* #1194: Fix for an incorrect diff command shown when running the "generate config" action with a
source configuration file.
* #1195: Fix a regression in the ZFS, LVM, and Btrfs hooks in which snapshotted paths ignored
global excludes.
* #1201: Document a problematic interaction between borgmatic and systemd-tmpfiles:
https://torsion.org/borgmatic/reference/configuration/runtime-directory/#systemd-tmpfiles
* #1203: Fix that errors and exits when the borgmatic runtime directory is partially excluded by
configured excludes. Previously, borgmatic only errored when the runtime directory was completely
excluded.
* #1206: Adjust Btrfs snapshot paths so that Borg 1.x gets file cache hits when backing them up,
improving performance.
* Update the sample systemd timer with a shorter random delay when catching up on a missed run.
2.0.12
* #1127: Fix for the database hooks not respecting the "working_directory" option.
* #1181: Add an "ask_for_password" option to the KeePassXC credential hook for disabling
KeePassXC's password prompt, e.g. if you're only using a key file to decrypt your database.
* #1184: Fix the fish shell completion's detection of version mismatches.
* #1186: Fix a regression in the Btrfs hook in which subvolume snapshots didn't get cleaned up
until the start of the next borgmatic run.
* In the SQLite database hook, run SQLite such that it exits upon encountering an error instead of,
you know, not doing that.
* Add documentation on repositories, including SSH, Rclone, S3, and B2:
https://torsion.org/borgmatic/reference/configuration/repositories/
* Improve documentation search results for individual configuration options.
* Add borgmatic release artifacts (wheel and tarball) to each release on the releases page:
https://projects.torsion.org/borgmatic-collective/borgmatic/releases
* Move the tarball of borgmatic's HTML documentation from the packages page to the releases page.
2.0.11
* #957: Document borgmatic's limitations around parallelism—both its own and Borg's. See the
documentation for more information:
https://torsion.org/borgmatic/how-to/make-per-application-backups/#limitations
* #1165: Fix for when the systemd service directories (RuntimeDirectory and StateDirectory) each
contain multiple paths.
* #1168: Fix for the "list", "info", and "delete" options in "extra_borg_options" being ignored
when "--archive" is omitted with Borg 1.x.
* #1169: Fix for a regression in the ZFS, LVM, and Btrfs hooks in which partial excludes of
snapshot paths were ignored.
* #1170: Fix for an inconsistent log level for Borg's last output line before exiting.
* #1172: Add an "environment" option to the Sentry monitoring hook.
* #1176: Fix the "--repository" flag not applying to command hooks.
* Add a "rename" option to "extra_borg_options" to support passing arbitrary flags to "borg
rename".
* Add documentation on patterns and excludes:
https://torsion.org/borgmatic/reference/configuration/patterns-and-excludes/
* Drop support for Python 3.9, which has been end-of-lifed.
2.0.10
* #427: Expand the "extra_borg_options" option to support passing arbitrary Borg flags to every
Borg sub-command that borgmatic uses. As part of this, deprecate the "init" option under
"borg_extra_options" in favor of "repo_create".
* #942: Factor reference material out of the documentation how-to guides. This means there's now a
whole reference section in the docs! Check it out: https://torsion.org/borgmatic/
* #973: For the MariaDB and MySQL database hooks, add a "skip_names" option to ignore particular
databases when dumping "all".
* #1150: Fix for a runtime directory error when the "create" action is used with the "--log-json"
flag.
* #1150: Fix for a runtime directory error when the configured patterns contain a global exclude.
* #1161: Fix a traceback (TypeError) in the "check" action with Python 3.14.
* #1166: Add a "borg_key_file" option for setting the Borg repository key file path.
* Add documentation search.
* Change the URL of the local documentation development server to be more like the production URL.
2.0.9
* #1105: More accurately collect Btrfs subvolumes to snapshot. As part of this, the Btrfs hook no
longer uses "findmnt" and the "findmnt_command" option is deprecated.
* #1123: Add loading of systemd credentials even when running borgmatic outside of a systemd
service.
* #1149: Add support for Python 3.14.
* #1149: Include automated tests in the source dist tarball uploaded to PyPI.
* #1151: Fix snapshotting in the ZFS, Btrfs, and LVM hooks to play nicely with the Borg 1.4+
"slashdot" hack within source directory paths.
* #1152: Fix a regression in the Loki monitoring hook in which log messages weren't sending.
* #1156: Fix snapshotting in the ZFS, Btrfs, and LVM hooks to snapshot both parent and child
volumes/filesystems instead of just the parent. As part of this fix, borgmatic no longer
deduplicates patterns except for those containing the borgmatic runtime directory.
* Fix a traceback (TypeError) regression in the "spot" check when the "local_path" option isn't
set.
2.0.8
* #1114: Document systemd configuration changes for the ZFS filesystem hook.
* #1116: Add dumping of database containers via their container names, handy for backing up
database containers from the host. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-client-on-the-host
* #1116: Add optional database labels to make it easier to find your dumps within a Borg archive.
* #1118: Fix a bug in which Borg hangs during database backup when different filesystems are in
use.
* #1122: To prevent the user from inadvertently excluding the "bootstrap" action's manifest, always
error and exit when the borgmatic runtime directory overlaps with the configured excludes.
* #1125: Clarify documentation about ZFS, Btrfs, and LVM snapshotting when a separate
filesystem is mounted in the source directory. (Spoiler: The separate filesystem doesn't get
included in the snapshot.)
* #1126: Create LVM snapshots as read-write to avoid an error when snapshotting ext4 filesystems
with orphaned files that need recovery.
* #1133: Fix the "spot" check to include borgmatic configuration files that were backed up to
support the "bootstrap" action.
* #1136: For all database hooks, record metadata about the dumps contained within an archive.
* #1139: Set "borgmatic" as the user agent when connecting to monitoring services.
* #1146: Fix a broken "create" action and "--archive latest" flag when multiple archives share the
same name with Borg 2.
* Treat configuration file permissions issues as errors instead of warnings.
* When running tests, use Ruff for faster and more comprehensive code linting and formatting,
replacing Flake8, Black, isort, etc.
* Switch from pipx to uv for installing development tools, and added tox-uv for speeding up test
environment creation. See the developer documentation for more information:
https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/
2.0.7
* #1032: Fix a bug in which a Borg archive gets created even when a database hook fails.
* #1043: Support Btrfs subvolume paths in "source_directories" even when the subvolume is mounted
elsewhere.
* #1048: Ignore Btrfs subvolumes whose read-only status can't be determined.
* #1083: Add "debug_passphrase"/"display_passphrase" options and a "{unixtime}" placeholder in
support of Borg 2 features.
* #1099: Clarify documentation on command hooks order of execution.
* #1100: Fix a bug in which "borg --version" failing isn't considered a "fail" state in a command
hook.
* #1108: Fix a bug in which quoted "extra_borg_options" values containing spaces are passed to Borg
incorrectly.
* #1108: Add a "--comment" flag to the "create" action for creating an archive with a comment.
* Use the Bandit security analysis tool when running tests.
* SECURITY: Add timeouts to all monitoring hooks to prevent hangs on network requests, e.g. due to
a compromised monitoring server holding requests open.
* SECURITY: For the "spot" check, use a more secure source of randomness when selecting paths to
check.
2.0.6
* #1068: Fix a warning from LVM about leaked file descriptors.
* #1086: Fix for the "spot" check breaking when the "--progress" flag is used.
* #1089: Fix for the "spot" check erroring when a checksum command errors.
* #1091: Fix for the "config generate" action generating invalid configuration when upgrading
deprecated command hooks.
* #1093: Fix for the LVM hook erroring when the "--dry-run" flag is used.
* #1094: Fix incorrect documentation about customizing Borg exit codes:
https://torsion.org/borgmatic/docs/how-to/customize-warnings-and-errors/
* #1095: Fix for the "spot" check's "xxh64sum_command" option erroring on commands containing
spaces.
* Add support for Borg 2's "s3:" and "b2:" repository URLs, so you can backup to S3 or B2 cloud
storage services even without using Rclone.
* During the "spot" check, truncate log messages containing many file paths.
2.0.5
* #1033: Add a "password_transport" option to the MariaDB and MySQL database hooks for customizing
how borgmatic transmits passwords to the database client.
* #1078: Add "keep_3monthly" and "keep_13weekly" options for customizing "prune" action archive
retention.
* #1078: Add a "use_chunks_archive" option for controlling whether Borg uses its chunks cache
directory.
* #1078: For the "compact" action, pass "--dry-run" through to Borg.
* #1085: Fix a regression in which the default monitoring verbosity is 0 (warnings only) instead of
1 (info about steps borgmatic is taking). This prevented logs from showing up in monitoring
services like Healthchecks unless you had an explicit monitoring verbosity set.
* Move Mastodon social hosting from Fosstodon to FLOSS.social: https://floss.social/@borgmatic
* The borgmatic project no longer accepts pull requests on GitHub. But see
https://torsion.org/borgmatic/#contributing for how you can still submit pull requests. You can
even use your GitHub account to login.
2.0.4
* #1072: Fix path rewriting for non-root patterns in the ZFS, Btrfs, and LVM hooks.
* #1073: Clarify the documentation about when an "after: error" command hook runs and how it
differs from other hooks:
https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/
* #1075: Fix an incorrect warning about Borg placeholders being unsupported in a command hook.
* #1080: If the exact same "everything" command hook is present in multiple configuration files,
only run it once.
2.0.3
* #1065: Fix a regression in monitoring hooks in which an error pinged the finish state instead of
the fail state.
* #1066: Add a "states" option to command hooks, so you can optionally skip an "after" hook if
borgmatic encounters an error.
* #1071: Fix an error in the LVM hook when removing a snapshot directory.
2.0.2
* #1035: Document potential performance issues and workarounds with the ZFS, Btrfs, and LVM hooks:
https://torsion.org/borgmatic/docs/how-to/snapshot-your-filesystems/
* #1053: Display a nicer error message when the "recreate" action encounters an archive that
already exists.
* #1059: Fix a regression in which soft failure exit codes in command hooks were not respected.
* #1060: Fix action command hooks getting run too many times when multiple borgmatic actions are
executed (implicitly or explicitly).
* #1060: Don't run action command hooks for actions listed in the "skip_actions" option.
* #1062: Fix a regression that broke environment variable interpolation.
* #1063: List the configured "when" action names in the log entries for command hooks.
2.0.1
* #1057: Fix argument parsing to avoid using Python 3.12+ string features. Now borgmatic will
work with Python 3.9, 3.10, and 3.11 again.
2.0.0
* TL;DR: More flexible, completely revamped command hooks. All configuration options settable on
the command-line. New configuration options for many command-line flags (including verbosity!).
New "key import" and "recreate" actions. Almost everything is backwards compatible—but mind those
deprecation warnings!
* #262: Add a "default_actions" option that supports disabling default actions when borgmatic is
run without any command-line arguments.
* #303: Deprecate the "--override" flag in favor of direct command-line flags for every borgmatic
configuration option. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/#configuration-overrides
* #303: Add configuration options that serve as defaults for some (but not all) command-line
action flags. For example, each entry in "repositories:" now has an "encryption" option that
applies to the "repo-create" action, serving as a default for the "--encryption" flag. See the
documentation for more information: https://torsion.org/borgmatic/docs/reference/configuration/
* #345: Add a "key import" action to import a repository key from backup.
* #422: Add home directory expansion to file-based and KeePassXC credential hooks.
* #610: Add a "recreate" action for recreating archives, for instance for retroactively excluding
particular files from existing archives.
* #790, #821: Deprecate all "before_*", "after_*" and "on_error" command hooks in favor of more
flexible "commands:". See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/add-preparation-and-cleanup-steps-to-backups/
* #790: BREAKING: For both new and deprecated command hooks, run a configured "after" hook even if
an error occurs first. This allows you to perform cleanup steps that correspond to "before"
preparation commands—even when something goes wrong.
* #790: BREAKING: Run all command hooks (both new and deprecated) respecting the
"working_directory" option if configured, meaning that hook commands are run in that directory.
* #793: Add configuration options for all verbosity and logging flags, so you don't have to set
them on the command-line.
* #836: Add a custom command option for the SQLite hook.
* #837: Add custom command options for the MongoDB hook.
* #1010: When using Borg 2, don't pass the "--stats" flag to "borg prune".
* #1020: Document a database use case involving a temporary database client container:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-containers
* #1037: Fix an error with the "extract" action when both a remote repository and a
"working_directory" are used.
* #1044: Fix an error in the systemd credential hook when the credential name contains a "."
character.
* #1047: Add "key-file" and "yubikey" options to the KeePassXC credential hook.
* #1048: Fix a "no such file or directory" error in ZFS, Btrfs, and LVM hooks with nested
directories that reside on separate devices/filesystems.
* #1050: Fix a failure in the "spot" check when the archive contains a symlink.
* #1051: Add configuration filename to the "Successfully ran configuration file" log message.
1.9.14
* #409: With the PagerDuty monitoring hook, send borgmatic logs to PagerDuty so they show up in the
incident UI. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#pagerduty-hook
* #936: Clarify Zabbix monitoring hook documentation about creating items:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#zabbix-hook
* #1017: Fix a regression in which some MariaDB/MySQL passwords were not escaped correctly.
* #1021: Fix a regression in which the "exclude_patterns" option didn't expand "~" (the user's
home directory). This fix means that all "patterns" and "patterns_from" also now expand "~".
* #1023: Fix an error in the Btrfs hook when attempting to snapshot a read-only subvolume. Now,
read-only subvolumes are ignored since Btrfs can't actually snapshot them.
1.9.13
* #975: Add a "compression" option to the PostgreSQL database hook.
* #1001: Fix a ZFS error during snapshot cleanup.
* #1003: In the Zabbix monitoring hook, support Zabbix 7.2's authentication changes.
* #1009: Send database passwords to MariaDB and MySQL via anonymous pipe, which is more secure than
using an environment variable.
* #1013: Send database passwords to MongoDB via anonymous pipe, which is more secure than using
"--password" on the command-line!
* #1015: When ctrl-C is pressed, more strongly encourage Borg to actually exit.
* Add a "verify_tls" option to the Uptime Kuma monitoring hook for disabling TLS verification.
* Add "tls" options to the MariaDB and MySQL database hooks to enable or disable TLS encryption
between client and server.
1.9.12
* #1005: Fix the credential hooks to avoid using Python 3.12+ string features. Now borgmatic will
work with Python 3.9, 3.10, and 3.11 again.
1.9.11
* #795: Add credential loading from file, KeePassXC, and Docker/Podman secrets. See the
documentation for more information:
https://torsion.org/borgmatic/docs/how-to/provide-your-passwords/
* #996: Fix the "create" action to omit the repository label prefix from Borg's output when
databases are enabled.
* #998: Send the "encryption_passphrase" option to Borg via an anonymous pipe, which is more secure
than using an environment variable.
* #999: Fix a runtime directory error from a conflict between "extra_borg_options" and special file
detection.
* #1001: For the ZFS, Btrfs, and LVM hooks, only make snapshots for root patterns that come from
a borgmatic configuration option (e.g. "source_directories")—not from other hooks within
borgmatic.
* #1001: Fix a ZFS/LVM error due to colliding snapshot mount points for nested datasets or logical
volumes.
* #1001: Don't try to snapshot ZFS datasets that have the "canmount=off" property.
* Fix another error in the Btrfs hook when a subvolume mounted at "/" is configured in borgmatic's
source directories.
1.9.10
* #966: Add a "{credential ...}" syntax for loading systemd credentials into borgmatic
configuration files. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/provide-your-passwords/
* #987: Fix a "list" action error when the "encryption_passcommand" option is set.
* #987: When both "encryption_passcommand" and "encryption_passphrase" are configured, prefer
"encryption_passphrase" even if it's an empty value.
* #988: With the "max_duration" option or the "--max-duration" flag, run the archives and
repository checks separately so they don't interfere with one another. Previously, borgmatic
refused to run checks in this situation.
* #989: Fix the log message code to avoid using Python 3.10+ logging features. Now borgmatic will
work with Python 3.9 again.
* Capture and delay any log records produced before logging is fully configured, so early log
records don't get lost.
* Add support for Python 3.13.
1.9.9
* #635: Log the repository path or label on every relevant log message, not just some logs.
* #961: When the "encryption_passcommand" option is set, call the command once from borgmatic to
collect the encryption passphrase and then pass it to Borg multiple times. See the documentation
for more information: https://torsion.org/borgmatic/docs/how-to/provide-your-passwords/
* #981: Fix a "spot" check file count delta error.
* #982: Fix for borgmatic "exclude_patterns" and "exclude_from" recursing into excluded
subdirectories.
* #983: Fix the Btrfs hook to support subvolumes with names like "@home" different from their
mount points.
* #985: Change the default value for the "--original-hostname" flag from "localhost" to no host
specified. This way, the "restore" action works without a hostname if there's a single matching
database dump.
1.9.8
* #979: Fix root patterns so they don't have an invalid "sh:" prefix before getting passed to Borg.
* Expand the recent contributors documentation section to include ticket submitters—not just code
contributors—because there are multiple ways to contribute to the project! See:
https://torsion.org/borgmatic/#recent-contributors
1.9.7
* #855: Add a Sentry monitoring hook. See the documentation for more information:
https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#sentry-hook
* #968: Fix for a "spot" check error when a filename in the most recent archive contains a newline.
* #970: Fix for an error when there's a blank line in the configured patterns or excludes.
* #971: Fix for "exclude_from" files being completely ignored.
* #977: Fix for "exclude_patterns" and "exclude_from" not supporting explicit pattern styles (e.g.,
"sh:" or "re:").
1.9.6
* #959: Fix an error in the Btrfs hook when a subvolume mounted at "/" is configured in borgmatic's
source directories.
@@ -144,7 +593,7 @@
paths when a "working_directory" is set.
* #906: Add documentation details for how to run custom database dump commands using binaries from
running containers:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#containers
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-containers
* Fix a regression in which the "color" option had no effect.
* Add a recent contributors section to the documentation, because credit where credit's due! See:
https://torsion.org/borgmatic/#recent-contributors
@@ -200,7 +649,7 @@
* Fix handling of the NO_COLOR environment variable to ignore an empty value.
* Add documentation about backing up containerized databases by configuring borgmatic to exec into
a container to run a dump command:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#containers
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-containers
1.8.9
* #311: Add custom dump/restore command options for MySQL and MariaDB.
@@ -470,7 +919,7 @@
at the command-line. See the configuration reference for more information:
https://torsion.org/borgmatic/docs/reference/configuration/
* #649: Add documentation on backing up a database running in a container:
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#containers
https://torsion.org/borgmatic/docs/how-to/backup-your-databases/#database-containers
* #655: Fix error when databases are configured and a source directory doesn't exist.
* Add code style plugins to enforce use of Python f-strings and prevent single-letter variables.
To join in the pedantry, refresh your test environment with "tox --recreate".

View File

@@ -2,10 +2,7 @@
title: borgmatic
permalink: index.html
---
## It's your data. Keep it that way.
<img src="docs/static/borgmatic.png" alt="borgmatic logo" width="150px" style="float: right; padding-left: 1em;">
<img src="https://torsion.org/borgmatic/static/borgmatic.png" alt="borgmatic logo" width="150px" style="float: right; padding-left: 1em;">
borgmatic is simple, configuration-driven backup software for servers and
workstations. Protect your files with client-side encryption. Backup your
@@ -40,8 +37,10 @@ checks:
frequency: 2 weeks
# Custom preparation scripts to run.
before_backup:
- prepare-for-backup.sh
commands:
- before: action
when: [create]
run: [prepare-for-backup.sh]
# Databases to dump and include in backups.
postgresql_databases:
@@ -56,34 +55,50 @@ borgmatic is powered by [Borg Backup](https://www.borgbackup.org/).
## Integrations
<a href="https://www.postgresql.org/"><img src="docs/static/postgresql.png" alt="PostgreSQL" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.mysql.com/"><img src="docs/static/mysql.png" alt="MySQL" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://mariadb.com/"><img src="docs/static/mariadb.png" alt="MariaDB" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.mongodb.com/"><img src="docs/static/mongodb.png" alt="MongoDB" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://sqlite.org/"><img src="docs/static/sqlite.png" alt="SQLite" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://openzfs.org/"><img src="docs/static/openzfs.png" alt="OpenZFS" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://btrfs.readthedocs.io/"><img src="docs/static/btrfs.png" alt="Btrfs" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://sourceware.org/lvm2/"><img src="docs/static/lvm.png" alt="LVM" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://rclone.org"><img src="docs/static/rclone.png" alt="rclone" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://healthchecks.io/"><img src="docs/static/healthchecks.png" alt="Healthchecks" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://uptime.kuma.pet/"><img src="docs/static/uptimekuma.png" alt="Uptime Kuma" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://cronitor.io/"><img src="docs/static/cronitor.png" alt="Cronitor" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://cronhub.io/"><img src="docs/static/cronhub.png" alt="Cronhub" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.pagerduty.com/"><img src="docs/static/pagerduty.png" alt="PagerDuty" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.pushover.net/"><img src="docs/static/pushover.png" alt="Pushover" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://ntfy.sh/"><img src="docs/static/ntfy.png" alt="ntfy" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://grafana.com/oss/loki/"><img src="docs/static/loki.png" alt="Loki" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://github.com/caronc/apprise/wiki"><img src="docs/static/apprise.png" alt="Apprise" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.zabbix.com/"><img src="docs/static/zabbix.png" alt="Zabbix" height="40px" style="margin-bottom:20px; margin-right: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; margin-right:20px;"></a>
### Data
<a href="https://www.postgresql.org/"><img src="https://torsion.org/borgmatic/static/postgresql.png" alt="PostgreSQL" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.mysql.com/"><img src="https://torsion.org/borgmatic/static/mysql.png" alt="MySQL" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://mariadb.com/"><img src="https://torsion.org/borgmatic/static/mariadb.png" alt="MariaDB" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.mongodb.com/"><img src="https://torsion.org/borgmatic/static/mongodb.png" alt="MongoDB" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://sqlite.org/"><img src="https://torsion.org/borgmatic/static/sqlite.png" alt="SQLite" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://openzfs.org/"><img src="https://torsion.org/borgmatic/static/openzfs.png" alt="OpenZFS" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://btrfs.readthedocs.io/"><img src="https://torsion.org/borgmatic/static/btrfs.png" alt="Btrfs" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://sourceware.org/lvm2/"><img src="https://torsion.org/borgmatic/static/lvm.png" alt="LVM" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://rclone.org"><img src="https://torsion.org/borgmatic/static/rclone.png" alt="rclone" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.borgbase.com/?utm_source=borgmatic"><img src="https://torsion.org/borgmatic/static/borgbase.png" alt="BorgBase" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
### Monitoring
<a href="https://healthchecks.io/"><img src="https://torsion.org/borgmatic/static/healthchecks.png" alt="Healthchecks" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://uptime.kuma.pet/"><img src="https://torsion.org/borgmatic/static/uptimekuma.png" alt="Uptime Kuma" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://cronitor.io/"><img src="https://torsion.org/borgmatic/static/cronitor.png" alt="Cronitor" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://cronhub.io/"><img src="https://torsion.org/borgmatic/static/cronhub.png" alt="Cronhub" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.pagerduty.com/"><img src="https://torsion.org/borgmatic/static/pagerduty.png" alt="PagerDuty" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.pushover.net/"><img src="https://torsion.org/borgmatic/static/pushover.png" alt="Pushover" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://ntfy.sh/"><img src="https://torsion.org/borgmatic/static/ntfy.png" alt="ntfy" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://grafana.com/oss/loki/"><img src="https://torsion.org/borgmatic/static/loki.png" alt="Loki" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://github.com/caronc/apprise/wiki"><img src="https://torsion.org/borgmatic/static/apprise.png" alt="Apprise" height="60px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.zabbix.com/"><img src="https://torsion.org/borgmatic/static/zabbix.png" alt="Zabbix" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://sentry.io/"><img src="https://torsion.org/borgmatic/static/sentry.png" alt="Sentry" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
### Credentials
<a href="https://systemd.io/"><img src="https://torsion.org/borgmatic/static/systemd.png" alt="Sentry" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://www.docker.com/"><img src="https://torsion.org/borgmatic/static/docker.png" alt="Docker" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://podman.io/"><img src="https://torsion.org/borgmatic/static/podman.png" alt="Podman" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
<a href="https://keepassxc.org/"><img src="https://torsion.org/borgmatic/static/keepassxc.png" alt="Podman" height="40px" style="margin-bottom:20px; margin-right:20px;"></a>
## Getting started
Your first step is to [install and configure
borgmatic](https://torsion.org/borgmatic/docs/how-to/set-up-backups/).
Your first steps are to
[install](https://torsion.org/borgmatic/how-to/install-borgmatic/) and
[configure borgmatic](https://torsion.org/borgmatic/how-to/set-up-backups/).
For additional documentation, check out the links above (left panel on wide screens)
For additional documentation, check out the links on the top/left
for <a href="https://torsion.org/borgmatic/#documentation">borgmatic how-to and
reference guides</a>.
@@ -115,13 +130,14 @@ first. If you prefer to use an existing GitHub account, you can skip account
creation and [login directly](https://projects.torsion.org/user/login).
Also see the [security
policy](https://torsion.org/borgmatic/docs/security-policy/) for any security
policy](https://torsion.org/borgmatic/security-policy/) for any security
issues.
### Social
Follow [borgmatic on Mastodon](https://fosstodon.org/@borgmatic).
Follow <a rel="me" href="https://floss.social/@borgmatic">borgmatic on
Mastodon</a>.
### Chat
@@ -142,26 +158,30 @@ Other questions or comments? Contact
### Contributing
borgmatic [source code is
available](https://projects.torsion.org/borgmatic-collective/borgmatic) and is also mirrored
on [GitHub](https://github.com/borgmatic-collective/borgmatic) for convenience.
available](https://projects.torsion.org/borgmatic-collective/borgmatic) and also
has a read-only mirror on
[GitHub](https://github.com/borgmatic-collective/borgmatic) for convenience.
borgmatic is licensed under the GNU General Public License version 3 or any
later version.
If you'd like to contribute to borgmatic development, please feel free to
submit a [Pull
Request](https://projects.torsion.org/borgmatic-collective/borgmatic/pulls) or
If you'd like to contribute to borgmatic development, please feel free to submit
a [pull
request](https://projects.torsion.org/borgmatic-collective/borgmatic/pulls) or
open an
[issue](https://projects.torsion.org/borgmatic-collective/borgmatic/issues) to
discuss your idea. Note that you'll need to
[register](https://projects.torsion.org/user/sign_up?invite_code=borgmatic)
first. We also accept Pull Requests on GitHub, if that's more your thing. In
general, contributions are very welcome. We don't bite!
first. In general, contributions are very welcome. We don't bite!
Also, please check out the [borgmatic development
how-to](https://torsion.org/borgmatic/docs/how-to/develop-on-borgmatic/) for
how-to](https://torsion.org/borgmatic/how-to/develop-on-borgmatic/) for
info on cloning source code, running tests, etc.
### Recent contributors
Thanks to all borgmatic contributors! There are multiple ways to contribute to
this project, so the following includes those who have fixed bugs, contributed
features, *or* filed tickets.
{% include borgmatic/contributors.html %}

View File

@@ -2,7 +2,6 @@ import logging
import borgmatic.borg.borg
import borgmatic.borg.repo_list
import borgmatic.config.validate
logger = logging.getLogger(__name__)
@@ -19,27 +18,22 @@ def run_borg(
'''
Run the "borg" action for the given repository.
'''
if borg_arguments.repository is None or borgmatic.config.validate.repositories_match(
repository, borg_arguments.repository
):
logger.info(
f'{repository.get("label", repository["path"])}: Running arbitrary Borg command'
)
archive_name = borgmatic.borg.repo_list.resolve_archive_name(
repository['path'],
borg_arguments.archive,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
)
borgmatic.borg.borg.run_arbitrary_borg(
repository['path'],
config,
local_borg_version,
options=borg_arguments.options,
archive=archive_name,
local_path=local_path,
remote_path=remote_path,
)
logger.info('Running arbitrary Borg command')
archive_name = borgmatic.borg.repo_list.resolve_archive_name(
repository['path'],
borg_arguments.archive,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
)
borgmatic.borg.borg.run_arbitrary_borg(
repository['path'],
config,
local_borg_version,
options=borg_arguments.options,
archive=archive_name,
local_path=local_path,
remote_path=remote_path,
)

View File

@@ -1,7 +1,6 @@
import logging
import borgmatic.borg.break_lock
import borgmatic.config.validate
logger = logging.getLogger(__name__)
@@ -18,17 +17,12 @@ def run_break_lock(
'''
Run the "break-lock" action for the given repository.
'''
if break_lock_arguments.repository is None or borgmatic.config.validate.repositories_match(
repository, break_lock_arguments.repository
):
logger.info(
f'{repository.get("label", repository["path"])}: Breaking repository and cache locks'
)
borgmatic.borg.break_lock.break_lock(
repository['path'],
config,
local_borg_version,
global_arguments,
local_path=local_path,
remote_path=remote_path,
)
logger.info('Breaking repository and cache locks')
borgmatic.borg.break_lock.break_lock(
repository['path'],
config,
local_borg_version,
global_arguments,
local_path=local_path,
remote_path=remote_path,
)

View File

@@ -1,7 +1,6 @@
import logging
import borgmatic.borg.change_passphrase
import borgmatic.config.validate
logger = logging.getLogger(__name__)
@@ -16,23 +15,15 @@ def run_change_passphrase(
remote_path,
):
'''
Run the "key change-passprhase" action for the given repository.
Run the "key change-passphrase" action for the given repository.
'''
if (
change_passphrase_arguments.repository is None
or borgmatic.config.validate.repositories_match(
repository, change_passphrase_arguments.repository
)
):
logger.info(
f'{repository.get("label", repository["path"])}: Changing repository passphrase'
)
borgmatic.borg.change_passphrase.change_passphrase(
repository['path'],
config,
local_borg_version,
change_passphrase_arguments,
global_arguments,
local_path=local_path,
remote_path=remote_path,
)
logger.info('Changing repository passphrase')
borgmatic.borg.change_passphrase.change_passphrase(
repository['path'],
config,
local_borg_version,
change_passphrase_arguments,
global_arguments,
local_path=local_path,
remote_path=remote_path,
)

View File

@@ -1,4 +1,5 @@
import calendar
import contextlib
import datetime
import hashlib
import itertools
@@ -6,20 +7,22 @@ import logging
import os
import pathlib
import random
import shlex
import shutil
import subprocess
import textwrap
import borgmatic.actions.create
import borgmatic.actions.config.bootstrap
import borgmatic.actions.pattern
import borgmatic.borg.check
import borgmatic.borg.create
import borgmatic.borg.environment
import borgmatic.borg.extract
import borgmatic.borg.list
import borgmatic.borg.pattern
import borgmatic.borg.repo_list
import borgmatic.borg.state
import borgmatic.config.paths
import borgmatic.config.validate
import borgmatic.execute
import borgmatic.hooks.command
DEFAULT_CHECKS = (
{'name': 'repository', 'frequency': '1 month'},
@@ -53,12 +56,14 @@ def parse_checks(config, only_checks=None):
if 'disabled' in checks:
logger.warning(
'The "disabled" value for the "checks" option is deprecated and will be removed from a future release; use "skip_actions" instead'
'The "disabled" value for the "checks" option is deprecated and will be removed from a future release; use "skip_actions" instead',
)
if len(checks) > 1:
logger.warning(
'Multiple checks are configured, but one of them is "disabled"; not running any checks'
'Multiple checks are configured, but one of them is "disabled"; not running any checks',
)
return ()
return checks
@@ -162,6 +167,7 @@ def filter_checks_on_frequency(
**dict.fromkeys(day for day in days if day != 'weekday'),
**dict.fromkeys(WEEKDAY_DAYS),
}
if 'weekend' in days:
days = {
**dict.fromkeys(day for day in days if day != 'weekend'),
@@ -170,7 +176,7 @@ def filter_checks_on_frequency(
if calendar.day_name[datetime_now().weekday()] not in days:
logger.info(
f"Skipping {check} check due to day of the week; check only runs on {'/'.join(days)} (use --force to check anyway)"
f"Skipping {check} check due to day of the week; check only runs on {'/'.join(day.title() for day in days)} (use --force to check anyway)",
)
filtered_checks.remove(check)
continue
@@ -188,7 +194,7 @@ def filter_checks_on_frequency(
if datetime_now() < check_time + frequency_delta:
remaining = check_time + frequency_delta - datetime_now()
logger.info(
f'Skipping {check} check due to configured frequency; {remaining} until next check (use --force to check anyway)'
f'Skipping {check} check due to configured frequency; {remaining} until next check (use --force to check anyway)',
)
filtered_checks.remove(check)
@@ -214,7 +220,7 @@ def make_check_time_path(config, borg_repository_id, check_type, archives_check_
'''
borgmatic_state_directory = borgmatic.config.paths.get_borgmatic_state_directory(config)
if check_type in ('archives', 'data'):
if check_type in {'archives', 'data'}:
return os.path.join(
borgmatic_state_directory,
'checks',
@@ -238,7 +244,7 @@ def write_check_time(path): # pragma: no cover
logger.debug(f'Writing check time at {path}')
os.makedirs(os.path.dirname(path), mode=0o700, exist_ok=True)
pathlib.Path(path, mode=0o600).touch()
pathlib.Path(path).touch(mode=0o600)
def read_check_time(path):
@@ -249,7 +255,7 @@ def read_check_time(path):
logger.debug(f'Reading check time from {path}')
try:
return datetime.datetime.fromtimestamp(os.stat(path).st_mtime)
return datetime.datetime.fromtimestamp(os.stat(path).st_mtime) # noqa: DTZ006
except FileNotFoundError:
return None
@@ -280,7 +286,7 @@ def probe_for_check_time(config, borg_repository_id, check, archives_check_id):
(
make_check_time_path(config, borg_repository_id, check, archives_check_id),
make_check_time_path(config, borg_repository_id, check),
)
),
)
)
@@ -312,16 +318,17 @@ def upgrade_check_times(config, borg_repository_id):
{borgmatic_state_directory}/checks/1234567890/archives/all
'''
borgmatic_source_checks_path = os.path.join(
borgmatic.config.paths.get_borgmatic_source_directory(config), 'checks'
borgmatic.config.paths.get_borgmatic_source_directory(config),
'checks',
)
borgmatic_state_path = borgmatic.config.paths.get_borgmatic_state_directory(config)
borgmatic_state_checks_path = os.path.join(borgmatic_state_path, 'checks')
if os.path.exists(borgmatic_source_checks_path) and not os.path.exists(
borgmatic_state_checks_path
borgmatic_state_checks_path,
):
logger.debug(
f'Upgrading archives check times directory from {borgmatic_source_checks_path} to {borgmatic_state_checks_path}'
f'Upgrading archives check times directory from {borgmatic_source_checks_path} to {borgmatic_state_checks_path}',
)
os.makedirs(borgmatic_state_path, mode=0o700, exist_ok=True)
shutil.move(borgmatic_source_checks_path, borgmatic_state_checks_path)
@@ -336,10 +343,8 @@ def upgrade_check_times(config, borg_repository_id):
logger.debug(f'Upgrading archives check time file from {old_path} to {new_path}')
try:
with contextlib.suppress(FileNotFoundError):
shutil.move(old_path, temporary_path)
except FileNotFoundError:
pass
os.mkdir(old_path)
shutil.move(temporary_path, new_path)
@@ -353,60 +358,74 @@ def collect_spot_check_source_paths(
local_path,
remote_path,
borgmatic_runtime_directory,
bootstrap_config_paths,
):
'''
Given a repository configuration dict, a configuration dict, the local Borg version, global
arguments as an argparse.Namespace instance, the local Borg path, and the remote Borg path,
collect the source paths that Borg would use in an actual create (but only include files).
arguments as an argparse.Namespace instance, the local Borg path, the remote Borg path, and the
bootstrap configuration paths as read from an archive's manifest, collect the source paths that
Borg would use in an actual create (but only include files). As part of this, include the
bootstrap configuration paths, so that any configuration files included in the archive to
support bootstrapping are also spot checked.
'''
stream_processes = any(
borgmatic.hooks.dispatch.call_hooks(
'use_streaming',
config,
repository['path'],
borgmatic.hooks.dispatch.Hook_type.DATA_SOURCE,
).values()
).values(),
)
working_directory = borgmatic.config.paths.get_working_directory(config)
(create_flags, create_positional_arguments, pattern_file) = (
borgmatic.borg.create.make_base_create_command(
dry_run=True,
repository_path=repository['path'],
config=config,
patterns=borgmatic.actions.create.process_patterns(
borgmatic.actions.create.collect_patterns(config),
working_directory,
(create_flags, create_positional_arguments, _) = borgmatic.borg.create.make_base_create_command(
dry_run=True,
repository_path=repository['path'],
# Omit "progress" because it interferes with "list_details".
config=dict(config, progress=False, list_details=True),
patterns=borgmatic.actions.pattern.process_patterns(
borgmatic.actions.pattern.collect_patterns(config)
+ tuple(
borgmatic.borg.pattern.Pattern(
config_path,
source=borgmatic.borg.pattern.Pattern_source.INTERNAL,
)
for config_path in bootstrap_config_paths
),
local_borg_version=local_borg_version,
global_arguments=global_arguments,
borgmatic_runtime_directory=borgmatic_runtime_directory,
local_path=local_path,
remote_path=remote_path,
list_files=True,
stream_processes=stream_processes,
)
config,
working_directory,
),
local_borg_version=local_borg_version,
global_arguments=global_arguments,
borgmatic_runtime_directory=borgmatic_runtime_directory,
local_path=local_path,
remote_path=remote_path,
stream_processes=stream_processes,
)
borg_environment = borgmatic.borg.environment.make_environment(config)
working_directory = borgmatic.config.paths.get_working_directory(config)
paths_output = borgmatic.execute.execute_command_and_capture_output(
path_lines = borgmatic.execute.execute_command_and_capture_output(
create_flags + create_positional_arguments,
capture_stderr=True,
extra_environment=borg_environment,
environment=borgmatic.borg.environment.make_environment(config),
working_directory=working_directory,
borg_local_path=local_path,
borg_exit_codes=config.get('borg_exit_codes'),
)
paths = tuple(
paths = (
path_line.split(' ', 1)[1]
for path_line in paths_output.split('\n')
if path_line and path_line.startswith('- ') or path_line.startswith('+ ')
for path_line in path_lines
if path_line and path_line.startswith(('- ', '+ '))
)
return tuple(
path for path in paths if os.path.isfile(os.path.join(working_directory or '', path))
# Use dict.fromkeys() to deduplicate file paths, which are present in Borg's dry run output
# when there are overlapping source patterns. For instance, if both "/foo" and
# "/foo/file.txt" are in configured patterns, then "/foo/file.txt" will show up in Borg's
# dry run output twice.
dict.fromkeys(
path for path in paths if os.path.isfile(os.path.join(working_directory or '', path))
)
)
@@ -436,28 +455,26 @@ def collect_spot_check_archive_paths(
borgmatic_source_directory = borgmatic.config.paths.get_borgmatic_source_directory(config)
return tuple(
path
for line in borgmatic.borg.list.capture_archive_listing(
entry['path']
for entry in borgmatic.borg.list.capture_archive_listing(
repository['path'],
archive,
config,
local_borg_version,
global_arguments,
path_format='{type} {path}{NL}', # noqa: FS003
local_path=local_path,
remote_path=remote_path,
)
for (file_type, path) in (line.split(' ', 1),)
if file_type not in (BORG_DIRECTORY_FILE_TYPE, BORG_PIPE_FILE_TYPE)
if pathlib.Path('borgmatic') not in pathlib.Path(path).parents
if entry['type'] not in {BORG_DIRECTORY_FILE_TYPE, BORG_PIPE_FILE_TYPE}
if pathlib.Path('borgmatic') not in pathlib.Path(entry['path']).parents
if pathlib.Path(borgmatic_source_directory.lstrip(os.path.sep))
not in pathlib.Path(path).parents
not in pathlib.Path(entry['path']).parents
if pathlib.Path(borgmatic_runtime_directory.lstrip(os.path.sep))
not in pathlib.Path(path).parents
not in pathlib.Path(entry['path']).parents
)
SAMPLE_PATHS_SUBSET_COUNT = 10000
SAMPLE_PATHS_SUBSET_COUNT = 5000
def compare_spot_check_hashes(
@@ -468,31 +485,33 @@ def compare_spot_check_hashes(
global_arguments,
local_path,
remote_path,
log_prefix,
source_paths,
):
'''
Given a repository configuration dict, the name of the latest archive, a configuration dict, the
local Borg version, global arguments as an argparse.Namespace instance, the local Borg path, the
remote Borg path, a log label, and spot check source paths, compare the hashes for a sampling of
the source paths with hashes from corresponding paths in the given archive. Return a sequence of
the paths that fail that hash comparison.
remote Borg path, and spot check source paths, compare the hashes for a sampling of the source
paths with hashes from corresponding paths in the given archive. Return a sequence of the paths
that fail that hash comparison.
'''
# Based on the configured sample percentage, come up with a list of random sample files from the
# source directories.
spot_check_config = next(check for check in config['checks'] if check['name'] == 'spot')
sample_count = max(
int(len(source_paths) * (min(spot_check_config['data_sample_percentage'], 100) / 100)), 1
int(len(source_paths) * (min(spot_check_config['data_sample_percentage'], 100) / 100)),
1,
)
source_sample_paths = tuple(random.sample(source_paths, sample_count))
source_sample_paths = tuple(random.SystemRandom().sample(source_paths, sample_count))
working_directory = borgmatic.config.paths.get_working_directory(config)
existing_source_sample_paths = {
hashable_source_sample_path = {
source_path
for source_path in source_sample_paths
if os.path.exists(os.path.join(working_directory or '', source_path))
for full_source_path in (os.path.join(working_directory or '', source_path),)
if os.path.exists(full_source_path)
if not os.path.islink(full_source_path)
}
logger.debug(
f'{log_prefix}: Sampling {sample_count} source paths (~{spot_check_config["data_sample_percentage"]}%) for spot check'
f'Sampling {sample_count} source paths (~{spot_check_config["data_sample_percentage"]}%) for spot check',
)
source_sample_paths_iterator = iter(source_sample_paths)
@@ -504,49 +523,102 @@ def compare_spot_check_hashes(
while True:
# Hash each file in the sample paths (if it exists).
source_sample_paths_subset = tuple(
itertools.islice(source_sample_paths_iterator, SAMPLE_PATHS_SUBSET_COUNT)
itertools.islice(source_sample_paths_iterator, SAMPLE_PATHS_SUBSET_COUNT),
)
if not source_sample_paths_subset:
break
hash_output = borgmatic.execute.execute_command_and_capture_output(
(spot_check_config.get('xxh64sum_command', 'xxh64sum'),)
+ tuple(
path for path in source_sample_paths_subset if path in existing_source_sample_paths
),
working_directory=working_directory,
hash_paths = tuple(
path for path in source_sample_paths_subset if path in hashable_source_sample_path
)
source_hashes.update(
**dict(
(reversed(line.split(' ', 1)) for line in hash_output.splitlines()),
# Represent non-existent files as having empty hashes so the comparison below still works.
**{
path: ''
for path in source_sample_paths_subset
if path not in existing_source_sample_paths
},
try:
hash_lines = borgmatic.execute.execute_command_and_capture_output(
tuple(
shlex.quote(part)
for part in shlex.split(spot_check_config.get('xxh64sum_command', 'xxh64sum'))
)
+ hash_paths,
working_directory=working_directory,
)
)
source_hashes.update(
**dict(
zip(
# xxh64sum rewrites/escapes the paths that it returns alongside its hashes, for
# instance if they contain special characters. When that happens, they don't
# match the original source paths and therefore hash lookups fail. So when
# building this lookup dict, use the original unaltered paths we provided as
# input to xxh64sum.
hash_paths,
(
# For some reason, xxh64sum prefixes the hash with a backslash if the path
# contains a newline. Work around that.
line.split(' ', 1)[0].lstrip('\\')
for line in hash_lines
),
),
# Represent non-existent files as having empty hashes so the comparison below still
# works. Same thing for filesystem links, since Borg produces empty archive hashes
# for them.
**{
path: ''
for path in source_sample_paths_subset
if path not in hashable_source_sample_path
},
),
)
except subprocess.CalledProcessError:
# This can happen if a file we planned to hash gets deleted right before we try to hash
# it. Falling back to individual file hashing allows us to find and mark just the
# file(s) with problems instead of failing the whole batch.
logger.warning(
'Bulk source path hashing failed for this batch; falling back to individual file hashing'
)
for hash_path in hash_paths:
try:
hash_lines = borgmatic.execute.execute_command_and_capture_output(
(
*(
shlex.quote(part)
for part in shlex.split(
spot_check_config.get('xxh64sum_command', 'xxh64sum')
)
),
hash_path,
),
working_directory=working_directory,
)
source_hashes[hash_path] = next(hash_lines).split(' ', 1)[0].lstrip('\\')
except (subprocess.CalledProcessError, StopIteration): # noqa: PERF203
logger.warning(
f'Source path hashing failed for {hash_path}; treating as missing'
)
source_hashes[hash_path] = ''
# Get the hash for each file in the archive.
archive_hashes.update(
**dict(
reversed(line.split(' ', 1))
for line in borgmatic.borg.list.capture_archive_listing(
repository['path'],
archive,
config,
local_borg_version,
global_arguments,
list_paths=source_sample_paths_subset,
path_format='{xxh64} {path}{NL}', # noqa: FS003
local_path=local_path,
remote_path=remote_path,
)
if line
)
)
for entry in borgmatic.borg.list.capture_archive_listing(
repository['path'],
archive,
config,
local_borg_version,
global_arguments,
list_paths=source_sample_paths_subset,
path_format='{xxh64}{path}{linktarget}',
local_path=local_path,
remote_path=remote_path,
):
if not entry:
continue
# Borg can't get hashes of stored hard links. So if this is a hard link path (and not
# deemed as the "original" by Borg), then skip hashing of it.
if entry['linktarget']:
source_hashes.pop(os.path.join('/', entry['path']), None)
continue
archive_hashes[entry['path']] = entry['xxh64']
# Compare the source hashes with the archive hashes to see how many match.
failing_paths = []
@@ -562,6 +634,9 @@ def compare_spot_check_hashes(
return tuple(failing_paths)
MAX_SPOT_CHECK_PATHS_LENGTH = 1000
def spot_check(
repository,
config,
@@ -580,9 +655,6 @@ def spot_check(
disk to those stored in the latest archive. If any differences are beyond configured tolerances,
then the check fails.
'''
log_prefix = f'{repository.get("label", repository["path"])}'
logger.debug(f'{log_prefix}: Running spot check')
try:
spot_check_config = next(
check for check in config.get('checks', ()) if check.get('name') == 'spot'
@@ -592,20 +664,9 @@ def spot_check(
if spot_check_config['data_tolerance_percentage'] > spot_check_config['data_sample_percentage']:
raise ValueError(
'The data_tolerance_percentage must be less than or equal to the data_sample_percentage'
'The data_tolerance_percentage must be less than or equal to the data_sample_percentage',
)
source_paths = collect_spot_check_source_paths(
repository,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
borgmatic_runtime_directory,
)
logger.debug(f'{log_prefix}: {len(source_paths)} total source paths for spot check')
archive = borgmatic.borg.repo_list.resolve_archive_name(
repository['path'],
'latest',
@@ -615,7 +676,26 @@ def spot_check(
local_path,
remote_path,
)
logger.debug(f'{log_prefix}: Using archive {archive} for spot check')
logger.debug(f'Using archive {archive} for spot check')
source_paths = collect_spot_check_source_paths(
repository,
config,
local_borg_version,
global_arguments,
local_path,
remote_path,
borgmatic_runtime_directory,
bootstrap_config_paths=borgmatic.actions.config.bootstrap.load_config_paths_from_archive(
repository['path'],
archive,
config,
local_borg_version,
global_arguments,
borgmatic_runtime_directory,
),
)
logger.debug(f'{len(source_paths)} total source paths for spot check')
archive_paths = collect_spot_check_archive_paths(
repository,
@@ -627,14 +707,17 @@ def spot_check(
remote_path,
borgmatic_runtime_directory,
)
logger.debug(f'{log_prefix}: {len(archive_paths)} total archive paths for spot check')
logger.debug(f'{len(archive_paths)} total archive paths for spot check')
if len(source_paths) == 0:
logger.debug(
f'{log_prefix}: Paths in latest archive but not source paths: {", ".join(set(archive_paths)) or "none"}'
truncated_archive_paths = textwrap.shorten(
', '.join(set(archive_paths)) or 'none',
width=MAX_SPOT_CHECK_PATHS_LENGTH,
placeholder=' ...',
)
logger.debug(f'Paths in latest archive but not source paths: {truncated_archive_paths}')
raise ValueError(
'Spot check failed: There are no source paths to compare against the archive'
'Spot check failed; there are no source paths to compare against the archive',
)
# Calculate the percentage delta between the source paths count and the archive paths count, and
@@ -642,15 +725,19 @@ def spot_check(
count_delta_percentage = abs(len(source_paths) - len(archive_paths)) / len(source_paths) * 100
if count_delta_percentage > spot_check_config['count_tolerance_percentage']:
rootless_source_paths = set(path.lstrip(os.path.sep) for path in source_paths)
logger.debug(
f'{log_prefix}: Paths in source paths but not latest archive: {", ".join(rootless_source_paths - set(archive_paths)) or "none"}'
rootless_source_paths = {path.lstrip(os.path.sep) for path in source_paths}
truncated_exclusive_source_paths = textwrap.shorten(
', '.join(rootless_source_paths - set(archive_paths)) or 'none',
width=MAX_SPOT_CHECK_PATHS_LENGTH,
placeholder=' ...',
)
logger.debug(
f'{log_prefix}: Paths in latest archive but not source paths: {", ".join(set(archive_paths) - rootless_source_paths) or "none"}'
truncated_exclusive_archive_paths = textwrap.shorten(
', '.join(set(archive_paths) - rootless_source_paths) or 'none',
width=MAX_SPOT_CHECK_PATHS_LENGTH,
placeholder=' ...',
)
raise ValueError(
f'Spot check failed: {count_delta_percentage:.2f}% file count delta between source paths and latest archive (tolerance is {spot_check_config["count_tolerance_percentage"]}%)'
f'Spot check failed\n{count_delta_percentage:.2f}% file count delta between source paths ({len(source_paths)} total) and latest archive ({len(archive_paths)} total); tolerance is {spot_check_config["count_tolerance_percentage"]}%\nOnly in source paths: {truncated_exclusive_source_paths}\nOnly in latest archive: {truncated_exclusive_archive_paths}',
)
failing_paths = compare_spot_check_hashes(
@@ -661,25 +748,26 @@ def spot_check(
global_arguments,
local_path,
remote_path,
log_prefix,
source_paths,
)
# Error if the percentage of failing hashes exceeds the configured tolerance percentage.
logger.debug(f'{log_prefix}: {len(failing_paths)} non-matching spot check hashes')
logger.debug(f'{len(failing_paths)} non-matching spot check hashes')
data_tolerance_percentage = spot_check_config['data_tolerance_percentage']
failing_percentage = (len(failing_paths) / len(source_paths)) * 100
if failing_percentage > data_tolerance_percentage:
logger.debug(
f'{log_prefix}: Source paths with data not matching the latest archive: {", ".join(failing_paths)}'
truncated_failing_paths = textwrap.shorten(
', '.join(failing_paths),
width=MAX_SPOT_CHECK_PATHS_LENGTH,
placeholder=' ...',
)
raise ValueError(
f'Spot check failed: {failing_percentage:.2f}% of source paths with data not matching the latest archive (tolerance is {data_tolerance_percentage}%)'
f'Spot check failed\n{failing_percentage:.2f}% of source paths ({len(failing_paths)} out of {len(source_paths)} checked) with data not matching the latest archive; tolerance is {data_tolerance_percentage}%\nSource paths with non-matching data: {truncated_failing_paths}',
)
logger.info(
f'{log_prefix}: Spot check passed with a {count_delta_percentage:.2f}% file count delta and a {failing_percentage:.2f}% file data delta'
f'Spot check passed with a {count_delta_percentage:.2f}% file count delta and a {failing_percentage:.2f}% file data delta',
)
@@ -687,7 +775,6 @@ def run_check(
config_filename,
repository,
config,
hook_context,
local_borg_version,
check_arguments,
global_arguments,
@@ -699,22 +786,7 @@ def run_check(
Raise ValueError if the Borg repository ID cannot be determined.
'''
if check_arguments.repository and not borgmatic.config.validate.repositories_match(
repository, check_arguments.repository
):
return
borgmatic.hooks.command.execute_hook(
config.get('before_check'),
config.get('umask'),
config_filename,
'pre-check',
global_arguments.dry_run,
**hook_context,
)
log_prefix = repository.get('label', repository['path'])
logger.info(f'{log_prefix}: Running consistency checks')
logger.info('Running consistency checks')
repository_id = borgmatic.borg.check.get_repository_id(
repository['path'],
@@ -727,7 +799,10 @@ def run_check(
upgrade_check_times(config, repository_id)
configured_checks = parse_checks(config, check_arguments.only_checks)
archive_filter_flags = borgmatic.borg.check.make_archive_filter_flags(
local_borg_version, config, configured_checks, check_arguments
local_borg_version,
config,
configured_checks,
check_arguments,
)
archives_check_id = make_archives_check_id(archive_filter_flags)
checks = filter_checks_on_frequency(
@@ -755,6 +830,7 @@ def run_check(
write_check_time(make_check_time_path(config, repository_id, check, archives_check_id))
if 'extract' in checks:
logger.info('Running extract check')
borgmatic.borg.extract.extract_last_archive_dry_run(
config,
local_borg_version,
@@ -767,9 +843,8 @@ def run_check(
write_check_time(make_check_time_path(config, repository_id, 'extract'))
if 'spot' in checks:
with borgmatic.config.paths.Runtime_directory(
config, log_prefix
) as borgmatic_runtime_directory:
logger.info('Running spot check')
with borgmatic.config.paths.Runtime_directory(config) as borgmatic_runtime_directory:
spot_check(
repository,
config,
@@ -779,13 +854,5 @@ def run_check(
remote_path,
borgmatic_runtime_directory,
)
write_check_time(make_check_time_path(config, repository_id, 'spot'))
borgmatic.hooks.command.execute_hook(
config.get('after_check'),
config.get('umask'),
config_filename,
'post-check',
global_arguments.dry_run,
**hook_context,
)
write_check_time(make_check_time_path(config, repository_id, 'spot'))

View File

@@ -2,8 +2,6 @@ import logging
import borgmatic.borg.compact
import borgmatic.borg.feature
import borgmatic.config.validate
import borgmatic.hooks.command
logger = logging.getLogger(__name__)
@@ -12,7 +10,6 @@ def run_compact(
config_filename,
repository,
config,
hook_context,
local_borg_version,
compact_arguments,