Hello community, here is the log from the commit of package duplicity for openSUSE:Factory checked in at 2020-07-29 17:21:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/duplicity (Old) and /work/SRC/openSUSE:Factory/.duplicity.new.3592 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "duplicity" Wed Jul 29 17:21:18 2020 rev:60 rq:823333 version:0.8.15 Changes: -------- --- /work/SRC/openSUSE:Factory/duplicity/duplicity.changes 2020-07-24 10:05:07.497910102 +0200 +++ /work/SRC/openSUSE:Factory/.duplicity.new.3592/duplicity.changes 2020-07-29 17:23:24.748710748 +0200 @@ -1,0 +2,19 @@ +Tue Jul 28 22:44:05 UTC 2020 - Michael Gorse <mgo...@suse.com> + +- Update to version 0.8.15: + + Merged in joshAppdev:pydriveshared - Backend for Shared Drives + on Google. + + Merged in martin-sucha:pydrive-notfound - Fix missing + FileNotUploadedError in pydrive + - Since dadbe2d2, FileNotUploadedError is not imported + anymore, resulting in an exception in case some of the files + failed to upload. Adding the import back. + + * Merged in hupfdule:s3-boto3-region-and-endpoint - Allow + setting s3 region and endpoint. + + Fix bug #1211481 with merge from Raffaele Di Campli + - Ignores the uid/gid from the archive and keeps the current + user's one. + + - Cleanup with Paramiko backend does not remove files due to + missing filename byte decoding + +------------------------------------------------------------------- Old: ---- duplicity-0.8.14.tar.gz New: ---- duplicity-0.8.15.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ duplicity.spec ++++++ --- /var/tmp/diff_new_pack.0LQ9lX/_old 2020-07-29 17:23:26.108711918 +0200 +++ /var/tmp/diff_new_pack.0LQ9lX/_new 2020-07-29 17:23:26.112711921 +0200 @@ -17,7 +17,7 @@ Name: duplicity -Version: 0.8.14 +Version: 0.8.15 Release: 0 Summary: Encrypted bandwidth-efficient backup using the rsync algorithm License: GPL-3.0-or-later ++++++ duplicity-0.8.14.tar.gz -> duplicity-0.8.15.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/CHANGELOG new/duplicity-0.8.15/CHANGELOG --- old/duplicity-0.8.14/CHANGELOG 2020-07-04 17:06:13.000000000 +0200 +++ new/duplicity-0.8.15/CHANGELOG 2020-07-27 17:03:47.000000000 +0200 @@ -1,3 +1,27 @@ +New in v0.8.15 (2020/07/27) +--------------------------- +* Fix bug #1887689 with patch from Matthew Barry + - Cleanup with Paramiko backend does not remove files due to missing + filename byte decoding +* Fix bug #1211481 with merge from Raffaele Di Campli + - Ignores the uid/gid from the archive and keeps the current user's one. + - Recommended for restoring data to mounted filesystem which do not + support Unix ownership or when root privileges are not available. +* Fix issue #10 - ppa:duplicity-release-git fails to install on Focal Fossa + - Set correct version requirements in debian/control. +* Merged in joshAppdev:pydriveshared - Backend for Shared Drives on Google + - pydrive://developer.gserviceaccount.com/target-folder/?driveID=<SHARED DRIVE ID> +* Merged in martin-sucha:pydrive-notfound - Fix missing FileNotUploadedError in pydrive + - Since dadbe2d2, FileNotUploadedError is not imported anymore, resulting in an + exception in case some of the files failed to upload. Adding the import back. +* Merged in hupfdule:s3-boto3-region-and-endpoint - Allow setting s3 region and endpoint + - This commit introduces the new commandline options --s3-region-name, --s3-endpoint-url + to specify these parameters. This allows using s3 compatible providers like Scaleway + or OVH. + - It is probably useful for Amazon accounts, too, to have more fine grained influence + on the region to use. + + New in v0.8.14 (2020/07/04) --------------------------- * Fixes for rclonebackend from Francesco Magno (original author) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/Changelog.GNU new/duplicity-0.8.15/Changelog.GNU --- old/duplicity-0.8.14/Changelog.GNU 2020-07-04 17:03:03.000000000 +0200 +++ new/duplicity-0.8.15/Changelog.GNU 2020-07-27 17:04:50.000000000 +0200 @@ -1,3 +1,39 @@ +2020-07-27 Kenneth Loafman <kenn...@loafman.com> + + * Prep for 0.8.15 + +2020-07-24 Kenneth Loafman <kenn...@loafman.com> + + * Merged in joshAppdev:pydriveshared - Backend for Shared Drives on Google + - pydrive://developer.gserviceaccount.com/target-folder/?driveID=<SHARED DRIVE ID> + * Merged in martin-sucha:pydrive-notfound - Fix missing FileNotUploadedError in pydrive + - Since dadbe2d2, FileNotUploadedError is not imported anymore, resulting in an + exception in case some of the files failed to upload. Adding the import back. + * Merged in hupfdule:s3-boto3-region-and-endpoint - Allow setting s3 region and endpoint + - This commit introduces the new commandline options --s3-region-name, --s3-endpoint-url + to specify these parameters. This allows using s3 compatible providers like Scaleway + or OVH. + - It is probably useful for Amazon accounts, too, to have more fine grained influence + on the region to use. + +2020-07-23 Kenneth Loafman <kenn...@loafman.com> + + * Fix issue #10 - ppa:duplicity-release-git fails to install on Focal Fossa + - Set correct version requirements in debian/control. + +2020-07-18 Kenneth Loafman <kenn...@loafman.com> + + * Fix bug #1211481 with merge from Raffaele Di Campli + - Ignores the uid/gid from the archive and keeps the current user's one. + - Recommended for restoring data to mounted filesystem which do not + support Unix ownership or when root privileges are not available. + +2020-07-16 Kenneth Loafman <kenn...@loafman.com> + + * Fix bug #1887689 with patch from Matthew Barry + - Cleanup with Paramiko backend does not remove files due to missing + filename byte decoding + 2020-07-04 Kenneth Loafman <kenn...@loafman.com> * Prep for 0.8.14 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/PKG-INFO new/duplicity-0.8.15/PKG-INFO --- old/duplicity-0.8.14/PKG-INFO 2020-07-04 20:54:04.000000000 +0200 +++ new/duplicity-0.8.15/PKG-INFO 2020-07-27 17:18:41.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: duplicity -Version: 0.8.14 +Version: 0.8.15 Summary: Encrypted backup using rsync algorithm Home-page: http://duplicity.nongnu.org/index.html Author: Ben Escoto <b...@emrose.org> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/bin/duplicity.1 new/duplicity-0.8.15/bin/duplicity.1 --- old/duplicity-0.8.14/bin/duplicity.1 2020-07-04 20:54:05.000000000 +0200 +++ new/duplicity-0.8.15/bin/duplicity.1 2020-07-27 17:18:42.000000000 +0200 @@ -1,4 +1,4 @@ -.TH DUPLICITY 1 "July 04, 2020" "Version 0.8.14" "User Manuals" \" -*- nroff -*- +.TH DUPLICITY 1 "July 27, 2020" "Version 0.8.15" "User Manuals" \" -*- nroff -*- .\" disable justification (adjust text to left margin only) .\" command line examples stay readable through that .ad l @@ -658,6 +658,12 @@ identical names but different uids/gids. .TP +.BI --do-not-restore-ownership +Ignores the uid/gid from the archive and keeps the current user's one. +Recommended for restoring data to mounted filesystem which do not +support Unix ownership or when root privileges are not available. + +.TP .BI "--num-retries " number Number of retries to make on errors before giving up. @@ -873,6 +879,18 @@ below. .TP +.BI "--s3-region-name" +Specifies the region of the S3 storage. + +This is currently only used in the newer boto3 backend. + +.TP +.BI "--s3-endpoint-url" +Specifies the endpoint URL of the S3 storage. + +This is currently only used in the newer boto3 backend. + +.TP .BI "--azure-blob-tier" Standard storage tier used for backup files (Hot|Cool|Archive). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/bin/rdiffdir.1 new/duplicity-0.8.15/bin/rdiffdir.1 --- old/duplicity-0.8.14/bin/rdiffdir.1 2020-07-04 20:54:05.000000000 +0200 +++ new/duplicity-0.8.15/bin/rdiffdir.1 2020-07-27 17:18:42.000000000 +0200 @@ -1,4 +1,4 @@ -.TH RDIFFDIR 1 "July 04, 2020" "Version 0.8.14" "User Manuals" \" -*- nroff -*- +.TH RDIFFDIR 1 "July 27, 2020" "Version 0.8.15" "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-0.8.14/debian/control new/duplicity-0.8.15/debian/control --- old/duplicity-0.8.14/debian/control 2020-06-03 15:49:44.000000000 +0200 +++ new/duplicity-0.8.15/debian/control 2020-07-23 17:33:08.000000000 +0200 @@ -25,7 +25,8 @@ rsync, Homepage: https://launchpad.net/duplicity Standards-Version: 3.9.5 -X-python3-Version: 3.7 +X-Python-Version: 2.7 +X-Python3-Version: >= 3.5 Package: duplicity Architecture: any diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/dist/makesnap new/duplicity-0.8.15/dist/makesnap --- old/duplicity-0.8.14/dist/makesnap 2020-06-02 21:10:41.000000000 +0200 +++ new/duplicity-0.8.15/dist/makesnap 2020-07-15 20:42:23.000000000 +0200 @@ -51,7 +51,7 @@ review-tools.snap-review --allow-classic duplicity_${VERSION}_amd64.snap # push to edge -snapcraft push duplicity_${VERSION}_amd64.snap --release edge +snapcraft upload duplicity_${VERSION}_amd64.snap --release edge # sign snap snapcraft sign-build duplicity_${VERSION}*.snap --key-name firstprime diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity/__init__.py new/duplicity-0.8.15/duplicity/__init__.py --- old/duplicity-0.8.14/duplicity/__init__.py 2020-07-04 20:54:05.000000000 +0200 +++ new/duplicity-0.8.15/duplicity/__init__.py 2020-07-27 17:18:42.000000000 +0200 @@ -22,7 +22,7 @@ import sys import gettext -__version__ = u'0.8.14' +__version__ = u'0.8.15' if sys.version_info.major >= 3: gettext.install(u'duplicity', names=[u'ngettext']) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity/backend.py new/duplicity-0.8.15/duplicity/backend.py --- old/duplicity-0.8.14/duplicity/backend.py 2020-06-02 21:10:42.000000000 +0200 +++ new/duplicity-0.8.15/duplicity/backend.py 2020-07-24 16:57:07.000000000 +0200 @@ -294,6 +294,16 @@ except Exception: raise InvalidBackendURL(u"Syntax error (hostname) in: %s" % url_string) + try: + self.query = pu.query + except Exception: + raise InvalidBackendURL(u"Syntax error (query) in: %s" % url_string) + if self.query: + self.query_args = urllib.parse.parse_qs(self.query) + else: + self.query = None + self.query_args = {} + # init to None, overwrite with actual value on success self.port = None try: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity/backends/pydrivebackend.py new/duplicity-0.8.15/duplicity/backends/pydrivebackend.py --- old/duplicity-0.8.14/duplicity/backends/pydrivebackend.py 2020-06-19 20:18:24.000000000 +0200 +++ new/duplicity-0.8.15/duplicity/backends/pydrivebackend.py 2020-07-24 17:10:10.000000000 +0200 @@ -41,6 +41,17 @@ Please read the manpage for setup details. Exception: %s""" % str(e)) + # Shared Drive ID specified as a query parameter in the backend URL. + # Example: pydrive://developer.gserviceaccount.com/target-folder/?driveID=<SHARED DRIVE ID> + self.api_params = {} + self.shared_drive_id = None + if u'driveID' in parsed_url.query_args: + self.shared_drive_id = parsed_url.query_args[u'driveID'][0] + self.api_params = {u'corpora': u'teamDrive', + u'teamDriveId': self.shared_drive_id, + u'includeTeamDriveItems': True, + u'supportsTeamDrives': True} + try: from pydrive2.auth import GoogleAuth from pydrive2.drive import GoogleDrive @@ -98,30 +109,41 @@ u'variable not set. Please read the manpage to fix.') self.drive = GoogleDrive(gauth) - # Dirty way to find root folder id - file_list = self.drive.ListFile({u'q': u"'Root' in parents and trashed=false"}).GetList() - if file_list: - parent_folder_id = file_list[0][u'parents'][0][u'id'] - else: - file_in_root = self.drive.CreateFile({u'title': u'i_am_in_root'}) - file_in_root.Upload() - parent_folder_id = file_in_root[u'parents'][0][u'id'] - file_in_root.Delete() + if self.shared_drive_id: + parent_folder_id = self.shared_drive_id + else: + # Dirty way to find root folder id + file_list = self.drive.ListFile({u'q': u"'Root' in parents and trashed=false"}).GetList() + if file_list: + parent_folder_id = file_list[0][u'parents'][0][u'id'] + else: + file_in_root = self.drive.CreateFile({u'title': u'i_am_in_root'}) + file_in_root.Upload() + parent_folder_id = file_in_root[u'parents'][0][u'id'] + file_in_root.Delete() # Fetch destination folder entry and create hierarchy if required. folder_names = parsed_url.path.split(u'/') for folder_name in folder_names: if not folder_name: continue - file_list = self.drive.ListFile({u'q': u"'" + parent_folder_id + - u"' in parents and trashed=false"}).GetList() + list_file_args = {u'q': u"'" + parent_folder_id + + u"' in parents and trashed=false"} + list_file_args.update(self.api_params) + file_list = self.drive.ListFile(list_file_args).GetList() folder = next((item for item in file_list if item[u'title'] == folder_name and item[u'mimeType'] == u'application/vnd.google-apps.folder'), None) if folder is None: - folder = self.drive.CreateFile({u'title': folder_name, - u'mimeType': u"application/vnd.google-apps.folder", - u'parents': [{u'id': parent_folder_id}]}) - folder.Upload() + create_file_args = {u'title': folder_name, + u'mimeType': u"application/vnd.google-apps.folder", + u'parents': [{u'id': parent_folder_id}]} + create_file_args[u'parents'][0].update(self.api_params) + create_file_args.update(self.api_params) + folder = self.drive.CreateFile(create_file_args) + if self.shared_drive_id: + folder.Upload(param={u'supportsTeamDrives': True}) + else: + folder.Upload() parent_folder_id = folder[u'id'] self.folder = parent_folder_id self.id_cache = {} @@ -159,7 +181,9 @@ # reliable because there is no strong consistency. q = u"title='%s' and '%s' in parents and trashed=false" % (filename, self.folder) fields = u'items(title,id,fileSize,downloadUrl,exportLinks),nextPageToken' - flist = self.drive.ListFile({u'q': q, u'fields': fields}).GetList() + list_file_args = {u'q': q, u'fields': fields} + list_file_args.update(self.api_params) + flist = self.drive.ListFile(list_file_args).GetList() if len(flist) > 1: log.FatalError(_(u"PyDrive backend: multiple files called '%s'.") % (filename,)) elif flist: @@ -184,15 +208,20 @@ drive_file = self.file_by_name(remote_filename) if drive_file is None: # No existing file, make a new one - drive_file = self.drive.CreateFile({u'title': remote_filename, - u'parents': [{u"kind": u"drive#fileLink", - u"id": self.folder}]}) + create_file_args = {u'title': remote_filename, + u'parents': [{u"kind": u"drive#fileLink", + u"id": self.folder}]} + create_file_args[u'parents'][0].update(self.api_params) + drive_file = self.drive.CreateFile(create_file_args) log.Info(u"PyDrive backend: creating new file '%s'" % (remote_filename,)) else: log.Info(u"PyDrive backend: replacing existing file '%s' with id '%s'" % ( remote_filename, drive_file[u'id'])) drive_file.SetContentFile(util.fsdecode(source_path.name)) - drive_file.Upload() + if self.shared_drive_id: + drive_file.Upload(param={u'supportsTeamDrives': True}) + else: + drive_file.Upload() self.id_cache[remote_filename] = drive_file[u'id'] def _get(self, remote_filename, local_path): @@ -200,9 +229,11 @@ drive_file.GetContentFile(util.fsdecode(local_path.name)) def _list(self): - drive_files = self.drive.ListFile({ + list_file_args = { u'q': u"'" + self.folder + u"' in parents and trashed=false", - u'fields': u'items(title,id),nextPageToken'}).GetList() + u'fields': u'items(title,id),nextPageToken'} + list_file_args.update(self.api_params) + drive_files = self.drive.ListFile(list_file_args).GetList() filenames = set(item[u'title'] for item in drive_files) # Check the cache as well. A file might have just been uploaded but # not yet appear in the listing. @@ -215,10 +246,12 @@ def _delete(self, filename): file_id = self.id_by_name(filename) - if file_id != u'': - self.drive.auth.service.files().delete(fileId=file_id).execute() - else: + if file_id == u'': log.Warn(u"File '%s' does not exist while trying to delete it" % (util.fsdecode(filename),)) + elif self.shared_drive_id: + self.drive.auth.service.files().delete(fileId=file_id, param={u'supportsTeamDrives': True}).execute() + else: + self.drive.auth.service.files().delete(fileId=file_id).execute() def _query(self, filename): drive_file = self.file_by_name(filename) @@ -230,9 +263,9 @@ def _error_code(self, operation, error): # pylint: disable=unused-argument try: - from pydrive2.files import ApiRequestError # pylint: disable=import-error + from pydrive2.files import ApiRequestError, FileNotUploadedError # pylint: disable=import-error except ImportError: - from pydrive.files import ApiRequestError # pylint: disable=import-error + from pydrive.files import ApiRequestError, FileNotUploadedError # pylint: disable=import-error if isinstance(error, FileNotUploadedError): return log.ErrorCode.backend_not_found elif isinstance(error, ApiRequestError): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity/backends/s3_boto3_backend.py new/duplicity-0.8.15/duplicity/backends/s3_boto3_backend.py --- old/duplicity-0.8.14/duplicity/backends/s3_boto3_backend.py 2020-06-02 21:10:42.000000000 +0200 +++ new/duplicity-0.8.15/duplicity/backends/s3_boto3_backend.py 2020-07-24 17:12:07.000000000 +0200 @@ -90,7 +90,7 @@ from botocore.exceptions import ClientError # pylint: disable=import-error self.bucket = None - self.s3 = boto3.resource(u's3') + self.s3 = boto3.resource(u's3', region_name=config.s3_region_name, endpoint_url=config.s3_endpoint_url) try: self.s3.meta.client.head_bucket(Bucket=self.bucket_name) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity/backends/ssh_paramiko_backend.py new/duplicity-0.8.15/duplicity/backends/ssh_paramiko_backend.py --- old/duplicity-0.8.14/duplicity/backends/ssh_paramiko_backend.py 2020-06-02 21:10:42.000000000 +0200 +++ new/duplicity-0.8.15/duplicity/backends/ssh_paramiko_backend.py 2020-07-16 17:16:59.000000000 +0200 @@ -295,7 +295,7 @@ def _put(self, source_path, remote_filename): # remote_filename is a byte object, not str or unicode - remote_filename = remote_filename.decode(u"utf-8") + remote_filename = util.fsdecode(remote_filename) if self.use_scp: f = open(source_path.name, u'rb') try: @@ -328,7 +328,7 @@ def _get(self, remote_filename, local_path): # remote_filename is a byte object, not str or unicode - remote_filename = remote_filename.decode(u"utf-8") + remote_filename = util.fsdecode(remote_filename) if self.use_scp: try: chan = self.client.get_transport().open_session() @@ -385,6 +385,8 @@ return self.sftp.listdir() def _delete(self, filename): + # filename is a byte object, not str or unicode + filename = util.fsdecode(filename) # In scp mode unavoidable quoting issues will cause failures if # filenames containing single quotes are encountered. if self.use_scp: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity/commandline.py new/duplicity-0.8.15/duplicity/commandline.py --- old/duplicity-0.8.14/duplicity/commandline.py 2020-07-04 16:44:10.000000000 +0200 +++ new/duplicity-0.8.15/duplicity/commandline.py 2020-07-24 17:12:07.000000000 +0200 @@ -459,6 +459,10 @@ # File owner uid keeps number from tar file. Like same option in GNU tar. parser.add_option(u"--numeric-owner", action=u"store_true") + # Do no restore the uid/gid when finished, useful if you're restoring + # data without having root privileges or Unix users support + parser.add_option(u"--do-not-restore-ownership", action=u"store_true") + # Whether the old filename format is in effect. parser.add_option(u"--old-filenames", action=u"callback", dest=u"old_filenames", @@ -552,6 +556,10 @@ parser.add_option(u"--s3-kms-key-id", action=u"store", dest=u"s3_kms_key_id") parser.add_option(u"--s3-kms-grant", action=u"store", dest=u"s3_kms_grant") + # Options for specifying region and endpoint of s3 + parser.add_option(u"--s3-region-name", type=u"string", dest=u"s3_region_name", action=u"store") + parser.add_option(u"--s3-endpoint-url", type=u"string", dest=u"s3_endpoint_url", action=u"store") + # Option to specify a Swift container storage policy. parser.add_option(u"--swift-storage-policy", type=u"string", metavar=_(u"policy")) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity/config.py new/duplicity-0.8.15/duplicity/config.py --- old/duplicity-0.8.14/duplicity/config.py 2020-06-02 21:10:42.000000000 +0200 +++ new/duplicity-0.8.15/duplicity/config.py 2020-07-18 21:50:05.000000000 +0200 @@ -201,6 +201,10 @@ # File owner uid keeps number from tar file. Like same option in GNU tar. numeric_owner = False +# Do no restore the uid/gid when finished, useful if you're restoring +# data without having root privileges or Unix users support +do_not_restore_ownership = False + # Whether to use plain HTTP (without SSL) to send data to S3 # See <https://bugs.launchpad.net/duplicity/+bug/433970>. s3_unencrypted_connection = False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity/dup_main.py new/duplicity-0.8.15/duplicity/dup_main.py --- old/duplicity-0.8.14/duplicity/dup_main.py 2020-07-04 16:41:36.000000000 +0200 +++ new/duplicity-0.8.15/duplicity/dup_main.py 2020-07-15 21:24:14.000000000 +0200 @@ -366,7 +366,7 @@ mf = config.restart.last_backup.get_local_manifest() config.restart.checkManifest(mf) config.restart.setLastSaved(mf) - if not [config.s3_use_deep_archive or config.s3_use_glacier]: + if not (config.s3_use_deep_archive or config.s3_use_glacier): validate_encryption_settings(config.restart.last_backup, mf) else: log.Warn(_(u"Skipping encryption validation due to glacier/deep storage")) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity/path.py new/duplicity-0.8.15/duplicity/path.py --- old/duplicity-0.8.14/duplicity/path.py 2020-06-19 20:18:24.000000000 +0200 +++ new/duplicity-0.8.15/duplicity/path.py 2020-07-18 21:50:05.000000000 +0200 @@ -221,7 +221,8 @@ self.mode = tarinfo.mode self.stat = StatResult() - u""" Set user and group id + u""" If do_not_restore_owner is False, + set user and group id use numeric id if name lookup fails OR --numeric-owner is set @@ -456,7 +457,8 @@ os.mkdir(other.name) elif self.issym(): os.symlink(self.symtext, other.name) - os.lchown(other.name, self.stat.st_uid, self.stat.st_gid) + if not config.do_not_restore_ownership: + os.lchown(other.name, self.stat.st_uid, self.stat.st_gid) other.setdata() return # no need to copy symlink attributes elif self.isfifo(): @@ -474,7 +476,7 @@ def copy_attribs(self, other): u"""Only copy attributes from self to other""" if isinstance(other, Path): - if self.stat is not None: + if self.stat and not config.do_not_restore_ownership: util.maybe_ignore_errors(lambda: os.chown(other.name, self.stat.st_uid, self.stat.st_gid)) util.maybe_ignore_errors(lambda: os.chmod(other.name, self.mode)) util.maybe_ignore_errors(lambda: os.utime(other.name, (time.time(), self.stat.st_mtime))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/duplicity.egg-info/PKG-INFO new/duplicity-0.8.15/duplicity.egg-info/PKG-INFO --- old/duplicity-0.8.14/duplicity.egg-info/PKG-INFO 2020-07-04 20:54:01.000000000 +0200 +++ new/duplicity-0.8.15/duplicity.egg-info/PKG-INFO 2020-07-27 17:18:37.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: duplicity -Version: 0.8.14 +Version: 0.8.15 Summary: Encrypted backup using rsync algorithm Home-page: http://duplicity.nongnu.org/index.html Author: Ben Escoto <b...@emrose.org> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/requirements.txt new/duplicity-0.8.15/requirements.txt --- old/duplicity-0.8.14/requirements.txt 2020-06-03 15:49:44.000000000 +0200 +++ new/duplicity-0.8.15/requirements.txt 2020-07-22 17:13:00.000000000 +0200 @@ -28,7 +28,7 @@ ##### backend libraries ##### -# azure +# azure-mgmt-storage # b2sdk # boto # boto3 @@ -38,6 +38,5 @@ # mediafire # pydrive # pyrax -# python-cloudfiles # python-swiftclient # requests_oauthlib diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/setup.py new/duplicity-0.8.15/setup.py --- old/duplicity-0.8.14/setup.py 2020-07-04 16:59:06.000000000 +0200 +++ new/duplicity-0.8.15/setup.py 2020-07-27 17:06:48.000000000 +0200 @@ -52,7 +52,7 @@ from setuptools_scm import get_version Version = get_version(**scm_version_args) except Exception as e: - Version = u"0.8.14" + Version = u"0.8.15" print(u"Unable to get SCM version: defaulting to %s" % (Version,)) Reldate = time.strftime(u"%B %d, %Y", time.localtime()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duplicity-0.8.14/snap/snapcraft.yaml new/duplicity-0.8.15/snap/snapcraft.yaml --- old/duplicity-0.8.14/snap/snapcraft.yaml 2020-07-04 20:54:05.000000000 +0200 +++ new/duplicity-0.8.15/snap/snapcraft.yaml 2020-07-27 17:18:42.000000000 +0200 @@ -1,5 +1,5 @@ name: duplicity -version: 0.8.14 +version: 0.8.15 summary: Efficient, encrypted backup to local or remote hosts description: | Duplicity backs directories by producing encrypted tar-format volumes and uploading @@ -57,5 +57,5 @@ - pyrax # hubicbackend, _cf_pyrax.py - setuptools # setup.py - setuptools_scm # scm version - - six # dpbxbackend.py + - six>=1.12.0 # dpbxbackend.py source: .