duplicity 3.2.1.dev3__tar.gz → 3.2.2.dev0__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 (196) hide show
  1. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/CHANGELOG.md +94 -33
  2. {duplicity-3.2.1.dev3/duplicity.egg-info → duplicity-3.2.2.dev0}/PKG-INFO +3 -2
  3. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/__init__.py +2 -2
  4. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/__main__.py +2 -2
  5. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backend.py +37 -2
  6. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backend_pool.py +3 -6
  7. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/_cf_cloudfiles.py +2 -1
  8. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/b2backend.py +2 -1
  9. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/boxbackend.py +38 -3
  10. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/idrivedbackend.py +1 -2
  11. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/imapbackend.py +1 -0
  12. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/jottacloudbackend.py +3 -0
  13. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/mediafirebackend.py +1 -0
  14. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/onedrivebackend.py +39 -16
  15. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/pyrax_identity/hubic.py +2 -0
  16. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/webdavbackend.py +20 -0
  17. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/xorrisobackend.py +1 -1
  18. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/cli_data.py +6 -0
  19. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/cli_main.py +2 -1
  20. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/config.py +3 -0
  21. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/diffdir.py +4 -2
  22. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/dup_collections.py +8 -5
  23. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/dup_main.py +1 -1
  24. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/dup_temp.py +1 -1
  25. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/gpg.py +2 -1
  26. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/gpginterface.py +21 -17
  27. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/log.py +1 -1
  28. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/manifest.py +17 -4
  29. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/patchdir.py +1 -1
  30. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/path.py +1 -1
  31. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/selection.py +1 -13
  32. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/util.py +8 -21
  33. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0/duplicity.egg-info}/PKG-INFO +3 -2
  34. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/man/duplicity.1 +10 -1
  35. {duplicity-3.2.1.dev3/po → duplicity-3.2.2.dev0/po/af_ZA}/af_ZA.po +394 -382
  36. {duplicity-3.2.1.dev3/po/af_ZA → duplicity-3.2.2.dev0/po}/af_ZA.po +394 -382
  37. {duplicity-3.2.1.dev3/po → duplicity-3.2.2.dev0/po/ar_SA}/ar_SA.po +400 -393
  38. {duplicity-3.2.1.dev3/po/ar_SA → duplicity-3.2.2.dev0/po}/ar_SA.po +400 -393
  39. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ca_ES/ca_ES.po +394 -382
  40. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ca_ES.po +394 -382
  41. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/cs_CZ/cs_CZ.po +400 -393
  42. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/cs_CZ.po +400 -393
  43. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/da_DK/da_DK.po +400 -393
  44. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/da_DK.po +400 -393
  45. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/de_AT/de_AT.po +400 -393
  46. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/de_AT.po +400 -393
  47. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/de_DE/de_DE.po +400 -393
  48. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/de_DE.po +400 -393
  49. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/duplicity.pot +399 -386
  50. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/el_GR/el_GR.po +400 -388
  51. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/el_GR.po +400 -388
  52. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/en_AU/en_AU.po +394 -382
  53. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/en_AU.po +394 -382
  54. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/en_GB/en_GB.po +394 -382
  55. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/en_GB.po +394 -382
  56. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/en_PR/en_PR.po +394 -382
  57. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/en_PR.po +394 -382
  58. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/en_US/en_US.po +394 -382
  59. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/en_US.po +394 -382
  60. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_EM/es_EM.po +400 -393
  61. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_EM.po +400 -393
  62. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_ES/es_ES.po +400 -393
  63. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_ES.po +400 -393
  64. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_MX/es_MX.po +400 -393
  65. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_MX.po +400 -393
  66. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_PR/es_PR.po +400 -393
  67. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_PR.po +400 -393
  68. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_US/es_US.po +400 -393
  69. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/es_US.po +400 -393
  70. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/fi_FI/fi_FI.po +400 -393
  71. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/fi_FI.po +400 -393
  72. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/fr_FR/fr_FR.po +400 -390
  73. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/fr_FR.po +400 -390
  74. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/he_IL/he_IL.po +395 -385
  75. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/he_IL.po +395 -385
  76. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/hu_HU/hu_HU.po +395 -383
  77. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/hu_HU.po +395 -383
  78. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/it_IT/it_IT.po +400 -393
  79. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/it_IT.po +400 -393
  80. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ja_JP/ja_JP.po +400 -388
  81. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ja_JP.po +400 -388
  82. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ka_GE/ka_GE.po +394 -382
  83. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ka_GE.po +394 -382
  84. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ko_KR/ko_KR.po +394 -382
  85. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ko_KR.po +394 -382
  86. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/nl_BE/nl_BE.po +400 -393
  87. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/nl_BE.po +400 -393
  88. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/nl_NL/nl_NL.po +400 -393
  89. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/nl_NL.po +400 -393
  90. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/nl_SR/nl_SR.po +400 -393
  91. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/nl_SR.po +400 -393
  92. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/no_NO/no_NO.po +400 -393
  93. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/no_NO.po +400 -393
  94. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/pl_PL/pl_PL.po +400 -393
  95. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/pl_PL.po +400 -393
  96. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/pt_BR/pt_BR.po +400 -393
  97. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/pt_BR.po +400 -393
  98. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/pt_PT/pt_PT.po +400 -393
  99. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/pt_PT.po +400 -393
  100. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ro_RO/ro_RO.po +400 -393
  101. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ro_RO.po +400 -393
  102. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ru_BY/ru_BY.po +400 -393
  103. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ru_BY.po +400 -393
  104. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ru_MD/ru_MD.po +400 -393
  105. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ru_MD.po +400 -393
  106. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ru_RU/ru_RU.po +400 -393
  107. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ru_RU.po +400 -393
  108. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/sr_SP/sr_SP.po +394 -382
  109. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/sr_SP.po +394 -382
  110. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/sv_SE/sv_SE.po +400 -393
  111. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/sv_SE.po +400 -393
  112. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/tr_TR/tr_TR.po +394 -382
  113. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/tr_TR.po +394 -382
  114. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/uk_UA/uk_UA.po +395 -383
  115. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/uk_UA.po +395 -383
  116. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/vi_VN/vi_VN.po +394 -382
  117. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/vi_VN.po +394 -382
  118. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_CN/zh_CN.po +400 -393
  119. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_CN.po +400 -393
  120. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_HK/zh_HK.po +394 -382
  121. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_HK.po +394 -382
  122. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_MO/zh_MO.po +394 -382
  123. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_MO.po +394 -382
  124. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_SG/zh_SG.po +400 -393
  125. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_SG.po +400 -393
  126. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_TW/zh_TW.po +394 -382
  127. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/zh_TW.po +394 -382
  128. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/pyproject.toml +11 -34
  129. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/AUTHORS.md +0 -0
  130. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/COPYING +0 -0
  131. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/README-ARCH.md +0 -0
  132. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/README-INSTALL.md +0 -0
  133. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/README-LOG.md +0 -0
  134. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/README-RELEASE.md +0 -0
  135. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/README-REPO.md +0 -0
  136. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/README-SNAP.md +0 -0
  137. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/README-TESTING.md +0 -0
  138. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/README.md +0 -0
  139. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/_librsync_ctypes.py +0 -0
  140. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/_librsyncmodule.c +0 -0
  141. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/argparse311.py +0 -0
  142. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/__init__.py +0 -0
  143. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/_cf_pyrax.py +0 -0
  144. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/_testbackend.py +0 -0
  145. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/adbackend.py +0 -0
  146. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/azurebackend.py +0 -0
  147. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/cfbackend.py +0 -0
  148. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/dpbxbackend.py +0 -0
  149. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/gdocsbackend.py +0 -0
  150. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/gdrivebackend.py +0 -0
  151. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/giobackend.py +0 -0
  152. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/hsibackend.py +0 -0
  153. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/hubicbackend.py +0 -0
  154. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/lftpbackend.py +0 -0
  155. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/localbackend.py +0 -0
  156. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/megabackend.py +0 -0
  157. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/megav2backend.py +0 -0
  158. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/megav3backend.py +0 -0
  159. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/multibackend.py +0 -0
  160. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/ncftpbackend.py +0 -0
  161. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/par2backend.py +0 -0
  162. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/pcabackend.py +0 -0
  163. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/pydrivebackend.py +0 -0
  164. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/pyrax_identity/__init__.py +0 -0
  165. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/rclonebackend.py +0 -0
  166. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/rsyncbackend.py +0 -0
  167. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/s3_boto3_backend.py +0 -0
  168. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/slatebackend.py +0 -0
  169. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/ssh_paramiko_backend.py +0 -0
  170. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/ssh_pexpect_backend.py +0 -0
  171. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/swiftbackend.py +0 -0
  172. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/sxbackend.py +0 -0
  173. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/backends/tahoebackend.py +0 -0
  174. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/cached_ops.py +0 -0
  175. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/cli_util.py +0 -0
  176. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/dup_tarfile.py +0 -0
  177. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/dup_time.py +0 -0
  178. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/errors.py +0 -0
  179. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/file_naming.py +0 -0
  180. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/globmatch.py +0 -0
  181. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/lazy.py +0 -0
  182. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/librsync.py +0 -0
  183. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/progress.py +0 -0
  184. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/robust.py +0 -0
  185. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/statistics.py +0 -0
  186. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity/tempdir.py +0 -0
  187. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity.egg-info/SOURCES.txt +0 -0
  188. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity.egg-info/dependency_links.txt +0 -0
  189. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity.egg-info/entry_points.txt +0 -0
  190. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity.egg-info/requires.txt +0 -0
  191. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/duplicity.egg-info/top_level.txt +0 -0
  192. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ru_UA/ru_UA.po +0 -0
  193. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/po/ru_UA.po +0 -0
  194. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/requirements.txt +0 -0
  195. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/setup.cfg +0 -0
  196. {duplicity-3.2.1.dev3 → duplicity-3.2.2.dev0}/setup.py +0 -0
