fileUtils: Add helper for loading D-Bus XML from resource

Commit dbf993300a moved all inline D-Bus interface descriptions to template
strings so we can stop escaping line breaks.

Unfortunately that unveiled a grave bug in xgettext, which currently cannot
handle files that contain both backtick and slash characters - as a result,
translations from affected files have started to disappear as translators
run xgettext/msgmerge.

Instead of reverting the change and getting the crusty escaping back, we
will take this as an opportunity to stop inlining the XML altogether and
load it from a resource instead.

To facilitate that, add a small helper method that loads a D-Bus interface
description from a dedicated resource bundle.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/537
This commit is contained in:
Florian Müllner 2018-09-06 02:04:47 +02:00 committed by Jonas Ådahl
parent 150a640c66
commit f42d9df3e0
4 changed files with 49 additions and 16 deletions

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/gnome/shell/dbus-interfaces">
</gresource>
</gresources>

View File

@ -44,22 +44,22 @@ endforeach
subdir('dbus-interfaces') subdir('dbus-interfaces')
subdir('theme') subdir('theme')
theme_resources = gnome.compile_resources( data_resources = [
'gnome-shell-theme', 'gnome-shell-theme.gresource.xml', ['dbus-interfaces', []],
source_dir: 'theme', ['osk-layouts', []],
dependencies: theme_deps, ['theme', theme_deps]
]
foreach resource : data_resources
gnome.compile_resources(
'gnome-shell-' + resource[0],
'gnome-shell-@0@.gresource.xml'.format(resource[0]),
source_dir: resource[0],
dependencies: resource[1],
gresource_bundle: true, gresource_bundle: true,
install: true, install: true,
install_dir: pkgdatadir install_dir: pkgdatadir
) )
endforeach
osk_layout_resources = gnome.compile_resources(
'gnome-shell-osk-layouts', 'gnome-shell-osk-layouts.gresource.xml',
source_dir: 'osk-layouts',
gresource_bundle: true,
install: true,
install_dir: pkgdatadir
)
perfconf = configuration_data() perfconf = configuration_data()
perfconf.set('datadir', datadir) perfconf.set('datadir', datadir)

View File

@ -14,6 +14,7 @@ var GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
var LOCALEDIR = '@datadir@/locale'; var LOCALEDIR = '@datadir@/locale';
/* other standard directories */ /* other standard directories */
var LIBEXECDIR = '@libexecdir@'; var LIBEXECDIR = '@libexecdir@';
var PKGDATADIR = '@datadir@/@PACKAGE_NAME@';
var VPNDIR = '@vpndir@'; var VPNDIR = '@vpndir@';
/* g-i package versions */ /* g-i package versions */
var LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@' var LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@'

View File

@ -3,6 +3,7 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const Lang = imports.lang;
const Config = imports.misc.config;
const Params = imports.misc.params; const Params = imports.misc.params;
function collectFromDatadirs(subdir, includeUserDir, processFile) { function collectFromDatadirs(subdir, includeUserDir, processFile) {
@ -70,3 +71,29 @@ function recursivelyMoveDir(srcDir, destDir) {
recursivelyMoveDir(srcChild, destChild); recursivelyMoveDir(srcChild, destChild);
} }
} }
let _ifaceResource = null;
function loadInterfaceXML(iface) {
if (!_ifaceResource) {
// don't use global.datadir so the method is usable from tools
let path = Config.PKGDATADIR + '/gnome-shell-dbus-interfaces.gresource';
_ifaceResource = Gio.Resource.load(path);
_ifaceResource._register();
}
let xml = null;
let uri = 'resource:///org/gnome/shell/dbus-interfaces/' + iface + '.xml';
let f = Gio.File.new_for_uri(uri);
try {
let [ok, bytes] = f.load_contents(null);
if (bytes instanceof Uint8Array)
xml = imports.byteArray.toString(bytes)
else
xml = bytes;
} catch (e) {
log('Failed to load D-Bus interface ' + iface);
}
return xml;
}