From 73f44dd65618835213044bf4840822437b16f76e Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Mon, 2 Oct 2017 17:45:27 +0200 Subject: [PATCH] Add extensions to /.flatpak-info This fixes https://github.com/flatpak/flatpak/issues/502 Closes: #1069 Approved by: alexlarsson --- app/flatpak-builtins-build.c | 19 ++++++++-------- common/flatpak-run.c | 42 ++++++++++++++++++++++++++++-------- common/flatpak-run.h | 5 +++++ 3 files changed, 48 insertions(+), 18 deletions(-) diff --git a/app/flatpak-builtins-build.c b/app/flatpak-builtins-build.c index f6669c77..7a33e4e7 100644 --- a/app/flatpak-builtins-build.c +++ b/app/flatpak-builtins-build.c @@ -108,6 +108,7 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError gboolean is_extension = FALSE; gboolean is_app_extension = FALSE; g_autofree char *app_info_path = NULL; + g_autofree char *runtime_extensions = NULL; g_autoptr(GFile) app_id_dir = NULL; context = g_option_context_new (_("DIRECTORY [COMMAND [args...]] - Build in directory")); @@ -368,10 +369,17 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError flatpak_context_allow_host_fs (app_context); flatpak_context_merge (app_context, arg_context); + envp = flatpak_run_get_minimal_env (TRUE); + envp = flatpak_run_apply_env_vars (envp, app_context); + + if (!custom_usr && !(is_extension && !is_app_extension) && + !flatpak_run_add_extension_args (argv_array, &envp, runtime_metakey, runtime_ref, &runtime_extensions, cancellable, error)) + return FALSE; + if (!flatpak_run_add_app_info_args (argv_array, NULL, - app_files, NULL, - runtime_files, runtime_deploy_data, + app_files, NULL, NULL, + runtime_files, runtime_deploy_data, runtime_extensions, id, NULL, runtime_ref, app_context, @@ -379,13 +387,6 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError error)) return FALSE; - envp = flatpak_run_get_minimal_env (TRUE); - envp = flatpak_run_apply_env_vars (envp, app_context); - - if (!custom_usr && !(is_extension && !is_app_extension) && - !flatpak_run_add_extension_args (argv_array, &envp, runtime_metakey, runtime_ref, cancellable, error)) - return FALSE; - if (!flatpak_run_add_environment_args (argv_array, NULL, &envp, app_info_path, run_flags, id, app_context, app_id_dir, NULL, cancellable, error)) return FALSE; diff --git a/common/flatpak-run.c b/common/flatpak-run.c index 82ec4837..e8af0630 100644 --- a/common/flatpak-run.c +++ b/common/flatpak-run.c @@ -2261,10 +2261,12 @@ flatpak_run_add_extension_args (GPtrArray *argv_array, char ***envp_p, GKeyFile *metakey, const char *full_ref, + char **extensions_out, GCancellable *cancellable, GError **error) { g_auto(GStrv) parts = NULL; + g_autoptr(GString) used_extensions = g_string_new (""); gboolean is_app; GList *extensions, *l; g_autoptr(GHashTable) mounted_tmpfs = @@ -2290,6 +2292,15 @@ flatpak_run_add_extension_args (GPtrArray *argv_array, g_autofree char *real_ref = g_build_filename (ext->files_path, ext->directory, ".ref", NULL); int i; + if (used_extensions->len > 0) + g_string_append (used_extensions, ";"); + g_string_append (used_extensions, ext->installed_id); + g_string_append (used_extensions, "="); + if (ext->commit != NULL) + g_string_append (used_extensions, ext->commit); + else + g_string_append (used_extensions, "local"); + if (ext->needs_tmpfs) { g_autofree char *parent = g_path_get_dirname (directory); @@ -2355,6 +2366,9 @@ flatpak_run_add_extension_args (GPtrArray *argv_array, g_list_free_full (extensions, (GDestroyNotify) flatpak_extension_free); + if (extensions_out) + *extensions_out = g_string_free (g_steal_pointer (&used_extensions), FALSE); + return TRUE; } @@ -3691,8 +3705,10 @@ flatpak_run_add_app_info_args (GPtrArray *argv_array, GArray *fd_array, GFile *app_files, GVariant *app_deploy_data, + const char *app_extensions, GFile *runtime_files, GVariant *runtime_deploy_data, + const char *runtime_extensions, const char *app_id, const char *app_branch, const char *runtime_ref, @@ -3738,12 +3754,18 @@ flatpak_run_add_app_info_args (GPtrArray *argv_array, if (app_deploy_data) g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, FLATPAK_METADATA_KEY_APP_COMMIT, flatpak_deploy_data_get_commit (app_deploy_data)); + if (app_extensions && *app_extensions != 0) + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_APP_EXTENSIONS, app_extensions); runtime_path = g_file_get_path (runtime_files); g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, FLATPAK_METADATA_KEY_RUNTIME_PATH, runtime_path); if (runtime_deploy_data) g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, FLATPAK_METADATA_KEY_RUNTIME_COMMIT, flatpak_deploy_data_get_commit (runtime_deploy_data)); + if (runtime_extensions && *runtime_extensions != 0) + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_RUNTIME_EXTENSIONS, runtime_extensions); if (app_branch != NULL) g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, FLATPAK_METADATA_KEY_BRANCH, app_branch); @@ -4855,6 +4877,8 @@ flatpak_run_app (const char *app_ref, g_auto(GStrv) app_ref_parts = NULL; g_autofree char *commandline = NULL; g_autofree char *doc_mount_path = NULL; + g_autofree char *app_extensions = NULL; + g_autofree char *runtime_extensions = NULL; app_ref_parts = flatpak_decompose_ref (app_ref, error); if (app_ref_parts == NULL) @@ -4984,20 +5008,20 @@ flatpak_run_app (const char *app_ref, if (!flatpak_run_setup_base_argv (argv_array, fd_array, runtime_files, app_id_dir, app_ref_parts[2], flags, error)) return FALSE; + if (metakey != NULL && + !flatpak_run_add_extension_args (argv_array, &envp, metakey, app_ref, &app_extensions, cancellable, error)) + return FALSE; + + if (!flatpak_run_add_extension_args (argv_array, &envp, runtime_metakey, runtime_ref, &runtime_extensions, cancellable, error)) + return FALSE; + if (!flatpak_run_add_app_info_args (argv_array, fd_array, - app_files, app_deploy_data, - runtime_files, runtime_deploy_data, + app_files, app_deploy_data, app_extensions, + runtime_files, runtime_deploy_data, runtime_extensions, app_ref_parts[1], app_ref_parts[3], runtime_ref, app_context, &app_info_path, error)) return FALSE; - if (metakey != NULL && - !flatpak_run_add_extension_args (argv_array, &envp, metakey, app_ref, cancellable, error)) - return FALSE; - - if (!flatpak_run_add_extension_args (argv_array, &envp, runtime_metakey, runtime_ref, cancellable, error)) - return FALSE; - add_document_portal_args (argv_array, app_ref_parts[1], &doc_mount_path); if (!flatpak_run_add_environment_args (argv_array, fd_array, &envp, diff --git a/common/flatpak-run.h b/common/flatpak-run.h index 17554815..2aa1f88d 100644 --- a/common/flatpak-run.h +++ b/common/flatpak-run.h @@ -51,10 +51,12 @@ gboolean flatpak_run_in_transient_unit (const char *app_id, #define FLATPAK_METADATA_GROUP_INSTANCE "Instance" #define FLATPAK_METADATA_KEY_APP_PATH "app-path" #define FLATPAK_METADATA_KEY_APP_COMMIT "app-commit" +#define FLATPAK_METADATA_KEY_APP_EXTENSIONS "app-extensions" #define FLATPAK_METADATA_KEY_BRANCH "branch" #define FLATPAK_METADATA_KEY_FLATPAK_VERSION "flatpak-version" #define FLATPAK_METADATA_KEY_RUNTIME_PATH "runtime-path" #define FLATPAK_METADATA_KEY_RUNTIME_COMMIT "runtime-commit" +#define FLATPAK_METADATA_KEY_RUNTIME_EXTENSIONS "runtime-extensions" #define FLATPAK_METADATA_KEY_SESSION_BUS_PROXY "session-bus-proxy" #define FLATPAK_METADATA_KEY_SYSTEM_BUS_PROXY "system-bus-proxy" @@ -160,6 +162,7 @@ gboolean flatpak_run_add_extension_args (GPtrArray *argv_array, char ***envp_p, GKeyFile *metakey, const char *full_ref, + char **extensions_out, GCancellable *cancellable, GError **error); gboolean flatpak_run_add_environment_args (GPtrArray *argv_array, @@ -199,8 +202,10 @@ gboolean flatpak_run_add_app_info_args (GPtrArray *argv_array, GArray *fd_array, GFile *app_files, GVariant *app_deploy_data, + const char *app_extensions, GFile *runtime_files, GVariant *runtime_deploy_data, + const char *runtime_extensions, const char *app_id, const char *app_branch, const char *runtime_ref,