duplicity 3.2.1.dev0__tar.gz → 3.2.1.dev2__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 (198) hide show
  1. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/CHANGELOG.md +69 -1
  2. duplicity-3.2.1.dev2/PKG-INFO +102 -0
  3. duplicity-3.2.1.dev2/README-ARCH.md +62 -0
  4. duplicity-3.2.1.dev2/README-INSTALL.md +159 -0
  5. duplicity-3.2.1.dev2/README-LOG.md +33 -0
  6. duplicity-3.2.1.dev2/README-RELEASE.md +66 -0
  7. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/README-REPO.md +1 -1
  8. duplicity-3.2.1.dev2/README-SNAP.md +90 -0
  9. duplicity-3.2.1.dev2/README-TESTING.md +36 -0
  10. duplicity-3.2.1.dev2/README.md +47 -0
  11. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/__init__.py +10 -2
  12. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/__main__.py +11 -6
  13. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/_librsync_ctypes.py +91 -4
  14. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/argparse311.py +3 -1
  15. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backend.py +145 -45
  16. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backend_pool.py +63 -19
  17. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/__init__.py +6 -3
  18. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/_cf_cloudfiles.py +17 -0
  19. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/_cf_pyrax.py +17 -0
  20. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/_testbackend.py +10 -0
  21. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/adbackend.py +49 -13
  22. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/azurebackend.py +17 -3
  23. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/b2backend.py +19 -4
  24. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/boxbackend.py +41 -11
  25. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/cfbackend.py +4 -0
  26. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/dpbxbackend.py +35 -3
  27. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/gdocsbackend.py +14 -2
  28. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/gdrivebackend.py +29 -1
  29. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/giobackend.py +15 -0
  30. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/hsibackend.py +15 -0
  31. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/hubicbackend.py +10 -0
  32. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/idrivedbackend.py +9 -0
  33. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/imapbackend.py +19 -0
  34. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/jottacloudbackend.py +36 -4
  35. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/lftpbackend.py +22 -1
  36. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/localbackend.py +53 -0
  37. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/mediafirebackend.py +38 -8
  38. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/megabackend.py +35 -9
  39. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/megav2backend.py +38 -10
  40. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/megav3backend.py +44 -12
  41. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/multibackend.py +24 -1
  42. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/ncftpbackend.py +24 -1
  43. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/onedrivebackend.py +20 -4
  44. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/par2backend.py +19 -3
  45. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/pcabackend.py +9 -0
  46. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/pydrivebackend.py +17 -3
  47. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/pyrax_identity/__init__.py +4 -0
  48. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/pyrax_identity/hubic.py +19 -1
  49. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/rclonebackend.py +33 -0
  50. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/rsyncbackend.py +21 -1
  51. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/s3_boto3_backend.py +51 -0
  52. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/slatebackend.py +10 -0
  53. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/ssh_paramiko_backend.py +64 -3
  54. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/ssh_pexpect_backend.py +21 -3
  55. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/swiftbackend.py +27 -0
  56. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/sxbackend.py +18 -1
  57. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/tahoebackend.py +9 -0
  58. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/webdavbackend.py +29 -5
  59. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/xorrisobackend.py +16 -0
  60. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/cached_ops.py +27 -1
  61. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/cli_data.py +9 -4
  62. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/cli_main.py +35 -11
  63. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/cli_util.py +83 -13
  64. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/config.py +17 -8
  65. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/diffdir.py +39 -5
  66. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_collections.py +33 -28
  67. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_main.py +121 -145
  68. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_tarfile.py +3 -1
  69. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_temp.py +21 -7
  70. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_time.py +62 -15
  71. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/errors.py +22 -0
  72. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/file_naming.py +23 -7
  73. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/globmatch.py +39 -37
  74. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/gpg.py +103 -34
  75. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/lazy.py +91 -31
  76. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/librsync.py +61 -23
  77. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/log.py +51 -4
  78. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/manifest.py +66 -37
  79. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/patchdir.py +93 -26
  80. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/path.py +196 -62
  81. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/progress.py +18 -8
  82. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/robust.py +15 -4
  83. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/selection.py +72 -28
  84. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/statistics.py +100 -42
  85. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/tempdir.py +36 -27
  86. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/util.py +88 -17
  87. duplicity-3.2.1.dev2/duplicity.egg-info/PKG-INFO +102 -0
  88. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/SOURCES.txt +54 -1
  89. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/man/duplicity.1 +1 -1
  90. duplicity-3.2.1.dev2/po/af_ZA/af_ZA.po +1656 -0
  91. duplicity-3.2.1.dev2/po/ar_SA/ar_SA.po +1696 -0
  92. duplicity-3.2.1.dev2/po/ca_ES/ca_ES.po +1656 -0
  93. duplicity-3.2.1.dev2/po/cs_CZ/cs_CZ.po +1688 -0
  94. duplicity-3.2.1.dev2/po/da_DK/da_DK.po +1693 -0
  95. duplicity-3.2.1.dev2/po/de_AT/de_AT.po +1693 -0
  96. duplicity-3.2.1.dev2/po/de_DE/de_DE.po +1693 -0
  97. duplicity-3.2.1.dev2/po/el_GR/el_GR.po +1681 -0
  98. duplicity-3.2.1.dev2/po/en_AU/en_AU.po +1656 -0
  99. duplicity-3.2.1.dev2/po/en_GB/en_GB.po +1663 -0
  100. duplicity-3.2.1.dev2/po/en_PR/en_PR.po +1656 -0
  101. duplicity-3.2.1.dev2/po/en_US/en_US.po +1656 -0
  102. duplicity-3.2.1.dev2/po/es_EM/es_EM.po +1693 -0
  103. duplicity-3.2.1.dev2/po/es_ES/es_ES.po +1693 -0
  104. duplicity-3.2.1.dev2/po/es_MX/es_MX.po +1693 -0
  105. duplicity-3.2.1.dev2/po/es_PR/es_PR.po +1693 -0
  106. duplicity-3.2.1.dev2/po/es_US/es_US.po +1693 -0
  107. duplicity-3.2.1.dev2/po/fi_FI/fi_FI.po +1693 -0
  108. duplicity-3.2.1.dev2/po/fr_FR/fr_FR.po +1690 -0
  109. duplicity-3.2.1.dev2/po/he_IL/he_IL.po +1660 -0
  110. duplicity-3.2.1.dev2/po/hu_HU/hu_HU.po +1673 -0
  111. duplicity-3.2.1.dev2/po/it_IT/it_IT.po +1693 -0
  112. duplicity-3.2.1.dev2/po/ja_JP/ja_JP.po +1671 -0
  113. duplicity-3.2.1.dev2/po/ka_GE/ka_GE.po +1656 -0
  114. duplicity-3.2.1.dev2/po/ko_KR/ko_KR.po +1654 -0
  115. duplicity-3.2.1.dev2/po/nl_BE/nl_BE.po +1693 -0
  116. duplicity-3.2.1.dev2/po/nl_NL/nl_NL.po +1693 -0
  117. duplicity-3.2.1.dev2/po/nl_SR/nl_SR.po +1693 -0
  118. duplicity-3.2.1.dev2/po/no_NO/no_NO.po +1686 -0
  119. duplicity-3.2.1.dev2/po/pl_PL/pl_PL.po +1696 -0
  120. duplicity-3.2.1.dev2/po/pt_BR/pt_BR.po +1692 -0
  121. duplicity-3.2.1.dev2/po/pt_PT/pt_PT.po +1691 -0
  122. duplicity-3.2.1.dev2/po/ro_RO/ro_RO.po +1694 -0
  123. duplicity-3.2.1.dev2/po/ru_BY/ru_BY.po +1696 -0
  124. duplicity-3.2.1.dev2/po/ru_MD/ru_MD.po +1696 -0
  125. duplicity-3.2.1.dev2/po/ru_RU/ru_RU.po +1696 -0
  126. duplicity-3.2.1.dev2/po/ru_UA/ru_UA.po +1696 -0
  127. duplicity-3.2.1.dev2/po/sr_SP/sr_SP.po +1658 -0
  128. duplicity-3.2.1.dev2/po/sv_SE/sv_SE.po +1693 -0
  129. duplicity-3.2.1.dev2/po/tr_TR/tr_TR.po +1656 -0
  130. duplicity-3.2.1.dev2/po/uk_UA/uk_UA.po +1677 -0
  131. duplicity-3.2.1.dev2/po/vi_VN/vi_VN.po +1654 -0
  132. duplicity-3.2.1.dev2/po/zh_CN/zh_CN.po +1688 -0
  133. duplicity-3.2.1.dev2/po/zh_HK/zh_HK.po +1654 -0
  134. duplicity-3.2.1.dev2/po/zh_MO/zh_MO.po +1654 -0
  135. duplicity-3.2.1.dev2/po/zh_SG/zh_SG.po +1688 -0
  136. duplicity-3.2.1.dev2/po/zh_TW/zh_TW.po +1654 -0
  137. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/pyproject.toml +6 -0
  138. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/requirements.txt +2 -2
  139. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/setup.py +89 -8
  140. duplicity-3.2.1.dev0/PKG-INFO +0 -241
  141. duplicity-3.2.1.dev0/README.md +0 -186
  142. duplicity-3.2.1.dev0/duplicity.egg-info/PKG-INFO +0 -241
  143. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/AUTHORS.md +0 -0
  144. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/COPYING +0 -0
  145. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/_librsyncmodule.c +0 -0
  146. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/dependency_links.txt +0 -0
  147. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/entry_points.txt +0 -0
  148. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/requires.txt +0 -0
  149. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/top_level.txt +0 -0
  150. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/af_ZA.po +0 -0
  151. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ar_SA.po +0 -0
  152. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ca_ES.po +0 -0
  153. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/cs_CZ.po +0 -0
  154. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/da_DK.po +0 -0
  155. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/de_AT.po +0 -0
  156. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/de_DE.po +0 -0
  157. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/duplicity.pot +0 -0
  158. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/el_GR.po +0 -0
  159. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/en_AU.po +0 -0
  160. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/en_GB.po +0 -0
  161. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/en_PR.po +0 -0
  162. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/en_US.po +0 -0
  163. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_EM.po +0 -0
  164. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_ES.po +0 -0
  165. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_MX.po +0 -0
  166. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_PR.po +0 -0
  167. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_US.po +0 -0
  168. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/fi_FI.po +0 -0
  169. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/fr_FR.po +0 -0
  170. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/he_IL.po +0 -0
  171. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/hu_HU.po +0 -0
  172. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/it_IT.po +0 -0
  173. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ja_JP.po +0 -0
  174. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ka_GE.po +0 -0
  175. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ko_KR.po +0 -0
  176. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/nl_BE.po +0 -0
  177. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/nl_NL.po +0 -0
  178. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/nl_SR.po +0 -0
  179. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/no_NO.po +0 -0
  180. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/pl_PL.po +0 -0
  181. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/pt_BR.po +0 -0
  182. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/pt_PT.po +0 -0
  183. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ro_RO.po +0 -0
  184. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ru_BY.po +0 -0
  185. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ru_MD.po +0 -0
  186. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ru_RU.po +0 -0
  187. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ru_UA.po +0 -0
  188. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/sr_SP.po +0 -0
  189. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/sv_SE.po +0 -0
  190. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/tr_TR.po +0 -0
  191. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/uk_UA.po +0 -0
  192. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/vi_VN.po +0 -0
  193. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_CN.po +0 -0
  194. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_HK.po +0 -0
  195. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_MO.po +0 -0
  196. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_SG.po +0 -0
  197. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_TW.po +0 -0
  198. {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/setup.cfg +0 -0
@@ -1,9 +1,77 @@
1
1
 
2
- (Unreleased) / 2026-08-10
2
+ (Unreleased) / 2026-08-20
3
3
  =========================
4
4
 
5
5
 
6
6
 
7
+ rel.3.2.1.dev2 / 2026-08-20
8
+ ===========================
9
+
10
+ * [`77c5107e`](https://gitlab.com/duplicity/duplicity/-/commit/77c5107e):new: Add get_version() to librsync to retrieve underlying library version
11
+ * [`b839f2c8`](https://gitlab.com/duplicity/duplicity/-/commit/b839f2c8):new: Add pure Python librsync implementation using ctypes as fallback
12
+ * [`ba7957c3`](https://gitlab.com/duplicity/duplicity/-/commit/ba7957c3):new: Add coverage configuration and Makefile targets for testing.
13
+ * [`855c6f1c`](https://gitlab.com/duplicity/duplicity/-/commit/855c6f1c):chg: Remove outdated comment for `python3-gnupg` in `debian/control`
14
+ * [`22fae925`](https://gitlab.com/duplicity/duplicity/-/commit/22fae925):chg: Sync README files in `setup.py` and clean up verbosity flags
15
+ * [`978355b4`](https://gitlab.com/duplicity/duplicity/-/commit/978355b4):chg: Enable verbose mode in debian/rules
16
+ * [`626cdccb`](https://gitlab.com/duplicity/duplicity/-/commit/626cdccb):chg: Remove redundant `apt` commands in `debian/rules`
17
+ * [`ba71d094`](https://gitlab.com/duplicity/duplicity/-/commit/ba71d094):chg: Update setuptools to >=61.0.0 in dev dependencies and `debian/rules`
18
+ * [`2b55864a`](https://gitlab.com/duplicity/duplicity/-/commit/2b55864a):chg: Simplify `gnupg` import logic in `gpg.py`
19
+ * [`80abbd02`](https://gitlab.com/duplicity/duplicity/-/commit/80abbd02):chg: Adjust dependencies in `requirements.txt` and `debian/control`
20
+ * [`df52d45b`](https://gitlab.com/duplicity/duplicity/-/commit/df52d45b):chg: Add `python3-gnupg` as a build dependency in `debian/control`
21
+ * [`057c7d0a`](https://gitlab.com/duplicity/duplicity/-/commit/057c7d0a):chg: Update doc cleanup pattern in `debian/rules`
22
+ * [`4eaee861`](https://gitlab.com/duplicity/duplicity/-/commit/4eaee861):chg: Update doc cleanup to remove `duplicity-*` files in `debian/rules`
23
+ * [`7cd8ddb6`](https://gitlab.com/duplicity/duplicity/-/commit/7cd8ddb6):chg: Add `get_data_files` for dynamic data file handling in `setup.py`
24
+ * [`e9bf8843`](https://gitlab.com/duplicity/duplicity/-/commit/e9bf8843):chg: Simplify doc handling by removing outdated duplicity docs
25
+ * [`4bc93712`](https://gitlab.com/duplicity/duplicity/-/commit/4bc93712):chg: Update dependencies, streamline configs, and refine CI
26
+ * [`ca78d6c5`](https://gitlab.com/duplicity/duplicity/-/commit/ca78d6c5):chg: Update release-prep script to use `check_tags`
27
+ * [`60ae51f3`](https://gitlab.com/duplicity/duplicity/-/commit/60ae51f3):chg: Update release-prep script to fix tag removal and file refs
28
+ * [`45495e09`](https://gitlab.com/duplicity/duplicity/-/commit/45495e09):chg: Update pipeline triggers for push, web, and merge request events
29
+ * [`f8fc71e3`](https://gitlab.com/duplicity/duplicity/-/commit/f8fc71e3):chg: Improve process in `setup.py` and release prep script
30
+ * [`f36c9922`](https://gitlab.com/duplicity/duplicity/-/commit/f36c9922):chg: Refactor versioning and metadata handling
31
+ * [`84afa6f2`](https://gitlab.com/duplicity/duplicity/-/commit/84afa6f2):chg: Refactor string concatenations to f-strings across codebase
32
+ * [`480cbc23`](https://gitlab.com/duplicity/duplicity/-/commit/480cbc23):chg: Clean up and refactor `pyproject.toml` and `Makefile`
33
+ * [`42d4838d`](https://gitlab.com/duplicity/duplicity/-/commit/42d4838d):chg: Rewrite `makechangelog` script in Python
34
+ * [`1dee9e31`](https://gitlab.com/duplicity/duplicity/-/commit/1dee9e31):chg: b2backend prefer b2sdk.v3
35
+ * [`4f4e052e`](https://gitlab.com/duplicity/duplicity/-/commit/4f4e052e):chg: Cleanup some minor issues
36
+ * [`1e0a97dc`](https://gitlab.com/duplicity/duplicity/-/commit/1e0a97dc):chg: Format with Black/PEP8 and ensure file flush before rename
37
+ * [`22da1a0d`](https://gitlab.com/duplicity/duplicity/-/commit/22da1a0d):fix: Resolve PEP8 style issues and whitespace in backend and main modules
38
+ * [`06858c9a`](https://gitlab.com/duplicity/duplicity/-/commit/06858c9a):fix: Replace `os.system` calls with safer Python alternatives.
39
+ * [`da745307`](https://gitlab.com/duplicity/duplicity/-/commit/da745307):fix: Add --ignore-installed flag for pip in Dockerfiles
40
+ * [`883cca1e`](https://gitlab.com/duplicity/duplicity/-/commit/883cca1e):fix: restore issue: AssertionError: (b'keys', [...]) not empty
41
+ * [`aa0b23e7`](https://gitlab.com/duplicity/duplicity/-/commit/aa0b23e7):fix: Replace `log.FatalError` with `raise errors.FatalError`.
42
+ * [`c3a45713`](https://gitlab.com/duplicity/duplicity/-/commit/c3a45713):fix: Add support for "sync" action and handle passphrase checks.
43
+ * [`db99858e`](https://gitlab.com/duplicity/duplicity/-/commit/db99858e):fix: Enhance error handling and debug logging in Python modules
44
+ * [`dbb899ad`](https://gitlab.com/duplicity/duplicity/-/commit/dbb899ad):fix: Use 'python-gnupg' instead of our 'gpginterface.py'.
45
+ * [`4d6e9f8c`](https://gitlab.com/duplicity/duplicity/-/commit/4d6e9f8c):fix: PCABackend GET URL needs prefix if one is defined
46
+ * [`d7cd05d8`](https://gitlab.com/duplicity/duplicity/-/commit/d7cd05d8):fix: Could not release lockfile
47
+ * [`fcbe3a7a`](https://gitlab.com/duplicity/duplicity/-/commit/fcbe3a7a):fix: Enforce --force requirement for destructive operations
48
+ * [`c6c8b26a`](https://gitlab.com/duplicity/duplicity/-/commit/c6c8b26a):fix: Enhance BackupSet.delete signature cleanup and fix lock release
49
+ * [`3f0ab55b`](https://gitlab.com/duplicity/duplicity/-/commit/3f0ab55b):fix: Prevent premature deletion of full backups during incremental starts
50
+ * [`9819e4d4`](https://gitlab.com/duplicity/duplicity/-/commit/9819e4d4):fix: Add get_last_continuous_volume for reliable backup resumption
51
+ * [`5d737d07`](https://gitlab.com/duplicity/duplicity/-/commit/5d737d07):fix: Postpone metadata promotion to prevent orphaned cache files
52
+
53
+ rel.3.2.0.1 / 2026-08-15
54
+ ========================
55
+
56
+ * [`3865b348`](https://gitlab.com/duplicity/duplicity/-/commit/3865b348):chg: Add `python3-gnupg` as a build dependency in `debian/control`
57
+ * [`efefc8b2`](https://gitlab.com/duplicity/duplicity/-/commit/efefc8b2):chg: Update doc cleanup pattern in `debian/rules`
58
+ * [`955713e7`](https://gitlab.com/duplicity/duplicity/-/commit/955713e7):chg: Update doc cleanup to remove `duplicity-*` files in `debian/rules`
59
+ * [`e8c0bc1a`](https://gitlab.com/duplicity/duplicity/-/commit/e8c0bc1a):chg: Add `get_data_files` for dynamic data file handling in `setup.py`
60
+ * [`137ae81d`](https://gitlab.com/duplicity/duplicity/-/commit/137ae81d):chg: Simplify doc handling by removing outdated duplicity docs
61
+ * [`f0fb534c`](https://gitlab.com/duplicity/duplicity/-/commit/f0fb534c):chg: Update dependencies, streamline configs, and refine CI
62
+ * [`6d719e1c`](https://gitlab.com/duplicity/duplicity/-/commit/6d719e1c):fix: Resolve PEP8 style issues and whitespace in backend and main modules
63
+
64
+ rel.3.2.1.dev1 / 2026-08-15
65
+ ===========================
66
+
67
+ * [`29b7ca68`](https://gitlab.com/duplicity/duplicity/-/commit/29b7ca68):chg: Add `python3-gnupg` as a build dependency in `debian/control`
68
+ * [`d5ab54d3`](https://gitlab.com/duplicity/duplicity/-/commit/d5ab54d3):chg: Update doc cleanup pattern in `debian/rules`
69
+ * [`6fbffc54`](https://gitlab.com/duplicity/duplicity/-/commit/6fbffc54):chg: Update doc cleanup to remove `duplicity-*` files in `debian/rules`
70
+ * [`bf4b9c5d`](https://gitlab.com/duplicity/duplicity/-/commit/bf4b9c5d):chg: Add `get_data_files` for dynamic data file handling in `setup.py`
71
+ * [`c88e9239`](https://gitlab.com/duplicity/duplicity/-/commit/c88e9239):chg: Simplify doc handling by removing outdated duplicity docs
72
+ * [`e05cf2f2`](https://gitlab.com/duplicity/duplicity/-/commit/e05cf2f2):chg: Update dependencies, streamline configs, and refine CI
73
+ * [`3bced29a`](https://gitlab.com/duplicity/duplicity/-/commit/3bced29a):fix: Resolve PEP8 style issues and whitespace in backend and main modules
74
+
7
75
  rel.3.2.0 / 2026-08-10
8
76
  ======================
9
77
 
@@ -0,0 +1,102 @@
1
+ Metadata-Version: 2.4
2
+ Name: duplicity
3
+ Version: 3.2.1.dev2
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: cryptography==43.0.3
31
+ Requires-Dist: fasteners>=0.19
32
+ Requires-Dist: httplib2
33
+ Requires-Dist: pysocks
34
+ Requires-Dist: python-gnupg
35
+ Requires-Dist: requests
36
+ Requires-Dist: requests-oauthlib
37
+ Requires-Dist: azure-storage-blob
38
+ Requires-Dist: b2sdk
39
+ Requires-Dist: boto3
40
+ Requires-Dist: botocore
41
+ Requires-Dist: boxsdk[jwt]
42
+ Requires-Dist: dropbox
43
+ Requires-Dist: gdata-python3
44
+ Requires-Dist: google-api-python-client
45
+ Requires-Dist: google-auth-oauthlib
46
+ Requires-Dist: jottalib
47
+ Requires-Dist: mediafire
48
+ Requires-Dist: megatools
49
+ Requires-Dist: paramiko
50
+ Requires-Dist: pexpect
51
+ Requires-Dist: pydrive2
52
+ Requires-Dist: pyrax
53
+ Requires-Dist: python-swiftclient
54
+ Dynamic: license-file
55
+
56
+ # Duplicity
57
+
58
+ 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.
59
+
60
+ ## Key Features
61
+
62
+ - **Encrypted & Signed**: Backups are safe from spying and modification using GnuPG.
63
+ - **Bandwidth Efficient**: Only transmits changes since the last backup using the rsync algorithm.
64
+ - **Incremental Archives**: Saves space by storing only the parts of files that have changed.
65
+ - **Multiple Backends**: Supports a wide range of storage services (S3, Azure, B2, Google Drive, etc.) and protocols (SFTP, SCP, FTP, etc.).
66
+
67
+ ## Table of Contents
68
+
69
+ - [Installation](README-INSTALL.md)
70
+ - [Architecture](README-ARCH.md)
71
+ - [Repository Access](README-REPO.md)
72
+ - [Testing](README-TESTING.md)
73
+ - [Logging](README-LOG.md)
74
+ - [Release Process](README-RELEASE.md)
75
+ - [Snap Support](README-SNAP.md)
76
+ - [Development](#development)
77
+ - [Help](#help)
78
+
79
+ # DEVELOPMENT
80
+
81
+ For more information on downloading duplicity's source code from the
82
+ code repository and developing for duplicity, see [README-REPO](README-REPO.md).
83
+
84
+ For source docs: https://duplicity.readthedocs.io/
85
+
86
+ # HELP
87
+
88
+ For more information see the duplicity web site at:
89
+
90
+ https://duplicity.us
91
+
92
+ or at:
93
+
94
+ https://duplicity.gitlab.io
95
+
96
+ or post to the mailing list at:
97
+
98
+ https://lists.nongnu.org/mailman/listinfo/duplicity-talk
99
+
100
+ or post a new issue at:
101
+
102
+ 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,159 @@
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-pip \
26
+ python3-venv \
27
+ python3 \
28
+ rclone \
29
+ rsync \
30
+ rdiff \
31
+ tzdata
32
+ ```
33
+
34
+ ### (1b) Install and Update Pipx
35
+ It is necessary to upgrade packaging tools to avoid installation failures.
36
+ ```shell
37
+ sudo python3 -m pip install --upgrade pip pipx
38
+ sudo pipx --global ensurepath # for all users
39
+ pipx ensurepath # for single user
40
+ ```
41
+
42
+ ### (1c) Uninstall Previous Versions
43
+ If you have an existing duplicity not installed by `pipx`, you must uninstall it first:
44
+ ```shell
45
+ which -a duplicity
46
+ # Use apt, yum, snap, or other command to remove existing instances.
47
+ ```
48
+
49
+ ### (1d) Install Duplicity
50
+ ```shell
51
+ # For all users
52
+ sudo pipx --global install duplicity
53
+
54
+ # For single user
55
+ pipx install duplicity
56
+ ```
57
+ *Note: Use `--suffix=version` to keep multiple versions (e.g., `duplicity-2.0`).*
58
+
59
+ ## (2) APT Only Installation (Production)
60
+
61
+ Use this method if you are on a Debian-based system and want to install all runtime dependencies via `apt`, avoiding `pip` entirely.
62
+
63
+ ```shell
64
+ sudo apt-get update
65
+ sudo apt-get install -y \
66
+ build-essential \
67
+ intltool \
68
+ lftp \
69
+ librsync-dev \
70
+ libffi-dev \
71
+ libssl-dev \
72
+ openssl \
73
+ megatools \
74
+ par2 \
75
+ python3-dev \
76
+ python3-lxml \
77
+ python3-pip \
78
+ python3-venv \
79
+ python3 \
80
+ rclone \
81
+ rsync \
82
+ rdiff \
83
+ tzdata \
84
+ python3-cryptography \
85
+ python3-fasteners \
86
+ python3-httplib2 \
87
+ python3-socks \
88
+ python3-gnupg \
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-gnupg \
134
+ python3-requests \
135
+ python3-requests-oauthlib \
136
+ python3-azure-storage-blob \
137
+ python3-b2sdk \
138
+ python3-boto3 \
139
+ python3-botocore \
140
+ python3-dropbox \
141
+ python3-googleapi \
142
+ python3-google-auth-oauthlib \
143
+ python3-paramiko \
144
+ python3-pexpect \
145
+ python3-pydrive2 \
146
+ python3-swiftclient \
147
+ python3-setuptools \
148
+ python3-setuptools-gettext \
149
+ black \
150
+ python3-coverage \
151
+ python3-pycodestyle \
152
+ pylint \
153
+ python3-pytest \
154
+ python3-pytest-cov \
155
+ python3-pytest-timeout \
156
+ python3-pytest-xdist \
157
+ python3-myst-parser \
158
+ python3-sphinx
159
+ ```
@@ -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,36 @@
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 `@unittest.expectedFailure` 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)").