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.
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/CHANGELOG.md +69 -1
- duplicity-3.2.1.dev2/PKG-INFO +102 -0
- duplicity-3.2.1.dev2/README-ARCH.md +62 -0
- duplicity-3.2.1.dev2/README-INSTALL.md +159 -0
- duplicity-3.2.1.dev2/README-LOG.md +33 -0
- duplicity-3.2.1.dev2/README-RELEASE.md +66 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/README-REPO.md +1 -1
- duplicity-3.2.1.dev2/README-SNAP.md +90 -0
- duplicity-3.2.1.dev2/README-TESTING.md +36 -0
- duplicity-3.2.1.dev2/README.md +47 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/__init__.py +10 -2
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/__main__.py +11 -6
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/_librsync_ctypes.py +91 -4
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/argparse311.py +3 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backend.py +145 -45
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backend_pool.py +63 -19
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/__init__.py +6 -3
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/_cf_cloudfiles.py +17 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/_cf_pyrax.py +17 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/_testbackend.py +10 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/adbackend.py +49 -13
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/azurebackend.py +17 -3
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/b2backend.py +19 -4
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/boxbackend.py +41 -11
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/cfbackend.py +4 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/dpbxbackend.py +35 -3
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/gdocsbackend.py +14 -2
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/gdrivebackend.py +29 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/giobackend.py +15 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/hsibackend.py +15 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/hubicbackend.py +10 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/idrivedbackend.py +9 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/imapbackend.py +19 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/jottacloudbackend.py +36 -4
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/lftpbackend.py +22 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/localbackend.py +53 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/mediafirebackend.py +38 -8
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/megabackend.py +35 -9
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/megav2backend.py +38 -10
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/megav3backend.py +44 -12
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/multibackend.py +24 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/ncftpbackend.py +24 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/onedrivebackend.py +20 -4
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/par2backend.py +19 -3
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/pcabackend.py +9 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/pydrivebackend.py +17 -3
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/pyrax_identity/__init__.py +4 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/pyrax_identity/hubic.py +19 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/rclonebackend.py +33 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/rsyncbackend.py +21 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/s3_boto3_backend.py +51 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/slatebackend.py +10 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/ssh_paramiko_backend.py +64 -3
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/ssh_pexpect_backend.py +21 -3
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/swiftbackend.py +27 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/sxbackend.py +18 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/tahoebackend.py +9 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/webdavbackend.py +29 -5
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/backends/xorrisobackend.py +16 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/cached_ops.py +27 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/cli_data.py +9 -4
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/cli_main.py +35 -11
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/cli_util.py +83 -13
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/config.py +17 -8
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/diffdir.py +39 -5
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_collections.py +33 -28
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_main.py +121 -145
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_tarfile.py +3 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_temp.py +21 -7
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/dup_time.py +62 -15
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/errors.py +22 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/file_naming.py +23 -7
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/globmatch.py +39 -37
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/gpg.py +103 -34
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/lazy.py +91 -31
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/librsync.py +61 -23
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/log.py +51 -4
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/manifest.py +66 -37
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/patchdir.py +93 -26
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/path.py +196 -62
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/progress.py +18 -8
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/robust.py +15 -4
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/selection.py +72 -28
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/statistics.py +100 -42
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/tempdir.py +36 -27
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/util.py +88 -17
- duplicity-3.2.1.dev2/duplicity.egg-info/PKG-INFO +102 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/SOURCES.txt +54 -1
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/man/duplicity.1 +1 -1
- duplicity-3.2.1.dev2/po/af_ZA/af_ZA.po +1656 -0
- duplicity-3.2.1.dev2/po/ar_SA/ar_SA.po +1696 -0
- duplicity-3.2.1.dev2/po/ca_ES/ca_ES.po +1656 -0
- duplicity-3.2.1.dev2/po/cs_CZ/cs_CZ.po +1688 -0
- duplicity-3.2.1.dev2/po/da_DK/da_DK.po +1693 -0
- duplicity-3.2.1.dev2/po/de_AT/de_AT.po +1693 -0
- duplicity-3.2.1.dev2/po/de_DE/de_DE.po +1693 -0
- duplicity-3.2.1.dev2/po/el_GR/el_GR.po +1681 -0
- duplicity-3.2.1.dev2/po/en_AU/en_AU.po +1656 -0
- duplicity-3.2.1.dev2/po/en_GB/en_GB.po +1663 -0
- duplicity-3.2.1.dev2/po/en_PR/en_PR.po +1656 -0
- duplicity-3.2.1.dev2/po/en_US/en_US.po +1656 -0
- duplicity-3.2.1.dev2/po/es_EM/es_EM.po +1693 -0
- duplicity-3.2.1.dev2/po/es_ES/es_ES.po +1693 -0
- duplicity-3.2.1.dev2/po/es_MX/es_MX.po +1693 -0
- duplicity-3.2.1.dev2/po/es_PR/es_PR.po +1693 -0
- duplicity-3.2.1.dev2/po/es_US/es_US.po +1693 -0
- duplicity-3.2.1.dev2/po/fi_FI/fi_FI.po +1693 -0
- duplicity-3.2.1.dev2/po/fr_FR/fr_FR.po +1690 -0
- duplicity-3.2.1.dev2/po/he_IL/he_IL.po +1660 -0
- duplicity-3.2.1.dev2/po/hu_HU/hu_HU.po +1673 -0
- duplicity-3.2.1.dev2/po/it_IT/it_IT.po +1693 -0
- duplicity-3.2.1.dev2/po/ja_JP/ja_JP.po +1671 -0
- duplicity-3.2.1.dev2/po/ka_GE/ka_GE.po +1656 -0
- duplicity-3.2.1.dev2/po/ko_KR/ko_KR.po +1654 -0
- duplicity-3.2.1.dev2/po/nl_BE/nl_BE.po +1693 -0
- duplicity-3.2.1.dev2/po/nl_NL/nl_NL.po +1693 -0
- duplicity-3.2.1.dev2/po/nl_SR/nl_SR.po +1693 -0
- duplicity-3.2.1.dev2/po/no_NO/no_NO.po +1686 -0
- duplicity-3.2.1.dev2/po/pl_PL/pl_PL.po +1696 -0
- duplicity-3.2.1.dev2/po/pt_BR/pt_BR.po +1692 -0
- duplicity-3.2.1.dev2/po/pt_PT/pt_PT.po +1691 -0
- duplicity-3.2.1.dev2/po/ro_RO/ro_RO.po +1694 -0
- duplicity-3.2.1.dev2/po/ru_BY/ru_BY.po +1696 -0
- duplicity-3.2.1.dev2/po/ru_MD/ru_MD.po +1696 -0
- duplicity-3.2.1.dev2/po/ru_RU/ru_RU.po +1696 -0
- duplicity-3.2.1.dev2/po/ru_UA/ru_UA.po +1696 -0
- duplicity-3.2.1.dev2/po/sr_SP/sr_SP.po +1658 -0
- duplicity-3.2.1.dev2/po/sv_SE/sv_SE.po +1693 -0
- duplicity-3.2.1.dev2/po/tr_TR/tr_TR.po +1656 -0
- duplicity-3.2.1.dev2/po/uk_UA/uk_UA.po +1677 -0
- duplicity-3.2.1.dev2/po/vi_VN/vi_VN.po +1654 -0
- duplicity-3.2.1.dev2/po/zh_CN/zh_CN.po +1688 -0
- duplicity-3.2.1.dev2/po/zh_HK/zh_HK.po +1654 -0
- duplicity-3.2.1.dev2/po/zh_MO/zh_MO.po +1654 -0
- duplicity-3.2.1.dev2/po/zh_SG/zh_SG.po +1688 -0
- duplicity-3.2.1.dev2/po/zh_TW/zh_TW.po +1654 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/pyproject.toml +6 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/requirements.txt +2 -2
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/setup.py +89 -8
- duplicity-3.2.1.dev0/PKG-INFO +0 -241
- duplicity-3.2.1.dev0/README.md +0 -186
- duplicity-3.2.1.dev0/duplicity.egg-info/PKG-INFO +0 -241
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/AUTHORS.md +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/COPYING +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity/_librsyncmodule.c +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/dependency_links.txt +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/entry_points.txt +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/requires.txt +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/duplicity.egg-info/top_level.txt +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/af_ZA.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ar_SA.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ca_ES.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/cs_CZ.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/da_DK.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/de_AT.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/de_DE.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/duplicity.pot +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/el_GR.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/en_AU.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/en_GB.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/en_PR.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/en_US.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_EM.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_ES.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_MX.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_PR.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/es_US.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/fi_FI.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/fr_FR.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/he_IL.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/hu_HU.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/it_IT.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ja_JP.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ka_GE.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ko_KR.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/nl_BE.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/nl_NL.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/nl_SR.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/no_NO.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/pl_PL.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/pt_BR.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/pt_PT.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ro_RO.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ru_BY.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ru_MD.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ru_RU.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/ru_UA.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/sr_SP.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/sv_SE.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/tr_TR.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/uk_UA.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/vi_VN.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_CN.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_HK.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_MO.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_SG.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/po/zh_TW.po +0 -0
- {duplicity-3.2.1.dev0 → duplicity-3.2.1.dev2}/setup.cfg +0 -0
|
@@ -1,9 +1,77 @@
|
|
|
1
1
|
|
|
2
|
-
(Unreleased) / 2026-08-
|
|
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.
|
|
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)").
|