gboolean flatpak_builtin_install (int argc, char **argv, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(FlatpakDir) dir = NULL; const char *repository; const char *name; const char *branch = NULL; g_autofree char *ref = NULL; gboolean is_app; g_autoptr(GFile) deploy_dir = NULL; g_autoptr(GPtrArray) related = NULL; int i; context = g_option_context_new ("REPOSITORY NAME [BRANCH] - Install an application or runtime"); if (!flatpak_option_context_parse (context, options, &argc, &argv, 0, &dir, cancellable, error)) return FALSE; if (opt_bundle) return install_bundle (dir, context, argc, argv, cancellable, error); if (argc < 3) return usage_error (context, "REPOSITORY and NAME must be specified", error); repository = argv[1]; name = argv[2]; if (argc >= 4) branch = argv[3]; if (!opt_app && !opt_runtime) opt_app = opt_runtime = TRUE; ref = flatpak_dir_find_remote_ref (dir, repository, name, branch, opt_arch, opt_app, opt_runtime, &is_app, cancellable, error); if (ref == NULL) return FALSE; deploy_dir = flatpak_dir_get_if_deployed (dir, ref, NULL, cancellable); if (deploy_dir != NULL) { g_auto(GStrv) parts = flatpak_decompose_ref (ref, error); return flatpak_fail (error, "%s %s, branch %s is already installed", is_app ? "App" : "Runtime", name, parts[3]); } if (!flatpak_dir_install (dir, opt_no_pull, opt_no_deploy, ref, repository, (const char **)opt_subpaths, NULL, cancellable, error)) return FALSE; if (!opt_no_related) { g_autoptr(GError) local_error = NULL; if (opt_no_pull) related = flatpak_dir_find_local_related (dir, ref, repository, NULL, &local_error); else related = flatpak_dir_find_remote_related (dir, ref, repository, NULL, &local_error); if (related == NULL) { g_printerr ("Warning: Problem looking for related refs: %s\n", local_error->message); g_clear_error (&local_error); } else { for (i = 0; i < related->len; i++) { FlatpakRelated *rel = g_ptr_array_index (related, i); g_auto(GStrv) parts = NULL; if (!rel->download) continue; parts = g_strsplit (rel->ref, "/", 0); g_print ("Installing related: %s\n", parts[1]); if (!flatpak_dir_install_or_update (dir, opt_no_pull, opt_no_deploy, rel->ref, repository, (const char **)rel->subpaths, NULL, cancellable, &local_error)) { g_printerr ("Warning: Failed to install related ref: %s\n", rel->ref); g_clear_error (&local_error); } } } } return TRUE; }
gboolean flatpak_complete_install (FlatpakCompletion *completion) { g_autoptr(GOptionContext) context = NULL; g_autoptr(FlatpakDir) dir = NULL; g_autoptr(GError) error = NULL; g_auto(GStrv) refs = NULL; int i; context = g_option_context_new (""); if (!flatpak_option_context_parse (context, options, &completion->argc, &completion->argv, 0, &dir, NULL, NULL)) return FALSE; if (!opt_app && !opt_runtime) opt_app = opt_runtime = TRUE; flatpak_completion_debug ("install argc %d", completion->argc); switch (completion->argc) { case 0: case 1: /* REMOTE */ flatpak_complete_options (completion, global_entries); flatpak_complete_options (completion, options); flatpak_complete_options (completion, user_entries); { g_auto(GStrv) remotes = flatpak_dir_list_remotes (dir, NULL, NULL); if (remotes == NULL) return FALSE; for (i = 0; remotes[i] != NULL; i++) flatpak_complete_word (completion, "%s ", remotes[i]); } break; case 2: /* Name */ refs = flatpak_dir_find_remote_refs (dir, completion->argv[1], NULL, NULL, opt_arch, opt_app, opt_runtime, NULL, &error); if (refs == NULL) flatpak_completion_debug ("find remote refs error: %s", error->message); for (i = 0; refs != NULL && refs[i] != NULL; i++) { g_auto(GStrv) parts = flatpak_decompose_ref (refs[i], NULL); if (parts) flatpak_complete_word (completion, "%s ", parts[1]); } break; case 3: /* Branch */ refs = flatpak_dir_find_remote_refs (dir, completion->argv[1], completion->argv[2], NULL, opt_arch, opt_app, opt_runtime, NULL, &error); if (refs == NULL) flatpak_completion_debug ("find remote refs error: %s", error->message); for (i = 0; refs != NULL && refs[i] != NULL; i++) { g_auto(GStrv) parts = flatpak_decompose_ref (refs[i], NULL); if (parts) flatpak_complete_word (completion, "%s ", parts[3]); } break; default: break; } return TRUE; }
static gboolean enumerate_instances (Column *columns, GError **error) { g_autoptr(GPtrArray) instances = NULL; FlatpakTablePrinter *printer; int i, j; if (columns[0].name == NULL) return TRUE; printer = flatpak_table_printer_new (); flatpak_table_printer_set_columns (printer, columns); instances = flatpak_instance_get_all (); if (instances->len == 0) { /* nothing to show */ return TRUE; } for (j = 0; j < instances->len; j++) { FlatpakInstance *instance = (FlatpakInstance *) g_ptr_array_index (instances, j); flatpak_table_printer_add_column (printer, flatpak_instance_get_id (instance)); for (i = 0; columns[i].name; i++) { if (strcmp (columns[i].name, "pid") == 0) { g_autofree char *pid = g_strdup_printf ("%d", flatpak_instance_get_pid (instance)); flatpak_table_printer_add_column (printer, pid); } else if (strcmp (columns[i].name, "child-pid") == 0) { g_autofree char *pid = g_strdup_printf ("%d", flatpak_instance_get_child_pid (instance)); flatpak_table_printer_add_column (printer, pid); } else if (strcmp (columns[i].name, "application") == 0) flatpak_table_printer_add_column (printer, flatpak_instance_get_app (instance)); else if (strcmp (columns[i].name, "arch") == 0) flatpak_table_printer_add_column (printer, flatpak_instance_get_arch (instance)); else if (strcmp (columns[i].name, "branch") == 0) flatpak_table_printer_add_column (printer, flatpak_instance_get_branch (instance)); else if (strcmp (columns[i].name, "commit") == 0) flatpak_table_printer_add_column_len (printer, flatpak_instance_get_commit (instance), 12); else if (strcmp (columns[i].name, "runtime") == 0) { const char *full_ref = flatpak_instance_get_runtime (instance); if (full_ref != NULL) { g_auto(GStrv) ref = flatpak_decompose_ref (full_ref, NULL); flatpak_table_printer_add_column (printer, ref[1]); } } else if (strcmp (columns[i].name, "runtime-branch") == 0) { const char *full_ref = flatpak_instance_get_runtime (instance); if (full_ref != NULL) { g_auto(GStrv) ref = flatpak_decompose_ref (full_ref, NULL); flatpak_table_printer_add_column (printer, ref[3]); } } else if (strcmp (columns[i].name, "runtime-commit") == 0) flatpak_table_printer_add_column_len (printer, flatpak_instance_get_runtime_commit (instance), 12); } flatpak_table_printer_finish_row (printer); } flatpak_table_printer_print (printer); flatpak_table_printer_free (printer); return TRUE; }