dar-backup 1.0.1__tar.gz → 1.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. {dar_backup-1.0.1 → dar_backup-1.0.2}/.gitignore +1 -0
  2. {dar_backup-1.0.1/src/dar_backup → dar_backup-1.0.2}/Changelog.md +29 -0
  3. {dar_backup-1.0.1 → dar_backup-1.0.2}/PKG-INFO +78 -18
  4. {dar_backup-1.0.1 → dar_backup-1.0.2}/README.md +75 -15
  5. {dar_backup-1.0.1 → dar_backup-1.0.2}/doc/Configfile.svg +0 -1
  6. dar_backup-1.0.2/doc/Gemini3-assessment.md +46 -0
  7. dar_backup-1.0.2/doc/clones-2025.png +0 -0
  8. {dar_backup-1.0.1 → dar_backup-1.0.2}/doc/dev.md +7 -0
  9. {dar_backup-1.0.1 → dar_backup-1.0.2}/pyproject.toml +5 -2
  10. {dar_backup-1.0.1 → dar_backup-1.0.2/src/dar_backup}/Changelog.md +29 -0
  11. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/README.md +75 -15
  12. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/__about__.py +1 -2
  13. dar_backup-1.0.2/src/dar_backup/clean_log.py +212 -0
  14. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/cleanup.py +136 -102
  15. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/command_runner.py +75 -13
  16. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/config_settings.py +25 -11
  17. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/dar-backup.conf +7 -0
  18. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/dar-backup.conf.j2 +3 -1
  19. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/dar_backup.py +438 -64
  20. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/demo.py +18 -9
  21. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/installer.py +18 -1
  22. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/manager.py +295 -88
  23. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/util.py +119 -11
  24. dar_backup-1.0.1/src/dar_backup/clean_log.py +0 -173
  25. {dar_backup-1.0.1 → dar_backup-1.0.2}/LICENSE +0 -0
  26. {dar_backup-1.0.1 → dar_backup-1.0.2}/doc/dar-backup-overview-small.png +0 -0
  27. {dar_backup-1.0.1 → dar_backup-1.0.2}/doc/dar-backup-overview.png +0 -0
  28. {dar_backup-1.0.1 → dar_backup-1.0.2}/doc/dar-backup-overview.svg +0 -0
  29. {dar_backup-1.0.1 → dar_backup-1.0.2}/doc/doc.md +0 -0
  30. {dar_backup-1.0.1 → dar_backup-1.0.2}/doc/portable-par2-layout.md +0 -0
  31. {dar_backup-1.0.1 → dar_backup-1.0.2}/packages/deb/README.md +0 -0
  32. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/.darrc +0 -0
  33. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/__init__.py +0 -0
  34. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/dar_backup_systemd.py +0 -0
  35. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/demo_backup_def.j2 +0 -0
  36. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/exceptions.py +0 -0
  37. {dar_backup-1.0.1 → dar_backup-1.0.2}/src/dar_backup/rich_progress.py +0 -0
  38. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/SecretStorage-3.3.3.dist-info/LICENSE +0 -0
  39. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/LICENSE +0 -0
  40. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/black-25.1.0.dist-info/licenses/LICENSE +0 -0
  41. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/blib2to3/LICENSE +0 -0
  42. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/build-1.2.2.post1.dist-info/LICENSE +0 -0
  43. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/certifi-2025.4.26.dist-info/licenses/LICENSE +0 -0
  44. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/cffi-1.17.1.dist-info/LICENSE +0 -0
  45. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/charset_normalizer-3.4.2.dist-info/licenses/LICENSE +0 -0
  46. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/contourpy-1.3.2.dist-info/LICENSE +0 -0
  47. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/cryptography-45.0.3.dist-info/licenses/LICENSE +0 -0
  48. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/cycler-0.12.1.dist-info/LICENSE +0 -0
  49. {dar_backup-1.0.1/venv/lib/python3.12/site-packages/dar_backup-1.0.1.dist-info → dar_backup-1.0.2/venv/lib/python3.12/site-packages/dar_backup-1.0.2.dist-info}/licenses/LICENSE +0 -0
  50. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/filelock-3.18.0.dist-info/licenses/LICENSE +0 -0
  51. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/fonttools-4.58.2.dist-info/licenses/LICENSE +0 -0
  52. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/hyperlink-21.0.0.dist-info/LICENSE +0 -0
  53. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/id-1.5.0.dist-info/LICENSE +0 -0
  54. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/iniconfig-2.1.0.dist-info/licenses/LICENSE +0 -0
  55. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/jaraco.classes-3.4.0.dist-info/LICENSE +0 -0
  56. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/jaraco.context-6.0.1.dist-info/LICENSE +0 -0
  57. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/jaraco.functools-4.1.0.dist-info/LICENSE +0 -0
  58. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/jeepney-0.9.0.dist-info/licenses/LICENSE +0 -0
  59. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/keyring-25.6.0.dist-info/LICENSE +0 -0
  60. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/kiwisolver-1.4.8.dist-info/LICENSE +0 -0
  61. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE +0 -0
  62. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/matplotlib-3.10.3.dist-info/LICENSE +0 -0
  63. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/LICENSE +0 -0
  64. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/more_itertools-10.7.0.dist-info/LICENSE +0 -0
  65. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/mypy_extensions-1.1.0.dist-info/licenses/LICENSE +0 -0
  66. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/nh3-0.2.21.dist-info/licenses/LICENSE +0 -0
  67. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/numpy/ma/LICENSE +0 -0
  68. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/packaging-25.0.dist-info/licenses/LICENSE +0 -0
  69. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pandas-2.3.0.dist-info/LICENSE +0 -0
  70. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pathspec-0.12.1.dist-info/LICENSE +0 -0
  71. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/LICENSE +0 -0
  72. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pillow-11.2.1.dist-info/licenses/LICENSE +0 -0
  73. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/certifi/LICENSE +0 -0
  74. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/distro/LICENSE +0 -0
  75. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/packaging/LICENSE +0 -0
  76. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/LICENSE +0 -0
  77. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/LICENSE +0 -0
  78. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/pygments/LICENSE +0 -0
  79. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/LICENSE +0 -0
  80. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/requests/LICENSE +0 -0
  81. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/LICENSE +0 -0
  82. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/rich/LICENSE +0 -0
  83. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/tomli/LICENSE +0 -0
  84. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/tomli_w/LICENSE +0 -0
  85. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip/_vendor/truststore/LICENSE +0 -0
  86. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/certifi/LICENSE +0 -0
  87. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/distro/LICENSE +0 -0
  88. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/packaging/LICENSE +0 -0
  89. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE +0 -0
  90. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE +0 -0
  91. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/pygments/LICENSE +0 -0
  92. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE +0 -0
  93. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/requests/LICENSE +0 -0
  94. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE +0 -0
  95. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/rich/LICENSE +0 -0
  96. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/tomli/LICENSE +0 -0
  97. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE +0 -0
  98. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/truststore/LICENSE +0 -0
  99. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/platformdirs-4.3.8.dist-info/licenses/LICENSE +0 -0
  100. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pluggy-1.6.0.dist-info/licenses/LICENSE +0 -0
  101. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/psutil-7.0.0.dist-info/LICENSE +0 -0
  102. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/LICENSE +0 -0
  103. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pycparser-2.22.dist-info/LICENSE +0 -0
  104. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/licenses/LICENSE +0 -0
  105. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pyparsing-3.2.3.dist-info/LICENSE +0 -0
  106. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pyproject_hooks-1.2.0.dist-info/LICENSE +0 -0
  107. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pytest-8.4.0.dist-info/licenses/LICENSE +0 -0
  108. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pytest_cov-6.1.1.dist-info/licenses/LICENSE +0 -0
  109. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/pytest_timeout-2.4.0.dist-info/licenses/LICENSE +0 -0
  110. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/python_dateutil-2.9.0.post0.dist-info/LICENSE +0 -0
  111. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/readme_renderer-44.0.dist-info/LICENSE +0 -0
  112. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/requests-2.32.3.dist-info/LICENSE +0 -0
  113. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/requests_toolbelt-1.0.0.dist-info/LICENSE +0 -0
  114. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/rfc3986-2.0.0.dist-info/LICENSE +0 -0
  115. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/rich-14.0.0.dist-info/LICENSE +0 -0
  116. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/shellingham-1.5.4.dist-info/LICENSE +0 -0
  117. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/LICENSE +0 -0
  118. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE +0 -0
  119. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/tomli_w-1.2.0.dist-info/LICENSE +0 -0
  120. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/tomlkit-0.13.2.dist-info/LICENSE +0 -0
  121. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/trove_classifiers-2025.5.9.12.dist-info/licenses/LICENSE +0 -0
  122. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/twine-6.1.0.dist-info/LICENSE +0 -0
  123. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/typing_extensions-4.14.0.dist-info/licenses/LICENSE +0 -0
  124. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/tzdata-2025.2.dist-info/licenses/LICENSE +0 -0
  125. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/virtualenv-20.31.2.dist-info/licenses/LICENSE +0 -0
  126. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/wheel/vendored/packaging/LICENSE +0 -0
  127. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/zipp-3.22.0.dist-info/licenses/LICENSE +0 -0
  128. {dar_backup-1.0.1 → dar_backup-1.0.2}/venv/lib/python3.12/site-packages/zstandard-0.23.0.dist-info/LICENSE +0 -0
