Re: Duplicity 3.1.0 Released

Kenneth Loafman via Duplicity-talk <[email protected]> Tue, 7 Jul 2026 06:47:22 -0500
Newsgroups gmane.comp.sysutils.backup.duplicity.general
Message-ID <CAD-_Ma2cNDEOSz=cWqNCY+3jMBOgqMiSOvYbxjU2VB7MMJgv+g@mail.gmail.com>
--===============2611362214966940097==
Content-Type: multipart/alternative; boundary="000000000000eaa263065603f4cb"

--000000000000eaa263065603f4cb
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

The lxml module was moved from pip to repo.

Here are the requirements from the repo (in README.md):

sudo apt-get update
sudo apt-get install -y \
        build-essential \
        intltool \
        lftp \
        librsync-dev \
        libffi-dev \
        libssl-dev \
        openssl \
        par2 \
        python3-dev \
        python3-lxml \
        python3-pip \
        python3-venv \
        python3 \
        rclone \
        rsync \
        rdiff \
        tzdata

...Ken

On Mon, Jul 6, 2026 at 2:07=E2=80=AFPM Scott Hannahs <[email protected]> wrote=
:

> And one more last thing=E2=80=A6.
> I also had a dependency on the =E2=80=9Clxml2=E2=80=9D python module.   I=
s that also not
> necessary now?  I think we had an email discussion about this module a lo=
ng
> time ago and concluded that it was necessary for duplicity itself and not
> one of the other modules.
>
> -Scott
>
> On Jul 6, 2026, at 3:03=E2=80=AFPM, Scott Hannahs via Duplicity-talk <
> [email protected]> wrote:
>
> I have and severely changed my requirements since the last update.  But I
> have a few questions.
>
> 1. what are the non-python requirements?   I have the following in
> previous versions, and I am sure that the gnupg2 is needed.
>         librsync2-shlibs (>=3D 2.0),
>         librsync-bin (>=3D 2.0),
>         gnupg2,
>         intltool40,
> par2,
>
>
> 2. to support ftp backups and other non-python backends I had these were
> also required?
>         ncftp,
>         lftp,
>
> Are these also no longer part of the duplicity backends?  The
> requirements.txt and requirements.dev seem limited.
>
> -Scott
>
> On Jun 28, 2026, at 2:29=E2=80=AFPM, Kenneth Loafman via Duplicity-talk <
> [email protected]> wrote:
>
> Hi Scott.
>
> 1. and 2. run fine with pylint=3D=3D4.0.5, black=3D=3D26.31
>
> 3. I really do not know why it is failing.
>
> Take a look at requirements.dev and requirements.txt.  You might want to
> do:
>
> $ python3 -m pip install --update -r requirements.dev
> $ python3 -m pip install --update -r requirements.txt
> $ python3 -m pip install .   # while in the duplicity directory
>
> as this will guarantee we're using the same environment.  At least you ca=
n
> figure out what versions you need.
>
> ...Ken
>
>
> On Fri, Jun 26, 2026 at 10:53=E2=80=AFAM Scott Hannahs via Duplicity-talk=
 <
