duplicity-team team mailing list archive
-
duplicity-team team
-
Mailing list archive
-
Message #05805
Re: [Duplicity-talk] Duplicity 1.0.1 Released
Hi Scott,
I would say that all your errors are from not being able to build
*_librsync.so* properly. There is one thing that may help in lines 65-76
of *setup.py*. You can supply *LIBRSYNC_DIR* as an env variable, or on the
command line as *--librsync-dir=*. I have *export LIBRSYNC_DIR=/usr/local* in
my .bash_profile. That came from *homebrew* installing into /usr/local
instead of /usr. Seems none of these installers care much for standards.
Try exporting *LIBRSYNC_DIR* and let me know how it goes after that.
...Ken
On Sun, Oct 9, 2022 at 4:46 PM Scott Hannahs <sth@xxxxxxxxxx> wrote:
> So there are two major failures in testing. One is four failures in the
> tahoe backend, (which I don’t use).
>
> testing/unit/test_backend_instance.py ..............................FF.. [
> 10%]
> FF........................ssssssssss [
> 18%]
>
>
> This shows a “Key Error” so is something wrong with my GPG version?
>
> self = <duplicity.backends.tahoebackend.TAHOEBackend object at 0x10f58deb0>
> commandline = 'tahoe cp
> /var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/local var:folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/output/file-a'
>
> def subprocess_popen(self, commandline):
> u"""
> Execute the given command line with error check.
> Returns int Exitcode, string StdOut, string StdErr
>
> Raise a BackendException on failure.
> """
> import shlex
>
> if isinstance(commandline, (list, tuple)):
> logstr = u' '.join(commandline)
> args = commandline
> else:
> logstr = commandline
> args = shlex.split(commandline)
>
> logstr = self.munge_password(logstr)
> log.Info(_(u"Reading results of '%s'") % logstr)
>
> result, stdout, stderr = self.__subprocess_popen(args)
> if result != 0:
> try:
> > ignores = self.popen_breaks[args[0]]
> E KeyError:
> '/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/testing/overrides/bin/tahoe'
>
> /opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/backend.py:522:
> KeyError
>
> During handling of the above exception, another exception occurred:
>
> The second testing error is more general, so many of the tests pass and
> then starting at the “bad upload” test it all goes south.
>
> testing/functional/test_badupload.py F [
> 70%]
> testing/functional/test_cleanup.py FFF [
> 71%]
> testing/functional/test_final.py FFFFFFFFFFFFFFFFFFFFFFFFFFF [
> 77%]
> testing/functional/test_log.py F [
> 77%]
> testing/functional/test_rdiffdir.py F [
> 77%]
> testing/functional/test_replicate.py FFF [
> 78%]
> testing/functional/test_restart.py FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [
> 86%]
> testing/functional/test_selection.py .FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [
> 94%]
> FFFFssFFFFFFFssss [
> 98%]
>
>
> This test has a long back trace, But I think that the basic problem is
> that duplicity cannot import “librsynch”??? The end of the traceback has
> the text "b"ImportError: cannot import name '_librsync' from 'duplicity'
> (/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/__init__.py)"
> ...return_val: 1"
>
> /opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/backend.py:527:
> BackendException
> _______________________ BadUploadTest.test_missing_file
> ________________________
>
> self = <testing.functional.test_badupload.BadUploadTest
> testMethod=test_missing_file>
>
> @pytest.mark.slow
> def test_missing_file(self):
> u"""
> Test basic lost file
> """
> try:
> > self.backup(u"full",
> u"{0}/testfiles/dir1".format(_runtest_dir), options=[u"--skip-volume=1"])
>
>
> /opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/testing/functional/test_badupload.py:44:
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
> _ _ _
>
> self = <testing.functional.test_badupload.BadUploadTest
> testMethod=test_missing_file>
> type = 'full'
> input_dir =
> '/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/dir1'
> options = ['full',
> '/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/dir1', '
> file:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/output',
> '--volsize', '1', '--skip-volume=1']
> kwargs = {}, before_files = set(), now = 1664937609.016365
>
> def backup(self, type, input_dir, options=[], **kwargs): # pylint:
> disable=redefined-builtin
> u"""Run duplicity backup to default directory"""
> options = [type, input_dir, self.backend_url, u"--volsize", u"1"]
> + options
> before_files = self.get_backend_files()
>
> # If a chain ends with time X and the next full chain begins at
> time X,
> # we may trigger an assert in dup_collections.py. If needed,
> sleep to
> # avoid such problems
> now = time.time()
> if self.last_backup == int(now):
> time.sleep(1)
>
> > self.run_duplicity(options=options, **kwargs)
>
>
> /opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/testing/functional/__init__.py:189:
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
> _ _ _
>
> self = <testing.functional.test_badupload.BadUploadTest
> testMethod=test_missing_file>
> options = ['full',
> '/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/dir1', '
> file:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/output',
> '--volsize', '1', '--skip-volume=1']
> current_time = None, fail = None, passphrase_input = []
>
> def run_duplicity(self, options=[], current_time=None, fail=None,
> passphrase_input=[]):
> u"""
> Run duplicity binary with given arguments and options
> """
> # We run under setsid and take input from /dev/null (below) because
> # this way we force a failure if duplicity tries to read from the
> # console unexpectedly (like for gpg password or such).
>
> # Check all string inputs are unicode -- we will convert to system
> encoding before running the command
> for item in options:
> if sys.version_info.major == 2:
> assert not isinstance(item, str), u"item " + unicode(item)
> + u" in options is not unicode"
>
> for item in passphrase_input:
> assert isinstance(item, u"".__class__), u"item " +
> unicode(item) + u" in passphrase_input is not unicode"
>
> if platform.platform().startswith(u'Linux'):
> cmd_list = [u'setsid']
> if self._setsid_w:
> cmd_list.extend([u"-w"])
> else:
> cmd_list = []
> basepython = os.environ.get(u'TOXPYTHON', None)
> if basepython is not None:
> cmd_list.extend([basepython])
> run_coverage = os.environ.get(u'RUN_COVERAGE', None)
> if run_coverage is not None:
> cmd_list.extend([u"-m", u"coverage", u"run",
> u"--source=duplicity", u"-p"])
> cmd_list.extend([u"{0}/bin/duplicity".format(_top_dir)])
> cmd_list.extend(options)
> cmd_list.extend([u"-v0"])
> cmd_list.extend([u"--no-print-statistics"])
> cmd_list.extend([u"--allow-source-mismatch"])
>
> cmd_list.extend([u"--archive-dir={0}/testfiles/cache".format(_runtest_dir)])
> if current_time:
> cmd_list.extend([u"--current-time", current_time])
> cmd_list.extend(self.class_args)
> if fail:
> cmd_list.extend([u"--fail", u"".__class__(fail)])
> cmdline = u" ".join([u'"%s"' % x for x in cmd_list])
>
> cmdline = u" ".join([u'"%s"' % x for x in cmd_list])
>
> if not passphrase_input:
> cmdline += u" < /dev/null"
>
> # The immediately following block is the nicer way to execute
> pexpect with
> # unicode strings, but we need to have the pre-4.0 version for
> some time yet,
> # so for now this is commented out so tests execute the same way
> on all systems.
>
> # if parse_version(pexpect.__version__) >= parse_version("4.0"):
> # # pexpect.spawn only supports unicode from version 4.0
> # # there was a separate pexpect.spawnu in 3.x, but it has an
> error on readline
> # child = pexpect.spawn(u'/bin/sh', [u'-c', cmdline],
> timeout=None, encoding=sys.getfilesystemencoding())
> #
> # for passphrase in passphrase_input:
> # child.expect(u'passphrase.*:')
> # child.sendline(passphrase)
> # else:
>
> # Manually encode to filesystem encoding and send to spawn as bytes
> # ToDo: Remove this once we no longer have to support systems with
> pexpect < 4.0
> if sys.version_info.major > 2:
> child = pexpect.spawn(u'/bin/sh', [u'-c', cmdline],
> timeout=None)
> else:
> child = pexpect.spawn(b'/bin/sh', [b'-c',
> cmdline.encode(sys.getfilesystemencoding(),
>
> u'replace')], timeout=None)
>
> for passphrase in passphrase_input:
> child.expect(b'passphrase.*:')
> child.sendline(passphrase)
>
> # if the command fails, we need to clear its output
> # so it will terminate cleanly.
> child.expect_exact(pexpect.EOF)
> lines = child.before.splitlines()
> child.wait()
> child.ptyproc.delayafterclose = 0.0
> return_val = child.exitstatus
>
> if fail:
> self.assertEqual(30, return_val)
> elif return_val:
> print(u"\n...command:", cmdline, file=sys.stderr)
> print(u"...cwd:", os.getcwd(), file=sys.stderr)
> print(u"...output:", file=sys.stderr)
> for line in lines:
> line = line.rstrip()
> if line:
> print(line, file=sys.stderr)
> print(u"...return_val:", return_val, file=sys.stderr)
>
> > raise CmdError(return_val)
> E testing.functional.CmdError: 1
>
> /opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/testing/functional/__init__.py:175:
> CmdError
>
> During handling of the above exception, another exception occurred:
>
> self = <testing.functional.test_badupload.BadUploadTest
> testMethod=test_missing_file>
>
> @pytest.mark.slow
> def test_missing_file(self):
> u"""
> Test basic lost file
> """
> try:
> self.backup(u"full",
> u"{0}/testfiles/dir1".format(_runtest_dir), options=[u"--skip-volume=1"])
> self.fail()
> except CmdError as e:
> > self.assertEqual(e.exit_status, 44, str(e))
> E AssertionError: 1 != 44 : 1
>
> /opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/testing/functional/test_badupload.py:47:
> AssertionError
> ----------------------------- Captured stderr call
> -----------------------------
>
> ...command:
> "/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/bin/duplicity"
> "full" "/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/dir1" "
> file:///var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/output"
> "--volsize" "1" "--skip-volume=1" "-v0" "--no-print-statistics"
> "--allow-source-mismatch"
> "--archive-dir=/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T/testfiles/cache"
> < /dev/null
> ...cwd: /private/var/folders/6b/85yg9bp94rv55dzbdp78thp40000kr/T
> ...output:
> b'Traceback (most recent call last):'
> b' File
> "/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/bin/duplicity",
> line 37, in <module>'
> b' from duplicity.dup_main import main'
> b' File
> "/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/dup_main.py",
> line 50, in <module>'
> b' from duplicity import commandline'
> b' File
> "/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/commandline.py",
> line 43, in <module>'
> b' from duplicity import backend'
> b' File
> "/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/backend.py",
> line 44, in <module>'
> b' from duplicity import dup_temp'
> b' File
> "/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/dup_temp.py",
> line 34, in <module>'
> b' from duplicity import path'
> b' File
> "/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/path.py",
> line 49, in <module>'
> b' from duplicity import librsync'
> b' File
> "/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/librsync.py",
> line 36, in <module>'
> b' from . import _librsync'
> b"ImportError: cannot import name '_librsync' from 'duplicity'
> (/opt/sw/src/fink.build/duplicity-1.0.1-1/duplicity-1.0.1/duplicity/__init__.py)"
> ...return_val: 1
>
>
> On Oct 9, 2022, at 11:26 AM, Kenneth Loafman <kenneth@xxxxxxxxxxx> wrote:
>
> Ok, sounds good. Any progress?
>
> ...Ken
>
>
> On Thu, Oct 6, 2022 at 3:15 PM Scott Hannahs <sth@xxxxxxxxxx> wrote:
>
>> I will try to reinstall Xcode and the command line tools. I had been
>> using py38 which is installed in both the standard and an updated version
>> in the non-standard location.
>>
>> On Oct 6, 2022, at 14:57, Kenneth Loafman <kenneth@xxxxxxxxxxx> wrote:
>>
>> OK,
>>
>> I could not remember what version of Python 3 you were running, so py3x
>> meant for you to fill it in. I'm guessing either py38 or py39 for Python
>> 3.8 and Python 3.9 respectively. Others follow the same model,
>> py27,py35,...py310.
>>
>> I am not sure why it's trying to build for anything but x86_64 if you
>> have Intel silicone and not Apple silicone.
>>
>> Here's what mine looks like for py38:
>>
>> ken@dione:~/workspace/duplicity-origin$ python3.8 ./setup.py build_ext
>> Unable to get SCM version: defaulting to 1.0.1
>> running build_ext
>> Building extension for librsync...
>> building 'duplicity._librsync' extension
>> creating build/temp.macosx-12-x86_64-cpython-38
>> creating build/temp.macosx-12-x86_64-cpython-38/duplicity
>> clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common
>> -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -isysroot
>> /Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk -I/usr/local/include
>> -I/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/include/python3.8
>> -c duplicity/_librsyncmodule.c -o
>> build/temp.macosx-12-x86_64-cpython-38/duplicity/_librsyncmodule.o
>> creating build/lib.macosx-12-x86_64-cpython-38
>> creating build/lib.macosx-12-x86_64-cpython-38/duplicity
>> clang -bundle -undefined dynamic_lookup -isysroot
>> /Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk
>> build/temp.macosx-12-x86_64-cpython-38/duplicity/_librsyncmodule.o
>> -L/usr/local/lib -lrsync -o
>> build/lib.macosx-12-x86_64-cpython-38/duplicity/_
>> librsync.cpython-38-darwin.so
>> ld: warning: -undefined dynamic_lookup may not work with chained fixups
>> copying build/lib.macosx-12-x86_64-cpython-38/duplicity/_
>> librsync.cpython-38-darwin.so -> duplicity
>>
>>
>> It looks like your xcode libs are out of date, and it also looks like
>> you're not using the standard locations for software. That's gonna
>> complicate matters.
>>
>> I'm on Monterey 12.6 with the current Xcode from Apple, all in standard
>> places.
>>
>> ...Ken
>>
>>
>>
>>
>> On Thu, Oct 6, 2022 at 1:13 PM Scott Hannahs <sth@xxxxxxxxxx> wrote:
>>
>>> Ken,
>>>
>>> I will leave fink out, but it should be doing exactly the same thing!
>>> :-)
>>>
>>> the following doesn’t even build duplicity correctly, so I don’t get to
>>> the tox command.
>>>
>>> % tar xf duplicity-1.0.1.tar
>>> % cd duplicity-1.0.1
>>> % % C_INCLUDE_PATH=/opt/sw/include LIBRARY_PATH=/opt/sw/lib python3
>>> ./setup.py build_ext > build.out.txt 2>&1
>>>
>>>
>>> This gives the following output.
>>>
>>> Unable to get SCM version: defaulting to 1.0.1
>>> running build_ext
>>> Building extension for librsync...
>>> building 'duplicity._librsync' extension
>>> clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common
>>> -dynamic -DNDEBUG -g -fwrapv -O3 -Wall
>>> -iwithsysroot/System/Library/Frameworks/System.framework/PrivateHeaders
>>> -iwithsysroot/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/Headers
>>> -arch arm64 -arch x86_64 -Werror=implicit-function-declaration
>>> -I/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/include/python3.9
>>> -c duplicity/_librsyncmodule.c -o
>>> build/temp.macosx-10.9-universal2-3.9/duplicity/_librsyncmodule.o
>>> clang -bundle -undefined dynamic_lookup -arch arm64 -arch x86_64
>>> -Wl,-headerpad,0x1000
>>> build/temp.macosx-10.9-universal2-3.9/duplicity/_librsyncmodule.o -lrsync
>>> -o build/lib.macosx-10.9-universal2-3.9/duplicity/_
>>> librsync.cpython-39-darwin.so
>>> ld: warning: ignoring file /opt/sw/lib/librsync.dylib, building for
>>> macOS-arm64 but attempting to link with file built for macOS-x86_64
>>> ld: warning: dylib (/opt/sw/lib/librsync.dylib) was built for newer
>>> macOS version (12.4) than being linked (10.9)
>>> copying build/lib.macosx-10.9-universal2-3.9/duplicity/_
>>> librsync.cpython-39-darwin.so -> duplicity
>>>
>>>
>>> I am building on an X86 machine and my libraries are x86 and I am not
>>> trying to build a universal arm 64 system. But with warnings it tries to
>>> build.
>>>
>>> tox does not like the py3x value
>>>
>>> % tox -epy3
>>> py3 create: /Users/sth/Downloads/duplicity-1.0.1/.tox/py3
>>> py3 installdeps: -rrequirements.txt
>>>
>>> and I ran out of time this AM waiting for more output.
>>>
>>> -Scott
>>>
>>>
>>> On Oct 5, 2022, at 11:54 AM, Kenneth Loafman <kenneth@xxxxxxxxxxx>
>>> wrote:
>>>
>>> Could you try just building and running the tests in a 'normal' user
>>> environment? Leave Fink out of the picture.
>>>
>>> do this:
>>>
>>> 1. $ tar xf duplicity-1.01.tar.gz
>>> 2. $ ./setup.py build_ext
>>> 3. $ tox -e py3x
>>>
>>> ...Thanks,
>>> ...Ken
>>>
>>>
>>>
>>
>
Follow ups
References