Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package duplicity for openSUSE:Factory checked in at 2025-12-01 11:14:52 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/duplicity (Old) and /work/SRC/openSUSE:Factory/.duplicity.new.14147 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "duplicity" Mon Dec 1 11:14:52 2025 rev:86 rq:1320662 version:3.0.6.2 Changes: -------- --- /work/SRC/openSUSE:Factory/duplicity/duplicity.changes 2025-11-20 14:50:37.491001446 +0100 +++ /work/SRC/openSUSE:Factory/.duplicity.new.14147/duplicity.changes 2025-12-01 11:15:41.928544532 +0100 @@ -1,0 +2,17 @@ +Thu Nov 27 10:23:44 UTC 2025 - Michael Gorse <[email protected]> + +- Update to version 3.0.6.2: + + Fix + - Don't check for missing in first CollectionStatus().set\_values(). + - Fix "full" not working. Add more tests. + - Fix "Upgrade to 3.0.6 on Archlinux gives gcry\_kdf\_derive failed". + - Ssh\_pexpect\_backend: fix TypeError. + - Fix compilation with gcc 15. + - --files-from fails when backing up root. + - Crash with b2backend when b2sk isn't available, rather than + proper error. + - Parsing the gpg version failed when using Sequoia Chameleon. +- Drop duplicity-gcc15.patch and duplicity-fix-ssh-pexpect.patch: + fixed upstream. + +------------------------------------------------------------------- Old: ---- duplicity-fix-ssh-pexpect.patch duplicity-gcc15.patch duplicity-rel.3.0.6.1.tar.bz2 New: ---- duplicity-rel.3.0.6.2.tar.bz2 ----------(Old B)---------- Old: - Parsing the gpg version failed when using Sequoia Chameleon. - Drop duplicity-gcc15.patch and duplicity-fix-ssh-pexpect.patch: fixed upstream. Old: - Parsing the gpg version failed when using Sequoia Chameleon. - Drop duplicity-gcc15.patch and duplicity-fix-ssh-pexpect.patch: fixed upstream. ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ duplicity.spec ++++++ --- /var/tmp/diff_new_pack.dMm2Qc/_old 2025-12-01 11:15:42.916586135 +0100 +++ /var/tmp/diff_new_pack.dMm2Qc/_new 2025-12-01 11:15:42.920586303 +0100 @@ -26,17 +26,13 @@ %define _python3_version %{?python311_version} %endif Name: duplicity -Version: 3.0.6.1 +Version: 3.0.6.2 Release: 0 Summary: Encrypted bandwidth-efficient backup using the rsync algorithm License: GPL-3.0-or-later Group: Productivity/Archiving/Backup URL: https://duplicity.gitlab.io/ Source: https://gitlab.com/%{name}/%{name}/-/archive/rel.%{version}/%{name}-rel.%{version}.tar.bz2 -# PATCH-FIX-UPSTREAM duplicity-gcc15.patch [email protected] -- fix compliation with gcc 15. -Patch0: duplicity-gcc15.patch -# PATCH-FIX-UPSTREAM duplicity-fix-ssh-pexpect.patch bsc#1253734 [email protected] -- fix TypeError with ssh+pexpect back end. -Patch1: duplicity-fix-ssh-pexpect.patch BuildRequires: %{_python}-devel BuildRequires: %{_python}-pytest BuildRequires: %{_python}-setuptools ++++++ duplicity-rel.3.0.6.1.tar.bz2 -> duplicity-rel.3.0.6.2.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/CHANGELOG.md new/duplicity-rel.3.0.6.2/CHANGELOG.md --- old/duplicity-rel.3.0.6.1/CHANGELOG.md 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/CHANGELOG.md 2025-11-20 17:41:09.000000000 +0100 @@ -1,6 +1,47 @@ # Changelog +## rel.3.0.6.2 (2025-11-20) + +### Changes + +* Fix merge conflict resolution error. [Kenneth Loafman] + +* Add tty to Docker images for colored output. [Kenneth Loafman] + +* Changes from Thomas's review. See MR 318. [Kenneth Loafman] + +### Fix + +* Remove test not running under Docker. [Kenneth Loafman] + +* Don't check for missing in first CollectionStatus().set\_values(). [Kenneth Loafman] + +* Fix "full" not working. Add more tests. [Kenneth Loafman] + +* Fix "Upgrade to 3.0.6 on Archlinux gives gcry\_kdf\_derive failed" (#901) [Kenneth Loafman] + +* Ssh\_pexpect\_backend: fix TypeError. [Martin Wilck] + +* Fix compilation with gcc 15. [Martin Wilck] + +* --files-from fails when backing up root. [Jindřich Makovička] + +* Crash with b2backend when b2sk isn't available, rather than proper error. [ede] + + Fixes #905. + +* Parsing the gpg version failed when using Sequoia Chameleon. [ede] + +* Remove test not running under Docker. [Kenneth Loafman] + +* Don't check for missing in first CollectionStatus().set\_values(). [Kenneth Loafman] + +* Fix "full" not working. Add more tests. [Kenneth Loafman] + +* Fix "Upgrade to 3.0.6 on Archlinux gives gcry\_kdf\_derive failed" (#901) [Kenneth Loafman] + + ## rel.3.0.6.1 (2025-11-13) ### Changes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/__init__.py new/duplicity-rel.3.0.6.2/duplicity/__init__.py --- old/duplicity-rel.3.0.6.1/duplicity/__init__.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/__init__.py 2025-11-20 17:41:09.000000000 +0100 @@ -21,7 +21,7 @@ import gettext -__version__: str = "3.0.6.1" -__reldate__: str = "November 13, 2025" +__version__: str = "3.0.6.2" +__reldate__: str = "November 20, 2025" gettext.install("duplicity", names=["ngettext"]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/_librsyncmodule.c new/duplicity-rel.3.0.6.2/duplicity/_librsyncmodule.c --- old/duplicity-rel.3.0.6.1/duplicity/_librsyncmodule.c 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/_librsyncmodule.c 2025-11-20 17:41:09.000000000 +0100 @@ -333,8 +333,8 @@ fd = dup(fd); if (fd == -1) { char buf[256]; - strerror_r(errno, buf, sizeof(buf)); - PyErr_SetString(PyExc_TypeError, buf); + if (strerror_r(errno, buf, sizeof(buf))) + PyErr_SetString(PyExc_TypeError, buf); return NULL; } Py_INCREF(python_file); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/backends/b2backend.py new/duplicity-rel.3.0.6.2/duplicity/backends/b2backend.py --- old/duplicity-rel.3.0.6.1/duplicity/backends/b2backend.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/backends/b2backend.py 2025-11-20 17:41:09.000000000 +0100 @@ -72,7 +72,6 @@ try: # figure out what version of b2sdk we have from b2sdk import __version__ as VERSION # pylint: disable=import-error - import traceback v_split = VERSION.split(".") self.v_num = [int(x) for x in v_split] @@ -86,6 +85,8 @@ NonExistentBucket, ) # pylint: disable=import-error except ImportError as e1: + import traceback + log.Debug("".join(traceback.format_exception(None, e1, e1.__traceback__))) try: # if public API v2 not found, try to use public API v1 from b2sdk.v1 import B2Api # pylint: disable=import-error diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/backends/ssh_pexpect_backend.py new/duplicity-rel.3.0.6.2/duplicity/backends/ssh_pexpect_backend.py --- old/duplicity-rel.3.0.6.1/duplicity/backends/ssh_pexpect_backend.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/backends/ssh_pexpect_backend.py 2025-11-20 17:41:09.000000000 +0100 @@ -187,6 +187,7 @@ commandline, timeout=None, maxread=maxread, + encoding=config.fsencoding, use_poll=True, ) cmdloc = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/config.py new/duplicity-rel.3.0.6.2/duplicity/config.py --- old/duplicity-rel.3.0.6.1/duplicity/config.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/config.py 2025-11-20 17:41:09.000000000 +0100 @@ -105,6 +105,10 @@ select_opts = [] select_files = [] +# true if missing difftars should be run +# mmising difftar files fount in second call +first_colstats = False + # gpg binary to use gpg_binary = None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/dup_collections.py new/duplicity-rel.3.0.6.2/duplicity/dup_collections.py --- old/duplicity-rel.3.0.6.1/duplicity/dup_collections.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/dup_collections.py 2025-11-20 17:41:09.000000000 +0100 @@ -24,6 +24,7 @@ import gzip import json import os +import sys from duplicity import ( config, @@ -87,7 +88,7 @@ """ check that we have a complete set of volumes. """ - if not config.check_remote: + if config.first_colstats and not config.check_remote: self.mf_missing = {} self.cs_missing = {} return @@ -324,8 +325,7 @@ try: remote_file_buffer = self.backend.get_data(remote_file) except GPGError as message: - log.FatalError(_(f"Error processing remote file ({os.fsdecode(remote_file)}): {util.uexc(message)}")) - return b"" + log.Error(_(f"Error processing remote file ({os.fsdecode(remote_file)}): {util.uexc(message)}")) log.Info(_(f"Processing remote file {os.fsdecode(remote_file)} ({len(remote_file_buffer)})")) return remote_file_buffer @@ -713,7 +713,7 @@ """ self.backend = backend self.archive_dir_path = archive_dir_path - self.first = first + config.first_colstats = first # Will hold (signature chain, backup chain) pair of active # (most recent) chains @@ -956,7 +956,7 @@ self.last_chain_missing_difftars = True if config.action == "inc" and self.last_chain_missing_difftars: - if self.first: + if config.first_colstats: log.FatalError( "ERROR, the last backup chain has missing difftar volumes as above.\n" "You must run a full backup as the next backup." @@ -1035,7 +1035,8 @@ incomplete_sets = [] missing_difftar_sets = [] for set in set_list: # pylint: disable=redefined-builtin - set.get_missing() + if not config.first_colstats: + set.get_missing() if not set.is_complete(): incomplete_sets.append(set) if set.is_missing(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/dup_main.py new/duplicity-rel.3.0.6.2/duplicity/dup_main.py --- old/duplicity-rel.3.0.6.1/duplicity/dup_main.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/dup_main.py 2025-11-20 17:41:09.000000000 +0100 @@ -61,6 +61,7 @@ util, ) from duplicity.errors import BadVolumeException +from duplicity.gpg import GPGError # If exit_val is not None, exit with given value at end. exit_val = None @@ -646,7 +647,7 @@ """ Do full backup of directory to backend, using archive_dir_path - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status @rtype: void @@ -707,7 +708,7 @@ """ Get last signature chain for inc backup, or None if none available - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status """ if not col_stats.matched_chain_pair: @@ -819,7 +820,7 @@ @param stat_type: Name of the json_stat should be full-stat or inc-stat @type bytes_written: int @param bytes_written: no of bytes written, in this run - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status """ if config.jsonstat: @@ -841,7 +842,7 @@ """ List the files current in the archive (examining signature only) - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status @rtype: void @@ -861,7 +862,7 @@ """ Restore archive in config.backend to config.local_path - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status @rtype: void @@ -885,7 +886,7 @@ """ Return iterator of patched ROPaths of desired restore data - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status """ if config.restore_path: @@ -1045,7 +1046,7 @@ """ Verify files, logging differences - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status @rtype: void @@ -1077,7 +1078,7 @@ """ Delete the extraneous files in the current backend - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status @rtype: void @@ -1110,7 +1111,7 @@ """ Remove backup files older than the last n full backups. - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status @rtype: void @@ -1129,7 +1130,7 @@ """ Remove backup files older than config.remove_time from backend - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status @rtype: void @@ -1447,7 +1448,7 @@ """ Check consistency and hostname/directory of last manifest - @type col_stats: CollectionStatus object + @type col_stats: CollectionsStatus object @param col_stats: collection status @rtype: void @@ -1670,7 +1671,7 @@ "full", "remove-all-but-n-full", "remove-all-inc-of-but-n-full", - "remove-old", + "remove-older-than", ]: sync_archive(col_stats) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/gpg.py new/duplicity-rel.3.0.6.2/duplicity/gpg.py --- old/duplicity-rel.3.0.6.1/duplicity/gpg.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/gpg.py 2025-11-20 17:41:09.000000000 +0100 @@ -57,9 +57,7 @@ Just hold some GPG settings, avoid passing tons of arguments """ - _version_re = re.compile( - b"^gpg.*\\(GnuPG(?:/MacGPG2)?\\) (?P<maj>[0-9]+)\\.(?P<min>[0-9]+)\\.(?P<bug>[0-9]+)(-.+)?$" - ) + _version_re = re.compile(b"^gpg(sm)?( \\([^\\)]+\\))? (?P<maj>[0-9]+)\\.(?P<min>[0-9]+)\\.(?P<bug>[0-9]+)(-.+)?$") def __init__(self, passphrase=None, sign_key=None, recipients=None, hidden_recipients=None): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/selection.py new/duplicity-rel.3.0.6.2/duplicity/selection.py --- old/duplicity-rel.3.0.6.1/duplicity/selection.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/selection.py 2025-11-20 17:41:09.000000000 +0100 @@ -379,6 +379,7 @@ separator = config.null_separator and "\0" or "\n" filelist = {} absolute_path = None + is_root = self.rootpath.get_parent_dir() == self.rootpath for line in filelist_fp.read().split(separator): if not line: # skip blanks continue @@ -387,7 +388,10 @@ break while line: dirname, basename = os.path.split(line) - path = os.path.join(self.rootpath.uc_name, dirname).rstrip(os.path.sep) + path = os.path.join(self.rootpath.uc_name, dirname) + # strip the trailing separator unless in root + if not is_root or len(dirname) > 0: + path = path.rstrip(os.path.sep) if path not in filelist: filelist[path] = set() if isinstance(basename, str): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/duplicity/util.py new/duplicity-rel.3.0.6.2/duplicity/util.py --- old/duplicity-rel.3.0.6.1/duplicity/util.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/duplicity/util.py 2025-11-20 17:41:09.000000000 +0100 @@ -26,20 +26,21 @@ import atexit import csv import errno -import time - -import fasteners -import multiprocessing import json +import multiprocessing import os import socket import sys import traceback from io import StringIO -from duplicity import config -from duplicity import log -from duplicity import dup_tarfile +import fasteners + +from duplicity import ( + config, + dup_tarfile, + log, +) def exception_traceback(limit=50): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/man/duplicity.1 new/duplicity-rel.3.0.6.2/man/duplicity.1 --- old/duplicity-rel.3.0.6.1/man/duplicity.1 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/man/duplicity.1 2025-11-20 17:41:09.000000000 +0100 @@ -1,4 +1,4 @@ -.TH DUPLICITY 1 "November 13, 2025" "Version 3.0.6.1" "User Manuals" \" -*- nroff -*- +.TH DUPLICITY 1 "November 20, 2025" "Version 3.0.6.2" "User Manuals" \" -*- nroff -*- .\" disable justification (adjust text to left margin only) .\" command line examples stay readable through that .ad l diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/pyproject.toml new/duplicity-rel.3.0.6.2/pyproject.toml --- old/duplicity-rel.3.0.6.1/pyproject.toml 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/pyproject.toml 2025-11-20 17:41:09.000000000 +0100 @@ -1,6 +1,6 @@ [project] name = "duplicity" -version = "3.0.6.1" +version = "3.0.6.2" dynamic = ["dependencies"] description = "Encrypted backup using rsync algorithm" authors = [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/setup.py new/duplicity-rel.3.0.6.2/setup.py --- old/duplicity-rel.3.0.6.1/setup.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/setup.py 2025-11-20 17:41:09.000000000 +0100 @@ -42,7 +42,7 @@ print("Sorry, duplicity requires version 3.9 thru 3.14 of Python.", file=sys.stderr) sys.exit(1) -Version: str = "3.0.6.1" +Version: str = "3.0.6.2" # READTHEDOCS uses setup.py sdist but can't handle extensions ext_modules = list() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/snap/snapcraft.yaml new/duplicity-rel.3.0.6.2/snap/snapcraft.yaml --- old/duplicity-rel.3.0.6.1/snap/snapcraft.yaml 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/snap/snapcraft.yaml 2025-11-20 17:41:09.000000000 +0100 @@ -1,5 +1,5 @@ name: duplicity -version: 3.0.6.1 +version: 3.0.6.2 license: GPL-2.0 summary: Efficient, encrypted backup to local or remote hosts description: | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/testing/docker/distro/compose.yml new/duplicity-rel.3.0.6.2/testing/docker/distro/compose.yml --- old/duplicity-rel.3.0.6.1/testing/docker/distro/compose.yml 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/testing/docker/distro/compose.yml 2025-11-20 17:41:09.000000000 +0100 @@ -30,6 +30,7 @@ image: distro/ub20 container_name: ub20 hostname: ub20 + tty: true environment: - PYTEST_ARGS=${PYTEST_ARGS:-""} entrypoint: /bin/bash @@ -42,6 +43,7 @@ image: distro/ub22 container_name: ub22 hostname: ub22 + tty: true environment: - PYTEST_ARGS=${PYTEST_ARGS:-""} entrypoint: /bin/bash @@ -54,6 +56,7 @@ image: distro/ub24 container_name: ub24 hostname: ub24 + tty: true environment: - PYTEST_ARGS=${PYTEST_ARGS:-""} entrypoint: /bin/bash diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/testing/docker/dupCI/compose.yml new/duplicity-rel.3.0.6.2/testing/docker/dupCI/compose.yml --- old/duplicity-rel.3.0.6.1/testing/docker/dupCI/compose.yml 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/testing/docker/dupCI/compose.yml 2025-11-20 17:41:09.000000000 +0100 @@ -30,6 +30,7 @@ image: dupci/py39 container_name: py39 hostname: py39 + tty: true environment: - PYTEST_ARGS=${PYTEST_ARGS:-""} entrypoint: /bin/bash @@ -42,6 +43,7 @@ image: dupci/py310 container_name: py310 hostname: py310 + tty: true environment: - PYTEST_ARGS=${PYTEST_ARGS:-""} entrypoint: /bin/bash @@ -54,6 +56,7 @@ image: dupci/py311 container_name: py311 hostname: py311 + tty: true environment: - PYTEST_ARGS=${PYTEST_ARGS:-""} entrypoint: /bin/bash @@ -66,6 +69,7 @@ image: dupci/py312 container_name: py312 hostname: py312 + tty: true environment: - PYTEST_ARGS=${PYTEST_ARGS:-""} entrypoint: /bin/bash @@ -78,6 +82,7 @@ image: dupci/py313 container_name: py313 hostname: py313 + tty: true environment: - PYTEST_ARGS=${PYTEST_ARGS:-""} entrypoint: /bin/bash @@ -90,6 +95,7 @@ image: dupci/py314 container_name: py314 hostname: py314 + tty: true environment: - PYTEST_ARGS=${PYTEST_ARGS:-""} entrypoint: /bin/bash diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/testing/functional/test_final.py new/duplicity-rel.3.0.6.2/testing/functional/test_final.py --- old/duplicity-rel.3.0.6.1/testing/functional/test_final.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/testing/functional/test_final.py 2025-11-20 17:41:09.000000000 +0100 @@ -23,6 +23,7 @@ import os import re import sys +import time import unittest import pytest @@ -266,58 +267,6 @@ backup_options = ["--concurrency=2", "--skip-if-no-change"] self.run_with_no_change(backup_options=backup_options) - # TODO: Collect regression issues into a separate test suite. - def test_regression_issues(self): - """ - test regression issues. - """ - # Issue 888 - collection_status --file-changed="foo\ bar" fails with type error - filenames = ["foo", "bar", "foo bar"] - os.mkdir(f"{_runtest_dir}/testfiles/issue888") - for filename in filenames: - open(f"{_runtest_dir}/testfiles/issue888/{filename}", "w").write(f"{filename}") - - self.backup( - "full", - f"{_runtest_dir}/testfiles/issue888", - options=["--no-encrypt", "--no-compress"], - ) - - self.run_duplicity( - options=[ - "list-current-files", - f"file://{_runtest_dir}/testfiles/output", - f"--log-file={_runtest_dir}/testfiles/issue888/testing.out", - ] - ) - txt = open(f"{_runtest_dir}/testfiles/issue888/testing.out").read() - print(txt, file=sys.stderr) - for filename in filenames: - self.assertRegex( - txt, - rf". .* {filename}\n", - f"filename {filename} not found in list-current-files output", - ) - - for filename in filenames: - self.run_duplicity( - options=[ - "collection-status", - f"file://{_runtest_dir}/testfiles/output", - "--file-changed", - filename, - f"--log-file={_runtest_dir}/testfiles/issue888/testing.out", - ], - ) - txt = open(f"{_runtest_dir}/testfiles/issue888/testing.out").read() - print(txt, file=sys.stderr) - patt = re.compile(rf".\s+File: b'{filename}'\n") - self.assertRegex( - txt, - patt, - f"filename {filename} not found in collection-status output", - ) - if __name__ == "__main__": unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/testing/functional/test_regression.py new/duplicity-rel.3.0.6.2/testing/functional/test_regression.py --- old/duplicity-rel.3.0.6.1/testing/functional/test_regression.py 1970-01-01 01:00:00.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/testing/functional/test_regression.py 2025-11-20 17:41:09.000000000 +0100 @@ -0,0 +1,131 @@ +# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4; encoding:utf-8 -*- +# +# Copyright 2025 Kenneth Loafman +# +# This file is part of duplicity. +# +# Duplicity is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# Duplicity is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with duplicity; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +import os +import re +import shutil +import sys +import unittest + +from testing.functional import ( + _runtest_dir, + FunctionalTestCase, +) + + +class RegressionTest(FunctionalTestCase): + """ + Test regression issues + """ + + def test_issue888(self): + """ + Test issue 888 - collection_status --file-changed="foo bar" fails with type error + """ + filenames = ["foo", "bar", "foo bar"] + os.mkdir(f"{_runtest_dir}/testfiles/issue888") + for filename in filenames: + open(f"{_runtest_dir}/testfiles/issue888/{filename}", "w").write(f"{filename}") + + self.backup( + "full", + f"{_runtest_dir}/testfiles/issue888", + options=["--no-encrypt", "--no-compress"], + ) + + self.run_duplicity( + options=[ + "list-current-files", + f"file://{_runtest_dir}/testfiles/output", + f"--log-file={_runtest_dir}/testfiles/issue888/testing.out", + ] + ) + txt = open(f"{_runtest_dir}/testfiles/issue888/testing.out").read() + print(txt, file=sys.stderr) + for filename in filenames: + self.assertRegex( + txt, + rf". .* {filename}\n", + f"filename {filename} not found in list-current-files output", + ) + + for filename in filenames: + self.run_duplicity( + options=[ + "collection-status", + f"file://{_runtest_dir}/testfiles/output", + "--file-changed", + filename, + f"--log-file={_runtest_dir}/testfiles/issue888/testing.out", + ], + ) + txt = open(f"{_runtest_dir}/testfiles/issue888/testing.out").read() + print(txt, file=sys.stderr) + patt = re.compile(rf".\s+File: b'{filename}'\n") + self.assertRegex( + txt, + patt, + f"filename {filename} not found in collection-status output", + ) + + def test_issue901(self): + """ + Test issue 901 - Upgrade to 3.0.6 on Archlinux gives gcry_kdf_derive failed + """ + self.set_environ("SIGN_PASSPHRASE", None) + self.set_environ("FTP_PASSWORD", None) + + # self.set_environ("TESTDEBUG", "1") + self.set_environ("PASSPHRASE", "issue901") + + # make sure we test with a clean cache and clean output + shutil.rmtree(f"{_runtest_dir}/testfiles/cache/issue901", ignore_errors=True) + shutil.rmtree(f"{_runtest_dir}/testfiles/output", ignore_errors=True) + + # do initial full backup + self.backup( + "full", + f"{_runtest_dir}/testfiles/various_file_types", + options=["--name=issue901"], + ) + + # make sure inc has somthing to do + os.unlink(f"{_runtest_dir}/testfiles/various_file_types/executable") + + # do incremental backup + self.backup( + "inc", + f"{_runtest_dir}/testfiles/various_file_types", + options=["--name=issue901"], + ) + + # list current files + self.run_duplicity( + options=[ + "list-current-files", + f"file://{_runtest_dir}/testfiles/output", + "--name=issue901", + ] + ) + + +if __name__ == "__main__": + unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/testing/functional/test_restart.py new/duplicity-rel.3.0.6.2/testing/functional/test_restart.py --- old/duplicity-rel.3.0.6.1/testing/functional/test_restart.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/testing/functional/test_restart.py 2025-11-20 17:41:09.000000000 +0100 @@ -173,13 +173,11 @@ options=["--allow-source-mismatch"], ) assert not os.system(f"rm {_runtest_dir}/testfiles/output/duplicity-inc*vol2*difftar*") - with self.assertRaises(CmdError) as cm: - self.backup( - "inc", - f"{_runtest_dir}/testfiles/largefiles", - options=["--allow-source-mismatch"], - ) - self.assertEqual(cm.exception.error_code, 101) + self.backup( + "inc", + f"{_runtest_dir}/testfiles/largefiles", + options=["--allow-source-mismatch"], + ) def test_changed_source_dangling_manifest_volume(self): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-rel.3.0.6.1/testing/unit/test_collections.py new/duplicity-rel.3.0.6.2/testing/unit/test_collections.py --- old/duplicity-rel.3.0.6.1/testing/unit/test_collections.py 2025-11-13 18:02:41.000000000 +0100 +++ new/duplicity-rel.3.0.6.2/testing/unit/test_collections.py 2025-11-20 17:41:09.000000000 +0100 @@ -166,7 +166,7 @@ assert chain.fullset.time == 1029626221 def test_collections_status(self): - """Test CollectionStatus object's set_values()""" + """Test CollectionsStatus object's set_values()""" def check_cs(cs): """Check values of collections status"""
