diff options
Diffstat (limited to 'gnu/packages/patches/breezy-fix-gio.patch')
-rw-r--r-- | gnu/packages/patches/breezy-fix-gio.patch | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/gnu/packages/patches/breezy-fix-gio.patch b/gnu/packages/patches/breezy-fix-gio.patch new file mode 100644 index 0000000000..f70e761555 --- /dev/null +++ b/gnu/packages/patches/breezy-fix-gio.patch @@ -0,0 +1,338 @@ +This patch combines https://code.launchpad.net/~jelmer/brz/enable-gio/+merge/419150 +and https://bazaar.launchpad.net/~jelmer/brz/fix-gio/revision/7570. + +=== modified file 'breezy/transport/gio_transport.py' +--- a/breezy/transport/gio_transport.py 2022-04-09 12:17:41 +0000 ++++ b/breezy/transport/gio_transport.py 2022-04-09 12:33:51 +0000 +@@ -52,11 +52,7 @@ + from ..tests.test_server import TestServer + + try: +- import glib +-except ImportError as e: +- raise errors.DependencyNotPresent('glib', e) +-try: +- import gio ++ from gi.repository import Gio as gio + except ImportError as e: + raise errors.DependencyNotPresent('gio', e) + + +@@ -57,6 +57,9 @@ + raise errors.DependencyNotPresent('gio', e) + + ++from gi.repository.GLib import GError ++ ++ + class GioLocalURLServer(TestServer): + """A pretend server for local transports, using file:// urls. + +@@ -81,7 +84,7 @@ + def __init__(self, transport, relpath): + FileStream.__init__(self, transport, relpath) + self.gio_file = transport._get_GIO(relpath) +- self.stream = self.gio_file.create() ++ self.stream = self.gio_file.create(0, None) + + def _close(self): + self.stream.close() +@@ -90,7 +93,7 @@ + try: + # Using pump_string_file seems to make things crash + osutils.pumpfile(BytesIO(bytes), self.stream) +- except gio.Error as e: ++ except GError as e: + # self.transport._translate_gio_error(e,self.relpath) + raise errors.BzrError(str(e)) + +@@ -98,12 +101,12 @@ + class GioStatResult(object): + + def __init__(self, f): +- info = f.query_info('standard::size,standard::type') ++ info = f.query_info('standard::size,standard::type', 0, None) + self.st_size = info.get_size() + type = info.get_file_type() +- if (type == gio.FILE_TYPE_REGULAR): ++ if type == gio.FileType.REGULAR: + self.st_mode = stat.S_IFREG +- elif type == gio.FILE_TYPE_DIRECTORY: ++ elif type == gio.FileType.DIRECTORY: + self.st_mode = stat.S_IFDIR + + +@@ -122,7 +125,7 @@ + user, netloc = netloc.rsplit('@', 1) + # Seems it is not possible to list supported backends for GIO + # so a hardcoded list it is then. +- gio_backends = ['dav', 'file', 'ftp', 'obex', 'sftp', 'ssh', 'smb'] ++ gio_backends = ['dav', 'file', 'ftp', 'obex', 'sftp', 'ssh', 'smb', 'http'] + if scheme not in gio_backends: + raise urlutils.InvalidURL(base, + extra="GIO support is only available for " + +@@ -138,13 +141,10 @@ + _from_transport=_from_transport) + + def _relpath_to_url(self, relpath): +- full_url = urlutils.join(self.url, relpath) +- if isinstance(full_url, str): +- raise urlutils.InvalidURL(full_url) +- return full_url ++ return urlutils.join(self.url, relpath) + + def _get_GIO(self, relpath): +- """Return the ftplib.GIO instance for this object.""" ++ """Return the GIO instance for this object.""" + # Ensures that a connection is established + connection = self._get_connection() + if connection is None: +@@ -152,7 +152,7 @@ + connection, credentials = self._create_connection() + self._set_connection(connection, credentials) + fileurl = self._relpath_to_url(relpath) +- file = gio.File(fileurl) ++ file = gio.File.new_for_uri(fileurl) + return file + + def _auth_cb(self, op, message, default_user, default_domain, flags): +@@ -197,7 +197,7 @@ + try: + obj.mount_enclosing_volume_finish(res) + self.loop.quit() +- except gio.Error as e: ++ except GError as e: + self.loop.quit() + raise errors.BzrError( + "Failed to mount the given location: " + str(e)) +@@ -209,12 +209,12 @@ + user, password = credentials + + try: +- connection = gio.File(self.url) ++ connection = gio.File.new_for_uri(self.url) + mount = None + try: + mount = connection.find_enclosing_mount() +- except gio.Error as e: +- if (e.code == gio.ERROR_NOT_MOUNTED): ++ except GError as e: ++ if e.code == gio.IOErrorEnum.NOT_MOUNTED: + self.loop = glib.MainLoop() + ui.ui_factory.show_message('Mounting %s using GIO' % + self.url) +@@ -227,7 +227,7 @@ + m = connection.mount_enclosing_volume(op, + self._mount_done_cb) + self.loop.run() +- except gio.Error as e: ++ except GError as e: + raise errors.TransportError(msg="Error setting up connection:" + " %s" % str(e), orig_error=e) + return connection, (user, password) +@@ -257,8 +257,8 @@ + if stat.S_ISREG(st.st_mode) or stat.S_ISDIR(st.st_mode): + return True + return False +- except gio.Error as e: +- if e.code == gio.ERROR_NOT_FOUND: ++ except GError as e: ++ if e.code == gio.IOErrorEnum.NOT_FOUND: + return False + else: + self._translate_gio_error(e, relpath) +@@ -281,10 +281,10 @@ + buf = fin.read() + fin.close() + return BytesIO(buf) +- except gio.Error as e: ++ except GError as e: + # If we get a not mounted here it might mean + # that a bad path has been entered (or that mount failed) +- if (e.code == gio.ERROR_NOT_MOUNTED): ++ if e.code == gio.IOErrorEnum.NOT_MOUNTED: + raise errors.PathError(relpath, + extra='Failed to get file, make sure the path is correct. ' + + str(e)) +@@ -307,19 +307,19 @@ + closed = True + try: + f = self._get_GIO(tmppath) +- fout = f.create() ++ fout = f.create(0, None) + closed = False + length = self._pump(fp, fout) + fout.close() + closed = True + self.stat(tmppath) + dest = self._get_GIO(relpath) +- f.move(dest, flags=gio.FILE_COPY_OVERWRITE) ++ f.move(dest, flags=gio.FileCopyFlags.OVERWRITE) + f = None + if mode is not None: + self._setmode(relpath, mode) + return length +- except gio.Error as e: ++ except GError as e: + self._translate_gio_error(e, relpath) + finally: + if not closed and fout is not None: +@@ -335,7 +335,7 @@ + f = self._get_GIO(relpath) + f.make_directory() + self._setmode(relpath, mode) +- except gio.Error as e: ++ except GError as e: + self._translate_gio_error(e, relpath) + + def open_write_stream(self, relpath, mode=None): +@@ -369,14 +369,11 @@ + f.delete() + else: + raise errors.NotADirectory(relpath) +- except gio.Error as e: ++ except GError as e: + self._translate_gio_error(e, relpath) + except errors.NotADirectory as e: + # just pass it forward + raise e +- except Exception as e: +- mutter('failed to rmdir %s: %s' % (relpath, e)) +- raise errors.PathError(relpath) + + def append_file(self, relpath, file, mode=None): + """Append the text in the file-like object into the final +@@ -392,7 +389,7 @@ + result = 0 + fo = self._get_GIO(tmppath) + fi = self._get_GIO(relpath) +- fout = fo.create() ++ fout = fo.create(0, None) + try: + info = GioStatResult(fi) + result = info.st_size +@@ -400,11 +397,11 @@ + self._pump(fin, fout) + fin.close() + # This separate except is to catch and ignore the +- # gio.ERROR_NOT_FOUND for the already existing file. ++ # gio.IOErrorEnum.NOT_FOUND for the already existing file. + # It is valid to open a non-existing file for append. + # This is caused by the broken gio append_to... +- except gio.Error as e: +- if e.code != gio.ERROR_NOT_FOUND: ++ except GError as e: ++ if e.code != gio.IOErrorEnum.NOT_FOUND: + self._translate_gio_error(e, relpath) + length = self._pump(file, fout) + fout.close() +@@ -413,9 +410,11 @@ + raise errors.BzrError("Failed to append size after " + "(%d) is not original (%d) + written (%d) total (%d)" % + (info.st_size, result, length, result + length)) +- fo.move(fi, flags=gio.FILE_COPY_OVERWRITE) ++ fo.move( ++ fi, flags=gio.FileCopyFlags.OVERWRITE, cancellable=None, ++ progress_callback=None) + return result +- except gio.Error as e: ++ except GError as e: + self._translate_gio_error(e, relpath) + + def _setmode(self, relpath, mode): +@@ -429,8 +428,8 @@ + try: + f = self._get_GIO(relpath) + f.set_attribute_uint32(gio.FILE_ATTRIBUTE_UNIX_MODE, mode) +- except gio.Error as e: +- if e.code == gio.ERROR_NOT_SUPPORTED: ++ except GError as e: ++ if e.code == gio.IOErrorEnum.NOT_SUPPORTED: + # Command probably not available on this server + mutter("GIO Could not set permissions to %s on %s. %s", + oct(mode), self._remote_path(relpath), str(e)) +@@ -444,8 +443,8 @@ + mutter("GIO move (rename): %s => %s", rel_from, rel_to) + f = self._get_GIO(rel_from) + t = self._get_GIO(rel_to) +- f.move(t) +- except gio.Error as e: ++ f.move(t, flags=0, cancellable=None, progress_callback=None) ++ except GError as e: + self._translate_gio_error(e, rel_from) + + def move(self, rel_from, rel_to): +@@ -455,8 +454,8 @@ + mutter("GIO move: %s => %s", rel_from, rel_to) + f = self._get_GIO(rel_from) + t = self._get_GIO(rel_to) +- f.move(t, flags=gio.FILE_COPY_OVERWRITE) +- except gio.Error as e: ++ f.move(t, flags=gio.FileCopyFlags.OVERWRITE) ++ except GError as e: + self._translate_gio_error(e, relfrom) + + def delete(self, relpath): +@@ -466,7 +465,7 @@ + mutter("GIO delete: %s", relpath) + f = self._get_GIO(relpath) + f.delete() +- except gio.Error as e: ++ except GError as e: + self._translate_gio_error(e, relpath) + + def external_url(self): +@@ -489,11 +488,11 @@ + try: + entries = [] + f = self._get_GIO(relpath) +- children = f.enumerate_children(gio.FILE_ATTRIBUTE_STANDARD_NAME) ++ children = f.enumerate_children(gio.FILE_ATTRIBUTE_STANDARD_NAME, 0, None) + for child in children: + entries.append(urlutils.escape(child.get_name())) + return entries +- except gio.Error as e: ++ except GError as e: + self._translate_gio_error(e, relpath) + + def iter_files_recursive(self): +@@ -519,7 +518,7 @@ + mutter("GIO stat: %s", relpath) + f = self._get_GIO(relpath) + return GioStatResult(f) +- except gio.Error as e: ++ except GError as e: + self._translate_gio_error(e, relpath, extra='error w/ stat') + + def lock_read(self, relpath): +@@ -556,21 +555,21 @@ + mutter("GIO Error: %s %s" % (str(err), path)) + if extra is None: + extra = str(err) +- if err.code == gio.ERROR_NOT_FOUND: ++ if err.code == gio.IOErrorEnum.NOT_FOUND: + raise errors.NoSuchFile(path, extra=extra) +- elif err.code == gio.ERROR_EXISTS: ++ elif err.code == gio.IOErrorEnum.EXISTS: + raise errors.FileExists(path, extra=extra) +- elif err.code == gio.ERROR_NOT_DIRECTORY: ++ elif err.code == gio.IOErrorEnum.NOT_DIRECTORY: + raise errors.NotADirectory(path, extra=extra) +- elif err.code == gio.ERROR_NOT_EMPTY: ++ elif err.code == gio.IOErrorEnum.NOT_EMPTY: + raise errors.DirectoryNotEmpty(path, extra=extra) +- elif err.code == gio.ERROR_BUSY: ++ elif err.code == gio.IOErrorEnum.BUSY: + raise errors.ResourceBusy(path, extra=extra) +- elif err.code == gio.ERROR_PERMISSION_DENIED: ++ elif err.code == gio.IOErrorEnum.PERMISSION_DENIED: + raise errors.PermissionDenied(path, extra=extra) +- elif err.code == gio.ERROR_HOST_NOT_FOUND: ++ elif err.code == gio.IOErrorEnum.HOST_NOT_FOUND: + raise errors.PathError(path, extra=extra) +- elif err.code == gio.ERROR_IS_DIRECTORY: ++ elif err.code == gio.IOErrorEnum.IS_DIRECTORY: + raise errors.PathError(path, extra=extra) + else: + mutter('unable to understand error for path: %s: %s', path, err) + |