Package: duplicity Version: 0.8.05-2 Severity: normal Tags: patch upstream Dear Maintainer,
The PCA (OVH public cloud archive) backend fails with Python 3, with "can only concatenate str (not "bytes") to str". The attached patch, based on the most recent SWIFT backend, appears to work. However, I am not familiar with Python 3 so I would recommend checking it properly. Cheers, Bertrand -- System Information: Debian Release: bullseye/sid APT prefers testing APT policy: (500, 'testing') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 5.2.0-3-amd64 (SMP w/2 CPU cores) Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8), LANGUAGE=fr_FR.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages duplicity depends on: ii gnupg 2.2.17-3 ii libc6 2.29-2 ii librsync2 2.0.2-1 ii python3 3.7.5-1 ii python3-fasteners 0.14.1-2 ii python3-future 0.16.0-1 ii python3-lockfile 1:0.12.2-2 Versions of packages duplicity recommends: ii python3-oauthlib 2.1.0-2 ii python3-paramiko 2.6.0-1 ii python3-pexpect 4.6.0-1 ii python3-urllib3 1.24.1-1 ii rsync 3.1.3-8 Versions of packages duplicity suggests: pn lftp <none> pn ncftp <none> pn par2 <none> pn python3-boto <none> pn python3-pip <none> ii python3-swiftclient 1:3.8.1-2 pn tahoe-lafs <none> -- no debconf information
--- /usr/lib/python3/dist-packages/duplicity/backends/pcabackend.py 2019-07-16 22:44:19.000000000 +0200 +++ /home/bbk/Temp/pcabackend.py 2019-11-07 18:02:17.513258254 +0100 @@ -150,8 +150,8 @@ return log.ErrorCode.backend_not_found def _put(self, source_path, remote_filename): - self.conn.put_object(self.container, self.prefix + remote_filename, - file(source_path.name)) + self.conn.put_object(self.container, self.prefix + util.fsdecode(remote_filename), + open(util.fsdecode(source_path.name), u'rb')) def _get(self, remote_filename, local_path): body = self.preprocess_download(remote_filename, 60) @@ -166,10 +166,10 @@ return [o[u'name'][len(self.prefix):] for o in objs] def _delete(self, filename): - self.conn.delete_object(self.container, self.prefix + filename) + self.conn.delete_object(self.container, self.prefix + util.fsdecode(filename)) def _query(self, filename): - sobject = self.conn.head_object(self.container, self.prefix + filename) + sobject = self.conn.head_object(self.container, self.prefix + util.fsdecode(filename)) return {u'size': int(sobject[u'content-length'])} def preprocess_download(self, remote_filename, retry_period, wait=True): @@ -188,7 +188,7 @@ def unseal(self, remote_filename): try: - _, body = self.conn.get_object(self.container, self.prefix + remote_filename, + _, body = self.conn.get_object(self.container, self.prefix + util.fsdecode(remote_filename), resp_chunk_size=1024) log.Info(u"File %s was successfully unsealed." % remote_filename) return body