commit:     4e8d5935c6645419765bcfc2e651d54d0d2bb925
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Sun Aug  3 19:51:33 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sun Aug  3 19:51:33 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=4e8d5935

app-backup/duplicity: fix log output w/ --concurrency; fix build w/ lld

Closes: https://bugs.gentoo.org/946846
Closes: https://bugs.gentoo.org/960239
Signed-off-by: Sam James <sam <AT> gentoo.org>

 app-backup/duplicity/duplicity-3.0.5-r1.ebuild     | 60 ++++++++++++++++++++++
 ....5-TotalDestinationSizeChange-concurrency.patch | 57 ++++++++++++++++++++
 ...uplicity-3.0.5-dont-repeat-standard-paths.patch | 20 ++++++++
 3 files changed, 137 insertions(+)

diff --git a/app-backup/duplicity/duplicity-3.0.5-r1.ebuild 
b/app-backup/duplicity/duplicity-3.0.5-r1.ebuild
new file mode 100644
index 000000000000..4f5a50ccfd1e
--- /dev/null
+++ b/app-backup/duplicity/duplicity-3.0.5-r1.ebuild
@@ -0,0 +1,60 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{11..13} )
+DISTUTILS_USE_PEP517=setuptools
+DISTUTILS_EXT=1
+
+inherit distutils-r1
+
+DESCRIPTION="Secure backup system using gnupg to encrypt data"
+HOMEPAGE="https://duplicity.gitlab.io/";
+SRC_URI="https://gitlab.com/duplicity/duplicity/-/archive/rel.${PV}/${PN}-rel.${PV}.tar.bz2";
+S="${WORKDIR}"/${PN}-rel.${PV}
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux ~x64-macos"
+IUSE="s3 test"
+
+COMMON_DEPEND="
+       net-libs/librsync
+       app-crypt/gnupg
+       dev-python/fasteners[${PYTHON_USEDEP}]
+"
+DEPEND="
+       ${COMMON_DEPEND}
+       dev-python/setuptools[${PYTHON_USEDEP}]
+       dev-python/setuptools-scm[${PYTHON_USEDEP}]
+       test? (
+               || ( app-arch/par2cmdline app-arch/par2cmdline-turbo )
+               dev-python/pexpect[${PYTHON_USEDEP}]
+       )
+"
+RDEPEND="
+       ${COMMON_DEPEND}
+       dev-python/paramiko[${PYTHON_USEDEP}]
+       s3? ( dev-python/boto3[${PYTHON_USEDEP}] )
+"
+
+EPYTEST_DESELECT=(
+       # Linting tests (black, pylint, etc); not relevant for us
+       testing/test_code.py::CodeTest::test_black
+       testing/test_code.py::CodeTest::test_pep8
+       testing/test_code.py::CodeTest::test_pylint
+)
+
+PATCHES=(
+       "${FILESDIR}"/${PN}-3.0.4.0-fix-docs-cmd.patch
+       "${FILESDIR}"/${PN}-3.0.5-dont-repeat-standard-paths.patch
+       "${FILESDIR}"/${PN}-3.0.5-TotalDestinationSizeChange-concurrency.patch
+)
+
+distutils_enable_tests pytest
+
+pkg_postinst() {
+       elog "Duplicity has many optional dependencies to support various 
backends."
+       elog "Currently it's up to you to install them as necessary."
+}

diff --git 
a/app-backup/duplicity/files/duplicity-3.0.5-TotalDestinationSizeChange-concurrency.patch
 
