duplicity 3.2.1.dev0__tar.gz → 3.2.1.dev3__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 (200) hide show
  1. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/CHANGELOG.md +98 -1
  2. duplicity-3.2.1.dev3/PKG-INFO +100 -0
  3. duplicity-3.2.1.dev3/README-ARCH.md +62 -0
  4. duplicity-3.2.1.dev3/README-INSTALL.md +158 -0
  5. duplicity-3.2.1.dev3/README-LOG.md +33 -0
  6. duplicity-3.2.1.dev3/README-RELEASE.md +66 -0
  7. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/README-REPO.md +1 -1
  8. duplicity-3.2.1.dev3/README-SNAP.md +90 -0
  9. duplicity-3.2.1.dev3/README-TESTING.md +37 -0
  10. duplicity-3.2.1.dev3/README.md +47 -0
  11. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/__init__.py +10 -2
  12. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/__main__.py +11 -6
  13. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/_librsync_ctypes.py +91 -4
  14. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/argparse311.py +3 -1
  15. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backend.py +145 -45
  16. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backend_pool.py +65 -20
  17. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/__init__.py +6 -3
  18. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/_cf_cloudfiles.py +23 -0
  19. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/_cf_pyrax.py +23 -0
  20. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/_testbackend.py +10 -0
  21. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/adbackend.py +49 -13
  22. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/azurebackend.py +17 -3
  23. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/b2backend.py +55 -15
  24. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/boxbackend.py +41 -11
  25. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/cfbackend.py +4 -0
  26. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/dpbxbackend.py +35 -3
  27. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/gdocsbackend.py +14 -2
  28. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/gdrivebackend.py +29 -1
  29. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/giobackend.py +15 -0
  30. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/hsibackend.py +15 -0
  31. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/hubicbackend.py +15 -0
  32. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/idrivedbackend.py +9 -0
  33. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/imapbackend.py +20 -1
  34. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/jottacloudbackend.py +36 -4
  35. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/lftpbackend.py +22 -1
  36. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/localbackend.py +53 -0
  37. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/mediafirebackend.py +38 -8
  38. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/megabackend.py +35 -9
  39. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/megav2backend.py +38 -10
  40. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/megav3backend.py +44 -12
  41. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/multibackend.py +24 -1
  42. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/ncftpbackend.py +24 -1
  43. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/onedrivebackend.py +20 -4
  44. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/par2backend.py +40 -7
  45. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/pcabackend.py +9 -0
  46. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/pydrivebackend.py +17 -3
  47. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/pyrax_identity/__init__.py +4 -0
  48. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/pyrax_identity/hubic.py +19 -1
  49. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/rclonebackend.py +33 -0
  50. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/rsyncbackend.py +46 -2
  51. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/s3_boto3_backend.py +51 -0
  52. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/slatebackend.py +10 -0
  53. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/ssh_paramiko_backend.py +64 -3
  54. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/ssh_pexpect_backend.py +23 -5
  55. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/swiftbackend.py +27 -0
  56. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/sxbackend.py +18 -1
  57. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/tahoebackend.py +9 -0
  58. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/webdavbackend.py +29 -5
  59. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/backends/xorrisobackend.py +16 -0
  60. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/cached_ops.py +27 -1
  61. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/cli_data.py +224 -40
  62. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/cli_main.py +128 -25
  63. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/cli_util.py +199 -14
  64. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/config.py +19 -9
  65. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/diffdir.py +39 -5
  66. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/dup_collections.py +43 -36
  67. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/dup_main.py +189 -206
  68. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/dup_tarfile.py +3 -1
  69. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/dup_temp.py +21 -7
  70. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/dup_time.py +62 -15
  71. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/errors.py +22 -0
  72. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/file_naming.py +38 -8
  73. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/globmatch.py +39 -37
  74. duplicity-3.2.1.dev3/duplicity/gpg.py +627 -0
  75. duplicity-3.2.1.dev3/duplicity/gpginterface.py +702 -0
  76. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/lazy.py +91 -31
  77. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/librsync.py +61 -23
  78. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/log.py +51 -4
  79. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/manifest.py +66 -37
  80. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/patchdir.py +93 -26
  81. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/path.py +196 -62
  82. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/progress.py +18 -8
  83. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/robust.py +15 -4
  84. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/selection.py +107 -139
  85. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/statistics.py +100 -42
  86. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/tempdir.py +42 -32
  87. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/util.py +88 -17
  88. duplicity-3.2.1.dev3/duplicity.egg-info/PKG-INFO +100 -0
  89. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity.egg-info/SOURCES.txt +55 -1
  90. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity.egg-info/requires.txt +0 -2
  91. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/man/duplicity.1 +25 -1
  92. duplicity-3.2.1.dev3/po/af_ZA/af_ZA.po +1656 -0
  93. duplicity-3.2.1.dev3/po/ar_SA/ar_SA.po +1696 -0
  94. duplicity-3.2.1.dev3/po/ca_ES/ca_ES.po +1656 -0
  95. duplicity-3.2.1.dev3/po/cs_CZ/cs_CZ.po +1688 -0
  96. duplicity-3.2.1.dev3/po/da_DK/da_DK.po +1693 -0
  97. duplicity-3.2.1.dev3/po/de_AT/de_AT.po +1693 -0
  98. duplicity-3.2.1.dev3/po/de_DE/de_DE.po +1693 -0
  99. duplicity-3.2.1.dev3/po/el_GR/el_GR.po +1681 -0
  100. duplicity-3.2.1.dev3/po/en_AU/en_AU.po +1656 -0
  101. duplicity-3.2.1.dev3/po/en_GB/en_GB.po +1663 -0
  102. duplicity-3.2.1.dev3/po/en_PR/en_PR.po +1656 -0
  103. duplicity-3.2.1.dev3/po/en_US/en_US.po +1656 -0
  104. duplicity-3.2.1.dev3/po/es_EM/es_EM.po +1693 -0
  105. duplicity-3.2.1.dev3/po/es_ES/es_ES.po +1693 -0
  106. duplicity-3.2.1.dev3/po/es_MX/es_MX.po +1693 -0
  107. duplicity-3.2.1.dev3/po/es_PR/es_PR.po +1693 -0
  108. duplicity-3.2.1.dev3/po/es_US/es_US.po +1693 -0
  109. duplicity-3.2.1.dev3/po/fi_FI/fi_FI.po +1693 -0
  110. duplicity-3.2.1.dev3/po/fr_FR/fr_FR.po +1690 -0
  111. duplicity-3.2.1.dev3/po/he_IL/he_IL.po +1660 -0
  112. duplicity-3.2.1.dev3/po/hu_HU/hu_HU.po +1673 -0
  113. duplicity-3.2.1.dev3/po/it_IT/it_IT.po +1693 -0
  114. duplicity-3.2.1.dev3/po/ja_JP/ja_JP.po +1671 -0
  115. duplicity-3.2.1.dev3/po/ka_GE/ka_GE.po +1656 -0
  116. duplicity-3.2.1.dev3/po/ko_KR/ko_KR.po +1654 -0
  117. duplicity-3.2.1.dev3/po/nl_BE/nl_BE.po +1693 -0
  118. duplicity-3.2.1.dev3/po/nl_NL/nl_NL.po +1693 -0
  119. duplicity-3.2.1.dev3/po/nl_SR/nl_SR.po +1693 -0
  120. duplicity-3.2.1.dev3/po/no_NO/no_NO.po +1686 -0
  121. duplicity-3.2.1.dev3/po/pl_PL/pl_PL.po +1696 -0
  122. duplicity-3.2.1.dev3/po/pt_BR/pt_BR.po +1692 -0
  123. duplicity-3.2.1.dev3/po/pt_PT/pt_PT.po +1691 -0
  124. duplicity-3.2.1.dev3/po/ro_RO/ro_RO.po +1694 -0
  125. duplicity-3.2.1.dev3/po/ru_BY/ru_BY.po +1696 -0
  126. duplicity-3.2.1.dev3/po/ru_MD/ru_MD.po +1696 -0
  127. duplicity-3.2.1.dev3/po/ru_RU/ru_RU.po +1696 -0
  128. duplicity-3.2.1.dev3/po/ru_UA/ru_UA.po +1696 -0
  129. duplicity-3.2.1.dev3/po/sr_SP/sr_SP.po +1658 -0
  130. duplicity-3.2.1.dev3/po/sv_SE/sv_SE.po +1693 -0
  131. duplicity-3.2.1.dev3/po/tr_TR/tr_TR.po +1656 -0
  132. duplicity-3.2.1.dev3/po/uk_UA/uk_UA.po +1677 -0
  133. duplicity-3.2.1.dev3/po/vi_VN/vi_VN.po +1654 -0
  134. duplicity-3.2.1.dev3/po/zh_CN/zh_CN.po +1688 -0
  135. duplicity-3.2.1.dev3/po/zh_HK/zh_HK.po +1654 -0
  136. duplicity-3.2.1.dev3/po/zh_MO/zh_MO.po +1654 -0
  137. duplicity-3.2.1.dev3/po/zh_SG/zh_SG.po +1688 -0
  138. duplicity-3.2.1.dev3/po/zh_TW/zh_TW.po +1654 -0
  139. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/pyproject.toml +23 -9
  140. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/requirements.txt +1 -3
  141. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/setup.py +91 -9
  142. duplicity-3.2.1.dev0/PKG-INFO +0 -241
  143. duplicity-3.2.1.dev0/README.md +0 -186
  144. duplicity-3.2.1.dev0/duplicity/gpg.py +0 -587
  145. duplicity-3.2.1.dev0/duplicity.egg-info/PKG-INFO +0 -241
  146. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/AUTHORS.md +0 -0
  147. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/COPYING +0 -0
  148. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity/_librsyncmodule.c +0 -0
  149. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity.egg-info/dependency_links.txt +0 -0
  150. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity.egg-info/entry_points.txt +0 -0
  151. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/duplicity.egg-info/top_level.txt +0 -0
  152. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/af_ZA.po +0 -0
  153. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ar_SA.po +0 -0
  154. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ca_ES.po +0 -0
  155. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/cs_CZ.po +0 -0
  156. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/da_DK.po +0 -0
  157. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/de_AT.po +0 -0
  158. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/de_DE.po +0 -0
  159. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/duplicity.pot +0 -0
  160. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/el_GR.po +0 -0
  161. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/en_AU.po +0 -0
  162. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/en_GB.po +0 -0
  163. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/en_PR.po +0 -0
  164. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/en_US.po +0 -0
  165. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/es_EM.po +0 -0
  166. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/es_ES.po +0 -0
  167. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/es_MX.po +0 -0
  168. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/es_PR.po +0 -0
  169. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/es_US.po +0 -0
  170. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/fi_FI.po +0 -0
  171. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/fr_FR.po +0 -0
  172. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/he_IL.po +0 -0
  173. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/hu_HU.po +0 -0
  174. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/it_IT.po +0 -0
  175. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ja_JP.po +0 -0
  176. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ka_GE.po +0 -0
  177. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ko_KR.po +0 -0
  178. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/nl_BE.po +0 -0
  179. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/nl_NL.po +0 -0
  180. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/nl_SR.po +0 -0
  181. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/no_NO.po +0 -0
  182. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/pl_PL.po +0 -0
  183. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/pt_BR.po +0 -0
  184. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/pt_PT.po +0 -0
  185. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ro_RO.po +0 -0
  186. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ru_BY.po +0 -0
  187. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ru_MD.po +0 -0
  188. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ru_RU.po +0 -0
  189. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/ru_UA.po +0 -0
  190. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/sr_SP.po +0 -0
  191. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/sv_SE.po +0 -0
  192. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/tr_TR.po +0 -0
  193. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/uk_UA.po +0 -0
  194. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/vi_VN.po +0 -0
  195. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/zh_CN.po +0 -0
  196. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/zh_HK.po +0 -0
  197. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/zh_MO.po +0 -0
  198. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/zh_SG.po +0 -0
  199. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/po/zh_TW.po +0 -0
  200. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev3}/setup.cfg +0 -0
