From 3cc3a79b7a2b73c2a88833e765993078b2ed5201 Mon Sep 17 00:00:00 2001 From: Andy Holmes Date: Mon, 27 Mar 2023 12:41:50 -0700 Subject: [PATCH] extensionDownloader: Check schemadir existence and type When checking for an extension schemadir, an error will be thrown if `query_info()` is used and the directory is missing. Catch the case of a missing directory, but throw an error if the path exists as a non-directory type. Part-of: --- js/ui/extensionDownloader.js | 37 ++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/js/ui/extensionDownloader.js b/js/ui/extensionDownloader.js index b3cef41a6..197cc1c1c 100644 --- a/js/ui/extensionDownloader.js +++ b/js/ui/extensionDownloader.js @@ -115,21 +115,30 @@ async function extractExtensionArchive(bytes, dir) { await unzip.wait_check_async(null); const schemasPath = dir.get_child('schemas'); - const info = await schemasPath.query_info_async( - Gio.FILE_ATTRIBUTE_STANDARD_TYPE, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, - null); - if (info.get_file_type() === Gio.FileType.DIRECTORY) { - const compileSchema = Gio.Subprocess.new( - ['glib-compile-schemas', '--strict', schemasPath.get_path()], - Gio.SubprocessFlags.NONE); - try { - await compileSchema.wait_check_async(null); - } catch (e) { - log(`Error while compiling schema for extension ${dir.get_basename()}: (${e.message})`); - } + try { + const info = await schemasPath.query_info_async( + Gio.FILE_ATTRIBUTE_STANDARD_TYPE, + Gio.FileQueryInfoFlags.NONE, + GLib.PRIORITY_DEFAULT, + null); + + if (info.get_file_type() !== Gio.FileType.DIRECTORY) + throw new Error('schemas is not a directory'); + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + console.warn(`Error while looking for schema for extension ${dir.get_basename()}: ${e.message}`); + return; + } + + const compileSchema = Gio.Subprocess.new( + ['glib-compile-schemas', '--strict', schemasPath.get_path()], + Gio.SubprocessFlags.NONE); + + try { + await compileSchema.wait_check_async(null); + } catch (e) { + log(`Error while compiling schema for extension ${dir.get_basename()}: (${e.message})`); } }