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: .


Reply via email to