builder: Add inherit-extensions features

This lets runtimes like the gnome and kde one easily inherit
extension points from the parent sdk.
tingping/wmclass
Alexander Larsson 2017-06-19 10:58:49 +02:00
parent 504a3a25ea
commit 8c6f31f9a8
2 changed files with 103 additions and 0 deletions

View File

@ -76,6 +76,7 @@ struct BuilderManifest
char **cleanup_platform;
char **cleanup_platform_commands;
char **finish_args;
char **inherit_extensions;
char **tags;
char *rename_desktop_file;
char *rename_appdata_file;
@ -138,6 +139,7 @@ enum {
PROP_SDK_EXTENSIONS,
PROP_PLATFORM_EXTENSIONS,
PROP_FINISH_ARGS,
PROP_INHERIT_EXTENSIONS,
PROP_TAGS,
PROP_RENAME_DESKTOP_FILE,
PROP_RENAME_APPDATA_FILE,
@ -175,6 +177,7 @@ builder_manifest_finalize (GObject *object)
g_strfreev (self->cleanup_platform);
g_strfreev (self->cleanup_platform_commands);
g_strfreev (self->finish_args);
g_strfreev (self->inherit_extensions);
g_strfreev (self->tags);
g_free (self->rename_desktop_file);
g_free (self->rename_appdata_file);
@ -336,6 +339,10 @@ builder_manifest_get_property (GObject *object,
g_value_set_boxed (value, self->finish_args);
break;
case PROP_INHERIT_EXTENSIONS:
g_value_set_boxed (value, self->inherit_extensions);
break;
case PROP_TAGS:
g_value_set_boxed (value, self->tags);
break;
@ -534,6 +541,12 @@ builder_manifest_set_property (GObject *object,
g_strfreev (tmp);
break;
case PROP_INHERIT_EXTENSIONS:
tmp = self->inherit_extensions;
self->inherit_extensions = g_strdupv (g_value_get_boxed (value));
g_strfreev (tmp);
break;
case PROP_TAGS:
tmp = self->tags;
self->tags = g_strdupv (g_value_get_boxed (value));
@ -782,6 +795,13 @@ builder_manifest_class_init (BuilderManifestClass *klass)
"",
G_TYPE_STRV,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_INHERIT_EXTENSIONS,
g_param_spec_boxed ("inherit-extensions",
"",
"",
G_TYPE_STRV,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_BUILD_RUNTIME,
g_param_spec_boolean ("build-runtime",
@ -1361,6 +1381,7 @@ builder_manifest_checksum_for_finish (BuilderManifest *self,
builder_cache_checksum_str (cache, BUILDER_MANIFEST_CHECKSUM_FINISH_VERSION);
builder_cache_checksum_strv (cache, self->finish_args);
builder_cache_checksum_str (cache, self->command);
builder_cache_checksum_compat_strv (cache, self->inherit_extensions);
if (self->metadata)
{
@ -2115,6 +2136,83 @@ builder_manifest_finish (BuilderManifest *self,
return FALSE;
}
if (self->inherit_extensions && self->inherit_extensions[0] != NULL)
{
g_autoptr(GFile) metadata = g_file_get_child (app_dir, "metadata");
g_autoptr(GKeyFile) keyfile = g_key_file_new ();
g_autoptr(GKeyFile) base_keyfile = g_key_file_new ();
g_autofree char *arch_option = NULL;
const char *parent_id = NULL;
const char *parent_version = NULL;
g_autofree char *base_metadata = NULL;
g_auto(GStrv) groups = NULL;
arch_option = g_strdup_printf ("--arch=%s", builder_context_get_arch (context));
if (self->base != NULL && *self->base != 0)
{
parent_id = self->base;
parent_version = builder_manifest_get_base_version (self);
}
else
{
parent_id = self->sdk;
parent_version = builder_manifest_get_runtime_version (self);
}
base_metadata = flatpak (NULL, "info", arch_option, "--show-metadata", parent_id, parent_version, NULL);
if (base_metadata == NULL)
return flatpak_fail (error, "Inherit extensions specified, but could not get metadata for parent %s version %s", parent_id, parent_version);
if (!g_key_file_load_from_data (base_keyfile,
base_metadata, -1,
G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS,
error))
{
g_prefix_error (error, "Can't load metadata file: ");
return FALSE;
}
if (!g_key_file_load_from_file (keyfile,
flatpak_file_get_path_cached (metadata),
G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS,
error))
{
g_prefix_error (error, "Can't load metadata file: ");
return FALSE;
}
for (i = 0; self->inherit_extensions[i] != NULL; i++)
{
g_autofree char *group = g_strdup_printf ("Extension %s", self->inherit_extensions[i]);
g_auto(GStrv) keys = NULL;
int j;
if (!g_key_file_has_group (base_keyfile, group))
return flatpak_fail (error, "Can't find inherited extension point %s", self->inherit_extensions[i]);
keys = g_key_file_get_keys (base_keyfile, group, NULL, error);
if (keys == NULL)
return FALSE;
for (j = 0; keys[j] != NULL; j++)
{
g_autofree char *value = g_key_file_get_value (base_keyfile, group, keys[j], error);
if (value == NULL)
return FALSE;
g_key_file_set_value (keyfile, group, keys[j], value);
}
}
if (!g_key_file_save_to_file (keyfile,
flatpak_file_get_path_cached (metadata),
error))
{
g_prefix_error (error, "Can't save metadata.platform: ");
return FALSE;
}
}
if (self->command)
{
g_autoptr(GFile) files_dir = g_file_resolve_relative_path (app_dir, "files");

View File

@ -137,6 +137,11 @@
<listitem><para>Install these extra extensions from the base application when initializing
the application directory.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>inherit-extensions</option> (array of strings)</term>
<listitem><para>Inherit these extra extensions points from the base application or sdk when
finishing the build.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>tags</option> (array of strings)</term>