@@ -1,9 +1,102 @@
1
1
 
2
- (Unreleased) / 2026-08-10
2
+ (Unreleased) / 2026-09-23
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
+ ===========================
13
+
14
+ * [`d7da150b`](https://gitlab.com/duplicity/duplicity/-/commit/d7da150b):new: Create subpath in rsyncd.
15
+ * [`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
+ * [`58a54680`](https://gitlab.com/duplicity/duplicity/-/commit/58a54680):chg: Add regex cache invalidation for file prefix changes; update tests
17
+ * [`fcd6920a`](https://gitlab.com/duplicity/duplicity/-/commit/fcd6920a):chg: Add deprecation warnings for CloudFiles, Pyrax, and Hubic backends
18
+ * [`1842e4de`](https://gitlab.com/duplicity/duplicity/-/commit/1842e4de):chg: Remove `python3-gnupg` and restore `gpginterface` module and unit tests.
19
+ * [`a201453e`](https://gitlab.com/duplicity/duplicity/-/commit/a201453e):chg: Plan to remove obsolete Pyrax, CloudFiles, and Hubic backends; standardize on python-swiftclient
20
+ * [`abdf9a0e`](https://gitlab.com/duplicity/duplicity/-/commit/abdf9a0e):chg: Remove unused gnupg import from gpg.py for cleanup.
21
+ * [`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
+ * [`993cc651`](https://gitlab.com/duplicity/duplicity/-/commit/993cc651):chg: Decouple selection parsing from core engine and refactor tests
23
+ * [`1af57ea4`](https://gitlab.com/duplicity/duplicity/-/commit/1af57ea4):chg: Add support and tests for new CLI options
24
+ * [`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
+ * [`855c6f1c`](https://gitlab.com/duplicity/duplicity/-/commit/855c6f1c):chg: Remove outdated comment for `python3-gnupg` in `debian/control`
34
+ * [`22fae925`](https://gitlab.com/duplicity/duplicity/-/commit/22fae925):chg: Sync README files in `setup.py` and clean up verbosity flags
35
+ * [`978355b4`](https://gitlab.com/duplicity/duplicity/-/commit/978355b4):chg: Enable verbose mode in debian/rules
36
+ * [`626cdccb`](https://gitlab.com/duplicity/duplicity/-/commit/626cdccb):chg: Remove redundant `apt` commands in `debian/rules`
37
+ * [`ba71d094`](https://gitlab.com/duplicity/duplicity/-/commit/ba71d094):chg: Update setuptools to >=61.0.0 in dev dependencies and `debian/rules`
38
+ * [`2b55864a`](https://gitlab.com/duplicity/duplicity/-/commit/2b55864a):chg: Simplify `gnupg` import logic in `gpg.py`
39
+ * [`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
+ * [`df52d45b`](https://gitlab.com/duplicity/duplicity/-/commit/df52d45b):chg: Add `python3-gnupg` as a build dependency in `debian/control`
45
+ * [`057c7d0a`](https://gitlab.com/duplicity/duplicity/-/commit/057c7d0a):chg: Update doc cleanup pattern in `debian/rules`
46
+ * [`4eaee861`](https://gitlab.com/duplicity/duplicity/-/commit/4eaee861):chg: Update doc cleanup to remove `duplicity-*` files in `debian/rules`
47
+ * [`7cd8ddb6`](https://gitlab.com/duplicity/duplicity/-/commit/7cd8ddb6):chg: Add `get_data_files` for dynamic data file handling in `setup.py`
48
+ * [`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
+ * [`4bc93712`](https://gitlab.com/duplicity/duplicity/-/commit/4bc93712):chg: Update dependencies, streamline configs, and refine CI
58
+ * [`ca78d6c5`](https://gitlab.com/duplicity/duplicity/-/commit/ca78d6c5):chg: Update release-prep script to use `check_tags`
59
+ * [`60ae51f3`](https://gitlab.com/duplicity/duplicity/-/commit/60ae51f3):chg: Update release-prep script to fix tag removal and file refs
60
+ * [`45495e09`](https://gitlab.com/duplicity/duplicity/-/commit/45495e09):chg: Update pipeline triggers for push, web, and merge request events
61
+ * [`f8fc71e3`](https://gitlab.com/duplicity/duplicity/-/commit/f8fc71e3):chg: Improve process in `setup.py` and release prep script
62
+ * [`f36c9922`](https://gitlab.com/duplicity/duplicity/-/commit/f36c9922):chg: Refactor versioning and metadata handling
63
+ * [`84afa6f2`](https://gitlab.com/duplicity/duplicity/-/commit/84afa6f2):chg: Refactor string concatenations to f-strings across codebase
64
+ * [`480cbc23`](https://gitlab.com/duplicity/duplicity/-/commit/480cbc23):chg: Clean up and refactor `pyproject.toml` and `Makefile`
65
+ * [`42d4838d`](https://gitlab.com/duplicity/duplicity/-/commit/42d4838d):chg: Rewrite `makechangelog` script in Python
66
+ * [`1dee9e31`](https://gitlab.com/duplicity/duplicity/-/commit/1dee9e31):chg: b2backend prefer b2sdk.v3
67
+ * [`4f4e052e`](https://gitlab.com/duplicity/duplicity/-/commit/4f4e052e):chg: Cleanup some minor issues
68
+ * [`1e0a97dc`](https://gitlab.com/duplicity/duplicity/-/commit/1e0a97dc):chg: Format with Black/PEP8 and ensure file flush before rename
69
+ * [`06858c9a`](https://gitlab.com/duplicity/duplicity/-/commit/06858c9a):fix: Replace `os.system` calls with safer Python alternatives.
70
+ * [`da745307`](https://gitlab.com/duplicity/duplicity/-/commit/da745307):fix: Add --ignore-installed flag for pip in Dockerfiles
71
+ * [`883cca1e`](https://gitlab.com/duplicity/duplicity/-/commit/883cca1e):fix: restore issue: AssertionError: (b'keys', [...]) not empty
72
+ * [`aa0b23e7`](https://gitlab.com/duplicity/duplicity/-/commit/aa0b23e7):fix: Replace `log.FatalError` with `raise errors.FatalError`.
73
+ * [`c3a45713`](https://gitlab.com/duplicity/duplicity/-/commit/c3a45713):fix: Add support for "sync" action and handle passphrase checks.
74
+ * [`db99858e`](https://gitlab.com/duplicity/duplicity/-/commit/db99858e):fix: Enhance error handling and debug logging in Python modules
75
+ * [`dbb899ad`](https://gitlab.com/duplicity/duplicity/-/commit/dbb899ad):fix: Use 'python-gnupg' instead of our 'gpginterface.py'.
76
+ * [`4d6e9f8c`](https://gitlab.com/duplicity/duplicity/-/commit/4d6e9f8c):fix: PCABackend GET URL needs prefix if one is defined
77
+ * [`d7cd05d8`](https://gitlab.com/duplicity/duplicity/-/commit/d7cd05d8):fix: Could not release lockfile
78
+ * [`fcbe3a7a`](https://gitlab.com/duplicity/duplicity/-/commit/fcbe3a7a):fix: Enforce --force requirement for destructive operations
79
+ * [`c6c8b26a`](https://gitlab.com/duplicity/duplicity/-/commit/c6c8b26a):fix: Enhance BackupSet.delete signature cleanup and fix lock release
80
+ * [`3f0ab55b`](https://gitlab.com/duplicity/duplicity/-/commit/3f0ab55b):fix: Prevent premature deletion of full backups during incremental starts
81
+ * [`9819e4d4`](https://gitlab.com/duplicity/duplicity/-/commit/9819e4d4):fix: Add get_last_continuous_volume for reliable backup resumption
82
+ * [`5d737d07`](https://gitlab.com/duplicity/duplicity/-/commit/5d737d07):fix: Postpone metadata promotion to prevent orphaned cache files
83
+
84
+ rel.3.2.0.2 / 2026-08-22
85
+ ========================
86
+
87
+ * [`f7ccc81b`](https://gitlab.com/duplicity/duplicity/-/commit/f7ccc81b):chg: Update Python3 version and dependencies in `debian/control`
88
+
89
+ rel.3.2.0.1 / 2026-08-15
90
+ ========================
91
+
92
+ * [`3865b348`](https://gitlab.com/duplicity/duplicity/-/commit/3865b348):chg: Add `python3-gnupg` as a build dependency in `debian/control`
93
+ * [`efefc8b2`](https://gitlab.com/duplicity/duplicity/-/commit/efefc8b2):chg: Update doc cleanup pattern in `debian/rules`
94
+ * [`955713e7`](https://gitlab.com/duplicity/duplicity/-/commit/955713e7):chg: Update doc cleanup to remove `duplicity-*` files in `debian/rules`
95
+ * [`e8c0bc1a`](https://gitlab.com/duplicity/duplicity/-/commit/e8c0bc1a):chg: Add `get_data_files` for dynamic data file handling in `setup.py`
96
+ * [`137ae81d`](https://gitlab.com/duplicity/duplicity/-/commit/137ae81d):chg: Simplify doc handling by removing outdated duplicity docs
97
+ * [`f0fb534c`](https://gitlab.com/duplicity/duplicity/-/commit/f0fb534c):chg: Update dependencies, streamline configs, and refine CI
98
+ * [`6d719e1c`](https://gitlab.com/duplicity/duplicity/-/commit/6d719e1c):fix: Resolve PEP8 style issues and whitespace in backend and main modules
99
+
7
100
  rel.3.2.0 / 2026-08-10
8
101
  ======================
9
102
 
@@ -37,6 +130,10 @@ rel.3.2.0 / 2026-08-10
37
130
  * [`c823ed36`](https://gitlab.com/duplicity/duplicity/-/commit/c823ed36):fix: Could not release lockfile
38
131
  * [`3d9eab94`](https://gitlab.com/duplicity/duplicity/-/commit/3d9eab94):fix: Comprehensive fix for backup, restart, and cleanup logic.
39
132
 
133
+ rel.3.1.1.dev0 / 2026-06-16
134
+ ===========================
135
+
136
+
40
137
  rel.3.1.0 / 2026-06-16
41
138
  ======================
42
139
 
@@ -0,0 +1,100 @@
1
+ Metadata-Version: 2.4
2
+ Name: duplicity
3
+ Version: 3.2.1.dev3
4
+ Summary: Encrypted backup using rsync algorithm
5
+ Author-email: Kenneth Loafman <kenneth@loafman.com>
6
+ Maintainer: Edgar Soldin, Thomas Laubrock
7
+ Project-URL: Homepage, http://duplicity.us
8
+ Project-URL: Download, https://gitlab.com/duplicity/duplicity/-/releases
9
+ Project-URL: Issues, https://gitlab.com/duplicity/duplicity/-/issues
10
+ Project-URL: Contact, https://lists.nongnu.org/mailman/listinfo/duplicity-talk
11
+ Project-URL: Documentation, http://duplicity.us
12
+ Project-URL: Repository, https://gitlab.com/duplicity/duplicity
13
+ Project-URL: Changelog, https://gitlab.com/duplicity/duplicity/-/blob/main/CHANGELOG.md
14
+ Classifier: Development Status :: 6 - Mature
15
+ Classifier: Environment :: Console
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: POSIX
18
+ Classifier: Programming Language :: C
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Programming Language :: Python :: 3.14
25
+ Classifier: Topic :: System :: Archiving :: Backup
26
+ Requires-Python: <3.15,>=3.10
27
+ Description-Content-Type: text/markdown
28
+ License-File: COPYING
29
+ License-File: AUTHORS.md
30
+ Requires-Dist: fasteners>=0.19
31
+ Requires-Dist: httplib2
32
+ Requires-Dist: pysocks
33
+ Requires-Dist: requests
34
+ Requires-Dist: requests-oauthlib
35
+ Requires-Dist: azure-storage-blob
36
+ Requires-Dist: b2sdk
37
+ Requires-Dist: boto3
38
+ Requires-Dist: botocore
39
+ Requires-Dist: boxsdk[jwt]
40
+ Requires-Dist: dropbox
41
+ Requires-Dist: gdata-python3
42
+ Requires-Dist: google-api-python-client
43
+ Requires-Dist: google-auth-oauthlib
44
+ Requires-Dist: jottalib
45
+ Requires-Dist: mediafire
46
+ Requires-Dist: megatools
47
+ Requires-Dist: paramiko
48
+ Requires-Dist: pexpect
49
+ Requires-Dist: pydrive2
50
+ Requires-Dist: pyrax
51
+ Requires-Dist: python-swiftclient
52
+ Dynamic: license-file
53
+
54
+ # Duplicity
55
+
56
+ Duplicity provides encrypted, bandwidth-efficient backups by producing encrypted tar-format volumes and uploading them to a remote or local file server. It uses the rsync algorithm for space-efficient incremental archives and GnuPG for security.
57
+
58
+ ## Key Features
59
+
60
+ - **Encrypted & Signed**: Backups are safe from spying and modification using GnuPG.
61
+ - **Bandwidth Efficient**: Only transmits changes since the last backup using the rsync algorithm.
62
+ - **Incremental Archives**: Saves space by storing only the parts of files that have changed.
63
+ - **Multiple Backends**: Supports a wide range of storage services (S3, Azure, B2, Google Drive, etc.) and protocols (SFTP, SCP, FTP, etc.).
64
+
65
+ ## Table of Contents
66
+
67
+ - [Installation](README-INSTALL.md)
68
+ - [Architecture](README-ARCH.md)
69
+ - [Repository Access](README-REPO.md)
70
+ - [Testing](README-TESTING.md)
71
+ - [Logging](README-LOG.md)
72
+ - [Release Process](README-RELEASE.md)
73
+ - [Snap Support](README-SNAP.md)
74
+ - [Development](#development)
75
+ - [Help](#help)
76
+
77
+ # DEVELOPMENT
78
+
79
+ For more information on downloading duplicity's source code from the
80
+ code repository and developing for duplicity, see [README-REPO](README-REPO.md).
81
+
82
+ For source docs: https://duplicity.readthedocs.io/
83
+
84
+ # HELP
85
+
86
+ For more information see the duplicity web site at:
87
+
88
+ https://duplicity.us
89
+
90
+ or at:
91
+
92
+ https://duplicity.gitlab.io
93
+
94
+ or post to the mailing list at:
95
+
96
+ https://lists.nongnu.org/mailman/listinfo/duplicity-talk
97
+
98
+ or post a new issue at:
99
+
100
+ https://gitlab.com/duplicity/duplicity/-/issues
@@ -0,0 +1,62 @@
1
+ # ARCHITECTURE
2
+
3
+ ```mermaid
4
+ graph TD
5
+ subgraph Interface
6
+ Main["__main__.py (Entry Point)"]
7
+ end
8
+
9
+ subgraph Orchestration
10
+ DupMain["dup_main.py (Orchestration)"]
11
+ end
12
+
13
+ subgraph Support_Config ["Support & Config"]
14
+ CLI["cli_main.py (Argument Parsing)"]
15
+ Config["config.py (Global Settings)"]
16
+ LogUtil["log.py / util.py (Logging/Support)"]
17
+ end
18
+
19
+ subgraph Core_Logic ["Core Logic"]
20
+ Selection["selection.py (File Selection)"]
21
+ Backend["backend.py (Storage Layer)"]
22
+ Errors["errors.py (Exception Mgmt)"]
23
+ end
24
+
25
+ subgraph Operation
26
+ DiffDir["diffdir.py (Backup Logic)"]
27
+ Backends["backends/ (Storage Drivers)"]
28
+ PatchDir["patchdir.py (Restore Logic)"]
29
+ end
30
+
31
+ subgraph Engines_Metadata ["Engines & Metadata"]
32
+ LibRsync["librsync.py (rsync delta)"]
33
+ GPG["gpg.py (Encryption)"]
34
+ Manifest["manifest.py (Metadata)"]
35
+ end
36
+
37
+ Main --> DupMain
38
+ DupMain --> CLI
39
+ DupMain --> Config
40
+ DupMain --> LogUtil
41
+
42
+ CLI --> Selection
43
+ Config --> Backend
44
+ LogUtil ~~~ Errors
45
+ Errors -.-> LogUtil
46
+
47
+ Selection --> DiffDir
48
+ Backend --> Backends
49
+
50
+ DiffDir --> Backends
51
+ PatchDir --> Backends
52
+
53
+ DiffDir --> LibRsync
54
+ DiffDir --> GPG
55
+ DiffDir --> Manifest
56
+
57
+ PatchDir --> LibRsync
58
+ PatchDir --> GPG
59
+ PatchDir --> Manifest
60
+
61
+ Backends --> GPG
62
+ ```
@@ -0,0 +1,158 @@
1
+ # INSTALLATION
2
+
3
+ Duplicity requires several system and Python dependencies. Choose one of the following methods to install them.
4
+
5
+ ## (1) Pipx Installation (Recommended)
6
+
7
+ This method is recommended for most users. It uses `pipx` to install duplicity into an isolated virtual environment, avoiding conflicts with system packages.
8
+
9
+ ### (1a) System Requirements
10
+ The following should be installed by `apt`, `yum`, etc., depending on your OS.
11
+ ```shell
12
+ sudo apt-get update
13
+ sudo apt-get install -y \
14
+ build-essential \
15
+ intltool \
16
+ lftp \
17
+ librsync-dev \
18
+ libffi-dev \
19
+ libssl-dev \
20
+ openssl \
21
+ megatools \
22
+ par2 \
23
+ python3-dev \
24
+ python3-lxml \
25
+ python3-cryptography \
26
+ python3-pip \
27
+ python3-venv \
28
+ python3 \
29
+ rclone \
30
+ rsync \
31
+ rdiff \
32
+ tzdata
33
+ ```
34
+
35
+ ### (1b) Install and Update Pipx
36
+ It is necessary to upgrade packaging tools to avoid installation failures.
37
+ ```shell
38
+ sudo python3 -m pip install --upgrade pip pipx
39
+ sudo pipx --global ensurepath # for all users
40
+ pipx ensurepath # for single user
41
+ ```
42
+
43
+ ### (1c) Uninstall Previous Versions
44
+ If you have an existing duplicity not installed by `pipx`, you must uninstall it first:
45
+ ```shell
46
+ which -a duplicity
47
+ # Use apt, yum, snap, or other command to remove existing instances.
48
+ ```
49
+
50
+ ### (1d) Install Duplicity
51
+ ```shell
52
+ # For all users
53
+ sudo pipx --global install duplicity
54
+
55
+ # For single user
56
+ pipx install duplicity
57
+ ```
58
+ *Note: Use `--suffix=version` to keep multiple versions (e.g., `duplicity-2.0`).*
59
+
60
+ ## (2) APT Only Installation (Production)
61
+
62
+ Use this method if you are on a Debian-based system and want to install all runtime dependencies via `apt`, avoiding `pip` entirely.
63
+
64
+ ```shell
65
+ sudo apt-get update
66
+ sudo apt-get install -y \
67
+ build-essential \
68
+ intltool \
69
+ lftp \
70
+ librsync-dev \
71
+ libffi-dev \
72
+ libssl-dev \
73
+ openssl \
74
+ megatools \
75
+ par2 \
76
+ python3-dev \
77
+ python3-lxml \
78
+ python3-pip \
79
+ python3-venv \
80
+ python3 \
81
+ rclone \
82
+ rsync \
83
+ rdiff \
84
+ tzdata \
85
+ python3-cryptography \
86
+ python3-fasteners \
87
+ python3-httplib2 \
88
+ python3-socks \
89
+ python3-requests \
90
+ python3-requests-oauthlib \
91
+ python3-azure-storage-blob \
92
+ python3-b2sdk \
93
+ python3-boto3 \
94
+ python3-botocore \
95
+ python3-dropbox \
96
+ python3-googleapi \
97
+ python3-google-auth-oauthlib \
98
+ python3-paramiko \
99
+ python3-pexpect \
100
+ python3-pydrive2 \
101
+ python3-swiftclient
102
+ ```
103
+
104
+ ## (3) APT Only Installation (Development)
105
+
106
+ Use this method for development or testing. It includes all runtime dependencies plus testing and documentation tools.
107
+
108
+ ```shell
109
+ sudo apt-get update
110
+ sudo apt-get install -y \
111
+ build-essential \
112
+ intltool \
113
+ lftp \
114
+ librsync-dev \
115
+ libffi-dev \
116
+ libssl-dev \
117
+ openssl \
118
+ megatools \
119
+ par2 \
120
+ python3-dev \
121
+ python3-lxml \
122
+ python3-pip \
123
+ python3-venv \
124
+ python3 \
125
+ rclone \
126
+ rsync \
127
+ rdiff \
128
+ tzdata \
129
+ python3-cryptography \
130
+ python3-fasteners \
131
+ python3-httplib2 \
132
+ python3-socks \
133
+ python3-requests \
134
+ python3-requests-oauthlib \
135
+ python3-azure-storage-blob \
136
+ python3-b2sdk \
137
+ python3-boto3 \
138
+ python3-botocore \
139
+ python3-dropbox \
140
+ python3-googleapi \
141
+ python3-google-auth-oauthlib \
142
+ python3-paramiko \
143
+ python3-pexpect \
144
+ python3-pydrive2 \
145
+ python3-swiftclient \
146
+ python3-setuptools \
147
+ python3-setuptools-gettext \
148
+ black \
149
+ python3-coverage \
150
+ python3-pycodestyle \
151
+ pylint \
152
+ python3-pytest \
153
+ python3-pytest-cov \
154
+ python3-pytest-timeout \
155
+ python3-pytest-xdist \
156
+ python3-myst-parser \
157
+ python3-sphinx
158
+ ```
@@ -0,0 +1,33 @@
1
+ # duplicity's Log Output
2
+
3
+ Duplicity's log output is meant as a means of reporting status and information
4
+ back to the caller. This makes the life of a frontend writer much easier.
5
+
6
+ The format consists of a stream of stanzas, each starting with a keyword and
7
+ some arguments, an optional suggested user text (each line of which starts with
8
+ ". ") and ending with an endline. Like so:
9
+
10
+ ```
11
+ KEYWORD 3\n
12
+ . Hello! All work and now play make Jack a...\n
13
+ . dull boy.\n
14
+ \n
15
+ ```
16
+
17
+ You can get this output by specifying either *--log-fd* or *--log-file*.
18
+
19
+ Currently, duplicity writes out status messages like WARNING or ERROR followed
20
+ by a message number. Each message number uniquely identifies a particular
21
+ warning or error so the frontend can take special action. For example, an ERROR
22
+ of 2 is a command line syntax error. Each message type has its own namespace
23
+ (i.e. a WARNING of 2 means something different than an ERROR of 2). A number
24
+ of 1 is a generic, non-unique number for messages without their own code.
25
+
26
+ For a list of current numbers, see log.py
27
+
28
+ ## HINTS FOR CONSUMERS
29
+
30
+ 1. Ignore any extra arguments on the keyword line.
31
+ 2. Ignore any stanzas that have a keyword you don't recognize.
32
+ 3. Ignore any lines in a stanza that start with a character you don't know.
33
+
@@ -0,0 +1,66 @@
1
+ # RELEASE PROCESS
2
+
3
+ ## Duplicity rel Checklist
4
+
5
+ 1. merge dev into main
6
+ 2. get Crowdin updates
7
+ - run "make pot"
8
+ - commit "chg:pkg: Run po/update-pot."
9
+ - wait for Crowdin MR
10
+ - fix & merge Crowdin MR
11
+ - add chg:pkg: to title
12
+ - click 'squash commits' and 'delete branch'
13
+ 3. run "tools/release-prep \<version\>"
14
+ 4. push to origin/main
15
+ 5. run "git push alpha : --tags"
16
+ 6. run "git push mirror : --tags"
17
+ 7. Launchpad PPAs
18
+ - [Release PPA](https://code.launchpad.net/~duplicity-team/+recipe/duplicity-release-git)
19
+ - edit the "Recipe contents" at the bottom to update the version number
20
+ 8. Launchpad SNAPs
21
+ - [Release SNAP](https://launchpad.net/~duplicity-team/duplicity/+snap/duplicity-rel)
22
+ - double check the settings so nothing is automatic
23
+ 9. "request builds" on both PPAs and SNAPS
24
+ 10. release pip version
25
+ - if the last pipeline for `main` was skipped:
26
+ - set CI_PIPELINE_SOURCE to "push"
27
+ - run new pipeline for `main`
28
+ - run jobs `wheels-linux` and `wheels-macos` once done
29
+ 11. update web pages in duplicity.gitlab.io
30
+ - set new version and date in index.wml
31
+ - commit and push
32
+ 12. release to GitLab releases
33
+ 13. send email to talk and announce
34
+ 14. send backup tarballs to sourceforge.net
35
+ 15. merge main into dev
36
+ 16. set next version in dev, e.g. 3.2.1-->3.2.2.dev0
37
+ 17. check builds for Launchpad PPAs, SNAPs, and wheels
38
+
39
+ ## Duplicity dev Checklist
40
+
41
+ 1. run "tools/release-prep \<version\>"
42
+ 2. Launchpad PPAs
43
+ - [Develop PPA](https://code.launchpad.net/~duplicity-team/+recipe/duplicity-develop-git)
44
+ - edit the "Recipe contents" at the bottom to update the version number
45
+ 3. Launchpad SNAPs
46
+ - [Develop SNAP](https://launchpad.net/~duplicity-team/duplicity/+snap/duplicity-dev)
47
+ - double check the settings so nothing is automatic
48
+ 4. run "git push alpha : --tags"
49
+ 5. run "git push mirror : --tags"
50
+ 6. "request builds" on both PPAs and SNAPS
51
+ 7. release pip version
52
+ - if the last pipeline for `main` was skipped:
53
+ - set CI_PIPELINE_SOURCE to "push"
54
+ - run new pipeline for `main`
55
+ - run jobs `wheels-linux` and `wheels-macos` once done
56
+ 8. set next version in dev, e.g. 3.2.1-->3.2.2.dev0
57
+ 9. check builds for Launchpad PPAs, SNAPs, and wheels
58
+
59
+ ## Versioning
60
+
61
+ - We use [semantic versioning](https://semver.org/).
62
+ - Dev releases are numbered like `3.2.1.dev0`.
63
+ - Full releases are numbered like `3.2.1`.
64
+ - We use `git tag rel.3.2.1.dev0` to mark dev releases.
65
+ - We use `git tag rel.3.2.1` to mark full releases.
66
+ - We no longer use alpha, beta, or rc for releases.
@@ -19,6 +19,6 @@ By the numbers:
19
19
  ```shell
20
20
  $ PYTHONPATH=$DUP_ROOT duplicity/__main__.py -V
21
21
  ```
22
- You should see something like "duplicity 3.0.0 May 16, 2024".
22
+ You should see something like "duplicity 3.2.1.dev0 August 11, 2026".
23
23
 
24
24
  Use PYTHONPATH to set the path each time that you use the binaries.
@@ -0,0 +1,90 @@
1
+ # Building
2
+
3
+ Some instructions and hints for building duplicity snaps.
4
+
5
+
6
+ ## Prerequisites
7
+
8
+ 1. Must be in a git clone of duplicity
9
+ 2. Must have all requirements.txt modules available
10
+ 3. For remote build (non-amd64) you'll need access to Launchpad
11
+
12
+
13
+ ## Build Process
14
+
15
+ 1. cd into clone root
16
+ 2. Run `tools/makesnap [arm64,amd64,armhf,ppc64el]`
17
+ 1. run without args to build amd64 only locally
18
+ 2. run with all args to build remotely on LP
19
+ 3. Run `tools/installsnap` to install to local machine
20
+ 4. Run `tools/testsnap` to run simple tests
21
+ 5. Run `tools/pushsnap` to push snap(s) to edge
22
+ 6. Sign on to [snapcraft.io](https://snapcraft.io/duplicity/releases) to promote snaps if needed
23
+
24
+
25
+ ## Notes
26
+
27
+ 1. Running 1 with all args is by far the easiest.
28
+ 2. Do not remove makesnap's `--destructive-mode`!
29
+ 1. it'll try to use `Multipass` and fail miserably
30
+ 2. if it should run, it'll interfere with other VMs
31
+ 3. use a Ubuntu 22.04 VM or Docker image (core22)
32
+
33
+
34
+ ## Step-by-step instructions for Ubuntu 22.04
35
+
36
+ Starting from a **default Ubuntu 22.04 Desktop installation**
37
+
38
+ 1. update and upgrade all packages (run as root or use `sudo`)
39
+ ```
40
+ apt-get update
41
+ apt-get -V upgrade
42
+ ```
43
+ 2. install needed software (run as root or use `sudo`)
44
+ ```
45
+ apt-get install python3-setuptools python3-distutils git snapcraft gettext
46
+ ```
47
+ 3. install python pip
48
+ ```
49
+ sudo apt-get install python3-pip
50
+ ```
51
+ 4. clone duplicity version to local file system (choose existing tag e.g. "rel.3.2.1.dev0")
52
+ ```
53
+ git clone https://gitlab.com/duplicity/duplicity.git -b rel.3.2.1.dev0
54
+ ```
55
+ 5. change into local git clone folder
56
+ ```
57
+ cd duplicity/
58
+ ```
59
+ 6. install needed python modules for duplicity (needed for local builds)
60
+ ```
61
+ python3 -m pip install -r requirements.txt
62
+ ```
63
+ 7. setup git user/email (needed for snapcraft remote build)
64
+ ```
65
+ git config --global user.email "your@email.com"
66
+ git config --global user.name "Your Name"
67
+ ```
68
+ 8. run snap creation script (any non-amd64 target platform will trigger the remote-build)
69
+ ```
70
+ tools/makesnap arm64,amd64,armhf,ppc64el
71
+ ```
72
+ 9. the above should result in several duplicity-*.snap files under `build/duplicity-<version>/`, as remote build at times results in truncated snap packages it is a good idea to quickly check if the squash-images are fine.
73
+ ```
74
+ ls -l build/duplicity-3.2.1.dev0/*.snap
75
+ # example output
76
+ #-rw-rw-r-- 1 user user 145268736 Dec 14 06:39 build/duplicity-3.2.1.dev0/duplicity_3.2.1.dev0_amd64.snap
77
+ #-rw-rw-r-- 1 user user 212455424 Dec 14 06:39 build/duplicity-3.2.1.dev0/duplicity_3.2.1.dev0_arm64.snap
78
+ #-rw-rw-r-- 1 user user 208789504 Dec 14 06:38 build/duplicity-3.2.1.dev0/duplicity_3.2.1.dev0_armhf.snap
79
+ #-rw-rw-r-- 1 user user 219574272 Dec 14 06:39 build/duplicity-3.2.1.dev0/duplicity_3.2.1.dev0_ppc64el.snap
80
+ # unsquashfs will print an error in case the image is corrupted
81
+ for f in build/duplicity-*/*.snap; do echo $f; unsquashfs -l "$f" > /dev/null; done
82
+ ```
83
+ 10. if all went well the snaps can be uploaded to snapcraft
84
+ ```
85
+ # use the `tools/pushsnap` script NEEDS '~/.snaplogin'
86
+ tools/pushsnap
87
+ # or do it manually
88
+ snapcraft login
89
+ for f in build/duplicity-*/*.snap; do echo "$f"; snapcraft upload "$f" --release edge; done
90
+ ```
@@ -0,0 +1,37 @@
1
+ # Testing duplicity
2
+
3
+ ## Introduction
4
+
5
+ Duplicity's tests are code, unit, and functional tests contained in the /testing folder of the main repository.
6
+ There are containers for each version of Python that we actively support.
7
+
8
+ ## Running tests on your branch
9
+
10
+ The recommended approach is to test duplicity using Docker, to ensure that you are running tests in a known-good
11
+ environment. You can run tests on your branch as follows:
12
+
13
+ 1. Install Docker
14
+ 2. run `testing/docker/build-dupCI.sh` to build containers.
15
+ 3. run `testing/docker/run-dupCI.sh` to start the containers.
16
+
17
+ Please test your branch using this method and ensure all tests pass before submitting a merge request.
18
+
19
+ The decorator `@pytest.mark.xfail` can be used to commit a known-failing test case without breaking the test
20
+ suite, for example to exhibit the behaviour in a bug report before it has been fixed.
21
+
22
+ ## Manual testing and running individual tests
23
+
24
+ 1. Docker containers
25
+ Even if you wish to run tests manually, we recommend that you do this inside the provided Docker container to ensure
26
+ that you have a clean and reproducible environment with all required dependencies for executing these. Please follow
27
+ the instructions above. For running a single test, set
28
+ `PYTEST_ARGS` either with an export like `export PYTEST_ARGS=testing/test_code.py` or a temporary setting like
29
+ `PYTEST_ARGS=testing/test_code.py testing/docker/run-dupCI.sh`.
30
+ 2. Use `pytest` locally if you want to test code on your machine. See
31
+ https://docs.pytest.org/en/stable/contents.html for complete instructions on using `pytest`.
32
+ See _Dependencies for testing_ to setup your environment.
33
+
34
+ ## Dependencies for testing
35
+ If you should prefer to execute the tests locally without using Docker, see [README-INSTALL.md](README-INSTALL.md) for
36
+ comprehensive `apt` commands to set up your environment (see "APT Only Installation (Development)").
37
+ Duplicity rely on some python packages provided by the system/distribution, to avoid compilations issues if installed via pip.