b/app-backup/duplicity/files/duplicity-3.0.5-TotalDestinationSizeChange-concurrency.patch
new file mode 100644
index 000000000000..be9e539ebeec
--- /dev/null
+++ 
b/app-backup/duplicity/files/duplicity-3.0.5-TotalDestinationSizeChange-concurrency.patch
@@ -0,0 +1,57 @@
+https://bugs.gentoo.org/960239
+https://gitlab.com/duplicity/duplicity/-/commit/3bc1bb974c252ceb170b8e3edd8f791af30c719f
+
+From 3bc1bb974c252ceb170b8e3edd8f791af30c719f Mon Sep 17 00:00:00 2001
+From: Martin Wilck <[email protected]>
+Date: Fri, 27 Jun 2025 14:53:12 +0000
+Subject: [PATCH] fix:usr: fix TotalDestinationSizeChange with concurrency.
+
+With --concurrency n (n \> 1), duplicity always prints 
TotalDestinationSizeChange 0 (0 bytes).
+
+Fix it by returning bytes_written from collect_put_results(). Fixes #880.
+---
+ duplicity/dup_main.py | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/duplicity/dup_main.py b/duplicity/dup_main.py
+index b98dd7a4..b6f08984 100644
+--- a/duplicity/dup_main.py
++++ b/duplicity/dup_main.py
+@@ -376,7 +376,8 @@ def write_multivol(backup_type, tarblock_iter, man_outfp, 
sig_outfp, backend):
+         transfer_success = False
+         manifest_written = False
+ 
+-    def collect_put_results(bytes_written: int, backend_pooler, 
command2vol_map: Dict[int, CommandMetaData]):
++    def collect_put_results(backend_pooler, command2vol_map: Dict[int, 
CommandMetaData]):
++        bytes_written = 0
+         for result in backend_pooler.results_since_last_call():
+             track_id = result.track_id
+             size = result.result
+@@ -392,6 +393,7 @@ def write_multivol(backup_type, tarblock_iter, man_outfp, 
sig_outfp, backend):
+                 f"Transfer of 
{command2vol_map[track_id].path_obj.get_filename()} with id {track_id} and size 
"
+                 f"{size} took {result.get_runtime()}"
+             )
++        return bytes_written
+ 
+     def write_manifest_in_sequence(mf, mf_file, command2vol_map: Dict[int, 
CommandMetaData]):
+         """
+@@ -499,7 +501,7 @@ def write_multivol(backup_type, tarblock_iter, man_outfp, 
sig_outfp, backend):
+                 progress.report_transfer(0, tdp.getsize())
+                 track_id = 
backend_pooler.command_throttled(backend.put_validated.__name__, args=(tdp, 
dest_filename))
+                 command2vol_map[track_id] = CommandMetaData(vol_num, tdp, vi)
+-                collect_put_results(bytes_written, backend_pooler, 
command2vol_map)
++                bytes_written += collect_put_results(backend_pooler, 
command2vol_map)
+                 write_manifest_in_sequence(mf, man_outfp, command2vol_map)
+             except (Exception, SystemExit) as e:
+                 # ensure pool processes terminate clean
+@@ -529,7 +531,7 @@ def write_multivol(backup_type, tarblock_iter, man_outfp, 
sig_outfp, backend):
+             # wait for background commands, collect some stats and shutdown 
clean.
+             log.Debug("Collecting remaining results from backend pool.")
+             while True and backend_pooler:
+-                collect_put_results(bytes_written, backend_pooler, 
command2vol_map)
++                bytes_written += collect_put_results(backend_pooler, 
command2vol_map)
+                 write_manifest_in_sequence(mf, man_outfp, command2vol_map)
+                 if backend_pooler.get_queue_length() == 0:
+                     break
+-- 
+GitLab

diff --git 
a/app-backup/duplicity/files/duplicity-3.0.5-dont-repeat-standard-paths.patch 
b/app-backup/duplicity/files/duplicity-3.0.5-dont-repeat-standard-paths.patch
new file mode 100644
index 000000000000..faa6428c8ec7
--- /dev/null
+++ 
b/app-backup/duplicity/files/duplicity-3.0.5-dont-repeat-standard-paths.patch
@@ -0,0 +1,20 @@
+The toolchain will already search these locations by default if appropriate,
+but /usr/lib isn't right on a 64-bit system where native objects are in 
/usr/lib64
+and /usr/lib has multilib 32-bit ones. bfd warns on this but lld rejects it.
+
+https://bugs.gentoo.org/946846
+--- a/setup.py
++++ b/setup.py
+@@ -84,12 +84,6 @@ if os.environ.get("READTHEDOCS", None) is None:
+             )
+         )
+ 
+-    # add standard locs
+-    incdir_list.append("/usr/local/include")
+-    libdir_list.append("/usr/local/lib")
+-    incdir_list.append("/usr/include")
+-    libdir_list.append("/usr/lib")
+-
+     # build the librsync extension
+     ext_modules = [
+         Extension(

Reply via email to