forked from Mirrors/flatpak-builder
builder: Add inherit-extensions features
This lets runtimes like the gnome and kde one easily inherit extension points from the parent sdk.tingping/wmclass
parent
504a3a25ea
commit
8c6f31f9a8
|
@ -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");
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue