duplicity 3.2.1.dev2__tar.gz → 3.2.2.dev0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/CHANGELOG.md +110 -20
- {duplicity-3.2.1.dev2/duplicity.egg-info → duplicity-3.2.2.dev0}/PKG-INFO +3 -4
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/README-INSTALL.md +1 -2
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/README-TESTING.md +2 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/__init__.py +2 -2
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/__main__.py +2 -2
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backend.py +37 -2
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backend_pool.py +5 -7
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/_cf_cloudfiles.py +8 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/_cf_pyrax.py +6 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/b2backend.py +38 -12
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/boxbackend.py +38 -3
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/hubicbackend.py +5 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/idrivedbackend.py +1 -2
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/imapbackend.py +2 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/jottacloudbackend.py +3 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/mediafirebackend.py +1 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/onedrivebackend.py +39 -16
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/par2backend.py +21 -4
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/pyrax_identity/hubic.py +2 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/rsyncbackend.py +25 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/ssh_pexpect_backend.py +2 -2
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/webdavbackend.py +20 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/xorrisobackend.py +1 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/cli_data.py +221 -36
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/cli_main.py +95 -15
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/cli_util.py +116 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/config.py +5 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/diffdir.py +4 -2
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/dup_collections.py +18 -13
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/dup_main.py +69 -62
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/dup_temp.py +1 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/file_naming.py +15 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/gpg.py +218 -246
- duplicity-3.2.2.dev0/duplicity/gpginterface.py +706 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/log.py +1 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/manifest.py +17 -4
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/patchdir.py +1 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/path.py +1 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/selection.py +44 -132
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/tempdir.py +6 -5
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/util.py +8 -21
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0/duplicity.egg-info}/PKG-INFO +3 -4
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity.egg-info/SOURCES.txt +1 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity.egg-info/requires.txt +0 -2
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/man/duplicity.1 +34 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/af_ZA/af_ZA.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/af_ZA.po +394 -382
- {duplicity-3.2.1.dev2/po → duplicity-3.2.2.dev0/po/ar_SA}/ar_SA.po +400 -393
- {duplicity-3.2.1.dev2/po/ar_SA → duplicity-3.2.2.dev0/po}/ar_SA.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ca_ES/ca_ES.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ca_ES.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/cs_CZ/cs_CZ.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/cs_CZ.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/da_DK/da_DK.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/da_DK.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/de_AT/de_AT.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/de_AT.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/de_DE/de_DE.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/de_DE.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/duplicity.pot +399 -386
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/el_GR/el_GR.po +400 -388
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/el_GR.po +400 -388
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/en_AU/en_AU.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/en_AU.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/en_GB/en_GB.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/en_GB.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/en_PR/en_PR.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/en_PR.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/en_US/en_US.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/en_US.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_EM/es_EM.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_EM.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_ES/es_ES.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_ES.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_MX/es_MX.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_MX.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_PR/es_PR.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_PR.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_US/es_US.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/es_US.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/fi_FI/fi_FI.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/fi_FI.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/fr_FR/fr_FR.po +400 -390
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/fr_FR.po +400 -390
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/he_IL/he_IL.po +395 -385
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/he_IL.po +395 -385
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/hu_HU/hu_HU.po +395 -383
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/hu_HU.po +395 -383
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/it_IT/it_IT.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/it_IT.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ja_JP/ja_JP.po +400 -388
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ja_JP.po +400 -388
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ka_GE/ka_GE.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ka_GE.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ko_KR/ko_KR.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ko_KR.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/nl_BE/nl_BE.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/nl_BE.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/nl_NL/nl_NL.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/nl_NL.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/nl_SR/nl_SR.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/nl_SR.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/no_NO/no_NO.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/no_NO.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/pl_PL/pl_PL.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/pl_PL.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/pt_BR/pt_BR.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/pt_BR.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/pt_PT/pt_PT.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/pt_PT.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ro_RO/ro_RO.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ro_RO.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ru_BY/ru_BY.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ru_BY.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ru_MD/ru_MD.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ru_MD.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ru_RU/ru_RU.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ru_RU.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/sr_SP/sr_SP.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/sr_SP.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/sv_SE/sv_SE.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/sv_SE.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/tr_TR/tr_TR.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/tr_TR.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/uk_UA/uk_UA.po +395 -383
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/uk_UA.po +395 -383
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/vi_VN/vi_VN.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/vi_VN.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_CN/zh_CN.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_CN.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_HK/zh_HK.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_HK.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_MO/zh_MO.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_MO.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_SG/zh_SG.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_SG.po +400 -393
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_TW/zh_TW.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/zh_TW.po +394 -382
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/pyproject.toml +27 -42
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/requirements.txt +0 -2
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/setup.py +2 -1
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/AUTHORS.md +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/COPYING +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/README-ARCH.md +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/README-LOG.md +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/README-RELEASE.md +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/README-REPO.md +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/README-SNAP.md +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/README.md +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/_librsync_ctypes.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/_librsyncmodule.c +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/argparse311.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/__init__.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/_testbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/adbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/azurebackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/cfbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/dpbxbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/gdocsbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/gdrivebackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/giobackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/hsibackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/lftpbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/localbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/megabackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/megav2backend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/megav3backend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/multibackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/ncftpbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/pcabackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/pydrivebackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/pyrax_identity/__init__.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/rclonebackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/s3_boto3_backend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/slatebackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/ssh_paramiko_backend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/swiftbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/sxbackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/backends/tahoebackend.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/cached_ops.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/dup_tarfile.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/dup_time.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/errors.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/globmatch.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/lazy.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/librsync.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/progress.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/robust.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity/statistics.py +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity.egg-info/dependency_links.txt +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity.egg-info/entry_points.txt +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/duplicity.egg-info/top_level.txt +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ru_UA/ru_UA.po +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/po/ru_UA.po +0 -0
- {duplicity-3.2.1.dev2 → duplicity-3.2.2.dev0}/setup.cfg +0 -0
|
@@ -1,15 +1,30 @@
|
|
|
1
1
|
|
|
2
|
-
(Unreleased) / 2026-
|
|
2
|
+
(Unreleased) / 2026-09-28
|
|
3
3
|
=========================
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
rel.3.2.1
|
|
8
|
-
|
|
7
|
+
rel.3.2.1 / 2026-09-28
|
|
8
|
+
======================
|
|
9
9
|
|
|
10
|
+
* [`d7da150b`](https://gitlab.com/duplicity/duplicity/-/commit/d7da150b):new: Create subpath in rsyncd.
|
|
10
11
|
* [`77c5107e`](https://gitlab.com/duplicity/duplicity/-/commit/77c5107e):new: Add get_version() to librsync to retrieve underlying library version
|
|
11
12
|
* [`b839f2c8`](https://gitlab.com/duplicity/duplicity/-/commit/b839f2c8):new: Add pure Python librsync implementation using ctypes as fallback
|
|
12
13
|
* [`ba7957c3`](https://gitlab.com/duplicity/duplicity/-/commit/ba7957c3):new: Add coverage configuration and Makefile targets for testing.
|
|
14
|
+
* [`846e90ae`](https://gitlab.com/duplicity/duplicity/-/commit/846e90ae):chg: Adapt `makechangelog` for enhanced usability and stricter repo cleanliness checks
|
|
15
|
+
* [`35191e13`](https://gitlab.com/duplicity/duplicity/-/commit/35191e13):chg: Remove unused pytest options and manual testing directory from `pyproject.toml`
|
|
16
|
+
* [`eaa264be`](https://gitlab.com/duplicity/duplicity/-/commit/eaa264be):chg: Improve error handling for Box, OneDrive, and WebDAV backends; add unit tests for comprehensive validation
|
|
17
|
+
* [`e181a9e9`](https://gitlab.com/duplicity/duplicity/-/commit/e181a9e9):chg: Improve error handling and signature file filtering logic; add unit tests for B2 and PAR2 backends
|
|
18
|
+
* [`58a54680`](https://gitlab.com/duplicity/duplicity/-/commit/58a54680):chg: Add regex cache invalidation for file prefix changes; update tests
|
|
19
|
+
* [`fcd6920a`](https://gitlab.com/duplicity/duplicity/-/commit/fcd6920a):chg: Add deprecation warnings for CloudFiles, Pyrax, and Hubic backends
|
|
20
|
+
* [`1842e4de`](https://gitlab.com/duplicity/duplicity/-/commit/1842e4de):chg: Remove `python3-gnupg` and restore `gpginterface` module and unit tests.
|
|
21
|
+
* [`aae16c61`](https://gitlab.com/duplicity/duplicity/-/commit/aae16c61):chg: Remove `python3-gnupg` and restore `gpginterface` module and unit tests.
|
|
22
|
+
* [`a201453e`](https://gitlab.com/duplicity/duplicity/-/commit/a201453e):chg: Plan to remove obsolete Pyrax, CloudFiles, and Hubic backends; standardize on python-swiftclient
|
|
23
|
+
* [`abdf9a0e`](https://gitlab.com/duplicity/duplicity/-/commit/abdf9a0e):chg: Remove unused gnupg import from gpg.py for cleanup.
|
|
24
|
+
* [`bd649791`](https://gitlab.com/duplicity/duplicity/-/commit/bd649791):chg: Split wildcard and multiline imports into individual lines for improved clarity and compliance with coding standards
|
|
25
|
+
* [`993cc651`](https://gitlab.com/duplicity/duplicity/-/commit/993cc651):chg: Decouple selection parsing from core engine and refactor tests
|
|
26
|
+
* [`1af57ea4`](https://gitlab.com/duplicity/duplicity/-/commit/1af57ea4):chg: Add support and tests for new CLI options
|
|
27
|
+
* [`df643666`](https://gitlab.com/duplicity/duplicity/-/commit/df643666):chg: Update Python3 version and dependencies in `debian/control`
|
|
13
28
|
* [`855c6f1c`](https://gitlab.com/duplicity/duplicity/-/commit/855c6f1c):chg: Remove outdated comment for `python3-gnupg` in `debian/control`
|
|
14
29
|
* [`22fae925`](https://gitlab.com/duplicity/duplicity/-/commit/22fae925):chg: Sync README files in `setup.py` and clean up verbosity flags
|
|
15
30
|
* [`978355b4`](https://gitlab.com/duplicity/duplicity/-/commit/978355b4):chg: Enable verbose mode in debian/rules
|
|
@@ -34,6 +49,10 @@ rel.3.2.1.dev2 / 2026-08-20
|
|
|
34
49
|
* [`1dee9e31`](https://gitlab.com/duplicity/duplicity/-/commit/1dee9e31):chg: b2backend prefer b2sdk.v3
|
|
35
50
|
* [`4f4e052e`](https://gitlab.com/duplicity/duplicity/-/commit/4f4e052e):chg: Cleanup some minor issues
|
|
36
51
|
* [`1e0a97dc`](https://gitlab.com/duplicity/duplicity/-/commit/1e0a97dc):chg: Format with Black/PEP8 and ensure file flush before rename
|
|
52
|
+
* [`7514a7e2`](https://gitlab.com/duplicity/duplicity/-/commit/7514a7e2):fix: Correct string formatting in help output and improve test stability
|
|
53
|
+
* [`c179caf1`](https://gitlab.com/duplicity/duplicity/-/commit/c179caf1):fix: Fix GPG sleep processes on verify, modernize tests, and update guidelines
|
|
54
|
+
* [`90f9137e`](https://gitlab.com/duplicity/duplicity/-/commit/90f9137e):fix: Fix subpath creation for rsync #943
|
|
55
|
+
* [`ed58fae5`](https://gitlab.com/duplicity/duplicity/-/commit/ed58fae5):fix: Restore Python versions, dependencies, and revert migration to 'python-gnupg'.
|
|
37
56
|
* [`22da1a0d`](https://gitlab.com/duplicity/duplicity/-/commit/22da1a0d):fix: Resolve PEP8 style issues and whitespace in backend and main modules
|
|
38
57
|
* [`06858c9a`](https://gitlab.com/duplicity/duplicity/-/commit/06858c9a):fix: Replace `os.system` calls with safer Python alternatives.
|
|
39
58
|
* [`da745307`](https://gitlab.com/duplicity/duplicity/-/commit/da745307):fix: Add --ignore-installed flag for pip in Dockerfiles
|
|
@@ -50,6 +69,11 @@ rel.3.2.1.dev2 / 2026-08-20
|
|
|
50
69
|
* [`9819e4d4`](https://gitlab.com/duplicity/duplicity/-/commit/9819e4d4):fix: Add get_last_continuous_volume for reliable backup resumption
|
|
51
70
|
* [`5d737d07`](https://gitlab.com/duplicity/duplicity/-/commit/5d737d07):fix: Postpone metadata promotion to prevent orphaned cache files
|
|
52
71
|
|
|
72
|
+
rel.3.2.0.2 / 2026-08-22
|
|
73
|
+
========================
|
|
74
|
+
|
|
75
|
+
* [`f7ccc81b`](https://gitlab.com/duplicity/duplicity/-/commit/f7ccc81b):chg: Update Python3 version and dependencies in `debian/control`
|
|
76
|
+
|
|
53
77
|
rel.3.2.0.1 / 2026-08-15
|
|
54
78
|
========================
|
|
55
79
|
|
|
@@ -61,24 +85,12 @@ rel.3.2.0.1 / 2026-08-15
|
|
|
61
85
|
* [`f0fb534c`](https://gitlab.com/duplicity/duplicity/-/commit/f0fb534c):chg: Update dependencies, streamline configs, and refine CI
|
|
62
86
|
* [`6d719e1c`](https://gitlab.com/duplicity/duplicity/-/commit/6d719e1c):fix: Resolve PEP8 style issues and whitespace in backend and main modules
|
|
63
87
|
|
|
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
|
-
|
|
75
88
|
rel.3.2.0 / 2026-08-10
|
|
76
89
|
======================
|
|
77
90
|
|
|
78
91
|
* [`8612b567`](https://gitlab.com/duplicity/duplicity/-/commit/8612b567):new: Add get_version() to librsync to retrieve underlying library version
|
|
79
92
|
* [`9dddcfc4`](https://gitlab.com/duplicity/duplicity/-/commit/9dddcfc4):new: Add pure Python librsync implementation using ctypes as fallback
|
|
80
93
|
* [`acaedcfe`](https://gitlab.com/duplicity/duplicity/-/commit/acaedcfe):new: Add coverage configuration and Makefile targets for testing.
|
|
81
|
-
* [`6feeafb1`](https://gitlab.com/duplicity/duplicity/-/commit/6feeafb1):new: Add PyCharm devcontainer configuration and base Dockerfile.
|
|
82
94
|
* [`b3c4b349`](https://gitlab.com/duplicity/duplicity/-/commit/b3c4b349):chg: Update release-prep script to use `check_tags`
|
|
83
95
|
* [`8befb2cf`](https://gitlab.com/duplicity/duplicity/-/commit/8befb2cf):chg: Update release-prep script to fix tag removal and file refs
|
|
84
96
|
* [`33544f8c`](https://gitlab.com/duplicity/duplicity/-/commit/33544f8c):chg: Update pipeline triggers for push, web, and merge request events
|
|
@@ -89,11 +101,6 @@ rel.3.2.0 / 2026-08-10
|
|
|
89
101
|
* [`59ed8f9e`](https://gitlab.com/duplicity/duplicity/-/commit/59ed8f9e):chg: Rewrite `makechangelog` script in Python
|
|
90
102
|
* [`ffc31818`](https://gitlab.com/duplicity/duplicity/-/commit/ffc31818):chg: b2backend prefer b2sdk.v3
|
|
91
103
|
* [`78da5b67`](https://gitlab.com/duplicity/duplicity/-/commit/78da5b67):chg: Cleanup some minor issues
|
|
92
|
-
* [`64264da1`](https://gitlab.com/duplicity/duplicity/-/commit/64264da1):chg: Remove unused Tahoe-LAFS installation steps in Snapcraft
|
|
93
|
-
* [`f4123b7e`](https://gitlab.com/duplicity/duplicity/-/commit/f4123b7e):chg: Add support for additional architectures in Snapcraft
|
|
94
|
-
* [`6f015221`](https://gitlab.com/duplicity/duplicity/-/commit/6f015221):chg: Update Snapcraft to core26 and Python 3.14
|
|
95
|
-
* [`938764f7`](https://gitlab.com/duplicity/duplicity/-/commit/938764f7):chg: Add setuptools dependency to requirements.dev for Python 3.12+
|
|
96
|
-
* [`b17da54e`](https://gitlab.com/duplicity/duplicity/-/commit/b17da54e):chg: Update dependencies in requirements.txt for compatibility.
|
|
97
104
|
* [`47c21150`](https://gitlab.com/duplicity/duplicity/-/commit/47c21150):fix: Replace `os.system` calls with safer Python alternatives.
|
|
98
105
|
* [`12c98f2a`](https://gitlab.com/duplicity/duplicity/-/commit/12c98f2a):fix: Add --ignore-installed flag for pip in Dockerfiles
|
|
99
106
|
* [`b1508a6d`](https://gitlab.com/duplicity/duplicity/-/commit/b1508a6d):fix: restore issue: AssertionError: (b'keys', [...]) not empty
|
|
@@ -105,6 +112,89 @@ rel.3.2.0 / 2026-08-10
|
|
|
105
112
|
* [`c823ed36`](https://gitlab.com/duplicity/duplicity/-/commit/c823ed36):fix: Could not release lockfile
|
|
106
113
|
* [`3d9eab94`](https://gitlab.com/duplicity/duplicity/-/commit/3d9eab94):fix: Comprehensive fix for backup, restart, and cleanup logic.
|
|
107
114
|
|
|
115
|
+
rel.3.2.1.dev3 / 2026-09-23
|
|
116
|
+
===========================
|
|
117
|
+
|
|
118
|
+
* [`d7da150b`](https://gitlab.com/duplicity/duplicity/-/commit/d7da150b):new: Create subpath in rsyncd.
|
|
119
|
+
* [`e181a9e9`](https://gitlab.com/duplicity/duplicity/-/commit/e181a9e9):chg: Improve error handling and signature file filtering logic; add unit tests for B2 and PAR2 backends
|
|
120
|
+
* [`58a54680`](https://gitlab.com/duplicity/duplicity/-/commit/58a54680):chg: Add regex cache invalidation for file prefix changes; update tests
|
|
121
|
+
* [`fcd6920a`](https://gitlab.com/duplicity/duplicity/-/commit/fcd6920a):chg: Add deprecation warnings for CloudFiles, Pyrax, and Hubic backends
|
|
122
|
+
* [`1842e4de`](https://gitlab.com/duplicity/duplicity/-/commit/1842e4de):chg: Remove `python3-gnupg` and restore `gpginterface` module and unit tests.
|
|
123
|
+
* [`a201453e`](https://gitlab.com/duplicity/duplicity/-/commit/a201453e):chg: Plan to remove obsolete Pyrax, CloudFiles, and Hubic backends; standardize on python-swiftclient
|
|
124
|
+
* [`abdf9a0e`](https://gitlab.com/duplicity/duplicity/-/commit/abdf9a0e):chg: Remove unused gnupg import from gpg.py for cleanup.
|
|
125
|
+
* [`bd649791`](https://gitlab.com/duplicity/duplicity/-/commit/bd649791):chg: Split wildcard and multiline imports into individual lines for improved clarity and compliance with coding standards
|
|
126
|
+
* [`993cc651`](https://gitlab.com/duplicity/duplicity/-/commit/993cc651):chg: Decouple selection parsing from core engine and refactor tests
|
|
127
|
+
* [`1af57ea4`](https://gitlab.com/duplicity/duplicity/-/commit/1af57ea4):chg: Add support and tests for new CLI options
|
|
128
|
+
* [`df643666`](https://gitlab.com/duplicity/duplicity/-/commit/df643666):chg: Update Python3 version and dependencies in `debian/control`
|
|
129
|
+
* [`7514a7e2`](https://gitlab.com/duplicity/duplicity/-/commit/7514a7e2):fix: Correct string formatting in help output and improve test stability
|
|
130
|
+
* [`c179caf1`](https://gitlab.com/duplicity/duplicity/-/commit/c179caf1):fix: Fix GPG sleep processes on verify, modernize tests, and update guidelines
|
|
131
|
+
* [`90f9137e`](https://gitlab.com/duplicity/duplicity/-/commit/90f9137e):fix: Fix subpath creation for rsync #943
|
|
132
|
+
* [`ed58fae5`](https://gitlab.com/duplicity/duplicity/-/commit/ed58fae5):fix: Restore Python versions, dependencies, and revert migration to 'python-gnupg'.
|
|
133
|
+
|
|
134
|
+
rel.3.2.1.dev2 / 2026-08-20
|
|
135
|
+
===========================
|
|
136
|
+
|
|
137
|
+
* [`855c6f1c`](https://gitlab.com/duplicity/duplicity/-/commit/855c6f1c):chg: Remove outdated comment for `python3-gnupg` in `debian/control`
|
|
138
|
+
* [`22fae925`](https://gitlab.com/duplicity/duplicity/-/commit/22fae925):chg: Sync README files in `setup.py` and clean up verbosity flags
|
|
139
|
+
* [`978355b4`](https://gitlab.com/duplicity/duplicity/-/commit/978355b4):chg: Enable verbose mode in debian/rules
|
|
140
|
+
* [`626cdccb`](https://gitlab.com/duplicity/duplicity/-/commit/626cdccb):chg: Remove redundant `apt` commands in `debian/rules`
|
|
141
|
+
* [`ba71d094`](https://gitlab.com/duplicity/duplicity/-/commit/ba71d094):chg: Update setuptools to >=61.0.0 in dev dependencies and `debian/rules`
|
|
142
|
+
* [`2b55864a`](https://gitlab.com/duplicity/duplicity/-/commit/2b55864a):chg: Simplify `gnupg` import logic in `gpg.py`
|
|
143
|
+
* [`80abbd02`](https://gitlab.com/duplicity/duplicity/-/commit/80abbd02):chg: Adjust dependencies in `requirements.txt` and `debian/control`
|
|
144
|
+
|
|
145
|
+
rel.3.2.1.dev1 / 2026-08-15
|
|
146
|
+
===========================
|
|
147
|
+
|
|
148
|
+
* [`df52d45b`](https://gitlab.com/duplicity/duplicity/-/commit/df52d45b):chg: Add `python3-gnupg` as a build dependency in `debian/control`
|
|
149
|
+
* [`057c7d0a`](https://gitlab.com/duplicity/duplicity/-/commit/057c7d0a):chg: Update doc cleanup pattern in `debian/rules`
|
|
150
|
+
* [`4eaee861`](https://gitlab.com/duplicity/duplicity/-/commit/4eaee861):chg: Update doc cleanup to remove `duplicity-*` files in `debian/rules`
|
|
151
|
+
* [`7cd8ddb6`](https://gitlab.com/duplicity/duplicity/-/commit/7cd8ddb6):chg: Add `get_data_files` for dynamic data file handling in `setup.py`
|
|
152
|
+
* [`e9bf8843`](https://gitlab.com/duplicity/duplicity/-/commit/e9bf8843):chg: Simplify doc handling by removing outdated duplicity docs
|
|
153
|
+
* [`22da1a0d`](https://gitlab.com/duplicity/duplicity/-/commit/22da1a0d):fix: Resolve PEP8 style issues and whitespace in backend and main modules
|
|
154
|
+
|
|
155
|
+
rel.3.2.1.dev0 / 2026-08-11
|
|
156
|
+
===========================
|
|
157
|
+
|
|
158
|
+
* [`77c5107e`](https://gitlab.com/duplicity/duplicity/-/commit/77c5107e):new: Add get_version() to librsync to retrieve underlying library version
|
|
159
|
+
* [`b839f2c8`](https://gitlab.com/duplicity/duplicity/-/commit/b839f2c8):new: Add pure Python librsync implementation using ctypes as fallback
|
|
160
|
+
* [`ba7957c3`](https://gitlab.com/duplicity/duplicity/-/commit/ba7957c3):new: Add coverage configuration and Makefile targets for testing.
|
|
161
|
+
* [`6feeafb1`](https://gitlab.com/duplicity/duplicity/-/commit/6feeafb1):new: Add PyCharm devcontainer configuration and base Dockerfile.
|
|
162
|
+
* [`4bc93712`](https://gitlab.com/duplicity/duplicity/-/commit/4bc93712):chg: Update dependencies, streamline configs, and refine CI
|
|
163
|
+
* [`ca78d6c5`](https://gitlab.com/duplicity/duplicity/-/commit/ca78d6c5):chg: Update release-prep script to use `check_tags`
|
|
164
|
+
* [`60ae51f3`](https://gitlab.com/duplicity/duplicity/-/commit/60ae51f3):chg: Update release-prep script to fix tag removal and file refs
|
|
165
|
+
* [`45495e09`](https://gitlab.com/duplicity/duplicity/-/commit/45495e09):chg: Update pipeline triggers for push, web, and merge request events
|
|
166
|
+
* [`f8fc71e3`](https://gitlab.com/duplicity/duplicity/-/commit/f8fc71e3):chg: Improve process in `setup.py` and release prep script
|
|
167
|
+
* [`f36c9922`](https://gitlab.com/duplicity/duplicity/-/commit/f36c9922):chg: Refactor versioning and metadata handling
|
|
168
|
+
* [`84afa6f2`](https://gitlab.com/duplicity/duplicity/-/commit/84afa6f2):chg: Refactor string concatenations to f-strings across codebase
|
|
169
|
+
* [`480cbc23`](https://gitlab.com/duplicity/duplicity/-/commit/480cbc23):chg: Clean up and refactor `pyproject.toml` and `Makefile`
|
|
170
|
+
* [`42d4838d`](https://gitlab.com/duplicity/duplicity/-/commit/42d4838d):chg: Rewrite `makechangelog` script in Python
|
|
171
|
+
* [`1dee9e31`](https://gitlab.com/duplicity/duplicity/-/commit/1dee9e31):chg: b2backend prefer b2sdk.v3
|
|
172
|
+
* [`4f4e052e`](https://gitlab.com/duplicity/duplicity/-/commit/4f4e052e):chg: Cleanup some minor issues
|
|
173
|
+
* [`1e0a97dc`](https://gitlab.com/duplicity/duplicity/-/commit/1e0a97dc):chg: Format with Black/PEP8 and ensure file flush before rename
|
|
174
|
+
* [`64264da1`](https://gitlab.com/duplicity/duplicity/-/commit/64264da1):chg: Remove unused Tahoe-LAFS installation steps in Snapcraft
|
|
175
|
+
* [`f4123b7e`](https://gitlab.com/duplicity/duplicity/-/commit/f4123b7e):chg: Add support for additional architectures in Snapcraft
|
|
176
|
+
* [`6f015221`](https://gitlab.com/duplicity/duplicity/-/commit/6f015221):chg: Update Snapcraft to core26 and Python 3.14
|
|
177
|
+
* [`938764f7`](https://gitlab.com/duplicity/duplicity/-/commit/938764f7):chg: Add setuptools dependency to requirements.dev for Python 3.12+
|
|
178
|
+
* [`b17da54e`](https://gitlab.com/duplicity/duplicity/-/commit/b17da54e):chg: Update dependencies in requirements.txt for compatibility.
|
|
179
|
+
* [`06858c9a`](https://gitlab.com/duplicity/duplicity/-/commit/06858c9a):fix: Replace `os.system` calls with safer Python alternatives.
|
|
180
|
+
* [`da745307`](https://gitlab.com/duplicity/duplicity/-/commit/da745307):fix: Add --ignore-installed flag for pip in Dockerfiles
|
|
181
|
+
* [`883cca1e`](https://gitlab.com/duplicity/duplicity/-/commit/883cca1e):fix: restore issue: AssertionError: (b'keys', [...]) not empty
|
|
182
|
+
* [`aa0b23e7`](https://gitlab.com/duplicity/duplicity/-/commit/aa0b23e7):fix: Replace `log.FatalError` with `raise errors.FatalError`.
|
|
183
|
+
* [`c3a45713`](https://gitlab.com/duplicity/duplicity/-/commit/c3a45713):fix: Add support for "sync" action and handle passphrase checks.
|
|
184
|
+
* [`db99858e`](https://gitlab.com/duplicity/duplicity/-/commit/db99858e):fix: Enhance error handling and debug logging in Python modules
|
|
185
|
+
* [`dbb899ad`](https://gitlab.com/duplicity/duplicity/-/commit/dbb899ad):fix: Use 'python-gnupg' instead of our 'gpginterface.py'.
|
|
186
|
+
* [`4d6e9f8c`](https://gitlab.com/duplicity/duplicity/-/commit/4d6e9f8c):fix: PCABackend GET URL needs prefix if one is defined
|
|
187
|
+
* [`d7cd05d8`](https://gitlab.com/duplicity/duplicity/-/commit/d7cd05d8):fix: Could not release lockfile
|
|
188
|
+
* [`fcbe3a7a`](https://gitlab.com/duplicity/duplicity/-/commit/fcbe3a7a):fix: Enforce --force requirement for destructive operations
|
|
189
|
+
* [`c6c8b26a`](https://gitlab.com/duplicity/duplicity/-/commit/c6c8b26a):fix: Enhance BackupSet.delete signature cleanup and fix lock release
|
|
190
|
+
* [`3f0ab55b`](https://gitlab.com/duplicity/duplicity/-/commit/3f0ab55b):fix: Prevent premature deletion of full backups during incremental starts
|
|
191
|
+
* [`9819e4d4`](https://gitlab.com/duplicity/duplicity/-/commit/9819e4d4):fix: Add get_last_continuous_volume for reliable backup resumption
|
|
192
|
+
* [`5d737d07`](https://gitlab.com/duplicity/duplicity/-/commit/5d737d07):fix: Postpone metadata promotion to prevent orphaned cache files
|
|
193
|
+
|
|
194
|
+
rel.3.1.1.dev0 / 2026-06-16
|
|
195
|
+
===========================
|
|
196
|
+
|
|
197
|
+
|
|
108
198
|
rel.3.1.0 / 2026-06-16
|
|
109
199
|
======================
|
|
110
200
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: duplicity
|
|
3
|
-
Version: 3.2.
|
|
3
|
+
Version: 3.2.2.dev0
|
|
4
4
|
Summary: Encrypted backup using rsync algorithm
|
|
5
5
|
Author-email: Kenneth Loafman <kenneth@loafman.com>
|
|
6
6
|
Maintainer: Edgar Soldin, Thomas Laubrock
|
|
@@ -22,16 +22,15 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
22
22
|
Classifier: Programming Language :: Python :: 3.12
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.13
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.14
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
25
26
|
Classifier: Topic :: System :: Archiving :: Backup
|
|
26
|
-
Requires-Python: <3.
|
|
27
|
+
Requires-Python: <3.16,>=3.10
|
|
27
28
|
Description-Content-Type: text/markdown
|
|
28
29
|
License-File: COPYING
|
|
29
30
|
License-File: AUTHORS.md
|
|
30
|
-
Requires-Dist: cryptography==43.0.3
|
|
31
31
|
Requires-Dist: fasteners>=0.19
|
|
32
32
|
Requires-Dist: httplib2
|
|
33
33
|
Requires-Dist: pysocks
|
|
34
|
-
Requires-Dist: python-gnupg
|
|
35
34
|
Requires-Dist: requests
|
|
36
35
|
Requires-Dist: requests-oauthlib
|
|
37
36
|
Requires-Dist: azure-storage-blob
|
|
@@ -22,6 +22,7 @@ sudo apt-get install -y \
|
|
|
22
22
|
par2 \
|
|
23
23
|
python3-dev \
|
|
24
24
|
python3-lxml \
|
|
25
|
+
python3-cryptography \
|
|
25
26
|
python3-pip \
|
|
26
27
|
python3-venv \
|
|
27
28
|
python3 \
|
|
@@ -85,7 +86,6 @@ sudo apt-get install -y \
|
|
|
85
86
|
python3-fasteners \
|
|
86
87
|
python3-httplib2 \
|
|
87
88
|
python3-socks \
|
|
88
|
-
python3-gnupg \
|
|
89
89
|
python3-requests \
|
|
90
90
|
python3-requests-oauthlib \
|
|
91
91
|
python3-azure-storage-blob \
|
|
@@ -130,7 +130,6 @@ sudo apt-get install -y \
|
|
|
130
130
|
python3-fasteners \
|
|
131
131
|
python3-httplib2 \
|
|
132
132
|
python3-socks \
|
|
133
|
-
python3-gnupg \
|
|
134
133
|
python3-requests \
|
|
135
134
|
python3-requests-oauthlib \
|
|
136
135
|
python3-azure-storage-blob \
|
|
@@ -16,7 +16,7 @@ environment. You can run tests on your branch as follows:
|
|
|
16
16
|
|
|
17
17
|
Please test your branch using this method and ensure all tests pass before submitting a merge request.
|
|
18
18
|
|
|
19
|
-
The decorator `@
|
|
19
|
+
The decorator `@pytest.mark.xfail` can be used to commit a known-failing test case without breaking the test
|
|
20
20
|
suite, for example to exhibit the behaviour in a bug report before it has been fixed.
|
|
21
21
|
|
|
22
22
|
## Manual testing and running individual tests
|
|
@@ -34,3 +34,4 @@ See _Dependencies for testing_ to setup your environment.
|
|
|
34
34
|
## Dependencies for testing
|
|
35
35
|
If you should prefer to execute the tests locally without using Docker, see [README-INSTALL.md](README-INSTALL.md) for
|
|
36
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.
|
|
@@ -68,8 +68,8 @@ def dup_run():
|
|
|
68
68
|
pass
|
|
69
69
|
elif os.environ.get("CIBUILDWHEEL") is not None:
|
|
70
70
|
pass
|
|
71
|
-
elif not ((3, 10) <= sys.version_info[:2] <= (3,
|
|
72
|
-
print("Sorry, duplicity requires Python version 3.10 thru 3.
|
|
71
|
+
elif not ((3, 10) <= sys.version_info[:2] <= (3, 15)):
|
|
72
|
+
print("Sorry, duplicity requires Python version 3.10 thru 3.15.", file=sys.stderr)
|
|
73
73
|
sys.exit(1)
|
|
74
74
|
|
|
75
75
|
try:
|
|
@@ -366,10 +366,45 @@ class ParsedUrl(object):
|
|
|
366
366
|
|
|
367
367
|
def strip_auth_from_url(parsed_url):
|
|
368
368
|
"""
|
|
369
|
-
Return a URL from a urlparse object without
|
|
369
|
+
Return a URL from a urlparse object or string without username, password, or sensitive query parameters.
|
|
370
370
|
"""
|
|
371
|
+
url_string = parsed_url.geturl() if hasattr(parsed_url, "geturl") else str(parsed_url)
|
|
372
|
+
clean_url = re.sub(r"^([^:/]+://)(.*@)?(.*)", r"\1\3", url_string)
|
|
373
|
+
|
|
374
|
+
if "?" in clean_url:
|
|
375
|
+
try:
|
|
376
|
+
parts = urllib.parse.urlsplit(clean_url)
|
|
377
|
+
if parts.query:
|
|
378
|
+
query_tuples = urllib.parse.parse_qsl(parts.query, keep_blank_values=True)
|
|
379
|
+
sanitized_query = []
|
|
380
|
+
sensitive_keys = {
|
|
381
|
+
"key",
|
|
382
|
+
"token",
|
|
383
|
+
"secret",
|
|
384
|
+
"password",
|
|
385
|
+
"pass",
|
|
386
|
+
"passwd",
|
|
387
|
+
"signature",
|
|
388
|
+
"api_key",
|
|
389
|
+
"apikey",
|
|
390
|
+
"auth",
|
|
391
|
+
"auth_token",
|
|
392
|
+
"access_token",
|
|
393
|
+
"secret_key",
|
|
394
|
+
}
|
|
395
|
+
for k, v in query_tuples:
|
|
396
|
+
k_lower = k.lower()
|
|
397
|
+
if k_lower in sensitive_keys or any(
|
|
398
|
+
s in k_lower for s in ("secret", "token", "password", "passwd", "sig")
|
|
399
|
+
):
|
|
400
|
+
sanitized_query.append((k, "REDACTED"))
|
|
401
|
+
else:
|
|
402
|
+
sanitized_query.append((k, v))
|
|
403
|
+
new_query = urllib.parse.urlencode(sanitized_query)
|
|
404
|
+
clean_url = urllib.parse.urlunsplit((parts.scheme, parts.netloc, parts.path, new_query, parts.fragment))
|
|
405
|
+
except Exception:
|
|
406
|
+
pass
|
|
371
407
|
|
|
372
|
-
clean_url = re.sub("^([^:/]+://)(.*@)?(.*)", r"\1\3", parsed_url.geturl())
|
|
373
408
|
return clean_url
|
|
374
409
|
|
|
375
410
|
|
|
@@ -65,7 +65,7 @@ class TrackRecord:
|
|
|
65
65
|
) # trace backs can't be pickled, store as string, to get it over into main process
|
|
66
66
|
result: object = None # must be picklable
|
|
67
67
|
log_prefix: str = ""
|
|
68
|
-
start_time: datetime = field(
|
|
68
|
+
start_time: datetime = field(default_factory=datetime.now)
|
|
69
69
|
stop_time: datetime = field(default=datetime.min)
|
|
70
70
|
|
|
71
71
|
def __post_init__(self):
|
|
@@ -277,7 +277,7 @@ class BackendPool:
|
|
|
277
277
|
end = len(self.all_results)
|
|
278
278
|
for result in self.all_results[self._last_results_reported : end]:
|
|
279
279
|
yield result
|
|
280
|
-
self._last_results_reported
|
|
280
|
+
self._last_results_reported += 1
|
|
281
281
|
|
|
282
282
|
def get_stats(self, last_index=None):
|
|
283
283
|
"""
|
|
@@ -323,16 +323,14 @@ class BackendPool:
|
|
|
323
323
|
:param bool cancel_futures: Whether to cancel any pending futures.
|
|
324
324
|
"""
|
|
325
325
|
log.Debug("Process Pool: Start shutdown.")
|
|
326
|
-
|
|
327
|
-
self.ppe.shutdown(wait=wait, cancel_futures=cancel_futures)
|
|
328
|
-
else:
|
|
329
|
-
self.ppe.shutdown(wait=wait)
|
|
326
|
+
self.ppe.shutdown(wait=wait, cancel_futures=cancel_futures)
|
|
330
327
|
log.Debug("Process Pool: Shutdown done.")
|
|
331
328
|
|
|
332
329
|
|
|
333
330
|
# code to run/test the pool independent, not relevant for duplicity
|
|
334
331
|
if __name__ == "__main__":
|
|
335
|
-
from duplicity import config
|
|
332
|
+
from duplicity import config
|
|
333
|
+
from duplicity import log
|
|
336
334
|
|
|
337
335
|
log.setup()
|
|
338
336
|
log.add_file("/tmp/tmp.log")
|
|
@@ -42,6 +42,12 @@ class CloudFilesBackend(duplicity.backend.Backend):
|
|
|
42
42
|
|
|
43
43
|
:param ParsedUrl parsed_url: The parsed URL.
|
|
44
44
|
"""
|
|
45
|
+
log.Warn(
|
|
46
|
+
"DEPRECATION NOTICE: The cloudfiles backend will be removed with the next major version release. "
|
|
47
|
+
"It is based on the outdated pyrax library that is no longer being developed or supported. "
|
|
48
|
+
"As instant replacement consider using either `swift://` or `rclone://` backend."
|
|
49
|
+
)
|
|
50
|
+
|
|
45
51
|
super().__init__(parsed_url)
|
|
46
52
|
try:
|
|
47
53
|
from cloudfiles import Connection
|
|
@@ -53,6 +59,7 @@ class CloudFilesBackend(duplicity.backend.Backend):
|
|
|
53
59
|
Exception: {str(e)}""")
|
|
54
60
|
|
|
55
61
|
self.resp_exc = ResponseError
|
|
62
|
+
self.nso_exc = NoSuchObject
|
|
56
63
|
conn_kwargs = {}
|
|
57
64
|
|
|
58
65
|
if "CLOUDFILES_USERNAME" not in os.environ:
|
|
@@ -81,7 +88,7 @@ Exception: {str(e)}""")
|
|
|
81
88
|
self.container = conn.create_container(container)
|
|
82
89
|
|
|
83
90
|
def _error_code(self, operation, e): # pylint: disable=unused-argument
|
|
84
|
-
if isinstance(e,
|
|
91
|
+
if isinstance(e, self.nso_exc):
|
|
85
92
|
return log.ErrorCode.backend_not_found
|
|
86
93
|
elif isinstance(e, self.resp_exc):
|
|
87
94
|
if e.status == 404:
|
|
@@ -44,6 +44,12 @@ class PyraxBackend(duplicity.backend.Backend):
|
|
|
44
44
|
"""
|
|
45
45
|
duplicity.backend.Backend.__init__(self, parsed_url)
|
|
46
46
|
|
|
47
|
+
log.Warn(
|
|
48
|
+
"DEPRECATION NOTICE: The cloudfiles pyrax backend will be removed with the next major version release. "
|
|
49
|
+
"It is based on the outdated python-cloudfiles library that is no longer being developed or supported. "
|
|
50
|
+
"As instant replacement consider using either `swift://` or `rclone://` backend."
|
|
51
|
+
)
|
|
52
|
+
|
|
47
53
|
try:
|
|
48
54
|
import pyrax
|
|
49
55
|
except ImportError as e:
|
|
@@ -37,7 +37,8 @@ from duplicity import progress
|
|
|
37
37
|
from duplicity.errors import BackendException
|
|
38
38
|
from duplicity.errors import FatalBackendException
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
DownloadDestLocalFile = None
|
|
41
|
+
FileVersionInfoFactory = None
|
|
41
42
|
|
|
42
43
|
|
|
43
44
|
class B2ProgressListener(object):
|
|
@@ -217,10 +218,24 @@ class B2Backend(duplicity.backend.Backend):
|
|
|
217
218
|
log.Log(f"Delete: {full_filename}", log.INFO)
|
|
218
219
|
|
|
219
220
|
if config.b2_hide_files:
|
|
220
|
-
|
|
221
|
+
try:
|
|
222
|
+
self.bucket.hide_file(full_filename)
|
|
223
|
+
except Exception as e:
|
|
224
|
+
code = self._error_code("delete", e)
|
|
225
|
+
if code == log.ErrorCode.backend_not_found:
|
|
226
|
+
log.Debug(f"B2Backend._delete: file {full_filename} not found, already deleted")
|
|
227
|
+
return
|
|
228
|
+
raise
|
|
221
229
|
else:
|
|
222
|
-
|
|
223
|
-
|
|
230
|
+
try:
|
|
231
|
+
file_version_info = self.file_info(quote_plus(full_filename, "/"))
|
|
232
|
+
self.bucket.delete_file_version(file_version_info.id_, file_version_info.file_name)
|
|
233
|
+
except Exception as e:
|
|
234
|
+
code = self._error_code("delete", e)
|
|
235
|
+
if code == log.ErrorCode.backend_not_found:
|
|
236
|
+
log.Debug(f"B2Backend._delete: file {full_filename} not found, already deleted")
|
|
237
|
+
return
|
|
238
|
+
raise
|
|
224
239
|
|
|
225
240
|
def _query(self, filename):
|
|
226
241
|
"""
|
|
@@ -231,14 +246,25 @@ class B2Backend(duplicity.backend.Backend):
|
|
|
231
246
|
:rtype: dict
|
|
232
247
|
"""
|
|
233
248
|
log.Log(f"Query: {self.path}{os.fsdecode(filename)}", log.INFO)
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
249
|
+
try:
|
|
250
|
+
file_version_info = self.file_info(quote_plus(self.path + os.fsdecode(filename), "/"))
|
|
251
|
+
return {
|
|
252
|
+
"size": (
|
|
253
|
+
int(file_version_info.size)
|
|
254
|
+
if file_version_info is not None and file_version_info.size is not None
|
|
255
|
+
else -1
|
|
256
|
+
)
|
|
257
|
+
}
|
|
258
|
+
except Exception as e:
|
|
259
|
+
code = self._error_code("query", e)
|
|
260
|
+
if code == log.ErrorCode.backend_not_found:
|
|
261
|
+
return {"size": -1}
|
|
262
|
+
raise
|
|
263
|
+
|
|
264
|
+
def _error_code(self, operation, e):
|
|
265
|
+
if e.__class__.__name__ in ("FileNotPresent", "NonExistentBucket") or str(e) == "File not found":
|
|
266
|
+
return log.ErrorCode.backend_not_found
|
|
267
|
+
return log.ErrorCode.backend_error
|
|
242
268
|
|
|
243
269
|
def file_info(self, filename):
|
|
244
270
|
if self.v_num >= [1, 9, 0]:
|
|
@@ -25,6 +25,7 @@ Box backend.
|
|
|
25
25
|
import os
|
|
26
26
|
|
|
27
27
|
import duplicity.backend
|
|
28
|
+
from duplicity import log
|
|
28
29
|
from duplicity.errors import BackendException
|
|
29
30
|
|
|
30
31
|
|
|
@@ -97,8 +98,14 @@ class BoxBackend(duplicity.backend.Backend):
|
|
|
97
98
|
"""
|
|
98
99
|
Deletes file from the specified remote path
|
|
99
100
|
"""
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
try:
|
|
102
|
+
self.delete(remote_file=filename.decode())
|
|
103
|
+
except Exception as e:
|
|
104
|
+
code = self._error_code("delete", e)
|
|
105
|
+
if code == log.ErrorCode.backend_not_found:
|
|
106
|
+
log.Debug(f"BoxBackend._delete: file {filename.decode()} not found, already deleted")
|
|
107
|
+
return
|
|
108
|
+
raise
|
|
102
109
|
|
|
103
110
|
def _query_list(self, filename_list):
|
|
104
111
|
"""
|
|
@@ -106,6 +113,17 @@ class BoxBackend(duplicity.backend.Backend):
|
|
|
106
113
|
"""
|
|
107
114
|
return {filename: self._file_to_metadata_map.get(filename.decode(), {"size": -1}) for filename in filename_list}
|
|
108
115
|
|
|
116
|
+
def _error_code(self, operation, e):
|
|
117
|
+
if getattr(e, "code", None) == log.ErrorCode.backend_not_found:
|
|
118
|
+
return log.ErrorCode.backend_not_found
|
|
119
|
+
if getattr(e, "status", None) == 404:
|
|
120
|
+
return log.ErrorCode.backend_not_found
|
|
121
|
+
if getattr(e, "code", None) in (404, "not_found"):
|
|
122
|
+
return log.ErrorCode.backend_not_found
|
|
123
|
+
if "not found" in str(e).lower() or "does not exist" in str(e).lower():
|
|
124
|
+
return log.ErrorCode.backend_not_found
|
|
125
|
+
return log.ErrorCode.backend_error
|
|
126
|
+
|
|
109
127
|
def get_id_from_path(self, remote_path, parent_id="0"):
|
|
110
128
|
"""
|
|
111
129
|
Get the folder or file id from its path
|
|
@@ -142,6 +160,8 @@ class BoxBackend(duplicity.backend.Backend):
|
|
|
142
160
|
return file["id"]
|
|
143
161
|
|
|
144
162
|
file_id = self.get_id_from_path(remote_filename, parent_id=self._folder_id)
|
|
163
|
+
if file_id is None:
|
|
164
|
+
return None
|
|
145
165
|
file = self._client.file(file_id).get()
|
|
146
166
|
self._file_to_metadata_map[file.name] = {
|
|
147
167
|
"id": file.id,
|
|
@@ -210,6 +230,8 @@ class BoxBackend(duplicity.backend.Backend):
|
|
|
210
230
|
Download file in box folder
|
|
211
231
|
"""
|
|
212
232
|
file_id = self.get_file_id_from_filename(remote_file)
|
|
233
|
+
if file_id is None:
|
|
234
|
+
raise BackendException(f"File {remote_file} not found.", code=log.ErrorCode.backend_not_found)
|
|
213
235
|
with open(local_file, "wb") as fp:
|
|
214
236
|
self._client.file(file_id).download_to(fp)
|
|
215
237
|
|
|
@@ -218,7 +240,20 @@ class BoxBackend(duplicity.backend.Backend):
|
|
|
218
240
|
Delete file in box folder
|
|
219
241
|
"""
|
|
220
242
|
file_id = self.get_file_id_from_filename(remote_file)
|
|
221
|
-
|
|
243
|
+
if file_id is None:
|
|
244
|
+
self._file_to_metadata_map.pop(remote_file, None)
|
|
245
|
+
log.Debug(f"BoxBackend.delete: file {remote_file} not found, already deleted")
|
|
246
|
+
return
|
|
247
|
+
try:
|
|
248
|
+
self._client.file(file_id).delete()
|
|
249
|
+
except Exception as e:
|
|
250
|
+
code = self._error_code("delete", e)
|
|
251
|
+
if code == log.ErrorCode.backend_not_found:
|
|
252
|
+
log.Debug(f"BoxBackend.delete: file {remote_file} not found, already deleted")
|
|
253
|
+
return
|
|
254
|
+
raise
|
|
255
|
+
finally:
|
|
256
|
+
self._file_to_metadata_map.pop(remote_file, None)
|
|
222
257
|
|
|
223
258
|
|
|
224
259
|
duplicity.backend.register_backend("box", BoxBackend)
|
|
@@ -46,6 +46,11 @@ class HubicBackend(PyraxBackend):
|
|
|
46
46
|
"""
|
|
47
47
|
duplicity.backend.Backend.__init__(self, parsed_url)
|
|
48
48
|
|
|
49
|
+
log.Warn(
|
|
50
|
+
"DEPRECATION NOTICE: The hubic backend will be removed with the next major version release. "
|
|
51
|
+
"the hubiC service was shut down in 2022. the pyrax access library is outdated."
|
|
52
|
+
)
|
|
53
|
+
|
|
49
54
|
try:
|
|
50
55
|
import pyrax
|
|
51
56
|
except ImportError as e:
|
|
@@ -493,8 +493,7 @@ class IDriveBackend(duplicity.backend.Backend):
|
|
|
493
493
|
# For each filename in list: take-out size (index 1) for requested filename (index -1)
|
|
494
494
|
info = {}
|
|
495
495
|
for filename in filename_list:
|
|
496
|
-
if filtered
|
|
497
|
-
result = [x[1] for x in filtered if x[-1] == filename.decode("utf-8")]
|
|
496
|
+
result = [x[1] for x in filtered if x[-1] == filename.decode("utf-8")] if filtered else []
|
|
498
497
|
if result:
|
|
499
498
|
info[filename] = {"size": int(result[0])}
|
|
500
499
|
else:
|
|
@@ -47,7 +47,8 @@ import ssl
|
|
|
47
47
|
socket.sslerror = ssl.SSLError
|
|
48
48
|
|
|
49
49
|
from duplicity import config
|
|
50
|
-
from duplicity
|
|
50
|
+
from duplicity import log
|
|
51
|
+
from duplicity.errors import BackendException
|
|
51
52
|
import duplicity.backend
|
|
52
53
|
|
|
53
54
|
|
|
@@ -33,6 +33,8 @@ import duplicity.backend
|
|
|
33
33
|
from duplicity import log
|
|
34
34
|
from duplicity.errors import BackendException
|
|
35
35
|
|
|
36
|
+
global JFSNotFoundError
|
|
37
|
+
|
|
36
38
|
|
|
37
39
|
def get_jotta_device(jfs):
|
|
38
40
|
jottadev = None
|
|
@@ -87,6 +89,7 @@ class JottaCloudBackend(duplicity.backend.Backend):
|
|
|
87
89
|
|
|
88
90
|
# Import JottaCloud libraries.
|
|
89
91
|
try:
|
|
92
|
+
global JFSNotFoundError
|
|
90
93
|
from jottalib import JFS
|
|
91
94
|
from jottalib.JFS import JFSNotFoundError
|
|
92
95
|
from jottalib.JFS import JFSIncompleteFile
|