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"""

Reply via email to