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: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2727>
This commit is contained in:
Andy Holmes 2023-03-27 12:41:50 -07:00 committed by Marge Bot
parent 95c0a88fe7
commit 3cc3a79b7a

View File

@ -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})`);
}
}