> [email protected]> wrote:
>
>> Thanks for the update.  Trying to adjust my fink-project build system fo=
r
>> this.  I get a couple of failures when running the suite of tests.  I kn=
ow
>> the pylint and the black tests are not necessary but I dislike failures =
in
>> my output.  Put it down to programmer OCD.  I am sure the tests all pass=
ed
>> on your system before you released it, but I am curious what is differen=
t
>> on my system that all but these 3 tests would pass.  I am using python 3=
.10
>> and pylint 2.14.5.  Now updating pylint (and astroid) to current version=
.
>>
>> 1. pylint fails.  It seems that building in a deep directory hierarchy
>> causes python to abbreviate the strings with a =E2=80=98=E2=80=A6=E2=80=
=99 ellipsis.  This of
>> course causes all sorts of failures when  the command line is called:
>>
>> pylint
>> --rcfile=3D/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/=
pyproject.toml
>> /opt/sw/src/*fink.b...l.3.1.0*/duplicity/backend.py
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/c=
onfig.py
>>
>>
>> The underlined text should be
>> '/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/=E2=80=98 but even wh=
en using
>> the full correct path, pylint gives me this error in the toml file.  I
>> assume that the paths are abbreviated just for error logging and the cod=
e
>> is using the full paths?
>>
>> pyproject.toml:1: [W0012(unknown-option-value), ] Unknown option value
>> for '--disable', expected a valid pylint message and got
>> 'possibly-used-before-assignment=E2=80=99
>>
>> Standard error output:
>>
>> ----------------------------- Captured stderr call
>> -----------------------------
>> ************* Module
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/pyproject.t=
oml
>> */opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/pyproject.=
toml:1:
>> [W0012(unknown-option-value), ] Unknown option value for '--disable',
>> expected a valid pylint message and got 'possibly-used-before-assignment=
'*
>> ************* Module duplicity.statistics
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/s=
tatistics.py:154:
>> [E1307(bad-string-format-type), StatsObj.get_timestats_string] Argument
>> 'builtins.NoneType' does not match format type 'f'
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/s=
tatistics.py:162:
>> [E1307(bad-string-format-type), StatsObj.get_timestats_string] Argument
>> 'builtins.NoneType' does not match format type 'f'
>> ************* Module duplicity.backends.gdrivebackend
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/b=
ackends/gdrivebackend.py:102:
>> [E0401(import-error), GDriveBackend.__init__] Unable to import
>> 'google_auth_oauthlib.flow'
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/b=
ackends/gdrivebackend.py:103:
>> [E0401(import-error), GDriveBackend.__init__] Unable to import
>> 'google.auth.transport.requests'
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/b=
ackends/gdrivebackend.py:217:
>> [E0401(import-error), GDriveBackend.file_by_name] Unable to import
>> 'googleapiclient.errors'
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/b=
ackends/gdrivebackend.py:286:
>> [E0401(import-error), GDriveBackend._put] Unable to import
>> 'googleapiclient.http'
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/b=
ackends/gdrivebackend.py:335:
>> [E0401(import-error), GDriveBackend._get] Unable to import
>> 'googleapiclient.http'
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/b=
ackends/gdrivebackend.py:402:
>> [E0401(import-error), GDriveBackend._error_code] Unable to import
>> 'google.auth.exceptions'
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/b=
ackends/gdrivebackend.py:403:
>> [E0401(import-error), GDriveBackend._error_code] Unable to import
>> 'googleapiclient.errors'
>> ************* Module duplicity.backends.pydrivebackend
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/b=
ackends/pydrivebackend.py:279:
>> [E0401(import-error), PyDriveBackend._error_code] Unable to import
>> 'pydrive2.files'
>> ************* Module duplicity.backends.azurebackend
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/b=
ackends/azurebackend.py:86:
>> [E0401(import-error), AzureBackend._get_or_create_container] Unable to
>> import 'azure.core.exceptions'
>>
>>
>> 2. black fails too, probably for the same reason and I will try to fix i=
t
>> if I can get a resolution to the pylint issue.
>>
>> 3. This is further on a specific test for a code regression number 908.
>> I am including the long log here because I am not sure what is relevant.
>>
>> testing/functional/test_regression.py::RegressionTest::test_issue908
>> FAILED [ 72%]
>> =E2=80=94=E2=80=94
>> _________________________ RegressionTest.test_issue908
>> _________________________
>>
>> self =3D <testing.functional.test_regression.RegressionTest
>> testMethod=3Dtest_issue908>
>>
>>     @unittest.skipIf(os.path.exists("/.dockerenv"), "Won't work on
>> docker")
>>     def test_issue908(self):
>>         """
>>         Test issue 908 - gpg: public key decryption failed: No passphras=
e
>> given (3.0.6.2)
>>         """
>>
>>         # make sure we test with a clean cache and clean output
>>         self.set_environ("FTP_PASSWORD", None)
>>         self.set_environ("PASSPHRASE", None)
>>         self.set_environ("SIGN_PASSPHRASE", None)
>>         self.set_environ("TESTDEBUG", None)
>>         shutil.rmtree(f"{_runtest_dir}/testfiles/cache/issue908",
>> ignore_errors=3DTrue)
>>         shutil.rmtree(f"{_runtest_dir}/testfiles/output",
>> ignore_errors=3DTrue)
>>
>>         # do initial full backup with passphrase
>>         self.backup(
>>             "full",
>>             f"{_runtest_dir}/testfiles/various_file_types",
>>             options=3D["--name=3Dissue908",
>> f"--encrypt-key=3D{self.encrypt_key1}"],
>>         )
>>
>>         # 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=3D["--name=3Dissue908",
>> f"--encrypt-key=3D{self.encrypt_key1}"],
>>             passphrase_input=3D[self.sign_passphrase],
>>         )
>>
>> self       =3D <testing.functional.test_regression.RegressionTest
>> testMethod=3Dtest_issue908>
>>
>>
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/testing/fun=
ctional/test_regression.py:154:
>> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ =
_
>> _ _ _
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/testing/fun=
ctional/__init__.py:197:
>> in backup
>>     self.run_duplicity(options=3Doptions, **kwargs)
>>         before_files =3D
>> {b'duplicity-full-signatures.20260616T174134Z.sigtar.gpg',
>> b'duplicity-full.20260616T174134Z.manifest.gpg',
>> b'duplicity-full.20260616T174134Z.vol1.difftar.gpg'}
>>         input_dir  =3D
>> '/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/various_file=
_types'
>>         kwargs     =3D {'passphrase_input': ['test']}
>>         now        =3D 1781631694.437021
>>         options    =3D ['inc',
>> '/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/various_file=
_types',
>> 'fortestsonly:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfil=
es/output',
>> '--volsize=3D1', '--name=3Dissue908', '--encrypt-key=3D839E6A2856538CCF'=
]
>>         self       =3D <testing.functional.test_regression.RegressionTes=
t
>> testMethod=3Dtest_issue908>
>>         type       =3D 'inc'
>> /opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/testing/fun=
ctional/__init__.py:159:
>> in run_duplicity
>>     child.expect("passphrase.*:")
>>         child      =3D <pexpect.pty_spawn.spawn object at 0x10abc27a0>
>>         cmd_list   =3D ['/opt/sw/bin/python3.10', '-W', 'ignore', '-u',
>> '/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/=
__main__.py',
>> 'inc', ...]
>>         cmdline    =3D "'/opt/sw/bin/python3.10' '-W' 'ignore' '-u'
>> '/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/=
_...538CCF'
>> '-v0' '--no-print-statistics'
>> '--archive-dir=3D/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfi=
les/cache'"
>>         current_time =3D None
>>         dup_env    =3D {'CCACHE_DIR': '/opt/sw/var/ccache', 'CPPFLAGS':
>> '-I/opt/sw/include', 'DBUS_SESSION_BUS_ADDRESS':
>> 'launchd:env=3DDBUS_FINK_SESSION_BUS_SOCKET', 'GNUPGHOME':
>> '/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/testing/gn=
upg',
>> ...}
>>         fail       =3D None
>>         item       =3D 'test'
>>         options    =3D ['inc',
>> '/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/various_file=
_types',
>> 'fortestsonly:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfil=
es/output',
>> '--volsize=3D1', '--name=3Dissue908', '--encrypt-key=3D839E6A2856538CCF'=
]
>>         passphrase =3D 'test'
>>         passphrase_input =3D ['test']
>>         self       =3D <testing.functional.test_regression.RegressionTes=
t
>> testMethod=3Dtest_issue908>
>>         timeout    =3D None
>> /opt/sw/lib/python3.10/site-packages/pexpect/spawnbase.py:343: in expect
>>     return self.expect_list(compiled_pattern_list,
>>         async_     =3D False
>>         compiled_pattern_list =3D [re.compile(b'passphrase.*:', re.DOTAL=
L)]
>>         kw         =3D {}
>>         pattern    =3D 'passphrase.*:'
>>         searchwindowsize =3D -1
>>         self       =3D <pexpect.pty_spawn.spawn object at 0x10abc27a0>
>>         timeout    =3D -1
>> /opt/sw/lib/python3.10/site-packages/pexpect/spawnbase.py:372: in
>> expect_list
>>     return exp.expect_loop(timeout)
>>         async_     =3D False
>>         exp        =3D <pexpect.expect.Expecter object at 0x109e4ff40>
>>         kw         =3D {}
>>         pattern_list =3D [re.compile(b'passphrase.*:', re.DOTALL)]
>>         searchwindowsize =3D -1
>>         self       =3D <pexpect.pty_spawn.spawn object at 0x10abc27a0>
>>         timeout    =3D None
>> /opt/sw/lib/python3.10/site-packages/pexpect/expect.py:179: in expect_lo=
op
>>     return self.eof(e)
>>         idx        =3D None
>>         self       =3D <pexpect.expect.Expecter object at 0x109e4ff40>
>>         spawn      =3D <pexpect.pty_spawn.spawn object at 0x10abc27a0>
>>         timeout    =3D None
>> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ =
_
>> _ _ _
>>
>> self =3D <pexpect.expect.Expecter object at 0x109e4ff40>
>> err =3D EOF('End Of File (EOF). Empty string style platform.')
>>
>>     def eof(self, err=3DNone):
>>         spawn =3D self.spawn
>>
>>         spawn.before =3D spawn._before.getvalue()
>>         spawn._buffer =3D spawn.buffer_type()
>>         spawn._before =3D spawn.buffer_type()
>>         spawn.after =3D EOF
>>         index =3D self.searcher.eof_index
>>         if index >=3D 0:
>>             spawn.match =3D EOF
>>             spawn.match_index =3D index
>>             return index
>>         else:
>>             spawn.match =3D None
>>             spawn.match_index =3D None
>>             msg =3D str(spawn)
>>             msg +=3D '\nsearcher: %s' % self.searcher
>>             if err is not None:
>>                 msg =3D str(err) + '\n' + msg
>>
>>             exc =3D EOF(msg)
>>             exc.__cause__ =3D None # in Python 3.x we can use "raise exc
>> from None"
>> >           raise exc
>> E           pexpect.exceptions.EOF: End Of File (EOF). Empty string styl=
e
>> platform.
>> E           <pexpect.pty_spawn.spawn object at 0x10abc27a0>
>> E           command: /bin/sh
>> E           args: ['/bin/sh', '-f', '-c', "'/opt/sw/bin/python3.10' '-W'
>> 'ignore' '-u'
>> '/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/=
__main__.py'
>> 'inc'
>> '/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/various_file=
_types'
>> 'fortestsonly:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfil=
es/output'
>> '--volsize=3D1' '--name=3Dissue908' '--encrypt-key=3D839E6A2856538CCF' '=
-v0'
>> '--no-print-statistics'
>> '--archive-dir=3D/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfi=
les/cache'"]
>> E           buffer (last 100 chars): b''
>> E           before (last 100 chars): ''
>> E           after: <class 'pexpect.exceptions.EOF'>
>> E           match: None
>> E           match_index: None
>> E           exitstatus: None
>> E           flag_eof: True
>> E           pid: 45404
>> E           child_fd: 191
>> E           closed: False
>> E           timeout: None
>> E           delimiter: <class 'pexpect.exceptions.EOF'>
>> E           logfile: None
>> E           logfile_read: None
>> E           logfile_send: None
>> E           maxread: 2000
>> E           ignorecase: False
>> E           searchwindowsize: None
>> E           delaybeforesend: 0.05
>> E           delayafterclose: 0.1
>> E           delayafterterminate: 0.1
>> E           searcher: searcher_re:
>> E               0: re.compile(b'passphrase.*:')
>>
>> err        =3D EOF('End Of File (EOF). Empty string style platform.')
>> exc        =3D EOF('End Of File (EOF). Empty string style
>> platform.\n<pexpect.pty_spawn.spawn object at 0x10abc27a0>\ncommand:
>> /bin/s...: 0.05\ndelayafterclose: 0.1\ndelayafterterminate: 0.1\nsearche=
r:
>> searcher_re:\n    0: re.compile(b\'passphrase.*:\')')
>> index      =3D -1
>> msg        =3D "End Of File (EOF). Empty string style
>> platform.\n<pexpect.pty_spawn.spawn object at 0x10abc27a0>\ncommand:
>> /bin/sh\na...end: 0.05\ndelayafterclose: 0.1\ndelayafterterminate:
>> 0.1\nsearcher: searcher_re:\n    0: re.compile(b'passphrase.*:')"
>> self       =3D <pexpect.expect.Expecter object at 0x109e4ff40>
>> spawn      =3D <pexpect.pty_spawn.spawn object at 0x10abc27a0>
>>
>> /opt/sw/lib/python3.10/site-packages/pexpect/expect.py:122: EOF
>> ----------------------------- Captured stdout call
>> -----------------------------
>> TestBackend is not made for production use!
>> TestBackend is not made for production use!
>> TestBackend is not made for production use!
>> TestBackend is not made for production use!
>> ----------------------------- Captured stderr call
>> -----------------------------
>>
>> ...command: '/opt/sw/bin/python3.10' '-W' 'ignore' '-u'
>> '/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/=
__main__.py'
>> 'full'
>> '/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/various_file=
_types'
>> 'fortestsonly:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfil=
es/output'
>> '--volsize=3D1' '--name=3Dissue908' '--encrypt-key=3D839E6A2856538CCF' '=
-v0'
>> '--no-print-statistics'
>> '--archive-dir=3D/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfi=
les/cache'
>> < /dev/null
>> ...cwd: /private/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T
>> ...output:
>> ...return_val: 0
>> ------------------------------ Captured log call
>> -------------------------------
>> Level 8  duplicity:log.py:100 TestBackend is not made for production use=
!
>> Level 8  duplicity:log.py:100 TestBackend is not made for production use=
!
>> Level 8  duplicity:log.py:100 TestBackend is not made for production use=
!
>> Level 8  duplicity:log.py:100 TestBackend is not made for production use=
!
>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D short test summary info
>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
>>
>> -Scott
>>
>> On Jun 16, 2026, at 1:10=E2=80=AFPM, Kenneth Loafman via Duplicity-talk =
<
>> [email protected]> wrote:
>>
>> Hi everyone,
>>
>> I am pleased to announce the release of duplicity version 3.1.0.
>>
>> This release follows version 3.0.7 and includes a minor version bump to
>> reflect a significant new feature. Thanks to elmuz's contribution, resto=
re
>> operations can now use --include, --exclude, --include-regexp, and
>> --include-filelist directly from the command line.
>>
>> There are many other improvements and bug fixes included in this update.
>> Please see the CHANGELOG below for full details.
>>
>> Thanks,
>> Ken
>>
>>
>> _______________________________________________
>> Duplicity-talk mailing list
>> [email protected]
>> https://lists.nongnu.org/mailman/listinfo/duplicity-talk
>>
> _______________________________________________
> Duplicity-talk mailing list
> [email protected]
> https://lists.nongnu.org/mailman/listinfo/duplicity-talk
>
>
> _______________________________________________
> Duplicity-talk mailing list
> [email protected]
> https://lists.nongnu.org/mailman/listinfo/duplicity-talk
>
>
>

--000000000000eaa263065603f4cb
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">The lxml module was moved from pip to repo.<div><br></div>=
<div>Here are the requirements from the repo (in README.md):</div><div><br>=
</div><div><font face=3D"monospace">sudo apt-get update <br>sudo apt-get in=
stall -y \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 build-essential \<br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 intltool \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 lftp \<br>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 librsync-dev \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 libf=
fi-dev \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 libssl-dev \<br>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 openssl \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 par2 \<br>=C2=A0 =C2=A0=
 =C2=A0 =C2=A0 python3-dev \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 python3-lxml \<=
br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 python3-pip \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0=
 python3-venv \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 python3 \<br>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 rclone \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 rsync \<br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 rdiff \<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 tzdata</font></div=
><div><br></div><div>...Ken</div></div><br><div class=3D"gmail_quote gmail_=
quote_container"><div dir=3D"ltr" class=3D"gmail_attr">On Mon, Jul 6, 2026 =
at 2:07=E2=80=AFPM Scott Hannahs &lt;<a href=3D"mailto:[email protected]">sth@=
p-hall.net</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex"><div>And one more last thing=E2=80=A6.<div>I also had a dependen=
cy on the =E2=80=9Clxml2=E2=80=9D python module. =C2=A0 Is that also not ne=
cessary now?=C2=A0 I think we had an email discussion about this module a l=
ong time ago and concluded that it was necessary for duplicity itself and n=
ot one of the other modules.</div><div><br></div><div>-Scott</div><div><div=
><br><blockquote type=3D"cite"><div>On Jul 6, 2026, at 3:03=E2=80=AFPM, Sco=
tt Hannahs via Duplicity-talk &lt;<a href=3D"mailto:[email protected]=
rg" target=3D"_blank">[email protected]</a>&gt; wrote:</div><br><di=
v><div>I have and severely changed my requirements since the last update.=
=C2=A0 But I have a few questions.<div><br></div><div>1. what are the non-p=
ython requirements? =C2=A0 I have the following in previous versions, and I=
 am sure that the gnupg2 is needed.</div><div><div>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 librsync2-shlibs (&gt;=3D 2.0),</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 l=
ibrsync-bin (&gt;=3D 2.0),</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 gnupg2,</d=
iv><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 intltool40,</div><div><span style=3D"wh=
ite-space:pre-wrap">	</span>par2,</div><div><br></div><div><br></div><div>2=
. to support ftp backups and other non-python backends I had these were als=
o required?</div><div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ncftp,</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 lftp,</div><div><br></div></div><div>Are these als=
o no longer part of the duplicity backends?=C2=A0 The requirements.txt and =
<a href=3D"http://requirements.dev" target=3D"_blank">requirements.dev</a> =
seem limited.</div><div><br></div><div>-Scott</div><div><br></div><div><blo=
ckquote type=3D"cite"><div>On Jun 28, 2026, at 2:29=E2=80=AFPM, Kenneth Loa=
fman via Duplicity-talk &lt;<a href=3D"mailto:[email protected]" ta=
rget=3D"_blank">[email protected]</a>&gt; wrote:</div><br><div><div=
 dir=3D"ltr"><div dir=3D"ltr"><div>Hi Scott.</div><div><br></div><div>1. an=
d 2. run fine with pylint=3D=3D4.0.5, black=3D=3D26.31</div><div><br></div>=
<div>3. I really do not know why it is failing.</div><div><br></div><div>Ta=
ke a look at <a href=3D"http://requirements.dev/" target=3D"_blank">require=
ments.dev</a> and requirements.txt.=C2=A0 You might want to do:</div><div><=
br></div><div><font face=3D"monospace" style=3D"background-color:rgb(238,23=
8,238)">$ python3 -m pip install --update -r <a href=3D"http://requirements=
.dev/" target=3D"_blank">requirements.dev</a></font></div><div><font face=
=3D"monospace" style=3D"background-color:rgb(238,238,238)">$ python3 -m pip=
 install --update -r requirements.txt</font></div><div><font face=3D"monosp=
ace" style=3D"background-color:rgb(238,238,238)">$ python3 -m pip install .=
=C2=A0 =C2=A0# while in the duplicity directory</font></div><div>=C2=A0</di=
v><div>as this will guarantee we&#39;re using the same environment.=C2=A0 A=
t least you can figure out what versions you need.</div><div><br></div><div=
>...Ken</div><div><br></div><br><div class=3D"gmail_quote"><div dir=3D"ltr"=
 class=3D"gmail_attr">On Fri, Jun 26, 2026 at 10:53=E2=80=AFAM Scott Hannah=
s via Duplicity-talk &lt;<a href=3D"mailto:[email protected]" targe=
t=3D"_blank">[email protected]</a>&gt; wrote:<br></div><blockquote =
class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px sol=
id rgb(204,204,204);padding-left:1ex"><div><div dir=3D"auto"><div dir=3D"au=
to"><div dir=3D"auto"><div dir=3D"auto">Thanks for the update.=C2=A0 Trying=
 to adjust my fink-project build system for this.=C2=A0 I get a couple of f=
ailures when running the suite of tests.=C2=A0 I know the pylint and the bl=
ack tests are not necessary but I dislike failures in my output.=C2=A0 Put =
it down to programmer OCD.=C2=A0 I am sure the tests all passed on your sys=
tem before you released it, but I am curious what is different on my system=
 that all but these 3 tests would pass.=C2=A0 I am using python 3.10 and py=
lint 2.14.5.=C2=A0 Now updating pylint (and astroid) to current version.<di=
v><br></div><div>1. pylint fails.=C2=A0 It seems that building in a deep di=
rectory hierarchy causes python to abbreviate the strings with a =E2=80=98=
=E2=80=A6=E2=80=99 ellipsis.=C2=A0 This of course causes all sorts of failu=
res when =C2=A0the command line is called:</div><blockquote style=3D"margin=
:0px 0px 0px 40px;border-width:medium;border-style:none;border-color:curren=
tcolor;padding:0px"><div>pylint --rcfile=3D/opt/sw/src/fink.build/duplicity=
-3.1.0-1/duplicity-rel.3.1.0/pyproject.toml /opt/sw/src/<b style=3D"font-si=
ze:16px"><u>fink.b...l.3.1.0</u></b>/duplicity/backend.py /opt/sw/src/fink.=
build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/config.py</div></bloc=
kquote><div><div><br></div><div>The underlined text should be &#39;/fink.bu=
ild/duplicity-3.1.0-1/duplicity-rel.3.1.0/=E2=80=98 but even when using the=
 full correct path, pylint gives me this error in the toml file.=C2=A0 I as=
sume that the paths are abbreviated just for error logging and the code is =
using the full paths?</div></div><blockquote style=3D"margin:0px 0px 0px 40=
px;border-width:medium;border-style:none;border-color:currentcolor;padding:=
0px"><div><div>pyproject.toml:1: [W0012(unknown-option-value), ] Unknown op=
tion value for &#39;--disable&#39;, expected a valid pylint message and got=
 &#39;possibly-used-before-assignment=E2=80=99</div></div><div><br></div></=
blockquote><div>Standard error output:</div><blockquote style=3D"margin:0px=
 0px 0px 40px;border-width:medium;border-style:none;border-color:currentcol=
or;padding:0px"><div><div>----------------------------- Captured stderr cal=
l -----------------------------</div><div>************* Module /opt/sw/src/=
fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/pyproject.toml</div><div s=
tyle=3D"font-size:16px"><b>/opt/sw/src/fink.build/duplicity-3.1.0-1/duplici=
ty-rel.3.1.0/pyproject.toml:1: [W0012(unknown-option-value), ] Unknown opti=
on value for &#39;--disable&#39;, expected a valid pylint message and got &=
#39;possibly-used-before-assignment&#39;</b></div><div>************* Module=
 duplicity.statistics</div><div>/opt/sw/src/fink.build/duplicity-3.1.0-1/du=
plicity-rel.3.1.0/duplicity/statistics.py:154: [E1307(bad-string-format-typ=
e), StatsObj.get_timestats_string] Argument &#39;builtins.NoneType&#39; doe=
s not match format type &#39;f&#39;</div><div>/opt/sw/src/fink.build/duplic=
ity-3.1.0-1/duplicity-rel.3.1.0/duplicity/statistics.py:162: [E1307(bad-str=
ing-format-type), StatsObj.get_timestats_string] Argument &#39;builtins.Non=
eType&#39; does not match format type &#39;f&#39;</div><div>************* M=
odule duplicity.backends.gdrivebackend</div><div>/opt/sw/src/fink.build/dup=
licity-3.1.0-1/duplicity-rel.3.1.0/duplicity/backends/gdrivebackend.py:102:=
 [E0401(import-error), GDriveBackend.__init__] Unable to import &#39;google=
_auth_oauthlib.flow&#39;</div><div>/opt/sw/src/fink.build/duplicity-3.1.0-1=
/duplicity-rel.3.1.0/duplicity/backends/gdrivebackend.py:103: [E0401(import=
-error), GDriveBackend.__init__] Unable to import &#39;google.auth.transpor=
t.requests&#39;</div><div>/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicit=
y-rel.3.1.0/duplicity/backends/gdrivebackend.py:217: [E0401(import-error), =
GDriveBackend.file_by_name] Unable to import &#39;googleapiclient.errors&#3=
9;</div><div>/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/d=
uplicity/backends/gdrivebackend.py:286: [E0401(import-error), GDriveBackend=
._put] Unable to import &#39;googleapiclient.http&#39;</div><div>/opt/sw/sr=
c/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/backends/gdriv=
ebackend.py:335: [E0401(import-error), GDriveBackend._get] Unable to import=
 &#39;googleapiclient.http&#39;</div><div>/opt/sw/src/fink.build/duplicity-=
3.1.0-1/duplicity-rel.3.1.0/duplicity/backends/gdrivebackend.py:402: [E0401=
(import-error), GDriveBackend._error_code] Unable to import &#39;google.aut=
h.exceptions&#39;</div><div>/opt/sw/src/fink.build/duplicity-3.1.0-1/duplic=
ity-rel.3.1.0/duplicity/backends/gdrivebackend.py:403: [E0401(import-error)=
, GDriveBackend._error_code] Unable to import &#39;googleapiclient.errors&#=
39;</div><div>************* Module duplicity.backends.pydrivebackend</div><=
div>/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/=
backends/pydrivebackend.py:279: [E0401(import-error), PyDriveBackend._error=
_code] Unable to import &#39;pydrive2.files&#39;</div><div>************* Mo=
dule duplicity.backends.azurebackend</div><div>/opt/sw/src/fink.build/dupli=
city-3.1.0-1/duplicity-rel.3.1.0/duplicity/backends/azurebackend.py:86: [E0=
401(import-error), AzureBackend._get_or_create_container] Unable to import =
&#39;azure.core.exceptions&#39;</div><div><br></div></div></blockquote><div=
><div><br></div><div>2. black fails too, probably for the same reason and I=
 will try to fix it if I can get a resolution to the pylint issue.</div><di=
v><br></div><div>3. This is further on a specific test for a code regressio=
n number 908.=C2=A0 I am including the long log here because I am not sure =
what is relevant.</div></div><div><br></div><blockquote style=3D"margin:0px=
 0px 0px 40px;border-width:medium;border-style:none;border-color:currentcol=
or;padding:0px"><div><div>testing/functional/test_regression.py::Regression=
Test::test_issue908 FAILED [ 72%]</div></div><div>=E2=80=94=E2=80=94</div><=
div><div>_________________________ RegressionTest.test_issue908 ___________=
______________</div><div><br></div><div>self =3D &lt;testing.functional.tes=
t_regression.RegressionTest testMethod=3Dtest_issue908&gt;</div><div><br></=
div><div>=C2=A0 =C2=A0 @unittest.skipIf(os.path.exists(&quot;/.dockerenv&qu=
ot;), &quot;Won&#39;t work on docker&quot;)</div><div>=C2=A0 =C2=A0 def tes=
t_issue908(self):</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot;&quot;&quot;<=
/div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 Test issue 908 - gpg: public key decr=
yption failed: No passphrase given (3.0.6.2)</div><div>=C2=A0 =C2=A0 =C2=A0=
 =C2=A0 &quot;&quot;&quot;</div><div>=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 # make sure we test with a clean cache and clean outpu=
t</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.set_environ(&quot;FTP_PASSWORD=
&quot;, None)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.set_environ(&quot;=
PASSPHRASE&quot;, None)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.set_envi=
ron(&quot;SIGN_PASSPHRASE&quot;, None)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 self.set_environ(&quot;TESTDEBUG&quot;, None)</div><div>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 shutil.rmtree(f&quot;{_runtest_dir}/testfiles/cache/issue908&=
quot;, ignore_errors=3DTrue)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 shutil.r=
mtree(f&quot;{_runtest_dir}/testfiles/output&quot;, ignore_errors=3DTrue)</=
div><div>=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 # do ini=
tial full backup with passphrase</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 self=
.backup(</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot;full&quo=
t;,</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 f&quot;{_runtest_di=
r}/testfiles/various_file_types&quot;,</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 options=3D[&quot;--name=3Dissue908&quot;, f&quot;--encryp=
t-key=3D{self.encrypt_key1}&quot;],</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 )=
</div><div>=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 # make=
 sure inc has somthing to do</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 os.unlin=
k(f&quot;{_runtest_dir}/testfiles/various_file_types/executable&quot;)</div=
><div>=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 # do increm=
ental backup</div><div>&gt; =C2=A0 =C2=A0 =C2=A0 self.backup(</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot;inc&quot;,</div><div>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 f&quot;{_runtest_dir}/testfiles/various_=
file_types&quot;,</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 optio=
ns=3D[&quot;--name=3Dissue908&quot;, f&quot;--encrypt-key=3D{self.encrypt_k=
ey1}&quot;],</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 passphrase=
_input=3D[self.sign_passphrase],</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 )</d=
iv><div><br></div><div>self =C2=A0 =C2=A0 =C2=A0 =3D &lt;testing.functional=
.test_regression.RegressionTest testMethod=3Dtest_issue908&gt;</div><div><b=
r></div><div>/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/t=
esting/functional/test_regression.py:154:=C2=A0</div><div>_ _ _ _ _ _ _ _ _=
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _=C2=A0</div><=
div><div>/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/testi=
ng/functional/__init__.py:197: in backup</div><div>=C2=A0 =C2=A0 self.run_d=
uplicity(options=3Doptions, **kwargs)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0=
 before_files =3D {b&#39;duplicity-full-signatures.20260616T174134Z.sigtar.=
gpg&#39;, b&#39;duplicity-full.20260616T174134Z.manifest.gpg&#39;, b&#39;du=
plicity-full.20260616T174134Z.vol1.difftar.gpg&#39;}</div><div>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 input_dir =C2=A0=3D &#39;/var/folders/6b/85yg9bp94rv55dzb=
dp78thp40000kr/T/testfiles/various_file_types&#39;</div><div>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 kwargs =C2=A0 =C2=A0 =3D {&#39;passphrase_input&#39;: [&#39;t=
est&#39;]}</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 now =C2=A0 =C2=A0 =C2=A0 =
=C2=A0=3D 1781631694.437021</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 options =
=C2=A0 =C2=A0=3D [&#39;inc&#39;, &#39;/var/folders/6b/85yg9bp94rv55dzbdp78t=
hp40000kr/T/testfiles/various_file_types&#39;, &#39;fortestsonly:///var/fol=
ders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/output&#39;, &#39;--vols=
ize=3D1&#39;, &#39;--name=3Dissue908&#39;, &#39;--encrypt-key=3D839E6A28565=
38CCF&#39;]</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 self =C2=A0 =C2=A0 =C2=A0=
 =3D &lt;testing.functional.test_regression.RegressionTest testMethod=3Dtes=
t_issue908&gt;</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 type =C2=A0 =C2=A0 =C2=
=A0 =3D &#39;inc&#39;</div><div>/opt/sw/src/fink.build/duplicity-3.1.0-1/du=
plicity-rel.3.1.0/testing/functional/__init__.py:159: in run_duplicity</div=
><div>=C2=A0 =C2=A0 child.expect(&quot;passphrase.*:&quot;)</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 child =C2=A0 =C2=A0 =C2=A0=3D &lt;pexpect.pty_spaw=
n.spawn object at 0x10abc27a0&gt;</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 cmd=
_list =C2=A0 =3D [&#39;/opt/sw/bin/python3.10&#39;, &#39;-W&#39;, &#39;igno=
re&#39;, &#39;-u&#39;, &#39;/opt/sw/src/fink.build/duplicity-3.1.0-1/duplic=
ity-rel.3.1.0/duplicity/__main__.py&#39;, &#39;inc&#39;, ...]</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 cmdline =C2=A0 =C2=A0=3D &quot;&#39;/opt/sw/bin/py=
thon3.10&#39; &#39;-W&#39; &#39;ignore&#39; &#39;-u&#39; &#39;/opt/sw/src/f=
ink.build/duplicity-3.1.0-1/duplicity-rel.3.1.0/duplicity/_...538CCF&#39; &=
#39;-v0&#39; &#39;--no-print-statistics&#39; &#39;--archive-dir=3D/var/fold=
ers/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/cache&#39;&quot;</div><di=
v>=C2=A0 =C2=A0 =C2=A0 =C2=A0 current_time =3D None</div><div>=C2=A0 =C2=A0=
 =C2=A0 =C2=A0 dup_env =C2=A0 =C2=A0=3D {&#39;CCACHE_DIR&#39;: &#39;/opt/sw=
/var/ccache&#39;, &#39;CPPFLAGS&#39;: &#39;-I/opt/sw/include&#39;, &#39;DBU=
S_SESSION_BUS_ADDRESS&#39;: &#39;launchd:env=3DDBUS_FINK_SESSION_BUS_SOCKET=
&#39;, &#39;GNUPGHOME&#39;: &#39;/opt/sw/src/fink.build/duplicity-3.1.0-1/d=
uplicity-rel.3.1.0/testing/gnupg&#39;, ...}</div><div>=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 fail =C2=A0 =C2=A0 =C2=A0 =3D None</div><div>=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 item =C2=A0 =C2=A0 =C2=A0 =3D &#39;test&#39;</div><div>=C2=A0 =C2=A0=
 =C2=A0 =C2=A0 options =C2=A0 =C2=A0=3D [&#39;inc&#39;, &#39;/var/folders/6=
b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/various_file_types&#39;, &#39;=
fortestsonly:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/o=
utput&#39;, &#39;--volsize=3D1&#39;, &#39;--name=3Dissue908&#39;, &#39;--en=
crypt-key=3D839E6A2856538CCF&#39;]</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 pa=
ssphrase =3D &#39;test&#39;</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 passphras=
e_input =3D [&#39;test&#39;]</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 self =C2=
=A0 =C2=A0 =C2=A0 =3D &lt;testing.functional.test_regression.RegressionTest=
 testMethod=3Dtest_issue908&gt;</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 timeo=
ut =C2=A0 =C2=A0=3D None</div><div>/opt/sw/lib/python3.10/site-packages/pex=
pect/spawnbase.py:343: in expect</div><div>=C2=A0 =C2=A0 return self.expect=
_list(compiled_pattern_list,</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 async_ =
=C2=A0 =C2=A0 =3D False</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 compiled_patt=
ern_list =3D [re.compile(b&#39;passphrase.*:&#39;, re.DOTALL)]</div><div>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 kw =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D {}</div><div=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 pattern =C2=A0 =C2=A0=3D &#39;passphrase.*:&#3=
9;</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 searchwindowsize =3D -1</div><div>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 self =C2=A0 =C2=A0 =C2=A0 =3D &lt;pexpect.pty_s=
pawn.spawn object at 0x10abc27a0&gt;</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
timeout =C2=A0 =C2=A0=3D -1</div><div>/opt/sw/lib/python3.10/site-packages/=
pexpect/spawnbase.py:372: in expect_list</div><div>=C2=A0 =C2=A0 return exp=
.expect_loop(timeout)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 async_ =C2=A0 =
=C2=A0 =3D False</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 exp =C2=A0 =C2=A0 =
=C2=A0 =C2=A0=3D &lt;pexpect.expect.Expecter object at 0x109e4ff40&gt;</div=
><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 kw =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D {}</di=
v><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 pattern_list =3D [re.compile(b&#39;passp=
hrase.*:&#39;, re.DOTALL)]</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 searchwind=
owsize =3D -1</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 self =C2=A0 =C2=A0 =C2=
=A0 =3D &lt;pexpect.pty_spawn.spawn object at 0x10abc27a0&gt;</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 timeout =C2=A0 =C2=A0=3D None</div><div>/opt/sw/li=
b/python3.10/site-packages/pexpect/expect.py:179: in expect_loop</div><div>=
=C2=A0 =C2=A0 return self.eof(e)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 idx =
=C2=A0 =C2=A0 =C2=A0 =C2=A0=3D None</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 s=
elf =C2=A0 =C2=A0 =C2=A0 =3D &lt;pexpect.expect.Expecter object at 0x109e4f=
f40&gt;</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 spawn =C2=A0 =C2=A0 =C2=A0=3D=
 &lt;pexpect.pty_spawn.spawn object at 0x10abc27a0&gt;</div><div>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 timeout =C2=A0 =C2=A0=3D None</div><div>_ _ _ _ _ _ _ _ _=
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _=C2=A0</div><=
div><br></div><div>self =3D &lt;pexpect.expect.Expecter object at 0x109e4ff=
40&gt;</div><div>err =3D EOF(&#39;End Of File (EOF). Empty string style pla=
tform.&#39;)</div><div><br></div><div>=C2=A0 =C2=A0 def eof(self, err=3DNon=
e):</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 spawn =3D self.spawn</div><div>=
=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 spawn.before =3D =
spawn._before.getvalue()</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 spawn._buffe=
r =3D spawn.buffer_type()</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 spawn._befo=
re =3D spawn.buffer_type()</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 spawn.afte=
r =3D EOF</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 index =3D self.searcher.eof=
_index</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if index &gt;=3D 0:</div><div>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 spawn.match =3D EOF</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 spawn.match_index =3D index</div><di=
v>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return index</div><div>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 else:</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 spawn.match =3D None</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 spawn.match_index =3D None</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 msg =3D str(spawn)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 msg +=3D &#39;\nsearcher: %s&#39; % self.searcher</div><div>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if err is not None:</div><div>=C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 msg =3D str(err) + &#39;\n&#39; =
+ msg</div><div>=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 exc =3D EOF(msg)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 exc.__cause__ =3D None # in Python 3.x we can use &quot;raise exc f=
rom None&quot;</div><div>&gt; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 raise exc<=
/div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pexpect.exceptions.EOF: End =
Of File (EOF). Empty string style platform.</div><div>E =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 &lt;pexpect.pty_spawn.spawn object at 0x10abc27a0&gt;</di=
v><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 command: /bin/sh</div><div>E =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 args: [&#39;/bin/sh&#39;, &#39;-f&#39;, =
&#39;-c&#39;, &quot;&#39;/opt/sw/bin/python3.10&#39; &#39;-W&#39; &#39;igno=
re&#39; &#39;-u&#39; &#39;/opt/sw/src/fink.build/duplicity-3.1.0-1/duplicit=
y-rel.3.1.0/duplicity/__main__.py&#39; &#39;inc&#39; &#39;/var/folders/6b/8=
5yg9bp94rv55dzbdp78thp40000kr/T/testfiles/various_file_types&#39; &#39;fort=
estsonly:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/outpu=
t&#39; &#39;--volsize=3D1&#39; &#39;--name=3Dissue908&#39; &#39;--encrypt-k=
ey=3D839E6A2856538CCF&#39; &#39;-v0&#39; &#39;--no-print-statistics&#39; &#=
39;--archive-dir=3D/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfil=
es/cache&#39;&quot;]</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 buffer =
(last 100 chars): b&#39;&#39;</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 before (last 100 chars): &#39;&#39;</div><div>E =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 after: &lt;class &#39;pexpect.exceptions.EOF&#39;&gt;</div><d=
iv>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match: None</div><div>E =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 match_index: None</div><div>E =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 exitstatus: None</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 flag_eof: True</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pid: 4540=
4</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 child_fd: 191</div><div>E =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 closed: False</div><div>E =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 timeout: None</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 delimiter: &lt;class &#39;pexpect.exceptions.EOF&#39;&gt;</div><div>=
E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 logfile: None</div><div>E =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 logfile_read: None</div><div>E =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 logfile_send: None</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 maxread: 2000</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ign=
orecase: False</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 searchwindows=
ize: None</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 delaybeforesend: 0=
.05</div><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 delayafterclose: 0.1</di=
v><div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 delayafterterminate: 0.1</div><=
div>E =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 searcher: searcher_re:</div><div>E=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0: re.compile(b&#39;passp=
hrase.*:&#39;)</div><div><br></div><div>err =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D =
EOF(&#39;End Of File (EOF). Empty string style platform.&#39;)</div><div>ex=
c =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D EOF(&#39;End Of File (EOF). Empty string s=
tyle platform.\n&lt;pexpect.pty_spawn.spawn object at 0x10abc27a0&gt;\ncomm=
and: /bin/s...: 0.05\ndelayafterclose: 0.1\ndelayafterterminate: 0.1\nsearc=
her: searcher_re:\n =C2=A0 =C2=A00: re.compile(b\&#39;passphrase.*:\&#39;)&=
#39;)</div><div>index =C2=A0 =C2=A0 =C2=A0=3D -1</div><div>msg =C2=A0 =C2=
=A0 =C2=A0 =C2=A0=3D &quot;End Of File (EOF). Empty string style platform.\=
n&lt;pexpect.pty_spawn.spawn object at 0x10abc27a0&gt;\ncommand: /bin/sh\na=
...end: 0.05\ndelayafterclose: 0.1\ndelayafterterminate: 0.1\nsearcher: sea=
rcher_re:\n =C2=A0 =C2=A00: re.compile(b&#39;passphrase.*:&#39;)&quot;</div=
><div>self =C2=A0 =C2=A0 =C2=A0 =3D &lt;pexpect.expect.Expecter object at 0=
x109e4ff40&gt;</div><div>spawn =C2=A0 =C2=A0 =C2=A0=3D &lt;pexpect.pty_spaw=
n.spawn object at 0x10abc27a0&gt;</div><div><br></div><div>/opt/sw/lib/pyth=
on3.10/site-packages/pexpect/expect.py:122: EOF</div><div>-----------------=
------------ Captured stdout call -----------------------------</div><div>T=
estBackend is not made for production use!</div><div>TestBackend is not mad=
e for production use!</div><div>TestBackend is not made for production use!=
</div><div>TestBackend is not made for production use!</div><div>----------=
------------------- Captured stderr call -----------------------------</div=
><div><br></div><div>...command: &#39;/opt/sw/bin/python3.10&#39; &#39;-W&#=
39; &#39;ignore&#39; &#39;-u&#39; &#39;/opt/sw/src/fink.build/duplicity-3.1=
.0-1/duplicity-rel.3.1.0/duplicity/__main__.py&#39; &#39;full&#39; &#39;/va=
r/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/various_file_types&=
#39; &#39;fortestsonly:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/t=
estfiles/output&#39; &#39;--volsize=3D1&#39; &#39;--name=3Dissue908&#39; &#=
39;--encrypt-key=3D839E6A2856538CCF&#39; &#39;-v0&#39; &#39;--no-print-stat=
istics&#39; &#39;--archive-dir=3D/var/folders/6b/85yg9bp94rv55dzbdp78thp400=
00kr/T/testfiles/cache&#39; &lt; /dev/null</div><div>...cwd: /private/var/f=
olders/6b/85yg9bp94rv55dzbdp78thp40000kr/T</div><div>...output:</div><div>.=
..return_val: 0</div><div>------------------------------ Captured log call =
-------------------------------</div><div>Level 8 =C2=A0duplicity:log.py:10=
0 TestBackend is not made for production use!</div><div>Level 8 =C2=A0dupli=
city:log.py:100 TestBackend is not made for production use!</div><div>Level=
 8 =C2=A0duplicity:log.py:100 TestBackend is not made for production use!</=
div><div>Level 8 =C2=A0duplicity:log.py:100 TestBackend is not made for pro=
duction use!</div><div>=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D short test summary info =3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D</div></d=
iv></div></blockquote><div>-Scott</div><div><div><br><blockquote type=3D"ci=
te"><div>On Jun 16, 2026, at 1:10=E2=80=AFPM, Kenneth Loafman via Duplicity=
-talk &lt;<a href=3D"mailto:[email protected]" target=3D"_blank">du=
[email protected]</a>&gt; wrote:</div><br><div><div dir=3D"ltr">Hi ev=
eryone,<br><br>I am pleased to announce the release of duplicity version 3.=
1.0.<br><br>This release follows version 3.0.7 and includes a minor version=
 bump to reflect a significant new feature. Thanks to elmuz&#39;s contribut=
ion, restore operations can now use --include, --exclude, --include-regexp,=
 and --include-filelist directly from the command line.<br><br>There are ma=
ny other improvements and bug fixes included in this update. Please see the=
 CHANGELOG below for full details.<br><br>Thanks,<br>Ken<br></div></div></b=
lockquote></div><br></div></div></div></div></div></div>___________________=
____________________________<br>
Duplicity-talk mailing list<br>
<a href=3D"mailto:[email protected]" target=3D"_blank">Duplicity-ta=
[email protected]</a><br>
<a href=3D"https://lists.nongnu.org/mailman/listinfo/duplicity-talk" rel=3D=
"noreferrer" target=3D"_blank">https://lists.nongnu.org/mailman/listinfo/du=
plicity-talk</a><br>
</blockquote></div></div>
</div>
_______________________________________________<br>Duplicity-talk mailing l=
ist<br><a href=3D"mailto:[email protected]" target=3D"_blank">Dupli=
[email protected]</a><br><a href=3D"https://lists.nongnu.org/mailman/lis=
tinfo/duplicity-talk" target=3D"_blank">https://lists.nongnu.org/mailman/li=
stinfo/duplicity-talk</a><br></div></blockquote></div><br></div></div>_____=
__________________________________________<br>Duplicity-talk mailing list<b=
r><a href=3D"mailto:[email protected]" target=3D"_blank">Duplicity-=
[email protected]</a><br><a href=3D"https://lists.nongnu.org/mailman/listinfo=
/duplicity-talk" target=3D"_blank">https://lists.nongnu.org/mailman/listinf=
o/duplicity-talk</a><br></div></blockquote></div><br></div></div></blockquo=
te></div>

--000000000000eaa263065603f4cb--


--===============2611362214966940097==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: inline

X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KRHVwbGljaXR5
LXRhbGsgbWFpbGluZyBsaXN0CkR1cGxpY2l0eS10YWxrQG5vbmdudS5vcmcKaHR0cHM6Ly9saXN0
cy5ub25nbnUub3JnL21haWxtYW4vbGlzdGluZm8vZHVwbGljaXR5LXRhbGsK

--===============2611362214966940097==--