@@ -16,6 +16,7 @@ v2/old_dar_backup
16
16
  v2/dist
17
17
  v2/build
18
18
  v2/.coverage
19
+ v2/.coverage*
19
20
  v2/dar-backup.tar
20
21
  v2/coverage.xml
21
22
  v2/packages/*
@@ -1,6 +1,35 @@
1
1
  <!-- markdownlint-disable MD024 -->
2
2
  # dar-backup Changelog
3
3
 
4
+ ## v2-1.0.2 - 2026-01-25
5
+
6
+ ### Added
7
+
8
+ - Streaming restore-test sampling using reservoir sampling to avoid holding full file lists in memory.
9
+ - Configurable command output capture cap (`COMMAND_CAPTURE_MAX_BYTES`, default 100 KB) to limit in-memory stdout/stderr while still logging full output.
10
+ - Streaming list output for `dar-backup --list-contents` and `manager --list-archive-contents` to avoid large in-memory buffers.
11
+ - Test coverage additions for config parsing, util helpers, restore-test sampling edge cases, par2 slice helpers, and get_backed_up_files error paths.
12
+ - Tests for missing source files during restore verification and for par2 generation order after verification.
13
+ - CommandRunner test coverage for sanitize failure notes, text/binary output handling, timeouts, Popen failures, and TTY restore logic.
14
+ - Tests for COMMAND_CAPTURE_MAX_BYTES defaults (0 and 1k) and binary stdout/stderr capture with truncation and log_output disabled.
15
+ - Manager test coverage for create-db guardrails and catalog listing parsing/sorting across runner/subprocess paths.
16
+ - Cleanup now reports PREREQ/POSTREQ failures cleanly and sends Discord failure notifications when configured.
17
+ - New trace logger that always logs at DEBUG and captures stacktraces if they happens. Default max size is 10MB + 1 rollover file.
18
+
19
+ ### Changed
20
+
21
+ - BUGFIX: Ensure existing files are removed before restore verification to prevent false positives.
22
+ - Clears out restore-test directory on program start to ensure a clean slate.
23
+ - Restore-test selection now streams DAR XML listings and samples candidates without loading all entries into RAM.
24
+ - `get_backed_up_files` uses incremental XML parsing to reduce memory use for large archives.
25
+ - Restore verification now logs a warning and continues when a source or restored file is missing during comparison.
26
+ - CommandRunner supports per-command capture cap overrides (disable cap with `capture_output_limit_bytes=-1`).
27
+ - Cleanup now rejects unsafe archive names when `--cleanup-specific-archives` is used to prevent accidental deletions.
28
+ - Removed deprecated PAR2 layout/mode settings and simplified PAR2 cleanup to delete all matching .par2 artifacts.
29
+ - Config templates/docs updated to drop PAR2_LAYOUT/PAR2_MODE references.
30
+ - [Snyk] Python 3.11 required in pyproject.toml. Snyk has flagged a vulnerabilly in an xml parser that requires the bump to 3.11.
31
+ - Config parsing errors now emit concise messages (no stack trace) and trigger Discord failure notifications in CLI tools.
32
+
4
33
  ## v2-1.0.1 - 2026-01-09
5
34
 
6
35
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dar-backup
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: A script to do full, differential and incremental backups using dar. Some files are restored from the backups during verification, after which par2 redundancy files are created. The script also has a cleanup feature to remove old backups and par2 files.
5
5
  Project-URL: GPG Public Key, https://keys.openpgp.org/search?q=dar-backup@pm.me
6
6
  Project-URL: Homepage, https://github.com/per2jensen/dar-backup/tree/main/v2
@@ -686,9 +686,9 @@ Classifier: Development Status :: 5 - Production/Stable
686
686
  Classifier: Intended Audience :: End Users/Desktop
687
687
  Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
688
688
  Classifier: Operating System :: POSIX :: Linux
689
- Classifier: Programming Language :: Python :: 3.9
689
+ Classifier: Programming Language :: Python :: 3.11
690
690
  Classifier: Topic :: System :: Archiving :: Backup
691
- Requires-Python: >=3.9
691
+ Requires-Python: >=3.11
692
692
  Requires-Dist: argcomplete>=3.6.2
693
693
  Requires-Dist: inputimeout>=1.0.4
694
694
  Requires-Dist: jinja2>=3.1.6
@@ -813,8 +813,8 @@ Version **1.0.0** was reached on October 9, 2025.
813
813
  - [Performance tip due to par2](#performance-tip-due-to-par2)
814
814
  - [.darrc sets -vd -vf (since v0.6.4)](#darrc-sets--vd--vf-since-v064)
815
815
  - [Separate log file for command output](#separate-log-file-for-command-output)
816
+ - [Trace Logging (Debug details)](#trace-logging-debug-details)
816
817
  - [Skipping cache directories](#skipping-cache-directories)
817
- - [Progress bar and current directory](#progress-bar-and-current-directory)
818
818
  - [Shell autocompletion](#shell-autocompletion)
819
819
  - [Use it](#use-it)
820
820
  - [Archive name completion (smart, context-aware)](#archive-name-completion-smart-context-aware)
@@ -841,6 +841,9 @@ Version **1.0.0** was reached on October 9, 2025.
841
841
  - [DISCORD WEBHOOK](#discord-webhook)
842
842
  - [Restore test config](#restore-test-config)
843
843
  - [Par2](#par2-1)
844
+ - [1.0.2](#102)
845
+ - [Trace Logging](#trace-logging)
846
+ - [Command output Capture](#command-output-capture)
844
847
 
845
848
  ## My use case
846
849
 
@@ -1509,7 +1512,6 @@ ERROR_CORRECTION_PERCENT = 5
1509
1512
  ENABLED = True
1510
1513
  # Optional PAR2 configuration
1511
1514
  # PAR2_DIR = /path/to/par2-store
1512
- # PAR2_MODE = per-slice
1513
1515
  # PAR2_RATIO_FULL = 10
1514
1516
  # PAR2_RATIO_DIFF = 5
1515
1517
  # PAR2_RATIO_INCR = 5
@@ -1518,7 +1520,6 @@ ENABLED = True
1518
1520
  # Optional per-backup overrides (section name = backup definition)
1519
1521
  [media-files]
1520
1522
  PAR2_DIR = /mnt/par2/media-files
1521
- PAR2_MODE = per-archive
1522
1523
  PAR2_RATIO_FULL = 10
1523
1524
 
1524
1525
  # scripts to run before the backup to setup the environment
@@ -1536,6 +1537,7 @@ PAR2 notes:
1536
1537
  - If `PAR2_DIR` is unset, par2 files are created next to the archive slices (legacy behavior) and no manifest is written
1537
1538
  - When `PAR2_DIR` is set, dar-backup writes a manifest next to the par2 set:
1538
1539
  `archive_base.par2.manifest.ini`
1540
+ - When generating a par2 set, par2 reads all archive slices before writing any output files; for large backups, this initial read can take hours
1539
1541
  - Verify or repair using:
1540
1542
  `par2 verify -B <archive_dir> <par2_set.par2>`
1541
1543
  `par2 repair -B <archive_dir> <par2_set.par2>`
@@ -1861,6 +1863,25 @@ This happens when the shell splits the quoted string or interprets globs before
1861
1863
 
1862
1864
  > 💡 **Tip:** See [dar's documentation](http://dar.linux.free.fr/doc/man/dar.html#COMMANDS%20AND%20OPTIONS)
1863
1865
 
1866
+ >
1867
+ > 💡💡 **Tip:** To filter all the empty directories away that `dar` emits when listing contents, append this grep:
1868
+ >
1869
+ > ```bash
1870
+ > |grep -vE '\s+d[rwx-]{9}\s'
1871
+ >```
1872
+ >
1873
+ >Example using the grep to discard directory noise from `dar's` output:
1874
+ >
1875
+ > ```bash
1876
+ > dar-backup --list-contents media-files_INCR_2025-05-10 --selection="-I '*Z50*' -X '*.xmp'" | grep -vE '\s+d[rwx-]{9}\s'
1877
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 26 Mio Fri May 9 11:26:16 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0633.NEF
1878
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 26 Mio Fri May 9 11:26:16 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0632.NEF
1879
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 28 Mio Fri May 9 11:09:04 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0631.NEF
1880
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 29 Mio Fri May 9 11:09:03 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0630.NEF
1881
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 29 Mio Fri May 9 11:09:03 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0629.NEF
1882
+ >...
1883
+ >```
1884
+
1864
1885
  ### select a directory
1865
1886
 
1866
1887
  Select files and sub directories in `home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling`
@@ -2217,23 +2238,29 @@ In order to not clutter that log file with the output of commands being run, a n
2217
2238
 
2218
2239
  The secondary log file can get quite cluttered, if you want to remove the clutter, run the `clean-log`script with the `--file` option, or simply delete it.
2219
2240
 
2220
- ### Skipping cache directories
2241
+ ### Trace Logging (Debug details)
2221
2242
 
2222
- The author uses the `--cache-directory-tagging` option in his [backup definitions](#backup-definition-example).
2243
+ To keep the main log file clean while preserving essential debugging information, `dar-backup` creates a separate trace log file (e.g., `dar-backup.trace.log`) alongside the main log.
2223
2244
 
2224
- The effect is that directories with the [CACHEDIR.TAG](https://bford.info/cachedir/) file are not backed up. Those directories contain content fetched from the net, which is of an ephemeral nature and probably not what you want to back up.
2245
+ - **Main Log (`dar-backup.log`)**: Contains clean, human-readable INFO/ERROR messages. Stack traces are suppressed here.
2246
+ - **Trace Log (`dar-backup.trace.log`)**: Captures ALL messages at `DEBUG` level, including full exception stack traces. Use this file for debugging crashes or unexpected behavior.
2225
2247
 
2226
- If the option is not in the backup definition, the cache directories are backed up as any other.
2248
+ You can configure the rotation of this file in `[MISC]`:
2227
2249
 
2228
- ### Progress bar and current directory
2250
+ ```ini
2251
+ [MISC]
2252
+ # ... other settings ...
2253
+ TRACE_LOG_MAX_BYTES = 10485760 # 10 MB default
2254
+ TRACE_LOG_BACKUP_COUNT = 1 # Keep 1 old trace file (default)
2255
+ ```
2229
2256
 
2230
- If you run dar-backup interactively in a "normal" console on your computer,
2231
- dar-backup displays 2 visual artifacts to show progress.
2257
+ ### Skipping cache directories
2232
2258
 
2233
- 1. a progress bar that fills up and starts over
2234
- 2. a status line showing the directory being backed up. If the directory is big and takes time to backup, the line is not changing, but you will probably know there is a lot to backup.
2259
+ The author uses the `--cache-directory-tagging` option in his [backup definitions](#backup-definition-example).
2235
2260
 
2236
- The indicators are not shown if dar-backup is run from systemd or if it is used in terminal multiplexers like `tmux` or `screen`. So no polluting of journald logs.
2261
+ The effect is that directories with the [CACHEDIR.TAG](https://bford.info/cachedir/) file are not backed up. Those directories contain content fetched from the net, which is of an ephemeral nature and probably not what you want to back up.
2262
+
2263
+ If the option is not in the backup definition, the cache directories are backed up as any other.
2237
2264
 
2238
2265
  ### Shell autocompletion
2239
2266
 
@@ -2418,7 +2445,6 @@ pytest # run the test suite
2418
2445
 
2419
2446
  - Perhaps look into pre-processing backup definitions. As `dar` does not expand env vars
2420
2447
  `dar-backup` could do so and feed the result to `dar`.
2421
- - When run interactively, a progress bar during test and par2 generation would be nice.
2422
2448
  - Look into a way to move the .par2 files away from the `dar` slices, to maximize chance of good redundancy.
2423
2449
  - Add option to dar-backup to use the `dar` option `--fsa-scope none`
2424
2450
 
@@ -2754,10 +2780,44 @@ PAR2_RUN_VERIFY = true
2754
2780
  #
2755
2781
  #[etc]
2756
2782
  # Keep global PAR2 settings but tweak ratios for this backup definition
2757
- # RATIO is i percent number
2783
+ # RATIO is given in percent (%)
2758
2784
  #PAR2_RATIO_FULL = 15
2759
2785
  #PAR2_RATIO_DIFF = 8
2760
2786
  #PAR2_RATIO_INCR = 8
2761
2787
  ```
2762
2788
 
2763
2789
  [Per-backup override test case: `tests/test_par2_overrides.py`](v2/tests/test_par2_overrides.py)
2790
+
2791
+ #### 1.0.2
2792
+
2793
+ ##### Trace Logging
2794
+
2795
+ To support debugging without cluttering the main log file, a secondary trace log is now created (e.g., `dar-backup.trace.log`).
2796
+ This file captures all `DEBUG` level messages and full exception stack traces.
2797
+
2798
+ You can configure its rotation in the `[MISC]` section:
2799
+
2800
+ - `TRACE_LOG_MAX_BYTES`: Max size of the trace log file in bytes. Default is `10485760` (10 MB).
2801
+ - `TRACE_LOG_BACKUP_COUNT`: Number of rotated trace log files to keep. Default is `1`.
2802
+
2803
+ Example:
2804
+
2805
+ ```ini
2806
+ [MISC]
2807
+ TRACE_LOG_MAX_BYTES = 10485760
2808
+ TRACE_LOG_BACKUP_COUNT = 1
2809
+ ```
2810
+
2811
+ ##### Command output Capture
2812
+
2813
+ - New optional `[MISC]` setting: `COMMAND_CAPTURE_MAX_BYTES` (default 102400).
2814
+ - Limits how much stdout/stderr is kept in memory per command while still logging full output.
2815
+ - Set to `0` to disable buffering entirely. Command output is still streamed to dar-backup-commands.log
2816
+ - If set to `0`, the calling function cannot rely on output from the executed command. The exit value is the only result provided.
2817
+
2818
+ Example:
2819
+
2820
+ ```ini
2821
+ [MISC]
2822
+ COMMAND_CAPTURE_MAX_BYTES = 102400
2823
+ ```
@@ -95,8 +95,8 @@ Version **1.0.0** was reached on October 9, 2025.
95
95
  - [Performance tip due to par2](#performance-tip-due-to-par2)
96
96
  - [.darrc sets -vd -vf (since v0.6.4)](#darrc-sets--vd--vf-since-v064)
97
97
  - [Separate log file for command output](#separate-log-file-for-command-output)
98
+ - [Trace Logging (Debug details)](#trace-logging-debug-details)
98
99
  - [Skipping cache directories](#skipping-cache-directories)
99
- - [Progress bar and current directory](#progress-bar-and-current-directory)
100
100
  - [Shell autocompletion](#shell-autocompletion)
101
101
  - [Use it](#use-it)
102
102
  - [Archive name completion (smart, context-aware)](#archive-name-completion-smart-context-aware)
@@ -123,6 +123,9 @@ Version **1.0.0** was reached on October 9, 2025.
123
123
  - [DISCORD WEBHOOK](#discord-webhook)
124
124
  - [Restore test config](#restore-test-config)
125
125
  - [Par2](#par2-1)
126
+ - [1.0.2](#102)
127
+ - [Trace Logging](#trace-logging)
128
+ - [Command output Capture](#command-output-capture)
126
129
 
127
130
  ## My use case
128
131
 
@@ -791,7 +794,6 @@ ERROR_CORRECTION_PERCENT = 5
791
794
  ENABLED = True
792
795
  # Optional PAR2 configuration
793
796
  # PAR2_DIR = /path/to/par2-store
794
- # PAR2_MODE = per-slice
795
797
  # PAR2_RATIO_FULL = 10
796
798
  # PAR2_RATIO_DIFF = 5
797
799
  # PAR2_RATIO_INCR = 5
@@ -800,7 +802,6 @@ ENABLED = True
800
802
  # Optional per-backup overrides (section name = backup definition)
801
803
  [media-files]
802
804
  PAR2_DIR = /mnt/par2/media-files
803
- PAR2_MODE = per-archive
804
805
  PAR2_RATIO_FULL = 10
805
806
 
806
807
  # scripts to run before the backup to setup the environment
@@ -818,6 +819,7 @@ PAR2 notes:
818
819
  - If `PAR2_DIR` is unset, par2 files are created next to the archive slices (legacy behavior) and no manifest is written
819
820
  - When `PAR2_DIR` is set, dar-backup writes a manifest next to the par2 set:
820
821
  `archive_base.par2.manifest.ini`
822
+ - When generating a par2 set, par2 reads all archive slices before writing any output files; for large backups, this initial read can take hours
821
823
  - Verify or repair using:
822
824
  `par2 verify -B <archive_dir> <par2_set.par2>`
823
825
  `par2 repair -B <archive_dir> <par2_set.par2>`
@@ -1143,6 +1145,25 @@ This happens when the shell splits the quoted string or interprets globs before
1143
1145
 
1144
1146
  > 💡 **Tip:** See [dar's documentation](http://dar.linux.free.fr/doc/man/dar.html#COMMANDS%20AND%20OPTIONS)
1145
1147
 
1148
+ >
1149
+ > 💡💡 **Tip:** To filter all the empty directories away that `dar` emits when listing contents, append this grep:
1150
+ >
1151
+ > ```bash
1152
+ > |grep -vE '\s+d[rwx-]{9}\s'
1153
+ >```
1154
+ >
1155
+ >Example using the grep to discard directory noise from `dar's` output:
1156
+ >
1157
+ > ```bash
1158
+ > dar-backup --list-contents media-files_INCR_2025-05-10 --selection="-I '*Z50*' -X '*.xmp'" | grep -vE '\s+d[rwx-]{9}\s'
1159
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 26 Mio Fri May 9 11:26:16 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0633.NEF
1160
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 26 Mio Fri May 9 11:26:16 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0632.NEF
1161
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 28 Mio Fri May 9 11:09:04 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0631.NEF
1162
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 29 Mio Fri May 9 11:09:03 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0630.NEF
1163
+ >[Saved][ ] [-L-][ 0%][X] -rw-rw-r-- user user 29 Mio Fri May 9 11:09:03 2025 home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling/Z50_0629.NEF
1164
+ >...
1165
+ >```
1166
+
1146
1167
  ### select a directory
1147
1168
 
1148
1169
  Select files and sub directories in `home/user/data/2025/2025-05-09-Roskilde-Nordisk-udstilling`
@@ -1499,23 +1520,29 @@ In order to not clutter that log file with the output of commands being run, a n
1499
1520
 
1500
1521
  The secondary log file can get quite cluttered, if you want to remove the clutter, run the `clean-log`script with the `--file` option, or simply delete it.
1501
1522
 
1502
- ### Skipping cache directories
1523
+ ### Trace Logging (Debug details)
1503
1524
 
1504
- The author uses the `--cache-directory-tagging` option in his [backup definitions](#backup-definition-example).
1525
+ To keep the main log file clean while preserving essential debugging information, `dar-backup` creates a separate trace log file (e.g., `dar-backup.trace.log`) alongside the main log.
1505
1526
 
1506
- The effect is that directories with the [CACHEDIR.TAG](https://bford.info/cachedir/) file are not backed up. Those directories contain content fetched from the net, which is of an ephemeral nature and probably not what you want to back up.
1527
+ - **Main Log (`dar-backup.log`)**: Contains clean, human-readable INFO/ERROR messages. Stack traces are suppressed here.
1528
+ - **Trace Log (`dar-backup.trace.log`)**: Captures ALL messages at `DEBUG` level, including full exception stack traces. Use this file for debugging crashes or unexpected behavior.
1507
1529
 
1508
- If the option is not in the backup definition, the cache directories are backed up as any other.
1530
+ You can configure the rotation of this file in `[MISC]`:
1509
1531
 
1510
- ### Progress bar and current directory
1532
+ ```ini
1533
+ [MISC]
1534
+ # ... other settings ...
1535
+ TRACE_LOG_MAX_BYTES = 10485760 # 10 MB default
1536
+ TRACE_LOG_BACKUP_COUNT = 1 # Keep 1 old trace file (default)
1537
+ ```
1511
1538
 
1512
- If you run dar-backup interactively in a "normal" console on your computer,
1513
- dar-backup displays 2 visual artifacts to show progress.
1539
+ ### Skipping cache directories
1514
1540
 
1515
- 1. a progress bar that fills up and starts over
1516
- 2. a status line showing the directory being backed up. If the directory is big and takes time to backup, the line is not changing, but you will probably know there is a lot to backup.
1541
+ The author uses the `--cache-directory-tagging` option in his [backup definitions](#backup-definition-example).
1517
1542
 
1518
- The indicators are not shown if dar-backup is run from systemd or if it is used in terminal multiplexers like `tmux` or `screen`. So no polluting of journald logs.
1543
+ The effect is that directories with the [CACHEDIR.TAG](https://bford.info/cachedir/) file are not backed up. Those directories contain content fetched from the net, which is of an ephemeral nature and probably not what you want to back up.
1544
+
1545
+ If the option is not in the backup definition, the cache directories are backed up as any other.
1519
1546
 
1520
1547
  ### Shell autocompletion
1521
1548
 
@@ -1700,7 +1727,6 @@ pytest # run the test suite
1700
1727
 
1701
1728
  - Perhaps look into pre-processing backup definitions. As `dar` does not expand env vars
1702
1729
  `dar-backup` could do so and feed the result to `dar`.
1703
- - When run interactively, a progress bar during test and par2 generation would be nice.
1704
1730
  - Look into a way to move the .par2 files away from the `dar` slices, to maximize chance of good redundancy.
1705
1731
  - Add option to dar-backup to use the `dar` option `--fsa-scope none`
1706
1732
 
@@ -2036,10 +2062,44 @@ PAR2_RUN_VERIFY = true
2036
2062
  #
2037
2063
  #[etc]
2038
2064
  # Keep global PAR2 settings but tweak ratios for this backup definition
2039
- # RATIO is i percent number
2065
+ # RATIO is given in percent (%)
2040
2066
  #PAR2_RATIO_FULL = 15
2041
2067
  #PAR2_RATIO_DIFF = 8
2042
2068
  #PAR2_RATIO_INCR = 8
2043
2069
  ```
2044
2070
 
2045
2071
  [Per-backup override test case: `tests/test_par2_overrides.py`](v2/tests/test_par2_overrides.py)
2072
+
2073
+ #### 1.0.2
2074
+
2075
+ ##### Trace Logging
2076
+
2077
+ To support debugging without cluttering the main log file, a secondary trace log is now created (e.g., `dar-backup.trace.log`).
2078
+ This file captures all `DEBUG` level messages and full exception stack traces.
2079
+
2080
+ You can configure its rotation in the `[MISC]` section:
2081
+
2082
+ - `TRACE_LOG_MAX_BYTES`: Max size of the trace log file in bytes. Default is `10485760` (10 MB).
2083
+ - `TRACE_LOG_BACKUP_COUNT`: Number of rotated trace log files to keep. Default is `1`.
2084
+
2085
+ Example:
2086
+
2087
+ ```ini
2088
+ [MISC]
2089
+ TRACE_LOG_MAX_BYTES = 10485760
2090
+ TRACE_LOG_BACKUP_COUNT = 1
2091
+ ```
2092
+
2093
+ ##### Command output Capture
2094
+
2095
+ - New optional `[MISC]` setting: `COMMAND_CAPTURE_MAX_BYTES` (default 102400).
2096
+ - Limits how much stdout/stderr is kept in memory per command while still logging full output.
2097
+ - Set to `0` to disable buffering entirely. Command output is still streamed to dar-backup-commands.log
2098
+ - If set to `0`, the calling function cannot rely on output from the executed command. The exit value is the only result provided.
2099
+
2100
+ Example:
2101
+
2102
+ ```ini
2103
+ [MISC]
2104
+ COMMAND_CAPTURE_MAX_BYTES = 102400
2105
+ ```
@@ -370,7 +370,6 @@
370
370
  x="975"
371
371
  y="618"
372
372
  id="text48">If section [name] is absent → uses global [PAR2] values</text>
373
- <!-- Bottom right: PAR2_LAYOUT effects (merged) -->
374
373
  <!-- Arrows -->
375
374
  <path
376
375
  class="arrow"
@@ -0,0 +1,46 @@
1
+ # Assessment of dar-backup (v2)
2
+
3
+ ## Gemini3-preview assessment
4
+
5
+ Date: January 23, 2026
6
+
7
+ ### 1. Code Quality
8
+
9
+ **Rating: Excellent**
10
+
11
+ The codebase demonstrates professional engineering standards and best practices for a Python CLI tool.
12
+
13
+ * **Structure & Organization:** The project follows a clear modular design.
14
+ * `dar_backup.py` acts as the orchestrator.
15
+ * `util.py` handles shared logic (logging, config parsing).
16
+ * `command_runner.py` encapsulates system command execution.
17
+ * **Type Hinting:** Extensive use of Python type hints (e.g., `-> List[str]`, `config_settings: ConfigSettings`) ensures code clarity and enables static analysis.
18
+ * **Documentation:** Functions feature comprehensive docstrings detailing arguments, return values, and exceptions.
19
+ * **Error Handling:** Robust exception handling is in place. Custom exceptions like `BackupError` are used, and `subprocess` errors are caught and logged gracefully.
20
+ * **Logging:** A sophisticated dual-logger setup (`main_logger` and `secondary_logger`) separates application logic from the verbose output of the underlying `dar` commands.
21
+
22
+ ### 2. Test Coverage
23
+ **Rating: Excellent**
24
+
25
+ The testing strategy is rigorous, verified by the reported **89% code coverage**.
26
+
27
+ * **Framework:** Uses `pytest`, the industry standard for Python testing.
28
+ * **Mocking:** The tests in `v2/tests/` (e.g., `test_dar_backup.py`) make extensive use of `unittest.mock`.
29
+ * **Isolation:** File system operations and external shell commands (like `dar` and `par2`) are mocked effectively. This ensures tests are fast, deterministic, and safe to run without modifying the user's system.
30
+ * **Scenarios:** The test suite covers:
31
+ * **Success paths:** Verifying correct command construction.
32
+ * **Failure paths:** Handling non-zero exit codes from subprocesses.
33
+ * **Edge cases:** Missing files, permission errors, and configuration mismatches.
34
+
35
+ ### 3. README.md
36
+ **Rating: Excellent**
37
+
38
+ The documentation is exhaustive and user-friendly.
39
+
40
+ * **Completeness:** It covers every aspect of the tool's lifecycle: Installation (pip/venv), Configuration (detailed `ini` examples), Usage, and Automation (systemd generation).
41
+ * **Context:** The "My Use Case" and "Design Choices" sections provide valuable context, explaining *why* the tool exists and the problems it solves (e.g., bitrot protection with PAR2).
42
+ * **Quick Start:** A "TL;DR" and "Quick Guide" allow users to get up and running immediately.
43
+ * **Transparency:** Includes live badges for build status, PyPI version, and test coverage, increasing trust.
44
+
45
+ ### Summary
46
+ `dar-backup` v2 is a high-quality, production-ready tool. It is well-architected, thoroughly tested, and exceptionally documented, making it a reliable choice for critical backup operations.
Binary file
@@ -37,6 +37,13 @@ python3 -m build && pip install --force-reinstall dist/dar_backup-${VERSION}-py3
37
37
 
38
38
  ## Howto use pytest in venv
39
39
 
40
+ The simplest way to run the test suite
41
+
42
+ ```` bash
43
+ # assumes the venc is activated, see above
44
+ pytest
45
+ ````
46
+
40
47
  A pytest.ini is located in the v2 directory, so that pytest writes out captures to console.
41
48
 
42
49
  That is useful when working with a single test and is the default
@@ -66,11 +66,11 @@ description = """A script to do full, differential and incremental backups using
66
66
  readme = "README.md"
67
67
  readme-content-type = "text/markdown"
68
68
  license = { file="LICENSE", name="GPL-3.0-or-later" }
69
- requires-python = ">=3.9"
69
+ requires-python = ">=3.11"
70
70
  classifiers = [
71
71
  "Development Status :: 5 - Production/Stable",
72
72
  "Intended Audience :: End Users/Desktop",
73
- 'Programming Language :: Python :: 3.9',
73
+ 'Programming Language :: Python :: 3.11',
74
74
  "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
75
75
  "Operating System :: POSIX :: Linux",
76
76
  "Topic :: System :: Archiving :: Backup",
@@ -110,6 +110,9 @@ packaging = [
110
110
  "twine>=6.1.0",
111
111
  ]
112
112
 
113
+ [tool.coverage.run]
114
+ data_file = "/tmp/.coverage"
115
+
113
116
  [project.urls]
114
117
  "GPG Public Key" = "https://keys.openpgp.org/search?q=dar-backup@pm.me"
115
118
  Homepage = "https://github.com/per2jensen/dar-backup/tree/main/v2"
@@ -1,6 +1,35 @@
1
1
  <!-- markdownlint-disable MD024 -->
2
2
  # dar-backup Changelog
3
3
 
4
+ ## v2-1.0.2 - 2026-01-25
5
+
6
+ ### Added
7
+
8
+ - Streaming restore-test sampling using reservoir sampling to avoid holding full file lists in memory.
9
+ - Configurable command output capture cap (`COMMAND_CAPTURE_MAX_BYTES`, default 100 KB) to limit in-memory stdout/stderr while still logging full output.
10
+ - Streaming list output for `dar-backup --list-contents` and `manager --list-archive-contents` to avoid large in-memory buffers.
11
+ - Test coverage additions for config parsing, util helpers, restore-test sampling edge cases, par2 slice helpers, and get_backed_up_files error paths.
12
+ - Tests for missing source files during restore verification and for par2 generation order after verification.
13
+ - CommandRunner test coverage for sanitize failure notes, text/binary output handling, timeouts, Popen failures, and TTY restore logic.
14
+ - Tests for COMMAND_CAPTURE_MAX_BYTES defaults (0 and 1k) and binary stdout/stderr capture with truncation and log_output disabled.
15
+ - Manager test coverage for create-db guardrails and catalog listing parsing/sorting across runner/subprocess paths.
16
+ - Cleanup now reports PREREQ/POSTREQ failures cleanly and sends Discord failure notifications when configured.
17
+ - New trace logger that always logs at DEBUG and captures stacktraces if they happens. Default max size is 10MB + 1 rollover file.
18
+
19
+ ### Changed
20
+
21
+ - BUGFIX: Ensure existing files are removed before restore verification to prevent false positives.
22
+ - Clears out restore-test directory on program start to ensure a clean slate.
23
+ - Restore-test selection now streams DAR XML listings and samples candidates without loading all entries into RAM.
24
+ - `get_backed_up_files` uses incremental XML parsing to reduce memory use for large archives.
25
+ - Restore verification now logs a warning and continues when a source or restored file is missing during comparison.
26
+ - CommandRunner supports per-command capture cap overrides (disable cap with `capture_output_limit_bytes=-1`).
27
+ - Cleanup now rejects unsafe archive names when `--cleanup-specific-archives` is used to prevent accidental deletions.
28
+ - Removed deprecated PAR2 layout/mode settings and simplified PAR2 cleanup to delete all matching .par2 artifacts.
29
+ - Config templates/docs updated to drop PAR2_LAYOUT/PAR2_MODE references.
30
+ - [Snyk] Python 3.11 required in pyproject.toml. Snyk has flagged a vulnerabilly in an xml parser that requires the bump to 3.11.
31
+ - Config parsing errors now emit concise messages (no stack trace) and trigger Discord failure notifications in CLI tools.
32
+
4
33
  ## v2-1.0.1 - 2026-01-09
5
34
 
6
35
  ### Added