duplicity 3.0.8.dev4__tar.gz → 3.0.8.dev6__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.0.8.dev4 → duplicity-3.0.8.dev6}/AUTHORS.md +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/CHANGELOG.md +14 -0
- {duplicity-3.0.8.dev4/duplicity.egg-info → duplicity-3.0.8.dev6}/PKG-INFO +3 -4
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/__init__.py +3 -3
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/__main__.py +5 -3
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backend_pool.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/__init__.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/_cf_cloudfiles.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/_cf_pyrax.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/_testbackend.py +7 -8
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/adbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/azurebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/b2backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/boxbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/cfbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/dpbxbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/gdocsbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/gdrivebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/giobackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/hsibackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/hubicbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/idrivedbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/imapbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/jottacloudbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/lftpbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/localbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/mediafirebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/megabackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/megav2backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/megav3backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/multibackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/ncftpbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/onedrivebackend.py +7 -7
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/par2backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/pcabackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/pydrivebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/pyrax_identity/__init__.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/pyrax_identity/hubic.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/rclonebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/rsyncbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/s3_boto3_backend.py +5 -5
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/slatebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/ssh_paramiko_backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/ssh_pexpect_backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/swiftbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/sxbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/tahoebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/webdavbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/backends/xorrisobackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/cached_ops.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/cli_data.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/cli_main.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/cli_util.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/config.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/diffdir.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/dup_collections.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/dup_main.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/dup_tarfile.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/dup_temp.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/dup_time.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/errors.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/filechunkio.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/globmatch.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/gpg.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/gpginterface.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/lazy.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/librsync.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/log.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/manifest.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/patchdir.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/path.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/progress.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/robust.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/selection.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/statistics.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/tempdir.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/util.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6/duplicity.egg-info}/PKG-INFO +3 -4
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity.egg-info/SOURCES.txt +0 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity.egg-info/requires.txt +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/man/duplicity.1 +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/af_ZA/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/ar_SA/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/ca_ES/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/cs_CZ/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/da_DK/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/de_AT/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/de_DE/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/el_GR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/en_AU/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/en_GB/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/en_PR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/en_US/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/es_EM/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/es_ES/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/es_MX/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/es_PR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/es_US/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/fi_FI/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/fr_FR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/he_IL/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/hu_HU/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/it_IT/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/ja_JP/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/ko_KR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/nl_BE/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/nl_NL/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/nl_SR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/no_NO/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/pl_PL/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/pt_BR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/pt_PT/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/ro_RO/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/ru_BY/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/ru_MD/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/ru_RU/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/ru_UA/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/sr_SP/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/sv_SE/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/tr_TR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/uk_UA/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/vi_VN/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/zh_CN/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/zh_HK/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/zh_MO/duplicity.mo +0 -0
- duplicity-3.0.8.dev6/po/zh_SG/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/po/zh_TW/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/pyproject.toml +28 -33
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/requirements.txt +2 -2
- duplicity-3.0.8.dev6/setup.cfg +4 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/setup.py +6 -10
- duplicity-3.0.8.dev4/po/zh_SG/duplicity.mo +0 -0
- duplicity-3.0.8.dev4/setup.cfg +0 -8
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/COPYING +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/README-LOG.md +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/README-REPO.md +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/README-TESTING.md +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/README.md +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/_librsyncmodule.c +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/argparse311.py +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity/file_naming.py +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity.egg-info/dependency_links.txt +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity.egg-info/entry_points.txt +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.0.8.dev6}/duplicity.egg-info/top_level.txt +0 -0
|
@@ -32,7 +32,7 @@ Duplicity Authors
|
|
|
32
32
|
- Stefan Breunig <stefan-duplicity@breunig.xyz>
|
|
33
33
|
- Steve Tynor <steve.tynor@gmail.com>
|
|
34
34
|
- Thomas Harning Jr <harningt@gmail.com>
|
|
35
|
-
- Thomas Laubrock
|
|
35
|
+
- Thomas Laubrock <duplicity-talk@schmu.net>
|
|
36
36
|
- Tomas Vondra (Launchpad id: tomas-v)
|
|
37
37
|
- Xavier Lucas <xavier.lucas@corp.ovh.com>
|
|
38
38
|
- Yigal Asnis
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
|
|
2
|
+
(Unreleased) / 2026-05-12
|
|
3
|
+
=========================
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
rel.3.0.8.dev5 / 2026-05-12
|
|
8
|
+
===========================
|
|
9
|
+
|
|
10
|
+
* 3997156c:chg: Update README-RELEASE.md.
|
|
11
|
+
* 0f5430db:fix: Fix so GNUPGHOME is not changed in production.
|
|
12
|
+
* 53cc9659:fix: lower boto warning log level, rephrase.
|
|
13
|
+
* 88bfc75e:chg: Misc cleanups for developers
|
|
14
|
+
* 4b0bb8d5:chg: Update 'release pip version' in README-RELEASE.md.
|
|
15
|
+
|
|
2
16
|
rel.3.0.8.dev4 / 2026-03-31
|
|
3
17
|
===========================
|
|
4
18
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: duplicity
|
|
3
|
-
Version: 3.0.8.
|
|
3
|
+
Version: 3.0.8.dev6
|
|
4
4
|
Summary: Encrypted backup using rsync algorithm
|
|
5
5
|
Author-email: Kenneth Loafman <kenneth@loafman.com>
|
|
6
6
|
Maintainer: Edgar Soldin, Thomas Laubrock
|
|
@@ -18,14 +18,13 @@ Classifier: Operating System :: MacOS
|
|
|
18
18
|
Classifier: Operating System :: POSIX
|
|
19
19
|
Classifier: Programming Language :: C
|
|
20
20
|
Classifier: Programming Language :: Python :: 3
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
22
21
|
Classifier: Programming Language :: Python :: 3.10
|
|
23
22
|
Classifier: Programming Language :: Python :: 3.11
|
|
24
23
|
Classifier: Programming Language :: Python :: 3.12
|
|
25
24
|
Classifier: Programming Language :: Python :: 3.13
|
|
26
25
|
Classifier: Programming Language :: Python :: 3.14
|
|
27
26
|
Classifier: Topic :: System :: Archiving :: Backup
|
|
28
|
-
Requires-Python:
|
|
27
|
+
Requires-Python: >=3.10
|
|
29
28
|
Description-Content-Type: text/markdown
|
|
30
29
|
License-File: COPYING
|
|
31
30
|
License-File: AUTHORS.md
|
|
@@ -45,7 +44,7 @@ Requires-Dist: httplib2
|
|
|
45
44
|
Requires-Dist: pysocks
|
|
46
45
|
Requires-Dist: jottalib
|
|
47
46
|
Requires-Dist: keyring
|
|
48
|
-
Requires-Dist: lxml
|
|
47
|
+
Requires-Dist: lxml
|
|
49
48
|
Requires-Dist: mediafire
|
|
50
49
|
Requires-Dist: megatools
|
|
51
50
|
Requires-Dist: paramiko
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4;
|
|
1
|
+
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4; coding:utf-8 -*-
|
|
2
2
|
#
|
|
3
3
|
# Copyright 2002 Ben Escoto
|
|
4
4
|
# Copyright 2007 Kenneth Loafman
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
import gettext
|
|
23
23
|
|
|
24
|
-
__version__: str = "3.0.8.
|
|
25
|
-
__reldate__: str = "
|
|
24
|
+
__version__: str = "3.0.8.dev6"
|
|
25
|
+
__reldate__: str = "May 12, 2026"
|
|
26
26
|
|
|
27
27
|
gettext.install("duplicity", names=["ngettext"])
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4;
|
|
2
|
+
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4; coding:utf-8 -*-
|
|
3
3
|
#
|
|
4
4
|
# duplicity -- Encrypted bandwidth efficient backup
|
|
5
5
|
#
|
|
@@ -62,8 +62,10 @@ def dup_run():
|
|
|
62
62
|
# check that we can function here
|
|
63
63
|
if os.environ.get("PYTEST_VERSION") is not None:
|
|
64
64
|
pass
|
|
65
|
-
elif
|
|
66
|
-
|
|
65
|
+
elif os.environ.get("CIBUILDWHEEL") is not None:
|
|
66
|
+
pass
|
|
67
|
+
elif not ((3, 10) <= sys.version_info[:2] <= (3, 14)):
|
|
68
|
+
print("Sorry, duplicity requires Python version 3.10 thru 3.14.", file=sys.stderr)
|
|
67
69
|
sys.exit(1)
|
|
68
70
|
|
|
69
71
|
try:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4;
|
|
1
|
+
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4; coding:utf-8 -*-
|
|
2
2
|
#
|
|
3
3
|
# Copyright 2002 Ben Escoto
|
|
4
4
|
# Copyright 2007 Kenneth Loafman
|
|
@@ -25,19 +25,16 @@ import inspect
|
|
|
25
25
|
import json
|
|
26
26
|
import logging
|
|
27
27
|
import os
|
|
28
|
-
from random import random
|
|
29
28
|
import re
|
|
30
29
|
import sys
|
|
31
30
|
import time
|
|
31
|
+
from random import random
|
|
32
32
|
|
|
33
33
|
import duplicity.backend
|
|
34
|
-
from duplicity import
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
progress,
|
|
38
|
-
)
|
|
34
|
+
from duplicity import log
|
|
35
|
+
from duplicity import path
|
|
36
|
+
from duplicity import progress
|
|
39
37
|
from duplicity.errors import BackendException
|
|
40
|
-
from testing import _runtest_dir
|
|
41
38
|
|
|
42
39
|
|
|
43
40
|
class BackendErrors:
|
|
@@ -66,6 +63,8 @@ class _TestBackend(duplicity.backend.Backend):
|
|
|
66
63
|
|
|
67
64
|
def __init__(self, parsed_url):
|
|
68
65
|
super().__init__(parsed_url)
|
|
66
|
+
from testing import _runtest_dir
|
|
67
|
+
|
|
69
68
|
log._logger.addHandler(logging.FileHandler(f"{_runtest_dir}/testbackend.log"))
|
|
70
69
|
log.Warn("TestBackend is not made for production use!")
|
|
71
70
|
# The URL form "file:MyFile" is not a valid duplicity target.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4;
|
|
1
|
+
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4; coding:utf-8 -*-
|
|
2
2
|
# vim:tabstop=4:shiftwidth=4:expandtab
|
|
3
3
|
#
|
|
4
4
|
# Copyright 2014 Google Inc.
|
|
@@ -92,7 +92,7 @@ class OneDriveBackend(duplicity.backend.Backend):
|
|
|
92
92
|
def _list(self):
|
|
93
93
|
accum = []
|
|
94
94
|
# Strip last slash, because graph can give a 404 in some cases with it
|
|
95
|
-
next_url = self.API_URI
|
|
95
|
+
next_url = f"{self.API_URI}{self.directory_onedrive_path.rstrip('/')}:/children"
|
|
96
96
|
while True:
|
|
97
97
|
response = self.http_client.get(next_url, timeout=config.timeout)
|
|
98
98
|
if response.status_code == 404:
|
|
@@ -114,7 +114,7 @@ class OneDriveBackend(duplicity.backend.Backend):
|
|
|
114
114
|
remote_filename = remote_filename.decode("UTF-8")
|
|
115
115
|
with local_path.open("wb") as f:
|
|
116
116
|
response = self.http_client.get(
|
|
117
|
-
self.API_URI
|
|
117
|
+
f"{self.API_URI}{self.directory_onedrive_path}{remote_filename}:/content",
|
|
118
118
|
stream=True,
|
|
119
119
|
timeout=config.timeout,
|
|
120
120
|
)
|
|
@@ -132,7 +132,7 @@ class OneDriveBackend(duplicity.backend.Backend):
|
|
|
132
132
|
remote_filename = remote_filename.decode("UTF-8")
|
|
133
133
|
source_size = os.path.getsize(source_path.name)
|
|
134
134
|
start = time.time()
|
|
135
|
-
response = self.http_client.get(self.API_URI
|
|
135
|
+
response = self.http_client.get(f"{self.API_URI}{self.drive_root}?$select=quota", timeout=config.timeout)
|
|
136
136
|
response.raise_for_status()
|
|
137
137
|
if "quota" in response.json():
|
|
138
138
|
available = response.json()["quota"].get("remaining", None)
|
|
@@ -149,7 +149,7 @@ class OneDriveBackend(duplicity.backend.Backend):
|
|
|
149
149
|
|
|
150
150
|
with source_path.open() as source_file:
|
|
151
151
|
start = time.time()
|
|
152
|
-
url = self.API_URI
|
|
152
|
+
url = f"{self.API_URI}{self.directory_onedrive_path}{remote_filename}:/createUploadSession"
|
|
153
153
|
|
|
154
154
|
response = self.http_client.post(url, timeout=config.timeout)
|
|
155
155
|
response.raise_for_status()
|
|
@@ -309,7 +309,7 @@ class DefaultOAuth2Session(OneDriveOAuth2Session):
|
|
|
309
309
|
# refreshed successfully, which will happen under the covers). In case
|
|
310
310
|
# this request fails, the provided token was too old (i.e. expired),
|
|
311
311
|
# and we need to get a new token.
|
|
312
|
-
user_info_response = self.session.get(api_uri
|
|
312
|
+
user_info_response = self.session.get(f"{api_uri}me", timeout=config.timeout)
|
|
313
313
|
if user_info_response.status_code != 200:
|
|
314
314
|
token = None
|
|
315
315
|
|
|
@@ -335,7 +335,7 @@ class DefaultOAuth2Session(OneDriveOAuth2Session):
|
|
|
335
335
|
timeout=config.timeout,
|
|
336
336
|
)
|
|
337
337
|
|
|
338
|
-
user_info_response = self.session.get(api_uri
|
|
338
|
+
user_info_response = self.session.get(f"{api_uri}me", timeout=config.timeout)
|
|
339
339
|
user_info_response.raise_for_status()
|
|
340
340
|
|
|
341
341
|
try:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4;
|
|
1
|
+
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4; coding:utf-8 -*-
|
|
2
2
|
#
|
|
3
3
|
# Copyright 2002 Ben Escoto
|
|
4
4
|
# Copyright 2007 Kenneth Loafman
|
|
@@ -106,10 +106,10 @@ class S3Boto3Backend(duplicity.backend.Backend):
|
|
|
106
106
|
if config.s3_endpoint_url and not re.match(
|
|
107
107
|
pattern="(?i).*\\.amazonaws\\.com(/+)?$", string=config.s3_endpoint_url
|
|
108
108
|
):
|
|
109
|
-
log.
|
|
110
|
-
"WARNING:
|
|
111
|
-
"
|
|
112
|
-
"
|
|
109
|
+
log.Notice(
|
|
110
|
+
"WARNING: If boto3 >= 1,36.0 with non-amazon s3 services"
|
|
111
|
+
" results in checksum errors preventing uploads you may try"
|
|
112
|
+
" the following workaround. set the following env vars\n\n"
|
|
113
113
|
" export AWS_REQUEST_CHECKSUM_CALCULATION=when_required\n"
|
|
114
114
|
" export AWS_RESPONSE_CHECKSUM_VALIDATION=when_required\n\n"
|
|
115
115
|
"see https://gitlab.com/duplicity/duplicity/-/issues/870 for details."
|