duplicity 3.0.8.dev4__tar.gz → 3.1.0.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.0.8.dev4 → duplicity-3.1.0.dev0}/AUTHORS.md +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/CHANGELOG.md +23 -0
- {duplicity-3.0.8.dev4/duplicity.egg-info → duplicity-3.1.0.dev0}/PKG-INFO +4 -5
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/README.md +2 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/__init__.py +3 -3
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/__main__.py +5 -3
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backend_pool.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/__init__.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/_cf_cloudfiles.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/_cf_pyrax.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/_testbackend.py +7 -8
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/adbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/azurebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/b2backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/boxbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/cfbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/dpbxbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/gdocsbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/gdrivebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/giobackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/hsibackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/hubicbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/idrivedbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/imapbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/jottacloudbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/lftpbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/localbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/mediafirebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/megabackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/megav2backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/megav3backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/multibackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/ncftpbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/onedrivebackend.py +7 -7
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/par2backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/pcabackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/pydrivebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/pyrax_identity/__init__.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/pyrax_identity/hubic.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/rclonebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/rsyncbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/s3_boto3_backend.py +5 -5
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/slatebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/ssh_paramiko_backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/ssh_pexpect_backend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/swiftbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/sxbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/tahoebackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/webdavbackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/backends/xorrisobackend.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/cached_ops.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/cli_data.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/cli_main.py +19 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/cli_util.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/config.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/diffdir.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/dup_collections.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/dup_main.py +9 -2
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/dup_tarfile.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/dup_temp.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/dup_time.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/errors.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/filechunkio.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/globmatch.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/gpg.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/gpginterface.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/lazy.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/librsync.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/log.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/manifest.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/patchdir.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/path.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/progress.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/robust.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/selection.py +160 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/statistics.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/tempdir.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/util.py +1 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0/duplicity.egg-info}/PKG-INFO +4 -5
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity.egg-info/SOURCES.txt +0 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity.egg-info/requires.txt +0 -1
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/man/duplicity.1 +33 -3
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/af_ZA/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/ar_SA/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/ca_ES/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/cs_CZ/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/da_DK/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/de_AT/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/de_DE/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/el_GR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/en_AU/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/en_GB/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/en_PR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/en_US/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/es_EM/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/es_ES/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/es_MX/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/es_PR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/es_US/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/fi_FI/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/fr_FR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/he_IL/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/hu_HU/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/it_IT/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/ja_JP/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/ko_KR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/nl_BE/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/nl_NL/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/nl_SR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/no_NO/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/pl_PL/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/pt_BR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/pt_PT/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/ro_RO/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/ru_BY/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/ru_MD/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/ru_RU/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/ru_UA/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/sr_SP/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/sv_SE/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/tr_TR/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/uk_UA/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/vi_VN/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/zh_CN/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/zh_HK/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/zh_MO/duplicity.mo +0 -0
- duplicity-3.1.0.dev0/po/zh_SG/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/po/zh_TW/duplicity.mo +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/pyproject.toml +70 -42
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/requirements.txt +1 -2
- duplicity-3.1.0.dev0/setup.cfg +4 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/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.1.0.dev0}/COPYING +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/README-LOG.md +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/README-REPO.md +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/README-TESTING.md +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/_librsyncmodule.c +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/argparse311.py +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity/file_naming.py +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity.egg-info/dependency_links.txt +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/duplicity.egg-info/entry_points.txt +0 -0
- {duplicity-3.0.8.dev4 → duplicity-3.1.0.dev0}/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,27 @@
|
|
|
1
1
|
|
|
2
|
+
(Unreleased) / 2026-06-04
|
|
3
|
+
=========================
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
rel.3.1.0.dev0 / 2026-06-04
|
|
8
|
+
===========================
|
|
9
|
+
|
|
10
|
+
* 5c4cdc2f:new: Now do pip builds for macOS and Linux
|
|
11
|
+
* 0140a374:new: Add include/exclude restore filtering using archive-relative paths
|
|
12
|
+
* 46a4796b:chg: Update snapcraft.yaml for license, type, and typo fixes.
|
|
13
|
+
* 143373b8:chg: Use `--build-on` for snapcraft remote-build.
|
|
14
|
+
* 182d6e33:chg: Use `python3 -m build` for sdist in release-prep.
|
|
15
|
+
|
|
16
|
+
rel.3.0.8.dev5 / 2026-05-12
|
|
17
|
+
===========================
|
|
18
|
+
|
|
19
|
+
* 3997156c:chg: Update README-RELEASE.md.
|
|
20
|
+
* 0f5430db:fix: Fix so GNUPGHOME is not changed in production.
|
|
21
|
+
* 53cc9659:fix: lower boto warning log level, rephrase.
|
|
22
|
+
* 88bfc75e:chg: Misc cleanups for developers
|
|
23
|
+
* 4b0bb8d5:chg: Update 'release pip version' in README-RELEASE.md.
|
|
24
|
+
|
|
2
25
|
rel.3.0.8.dev4 / 2026-03-31
|
|
3
26
|
===========================
|
|
4
27
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: duplicity
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.1.0.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
|
|
@@ -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,6 @@ Requires-Dist: httplib2
|
|
|
45
44
|
Requires-Dist: pysocks
|
|
46
45
|
Requires-Dist: jottalib
|
|
47
46
|
Requires-Dist: keyring
|
|
48
|
-
Requires-Dist: lxml<=5.4.0
|
|
49
47
|
Requires-Dist: mediafire
|
|
50
48
|
Requires-Dist: megatools
|
|
51
49
|
Requires-Dist: paramiko
|
|
@@ -75,6 +73,7 @@ sudo apt-get install -y \
|
|
|
75
73
|
openssl \
|
|
76
74
|
par2 \
|
|
77
75
|
python3-dev \
|
|
76
|
+
python3-lxml \
|
|
78
77
|
python3-pip \
|
|
79
78
|
python3-venv \
|
|
80
79
|
python3 \
|
|
@@ -102,7 +101,7 @@ packaging tools like this:
|
|
|
102
101
|
```shell
|
|
103
102
|
sudo python3 -m pip install --upgrade pip pipx
|
|
104
103
|
````
|
|
105
|
-
**NOTE: _Failure to upgrade will probably result in a failed install._
|
|
104
|
+
**NOTE: _Failure to upgrade will probably result in a failed install._ ←IMPORTANT!**
|
|
106
105
|
|
|
107
106
|
To make sure the pipx dirs are on your path do:
|
|
108
107
|
```shell
|
|
@@ -15,6 +15,7 @@ sudo apt-get install -y \
|
|
|
15
15
|
openssl \
|
|
16
16
|
par2 \
|
|
17
17
|
python3-dev \
|
|
18
|
+
python3-lxml \
|
|
18
19
|
python3-pip \
|
|
19
20
|
python3-venv \
|
|
20
21
|
python3 \
|
|
@@ -42,7 +43,7 @@ packaging tools like this:
|
|
|
42
43
|
```shell
|
|
43
44
|
sudo python3 -m pip install --upgrade pip pipx
|
|
44
45
|
````
|
|
45
|
-
**NOTE: _Failure to upgrade will probably result in a failed install._
|
|
46
|
+
**NOTE: _Failure to upgrade will probably result in a failed install._ ←IMPORTANT!**
|
|
46
47
|
|
|
47
48
|
To make sure the pipx dirs are on your path do:
|
|
48
49
|
```shell
|
|
@@ -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.
|
|
25
|
-
__reldate__: str = "
|
|
24
|
+
__version__: str = "3.1.0.dev0"
|
|
25
|
+
__reldate__: str = "June 04, 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."
|
|
@@ -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 2022 Kenneth Loafman
|
|
4
4
|
#
|
|
@@ -320,6 +320,24 @@ def process_command_line(cmdline_list):
|
|
|
320
320
|
# count is only used by the remove-* commands
|
|
321
321
|
config.keep_chains = config.count
|
|
322
322
|
|
|
323
|
+
# restore selection uses archive-relative paths and is applied while restoring
|
|
324
|
+
if config.action == "restore" and config.select_opts:
|
|
325
|
+
if config.restore_path:
|
|
326
|
+
command_line_error(
|
|
327
|
+
"--path-to-restore cannot be combined with restore file selection options. "
|
|
328
|
+
"Use --path-to-restore for one archive path, or --include/--exclude for pattern-based restore."
|
|
329
|
+
)
|
|
330
|
+
unsupported_restore_selection = {
|
|
331
|
+
"--exclude-if-present",
|
|
332
|
+
"--exclude-other-filesystems",
|
|
333
|
+
"--files-from",
|
|
334
|
+
}
|
|
335
|
+
unsupported = sorted({opt for opt, _arg in config.select_opts if opt in unsupported_restore_selection})
|
|
336
|
+
if unsupported:
|
|
337
|
+
command_line_error(
|
|
338
|
+
"The following file selection options are not supported for restore: " + ", ".join(unsupported)
|
|
339
|
+
)
|
|
340
|
+
|
|
323
341
|
# selection only applies to certain commands
|
|
324
342
|
if config.action in ["full", "inc", "verify"]:
|
|
325
343
|
set_selection()
|