@@ -1,35 +1,30 @@
1
1
 
2
- (Unreleased) / 2026-09-23
2
+ (Unreleased) / 2026-09-28
3
3
  =========================
4
4
 
5
5
 
6
6
 
7
- rel.3.2.1.dev3 / 2026-09-23
8
- ===========================
9
-
10
-
11
- rel.3.3.1.dev3 / 2026-09-22
12
- ===========================
7
+ rel.3.2.1 / 2026-09-28
8
+ ======================
13
9
 
14
10
  * [`d7da150b`](https://gitlab.com/duplicity/duplicity/-/commit/d7da150b):new: Create subpath in rsyncd.
11
+ * [`77c5107e`](https://gitlab.com/duplicity/duplicity/-/commit/77c5107e):new: Add get_version() to librsync to retrieve underlying library version
12
+ * [`b839f2c8`](https://gitlab.com/duplicity/duplicity/-/commit/b839f2c8):new: Add pure Python librsync implementation using ctypes as fallback
13
+ * [`ba7957c3`](https://gitlab.com/duplicity/duplicity/-/commit/ba7957c3):new: Add coverage configuration and Makefile targets for testing.
14
+ * [`846e90ae`](https://gitlab.com/duplicity/duplicity/-/commit/846e90ae):chg: Adapt `makechangelog` for enhanced usability and stricter repo cleanliness checks
15
+ * [`35191e13`](https://gitlab.com/duplicity/duplicity/-/commit/35191e13):chg: Remove unused pytest options and manual testing directory from `pyproject.toml`
16
+ * [`eaa264be`](https://gitlab.com/duplicity/duplicity/-/commit/eaa264be):chg: Improve error handling for Box, OneDrive, and WebDAV backends; add unit tests for comprehensive validation
15
17
  * [`e181a9e9`](https://gitlab.com/duplicity/duplicity/-/commit/e181a9e9):chg: Improve error handling and signature file filtering logic; add unit tests for B2 and PAR2 backends
16
18
  * [`58a54680`](https://gitlab.com/duplicity/duplicity/-/commit/58a54680):chg: Add regex cache invalidation for file prefix changes; update tests
17
19
  * [`fcd6920a`](https://gitlab.com/duplicity/duplicity/-/commit/fcd6920a):chg: Add deprecation warnings for CloudFiles, Pyrax, and Hubic backends
18
20
  * [`1842e4de`](https://gitlab.com/duplicity/duplicity/-/commit/1842e4de):chg: Remove `python3-gnupg` and restore `gpginterface` module and unit tests.
21
+ * [`aae16c61`](https://gitlab.com/duplicity/duplicity/-/commit/aae16c61):chg: Remove `python3-gnupg` and restore `gpginterface` module and unit tests.
19
22
  * [`a201453e`](https://gitlab.com/duplicity/duplicity/-/commit/a201453e):chg: Plan to remove obsolete Pyrax, CloudFiles, and Hubic backends; standardize on python-swiftclient
20
23
  * [`abdf9a0e`](https://gitlab.com/duplicity/duplicity/-/commit/abdf9a0e):chg: Remove unused gnupg import from gpg.py for cleanup.
21
24
  * [`bd649791`](https://gitlab.com/duplicity/duplicity/-/commit/bd649791):chg: Split wildcard and multiline imports into individual lines for improved clarity and compliance with coding standards
22
25
  * [`993cc651`](https://gitlab.com/duplicity/duplicity/-/commit/993cc651):chg: Decouple selection parsing from core engine and refactor tests
23
26
  * [`1af57ea4`](https://gitlab.com/duplicity/duplicity/-/commit/1af57ea4):chg: Add support and tests for new CLI options
24
27
  * [`df643666`](https://gitlab.com/duplicity/duplicity/-/commit/df643666):chg: Update Python3 version and dependencies in `debian/control`
25
- * [`7514a7e2`](https://gitlab.com/duplicity/duplicity/-/commit/7514a7e2):fix: Correct string formatting in help output and improve test stability
26
- * [`c179caf1`](https://gitlab.com/duplicity/duplicity/-/commit/c179caf1):fix: Fix GPG sleep processes on verify, modernize tests, and update guidelines
27
- * [`90f9137e`](https://gitlab.com/duplicity/duplicity/-/commit/90f9137e):fix: Fix subpath creation for rsync #943
28
- * [`ed58fae5`](https://gitlab.com/duplicity/duplicity/-/commit/ed58fae5):fix: Restore Python versions, dependencies, and revert migration to 'python-gnupg'.
29
-
30
- rel.3.2.1.dev2 / 2026-08-20
31
- ===========================
32
-
33
28
  * [`855c6f1c`](https://gitlab.com/duplicity/duplicity/-/commit/855c6f1c):chg: Remove outdated comment for `python3-gnupg` in `debian/control`
34
29
  * [`22fae925`](https://gitlab.com/duplicity/duplicity/-/commit/22fae925):chg: Sync README files in `setup.py` and clean up verbosity flags
35
30
  * [`978355b4`](https://gitlab.com/duplicity/duplicity/-/commit/978355b4):chg: Enable verbose mode in debian/rules
@@ -37,23 +32,11 @@ rel.3.2.1.dev2 / 2026-08-20
37
32
  * [`ba71d094`](https://gitlab.com/duplicity/duplicity/-/commit/ba71d094):chg: Update setuptools to >=61.0.0 in dev dependencies and `debian/rules`
38
33
  * [`2b55864a`](https://gitlab.com/duplicity/duplicity/-/commit/2b55864a):chg: Simplify `gnupg` import logic in `gpg.py`
39
34
  * [`80abbd02`](https://gitlab.com/duplicity/duplicity/-/commit/80abbd02):chg: Adjust dependencies in `requirements.txt` and `debian/control`
40
-
41
- rel.3.2.1.dev1 / 2026-08-15
42
- ===========================
43
-
44
35
  * [`df52d45b`](https://gitlab.com/duplicity/duplicity/-/commit/df52d45b):chg: Add `python3-gnupg` as a build dependency in `debian/control`
45
36
  * [`057c7d0a`](https://gitlab.com/duplicity/duplicity/-/commit/057c7d0a):chg: Update doc cleanup pattern in `debian/rules`
46
37
  * [`4eaee861`](https://gitlab.com/duplicity/duplicity/-/commit/4eaee861):chg: Update doc cleanup to remove `duplicity-*` files in `debian/rules`
47
38
  * [`7cd8ddb6`](https://gitlab.com/duplicity/duplicity/-/commit/7cd8ddb6):chg: Add `get_data_files` for dynamic data file handling in `setup.py`
48
39
  * [`e9bf8843`](https://gitlab.com/duplicity/duplicity/-/commit/e9bf8843):chg: Simplify doc handling by removing outdated duplicity docs
49
- * [`22da1a0d`](https://gitlab.com/duplicity/duplicity/-/commit/22da1a0d):fix: Resolve PEP8 style issues and whitespace in backend and main modules
50
-
51
- rel.3.2.1.dev0 / 2026-08-11
52
- ===========================
53
-
54
- * [`77c5107e`](https://gitlab.com/duplicity/duplicity/-/commit/77c5107e):new: Add get_version() to librsync to retrieve underlying library version
55
- * [`b839f2c8`](https://gitlab.com/duplicity/duplicity/-/commit/b839f2c8):new: Add pure Python librsync implementation using ctypes as fallback
56
- * [`ba7957c3`](https://gitlab.com/duplicity/duplicity/-/commit/ba7957c3):new: Add coverage configuration and Makefile targets for testing.
57
40
  * [`4bc93712`](https://gitlab.com/duplicity/duplicity/-/commit/4bc93712):chg: Update dependencies, streamline configs, and refine CI
58
41
  * [`ca78d6c5`](https://gitlab.com/duplicity/duplicity/-/commit/ca78d6c5):chg: Update release-prep script to use `check_tags`
59
42
  * [`60ae51f3`](https://gitlab.com/duplicity/duplicity/-/commit/60ae51f3):chg: Update release-prep script to fix tag removal and file refs
@@ -66,6 +49,11 @@ rel.3.2.1.dev0 / 2026-08-11
66
49
  * [`1dee9e31`](https://gitlab.com/duplicity/duplicity/-/commit/1dee9e31):chg: b2backend prefer b2sdk.v3
67
50
  * [`4f4e052e`](https://gitlab.com/duplicity/duplicity/-/commit/4f4e052e):chg: Cleanup some minor issues
68
51
  * [`1e0a97dc`](https://gitlab.com/duplicity/duplicity/-/commit/1e0a97dc):chg: Format with Black/PEP8 and ensure file flush before rename
52
+ * [`7514a7e2`](https://gitlab.com/duplicity/duplicity/-/commit/7514a7e2):fix: Correct string formatting in help output and improve test stability
53
+ * [`c179caf1`](https://gitlab.com/duplicity/duplicity/-/commit/c179caf1):fix: Fix GPG sleep processes on verify, modernize tests, and update guidelines
54
+ * [`90f9137e`](https://gitlab.com/duplicity/duplicity/-/commit/90f9137e):fix: Fix subpath creation for rsync #943
55
+ * [`ed58fae5`](https://gitlab.com/duplicity/duplicity/-/commit/ed58fae5):fix: Restore Python versions, dependencies, and revert migration to 'python-gnupg'.
56
+ * [`22da1a0d`](https://gitlab.com/duplicity/duplicity/-/commit/22da1a0d):fix: Resolve PEP8 style issues and whitespace in backend and main modules
69
57
  * [`06858c9a`](https://gitlab.com/duplicity/duplicity/-/commit/06858c9a):fix: Replace `os.system` calls with safer Python alternatives.
70
58
  * [`da745307`](https://gitlab.com/duplicity/duplicity/-/commit/da745307):fix: Add --ignore-installed flag for pip in Dockerfiles
71
59
  * [`883cca1e`](https://gitlab.com/duplicity/duplicity/-/commit/883cca1e):fix: restore issue: AssertionError: (b'keys', [...]) not empty
@@ -103,7 +91,6 @@ rel.3.2.0 / 2026-08-10
103
91
  * [`8612b567`](https://gitlab.com/duplicity/duplicity/-/commit/8612b567):new: Add get_version() to librsync to retrieve underlying library version
104
92
  * [`9dddcfc4`](https://gitlab.com/duplicity/duplicity/-/commit/9dddcfc4):new: Add pure Python librsync implementation using ctypes as fallback
105
93
  * [`acaedcfe`](https://gitlab.com/duplicity/duplicity/-/commit/acaedcfe):new: Add coverage configuration and Makefile targets for testing.
106
- * [`6feeafb1`](https://gitlab.com/duplicity/duplicity/-/commit/6feeafb1):new: Add PyCharm devcontainer configuration and base Dockerfile.
107
94
  * [`b3c4b349`](https://gitlab.com/duplicity/duplicity/-/commit/b3c4b349):chg: Update release-prep script to use `check_tags`
108
95
  * [`8befb2cf`](https://gitlab.com/duplicity/duplicity/-/commit/8befb2cf):chg: Update release-prep script to fix tag removal and file refs
109
96
  * [`33544f8c`](https://gitlab.com/duplicity/duplicity/-/commit/33544f8c):chg: Update pipeline triggers for push, web, and merge request events
@@ -114,11 +101,6 @@ rel.3.2.0 / 2026-08-10
114
101
  * [`59ed8f9e`](https://gitlab.com/duplicity/duplicity/-/commit/59ed8f9e):chg: Rewrite `makechangelog` script in Python
115
102
  * [`ffc31818`](https://gitlab.com/duplicity/duplicity/-/commit/ffc31818):chg: b2backend prefer b2sdk.v3
116
103
  * [`78da5b67`](https://gitlab.com/duplicity/duplicity/-/commit/78da5b67):chg: Cleanup some minor issues
117
- * [`64264da1`](https://gitlab.com/duplicity/duplicity/-/commit/64264da1):chg: Remove unused Tahoe-LAFS installation steps in Snapcraft
118
- * [`f4123b7e`](https://gitlab.com/duplicity/duplicity/-/commit/f4123b7e):chg: Add support for additional architectures in Snapcraft
119
- * [`6f015221`](https://gitlab.com/duplicity/duplicity/-/commit/6f015221):chg: Update Snapcraft to core26 and Python 3.14
120
- * [`938764f7`](https://gitlab.com/duplicity/duplicity/-/commit/938764f7):chg: Add setuptools dependency to requirements.dev for Python 3.12+
121
- * [`b17da54e`](https://gitlab.com/duplicity/duplicity/-/commit/b17da54e):chg: Update dependencies in requirements.txt for compatibility.
122
104
  * [`47c21150`](https://gitlab.com/duplicity/duplicity/-/commit/47c21150):fix: Replace `os.system` calls with safer Python alternatives.
123
105
  * [`12c98f2a`](https://gitlab.com/duplicity/duplicity/-/commit/12c98f2a):fix: Add --ignore-installed flag for pip in Dockerfiles
124
106
  * [`b1508a6d`](https://gitlab.com/duplicity/duplicity/-/commit/b1508a6d):fix: restore issue: AssertionError: (b'keys', [...]) not empty
@@ -130,6 +112,85 @@ rel.3.2.0 / 2026-08-10
130
112
  * [`c823ed36`](https://gitlab.com/duplicity/duplicity/-/commit/c823ed36):fix: Could not release lockfile
131
113
  * [`3d9eab94`](https://gitlab.com/duplicity/duplicity/-/commit/3d9eab94):fix: Comprehensive fix for backup, restart, and cleanup logic.
132
114
 
115
+ rel.3.2.1.dev3 / 2026-09-23
116
+ ===========================
117
+
118
+ * [`d7da150b`](https://gitlab.com/duplicity/duplicity/-/commit/d7da150b):new: Create subpath in rsyncd.
119
+ * [`e181a9e9`](https://gitlab.com/duplicity/duplicity/-/commit/e181a9e9):chg: Improve error handling and signature file filtering logic; add unit tests for B2 and PAR2 backends
120
+ * [`58a54680`](https://gitlab.com/duplicity/duplicity/-/commit/58a54680):chg: Add regex cache invalidation for file prefix changes; update tests
121
+ * [`fcd6920a`](https://gitlab.com/duplicity/duplicity/-/commit/fcd6920a):chg: Add deprecation warnings for CloudFiles, Pyrax, and Hubic backends
122
+ * [`1842e4de`](https://gitlab.com/duplicity/duplicity/-/commit/1842e4de):chg: Remove `python3-gnupg` and restore `gpginterface` module and unit tests.
123
+ * [`a201453e`](https://gitlab.com/duplicity/duplicity/-/commit/a201453e):chg: Plan to remove obsolete Pyrax, CloudFiles, and Hubic backends; standardize on python-swiftclient
124
+ * [`abdf9a0e`](https://gitlab.com/duplicity/duplicity/-/commit/abdf9a0e):chg: Remove unused gnupg import from gpg.py for cleanup.
125
+ * [`bd649791`](https://gitlab.com/duplicity/duplicity/-/commit/bd649791):chg: Split wildcard and multiline imports into individual lines for improved clarity and compliance with coding standards
126
+ * [`993cc651`](https://gitlab.com/duplicity/duplicity/-/commit/993cc651):chg: Decouple selection parsing from core engine and refactor tests
127
+ * [`1af57ea4`](https://gitlab.com/duplicity/duplicity/-/commit/1af57ea4):chg: Add support and tests for new CLI options
128
+ * [`df643666`](https://gitlab.com/duplicity/duplicity/-/commit/df643666):chg: Update Python3 version and dependencies in `debian/control`
129
+ * [`7514a7e2`](https://gitlab.com/duplicity/duplicity/-/commit/7514a7e2):fix: Correct string formatting in help output and improve test stability
130
+ * [`c179caf1`](https://gitlab.com/duplicity/duplicity/-/commit/c179caf1):fix: Fix GPG sleep processes on verify, modernize tests, and update guidelines
131
+ * [`90f9137e`](https://gitlab.com/duplicity/duplicity/-/commit/90f9137e):fix: Fix subpath creation for rsync #943
132
+ * [`ed58fae5`](https://gitlab.com/duplicity/duplicity/-/commit/ed58fae5):fix: Restore Python versions, dependencies, and revert migration to 'python-gnupg'.
133
+
134
+ rel.3.2.1.dev2 / 2026-08-20
135
+ ===========================
136
+
137
+ * [`855c6f1c`](https://gitlab.com/duplicity/duplicity/-/commit/855c6f1c):chg: Remove outdated comment for `python3-gnupg` in `debian/control`
138
+ * [`22fae925`](https://gitlab.com/duplicity/duplicity/-/commit/22fae925):chg: Sync README files in `setup.py` and clean up verbosity flags
139
+ * [`978355b4`](https://gitlab.com/duplicity/duplicity/-/commit/978355b4):chg: Enable verbose mode in debian/rules
140
+ * [`626cdccb`](https://gitlab.com/duplicity/duplicity/-/commit/626cdccb):chg: Remove redundant `apt` commands in `debian/rules`
141
+ * [`ba71d094`](https://gitlab.com/duplicity/duplicity/-/commit/ba71d094):chg: Update setuptools to >=61.0.0 in dev dependencies and `debian/rules`
142
+ * [`2b55864a`](https://gitlab.com/duplicity/duplicity/-/commit/2b55864a):chg: Simplify `gnupg` import logic in `gpg.py`
143
+ * [`80abbd02`](https://gitlab.com/duplicity/duplicity/-/commit/80abbd02):chg: Adjust dependencies in `requirements.txt` and `debian/control`
144
+
145
+ rel.3.2.1.dev1 / 2026-08-15
146
+ ===========================
147
+
148
+ * [`df52d45b`](https://gitlab.com/duplicity/duplicity/-/commit/df52d45b):chg: Add `python3-gnupg` as a build dependency in `debian/control`
149
+ * [`057c7d0a`](https://gitlab.com/duplicity/duplicity/-/commit/057c7d0a):chg: Update doc cleanup pattern in `debian/rules`
150
+ * [`4eaee861`](https://gitlab.com/duplicity/duplicity/-/commit/4eaee861):chg: Update doc cleanup to remove `duplicity-*` files in `debian/rules`
151
+ * [`7cd8ddb6`](https://gitlab.com/duplicity/duplicity/-/commit/7cd8ddb6):chg: Add `get_data_files` for dynamic data file handling in `setup.py`
152
+ * [`e9bf8843`](https://gitlab.com/duplicity/duplicity/-/commit/e9bf8843):chg: Simplify doc handling by removing outdated duplicity docs
153
+ * [`22da1a0d`](https://gitlab.com/duplicity/duplicity/-/commit/22da1a0d):fix: Resolve PEP8 style issues and whitespace in backend and main modules
154
+
155
+ rel.3.2.1.dev0 / 2026-08-11
156
+ ===========================
157
+
158
+ * [`77c5107e`](https://gitlab.com/duplicity/duplicity/-/commit/77c5107e):new: Add get_version() to librsync to retrieve underlying library version
159
+ * [`b839f2c8`](https://gitlab.com/duplicity/duplicity/-/commit/b839f2c8):new: Add pure Python librsync implementation using ctypes as fallback
160
+ * [`ba7957c3`](https://gitlab.com/duplicity/duplicity/-/commit/ba7957c3):new: Add coverage configuration and Makefile targets for testing.
161
+ * [`6feeafb1`](https://gitlab.com/duplicity/duplicity/-/commit/6feeafb1):new: Add PyCharm devcontainer configuration and base Dockerfile.
162
+ * [`4bc93712`](https://gitlab.com/duplicity/duplicity/-/commit/4bc93712):chg: Update dependencies, streamline configs, and refine CI
163
+ * [`ca78d6c5`](https://gitlab.com/duplicity/duplicity/-/commit/ca78d6c5):chg: Update release-prep script to use `check_tags`
164
+ * [`60ae51f3`](https://gitlab.com/duplicity/duplicity/-/commit/60ae51f3):chg: Update release-prep script to fix tag removal and file refs
165
+ * [`45495e09`](https://gitlab.com/duplicity/duplicity/-/commit/45495e09):chg: Update pipeline triggers for push, web, and merge request events
166
+ * [`f8fc71e3`](https://gitlab.com/duplicity/duplicity/-/commit/f8fc71e3):chg: Improve process in `setup.py` and release prep script
167
+ * [`f36c9922`](https://gitlab.com/duplicity/duplicity/-/commit/f36c9922):chg: Refactor versioning and metadata handling
168
+ * [`84afa6f2`](https://gitlab.com/duplicity/duplicity/-/commit/84afa6f2):chg: Refactor string concatenations to f-strings across codebase
169
+ * [`480cbc23`](https://gitlab.com/duplicity/duplicity/-/commit/480cbc23):chg: Clean up and refactor `pyproject.toml` and `Makefile`
170
+ * [`42d4838d`](https://gitlab.com/duplicity/duplicity/-/commit/42d4838d):chg: Rewrite `makechangelog` script in Python
171
+ * [`1dee9e31`](https://gitlab.com/duplicity/duplicity/-/commit/1dee9e31):chg: b2backend prefer b2sdk.v3
172
+ * [`4f4e052e`](https://gitlab.com/duplicity/duplicity/-/commit/4f4e052e):chg: Cleanup some minor issues
173
+ * [`1e0a97dc`](https://gitlab.com/duplicity/duplicity/-/commit/1e0a97dc):chg: Format with Black/PEP8 and ensure file flush before rename
174
+ * [`64264da1`](https://gitlab.com/duplicity/duplicity/-/commit/64264da1):chg: Remove unused Tahoe-LAFS installation steps in Snapcraft
175
+ * [`f4123b7e`](https://gitlab.com/duplicity/duplicity/-/commit/f4123b7e):chg: Add support for additional architectures in Snapcraft
176
+ * [`6f015221`](https://gitlab.com/duplicity/duplicity/-/commit/6f015221):chg: Update Snapcraft to core26 and Python 3.14
177
+ * [`938764f7`](https://gitlab.com/duplicity/duplicity/-/commit/938764f7):chg: Add setuptools dependency to requirements.dev for Python 3.12+
178
+ * [`b17da54e`](https://gitlab.com/duplicity/duplicity/-/commit/b17da54e):chg: Update dependencies in requirements.txt for compatibility.
179
+ * [`06858c9a`](https://gitlab.com/duplicity/duplicity/-/commit/06858c9a):fix: Replace `os.system` calls with safer Python alternatives.
180
+ * [`da745307`](https://gitlab.com/duplicity/duplicity/-/commit/da745307):fix: Add --ignore-installed flag for pip in Dockerfiles
181
+ * [`883cca1e`](https://gitlab.com/duplicity/duplicity/-/commit/883cca1e):fix: restore issue: AssertionError: (b'keys', [...]) not empty
182
+ * [`aa0b23e7`](https://gitlab.com/duplicity/duplicity/-/commit/aa0b23e7):fix: Replace `log.FatalError` with `raise errors.FatalError`.
183
+ * [`c3a45713`](https://gitlab.com/duplicity/duplicity/-/commit/c3a45713):fix: Add support for "sync" action and handle passphrase checks.
184
+ * [`db99858e`](https://gitlab.com/duplicity/duplicity/-/commit/db99858e):fix: Enhance error handling and debug logging in Python modules
185
+ * [`dbb899ad`](https://gitlab.com/duplicity/duplicity/-/commit/dbb899ad):fix: Use 'python-gnupg' instead of our 'gpginterface.py'.
186
+ * [`4d6e9f8c`](https://gitlab.com/duplicity/duplicity/-/commit/4d6e9f8c):fix: PCABackend GET URL needs prefix if one is defined
187
+ * [`d7cd05d8`](https://gitlab.com/duplicity/duplicity/-/commit/d7cd05d8):fix: Could not release lockfile
188
+ * [`fcbe3a7a`](https://gitlab.com/duplicity/duplicity/-/commit/fcbe3a7a):fix: Enforce --force requirement for destructive operations
189
+ * [`c6c8b26a`](https://gitlab.com/duplicity/duplicity/-/commit/c6c8b26a):fix: Enhance BackupSet.delete signature cleanup and fix lock release
190
+ * [`3f0ab55b`](https://gitlab.com/duplicity/duplicity/-/commit/3f0ab55b):fix: Prevent premature deletion of full backups during incremental starts
191
+ * [`9819e4d4`](https://gitlab.com/duplicity/duplicity/-/commit/9819e4d4):fix: Add get_last_continuous_volume for reliable backup resumption
192
+ * [`5d737d07`](https://gitlab.com/duplicity/duplicity/-/commit/5d737d07):fix: Postpone metadata promotion to prevent orphaned cache files
193
+
133
194
  rel.3.1.1.dev0 / 2026-06-16
134
195
  ===========================
135
196
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: duplicity
3
- Version: 3.2.1.dev3
3
+ Version: 3.2.2.dev0
4
4
  Summary: Encrypted backup using rsync algorithm
5
5
  Author-email: Kenneth Loafman <kenneth@loafman.com>
6
6
  Maintainer: Edgar Soldin, Thomas Laubrock
@@ -22,8 +22,9 @@ Classifier: Programming Language :: Python :: 3.11
22
22
  Classifier: Programming Language :: Python :: 3.12
23
23
  Classifier: Programming Language :: Python :: 3.13
24
24
  Classifier: Programming Language :: Python :: 3.14
25
+ Classifier: Programming Language :: Python :: 3.15
25
26
  Classifier: Topic :: System :: Archiving :: Backup
26
- Requires-Python: <3.15,>=3.10
27
+ Requires-Python: <3.16,>=3.10
27
28
  Description-Content-Type: text/markdown
28
29
  License-File: COPYING
29
30
  License-File: AUTHORS.md
@@ -29,7 +29,7 @@ orchestration.
29
29
 
30
30
  import gettext
31
31
 
32
- __version__: str = "3.2.1.dev3"
33
- __reldate__: str = "September 23, 2026"
32
+ __version__: str = "3.2.2.dev0"
33
+ __reldate__: str = "September 28, 2026"
34
34
 
35
35
  gettext.install("duplicity", names=["ngettext"])
@@ -68,8 +68,8 @@ def dup_run():
68
68
  pass
69
69
  elif os.environ.get("CIBUILDWHEEL") is not None:
70
70
  pass
71
- elif not ((3, 10) <= sys.version_info[:2] <= (3, 14)):
72
- print("Sorry, duplicity requires Python version 3.10 thru 3.14.", file=sys.stderr)
71
+ elif not ((3, 10) <= sys.version_info[:2] <= (3, 15)):
72
+ print("Sorry, duplicity requires Python version 3.10 thru 3.15.", file=sys.stderr)
73
73
  sys.exit(1)
74
74
 
75
75
  try:
@@ -366,10 +366,45 @@ class ParsedUrl(object):
366
366
 
367
367
  def strip_auth_from_url(parsed_url):
368
368
  """
369
- Return a URL from a urlparse object without a username or password.
369
+ Return a URL from a urlparse object or string without username, password, or sensitive query parameters.
370
370
  """
371
+ url_string = parsed_url.geturl() if hasattr(parsed_url, "geturl") else str(parsed_url)
372
+ clean_url = re.sub(r"^([^:/]+://)(.*@)?(.*)", r"\1\3", url_string)
373
+
374
+ if "?" in clean_url:
375
+ try:
376
+ parts = urllib.parse.urlsplit(clean_url)
377
+ if parts.query:
378
+ query_tuples = urllib.parse.parse_qsl(parts.query, keep_blank_values=True)
379
+ sanitized_query = []
380
+ sensitive_keys = {
381
+ "key",
382
+ "token",
383
+ "secret",
384
+ "password",
385
+ "pass",
386
+ "passwd",
387
+ "signature",
388
+ "api_key",
389
+ "apikey",
390
+ "auth",
391
+ "auth_token",
392
+ "access_token",
393
+ "secret_key",
394
+ }
395
+ for k, v in query_tuples:
396
+ k_lower = k.lower()
397
+ if k_lower in sensitive_keys or any(
398
+ s in k_lower for s in ("secret", "token", "password", "passwd", "sig")
399
+ ):
400
+ sanitized_query.append((k, "REDACTED"))
401
+ else:
402
+ sanitized_query.append((k, v))
403
+ new_query = urllib.parse.urlencode(sanitized_query)
404
+ clean_url = urllib.parse.urlunsplit((parts.scheme, parts.netloc, parts.path, new_query, parts.fragment))
405
+ except Exception:
406
+ pass
371
407
 
372
- clean_url = re.sub("^([^:/]+://)(.*@)?(.*)", r"\1\3", parsed_url.geturl())
373
408
  return clean_url
374
409
 
375
410
 
@@ -65,7 +65,7 @@ class TrackRecord:
65
65
  ) # trace backs can't be pickled, store as string, to get it over into main process
66
66
  result: object = None # must be picklable
67
67
  log_prefix: str = ""
68
- start_time: datetime = field(default=datetime.now())
68
+ start_time: datetime = field(default_factory=datetime.now)
69
69
  stop_time: datetime = field(default=datetime.min)
70
70
 
71
71
  def __post_init__(self):
@@ -277,7 +277,7 @@ class BackendPool:
277
277
  end = len(self.all_results)
278
278
  for result in self.all_results[self._last_results_reported : end]:
279
279
  yield result
280
- self._last_results_reported = end
280
+ self._last_results_reported += 1
281
281
 
282
282
  def get_stats(self, last_index=None):
283
283
  """
@@ -323,10 +323,7 @@ class BackendPool:
323
323
  :param bool cancel_futures: Whether to cancel any pending futures.
324
324
  """
325
325
  log.Debug("Process Pool: Start shutdown.")
326
- if sys.version_info >= (3, 9):
327
- self.ppe.shutdown(wait=wait, cancel_futures=cancel_futures)
328
- else:
329
- self.ppe.shutdown(wait=wait)
326
+ self.ppe.shutdown(wait=wait, cancel_futures=cancel_futures)
330
327
  log.Debug("Process Pool: Shutdown done.")
331
328
 
332
329
 
@@ -59,6 +59,7 @@ class CloudFilesBackend(duplicity.backend.Backend):
59
59
  Exception: {str(e)}""")
60
60
 
61
61
  self.resp_exc = ResponseError
62
+ self.nso_exc = NoSuchObject
62
63
  conn_kwargs = {}
63
64
 
64
65
  if "CLOUDFILES_USERNAME" not in os.environ:
@@ -87,7 +88,7 @@ Exception: {str(e)}""")
87
88
  self.container = conn.create_container(container)
88
89
 
89
90
  def _error_code(self, operation, e): # pylint: disable=unused-argument
90
- if isinstance(e, NoSuchObject):
91
+ if isinstance(e, self.nso_exc):
91
92
  return log.ErrorCode.backend_not_found
92
93
  elif isinstance(e, self.resp_exc):
93
94
  if e.status == 404:
@@ -37,7 +37,8 @@ from duplicity import progress
37
37
  from duplicity.errors import BackendException
38
38
  from duplicity.errors import FatalBackendException
39
39
 
40
- global DownloadDestLocalFile, FileVersionInfoFactory
40
+ DownloadDestLocalFile = None
41
+ FileVersionInfoFactory = None
41
42
 
42
43
 
43
44
  class B2ProgressListener(object):
@@ -25,6 +25,7 @@ Box backend.
25
25
  import os
26
26
 
27
27
  import duplicity.backend
28
+ from duplicity import log
28
29
  from duplicity.errors import BackendException
29
30
 
30
31
 
@@ -97,8 +98,14 @@ class BoxBackend(duplicity.backend.Backend):
97
98
  """
98
99
  Deletes file from the specified remote path
99
100
  """
100
-
101
- self.delete(remote_file=filename.decode())
101
+ try:
102
+ self.delete(remote_file=filename.decode())
103
+ except Exception as e:
104
+ code = self._error_code("delete", e)
105
+ if code == log.ErrorCode.backend_not_found:
106
+ log.Debug(f"BoxBackend._delete: file {filename.decode()} not found, already deleted")
107
+ return
108
+ raise
102
109
 
103
110
  def _query_list(self, filename_list):
104
111
  """
@@ -106,6 +113,17 @@ class BoxBackend(duplicity.backend.Backend):
106
113
  """
107
114
  return {filename: self._file_to_metadata_map.get(filename.decode(), {"size": -1}) for filename in filename_list}
108
115
 
116
+ def _error_code(self, operation, e):
117
+ if getattr(e, "code", None) == log.ErrorCode.backend_not_found:
118
+ return log.ErrorCode.backend_not_found
119
+ if getattr(e, "status", None) == 404:
120
+ return log.ErrorCode.backend_not_found
121
+ if getattr(e, "code", None) in (404, "not_found"):
122
+ return log.ErrorCode.backend_not_found
123
+ if "not found" in str(e).lower() or "does not exist" in str(e).lower():
124
+ return log.ErrorCode.backend_not_found
125
+ return log.ErrorCode.backend_error
126
+
109
127
  def get_id_from_path(self, remote_path, parent_id="0"):
110
128
  """
111
129
  Get the folder or file id from its path
@@ -142,6 +160,8 @@ class BoxBackend(duplicity.backend.Backend):
142
160
  return file["id"]
143
161
 
144
162
  file_id = self.get_id_from_path(remote_filename, parent_id=self._folder_id)
163
+ if file_id is None:
164
+ return None
145
165
  file = self._client.file(file_id).get()
146
166
  self._file_to_metadata_map[file.name] = {
147
167
  "id": file.id,
@@ -210,6 +230,8 @@ class BoxBackend(duplicity.backend.Backend):
210
230
  Download file in box folder
211
231
  """
212
232
  file_id = self.get_file_id_from_filename(remote_file)
233
+ if file_id is None:
234
+ raise BackendException(f"File {remote_file} not found.", code=log.ErrorCode.backend_not_found)
213
235
  with open(local_file, "wb") as fp:
214
236
  self._client.file(file_id).download_to(fp)
215
237
 
@@ -218,7 +240,20 @@ class BoxBackend(duplicity.backend.Backend):
218
240
  Delete file in box folder
219
241
  """
220
242
  file_id = self.get_file_id_from_filename(remote_file)
221
- self._client.file(file_id).delete()
243
+ if file_id is None:
244
+ self._file_to_metadata_map.pop(remote_file, None)
245
+ log.Debug(f"BoxBackend.delete: file {remote_file} not found, already deleted")
246
+ return
247
+ try:
248
+ self._client.file(file_id).delete()
249
+ except Exception as e:
250
+ code = self._error_code("delete", e)
251
+ if code == log.ErrorCode.backend_not_found:
252
+ log.Debug(f"BoxBackend.delete: file {remote_file} not found, already deleted")
253
+ return
254
+ raise
255
+ finally:
256
+ self._file_to_metadata_map.pop(remote_file, None)
222
257
 
223
258
 
224
259
  duplicity.backend.register_backend("box", BoxBackend)
@@ -493,8 +493,7 @@ class IDriveBackend(duplicity.backend.Backend):
493
493
  # For each filename in list: take-out size (index 1) for requested filename (index -1)
494
494
  info = {}
495
495
  for filename in filename_list:
496
- if filtered:
497
- result = [x[1] for x in filtered if x[-1] == filename.decode("utf-8")]
496
+ result = [x[1] for x in filtered if x[-1] == filename.decode("utf-8")] if filtered else []
498
497
  if result:
499
498
  info[filename] = {"size": int(result[0])}
500
499
  else:
@@ -47,6 +47,7 @@ import ssl
47
47
  socket.sslerror = ssl.SSLError
48
48
 
49
49
  from duplicity import config
50
+ from duplicity import log
50
51
  from duplicity.errors import BackendException
51
52
  import duplicity.backend
52
53
 
@@ -33,6 +33,8 @@ import duplicity.backend
33
33
  from duplicity import log
34
34
  from duplicity.errors import BackendException
35
35
 
36
+ global JFSNotFoundError
37
+
36
38
 
37
39
  def get_jotta_device(jfs):
38
40
  jottadev = None
@@ -87,6 +89,7 @@ class JottaCloudBackend(duplicity.backend.Backend):
87
89
 
88
90
  # Import JottaCloud libraries.
89
91
  try:
92
+ global JFSNotFoundError
90
93
  from jottalib import JFS
91
94
  from jottalib.JFS import JFSNotFoundError
92
95
  from jottalib.JFS import JFSIncompleteFile
@@ -25,6 +25,7 @@ Mediafire backend.
25
25
  import os
26
26
 
27
27
  import duplicity.backend
28
+ from duplicity import config
28
29
  from duplicity.errors import BackendException
29
30
 
30
31
  DUPLICITY_APP_ID = "45593"
@@ -197,25 +197,48 @@ class OneDriveBackend(duplicity.backend.Backend):
197
197
 
198
198
  def _delete(self, remote_filename):
199
199
  remote_filename = remote_filename.decode("UTF-8")
200
- response = self.http_client.delete(
201
- self.API_URI + self.directory_onedrive_path + remote_filename,
202
- timeout=config.timeout,
203
- )
204
- if response.status_code == 404:
205
- raise BackendException(f'File "{remote_filename}" cannot be deleted: it does not exist')
206
- response.raise_for_status()
200
+ try:
201
+ response = self.http_client.delete(
202
+ self.API_URI + self.directory_onedrive_path + remote_filename,
203
+ timeout=config.timeout,
204
+ )
205
+ if response.status_code == 404:
206
+ log.Debug(f"OneDriveBackend._delete: file {remote_filename} not found, already deleted")
207
+ return
208
+ response.raise_for_status()
209
+ except Exception as e:
210
+ code = self._error_code("delete", e)
211
+ if code == log.ErrorCode.backend_not_found:
212
+ log.Debug(f"OneDriveBackend._delete: file {remote_filename} not found, already deleted")
213
+ return
214
+ raise
207
215
 
208
216
  def _query(self, remote_filename):
209
217
  remote_filename = remote_filename.decode("UTF-8")
210
- response = self.http_client.get(
211
- self.API_URI + self.directory_onedrive_path + remote_filename,
212
- timeout=config.timeout,
213
- )
214
- if response.status_code != 200:
215
- return {"size": -1}
216
- if "size" not in response.json():
217
- raise BackendException(f'Malformed JSON: expected "size" member in {response.json()}')
218
- return {"size": response.json()["size"]}
218
+ try:
219
+ response = self.http_client.get(
220
+ self.API_URI + self.directory_onedrive_path + remote_filename,
221
+ timeout=config.timeout,
222
+ )
223
+ if response.status_code == 404 or response.status_code != 200:
224
+ return {"size": -1}
225
+ if "size" not in response.json():
226
+ raise BackendException(f'Malformed JSON: expected "size" member in {response.json()}')
227
+ return {"size": response.json()["size"]}
228
+ except Exception as e:
229
+ code = self._error_code("query", e)
230
+ if code == log.ErrorCode.backend_not_found:
231
+ return {"size": -1}
232
+ raise
233
+
234
+ def _error_code(self, operation, e):
235
+ if getattr(e, "code", None) == log.ErrorCode.backend_not_found:
236
+ return log.ErrorCode.backend_not_found
237
+ if hasattr(e, "response") and getattr(e.response, "status_code", None) == 404:
238
+ return log.ErrorCode.backend_not_found
239
+ if "not found" in str(e).lower() or "does not exist" in str(e).lower():
240
+ return log.ErrorCode.backend_not_found
241
+ return log.ErrorCode.backend_error
219
242
 
220
243
  def _retry_cleanup(self):
221
244
  self.initialize_oauth2_session()
@@ -17,6 +17,8 @@ import requests
17
17
  from requests.compat import quote
18
18
  from requests.compat import quote_plus
19
19
 
20
+ from duplicity.errors import BackendException
21
+
20
22
  try:
21
23
  import pyrax
22
24
  from pyrax.base_identity import BaseIdentity
@@ -487,17 +487,37 @@ Connect to remote store using WebDAV Protocol
487
487
  if response.status in [200, 204]:
488
488
  response.read()
489
489
  response.close()
490
+ elif response.status == 404:
491
+ response.read()
492
+ response.close()
493
+ log.Debug(f"WebDAVBackend._delete: file {os.fsdecode(filename)} not found, already deleted")
494
+ return
490
495
  else:
491
496
  status = response.status
492
497
  reason = response.reason
493
498
  response.close()
494
499
  raise BackendException(_("WebDAV DEL Bad status code %s reason %s.") % (status, reason))
495
500
  except Exception as e:
501
+ code = self._error_code("delete", e)
502
+ if code == log.ErrorCode.backend_not_found:
503
+ log.Debug(f"WebDAVBackend._delete: file {os.fsdecode(filename)} not found, already deleted")
504
+ return
496
505
  raise e
497
506
  finally:
498
507
  if response:
499
508
  response.close()
500
509
 
510
+ def _error_code(self, operation, e):
511
+ if getattr(e, "code", None) == log.ErrorCode.backend_not_found:
512
+ return log.ErrorCode.backend_not_found
513
+ if getattr(e, "status", None) == 404 or getattr(e, "code", None) == 404:
514
+ return log.ErrorCode.backend_not_found
515
+ if isinstance(e, BackendException) and "404" in str(e):
516
+ return log.ErrorCode.backend_not_found
517
+ if "not found" in str(e).lower() or "does not exist" in str(e).lower():
518
+ return log.ErrorCode.backend_not_found
519
+ return log.ErrorCode.backend_error
520
+
501
521
 
502
522
  duplicity.backend.register_backend("http", WebDAVBackend)
503
523
  duplicity.backend.register_backend("https", WebDAVBackend)
@@ -347,7 +347,7 @@ class XorrisoBackend(duplicity.backend.Backend):
347
347
 
348
348
  # The URL form "file:MyFile" is not a valid duplicity target.
349
349
  if not parsed_url.path.startswith("//"):
350
- raise InvalidBackendURl("Bad xorriso:// path syntax.")
350
+ raise InvalidBackendURL("Bad xorriso:// path syntax.")
351
351
 
352
352
  path = parsed_url.path[2:] # Strip '//'
353
353
 
@@ -429,6 +429,12 @@ OptionKwargs = dict(
429
429
  ),
430
430
  default=dflt(config.gpg_options),
431
431
  ),
432
+ ignore_mdc_error=dict(
433
+ action="store_true",
434
+ dest="ignore_mdc_error",
435
+ help="Insecure option to ignore MDC (Modification Detection Code) errors during decryption.",
436
+ default=dflt(config.ignore_mdc_error),
437
+ ),
432
438
  use_gpgsm=dict(
433
439
  action="store_true",
434
440
  dest="use_gpgsm",
@@ -27,6 +27,7 @@ import inspect
27
27
  import os
28
28
  import pydoc
29
29
  import sys
30
+ import warnings
30
31
  from textwrap import dedent
31
32
 
32
33
  # TODO: Remove duplicity.argparse311 when py310 xgoes EOL
@@ -274,7 +275,7 @@ def parse_cmdline_options(arglist):
274
275
  if opt.startswith("-"):
275
276
  if opt in changed_options:
276
277
  command_line_error(dedent(f"""\
277
- Option '{opt} was changed in 2.0.0.
278
+ Option '{opt}' was changed in 2.0.0.
278
279
  --file-to-restore to --path-to-restore
279
280
  --do-not-restore-ownership to --no-restore-ownership
280
281
  """))