diff options
author | Alexander Larsson <alexl@redhat.com> | 2017-12-12 17:23:44 +0100 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2017-12-13 10:03:47 +0000 |
commit | e769cdd489a2495a197fd980b57a0bf2d1ae10b7 (patch) | |
tree | fe13a05949eb0e747ed8fe0d82af08b1621e1b7b | |
parent | 13db7f047423a35d3f0bba9c02c00a6ba6c3b739 (diff) | |
download | flatpak-e769cdd489a2495a197fd980b57a0bf2d1ae10b7.tar.gz |
update: Update apps from both system and user installations
Unless you manually specify an installation it looks for updates
in all the standard installations.
This fixes https://github.com/flatpak/flatpak/issues/282
Closes: #1246
Approved by: alexlarsson
-rw-r--r-- | app/flatpak-builtins-update.c | 208 | ||||
-rw-r--r-- | app/flatpak-transaction.c | 6 | ||||
-rw-r--r-- | app/flatpak-transaction.h | 1 | ||||
-rw-r--r-- | doc/flatpak-update.xml | 4 |
4 files changed, 133 insertions, 86 deletions
diff --git a/app/flatpak-builtins-update.c b/app/flatpak-builtins-update.c index 9a51e399..ffc09a15 100644 --- a/app/flatpak-builtins-update.c +++ b/app/flatpak-builtins-update.c @@ -67,10 +67,11 @@ static GOptionEntry options[] = { }; static gboolean -update_appstream (FlatpakDir *dir, const char *remote, GCancellable *cancellable, GError **error) +update_appstream (GPtrArray *dirs, const char *remote, GCancellable *cancellable, GError **error) { gboolean changed; gboolean res; + int i, j; if (opt_arch == NULL) opt_arch = (char *)flatpak_get_arch (); @@ -78,40 +79,60 @@ update_appstream (FlatpakDir *dir, const char *remote, GCancellable *cancellable if (remote == NULL) { g_auto(GStrv) remotes = NULL; - int i; - remotes = flatpak_dir_list_remotes (dir, cancellable, error); - if (remotes == NULL) - return FALSE; - - for (i = 0; remotes[i] != NULL; i++) + for (j = 0; j < dirs->len; j++) { - g_autoptr(GError) local_error = NULL; - FlatpakTerminalProgress terminal_progress = { 0 }; - - if (flatpak_dir_get_remote_disabled (dir, remotes[i]) || - flatpak_dir_get_remote_noenumerate (dir, remotes[i])) - continue; - - g_print (_("Updating appstream for remote %s\n"), remotes[i]); - g_autoptr(OstreeAsyncProgress) progress = flatpak_progress_new (flatpak_terminal_progress_cb, &terminal_progress); - if (!flatpak_dir_update_appstream (dir, remotes[i], opt_arch, &changed, - progress, cancellable, &local_error)) - g_printerr (_("Error updating: %s\n"), local_error->message); - ostree_async_progress_finish (progress); - flatpak_terminal_progress_end (&terminal_progress); + FlatpakDir *dir = g_ptr_array_index (dirs, j); + + remotes = flatpak_dir_list_remotes (dir, cancellable, error); + if (remotes == NULL) + return FALSE; + + for (i = 0; remotes[i] != NULL; i++) + { + g_autoptr(GError) local_error = NULL; + FlatpakTerminalProgress terminal_progress = { 0 }; + + if (flatpak_dir_get_remote_disabled (dir, remotes[i]) || + flatpak_dir_get_remote_noenumerate (dir, remotes[i])) + continue; + + g_print (_("Updating appstream for remote %s\n"), remotes[i]); + g_autoptr(OstreeAsyncProgress) progress = flatpak_progress_new (flatpak_terminal_progress_cb, &terminal_progress); + if (!flatpak_dir_update_appstream (dir, remotes[i], opt_arch, &changed, + progress, cancellable, &local_error)) + g_printerr (_("Error updating: %s\n"), local_error->message); + ostree_async_progress_finish (progress); + flatpak_terminal_progress_end (&terminal_progress); + } } } else { - FlatpakTerminalProgress terminal_progress = { 0 }; - g_autoptr(OstreeAsyncProgress) progress = flatpak_progress_new (flatpak_terminal_progress_cb, &terminal_progress); - res = flatpak_dir_update_appstream (dir, remote, opt_arch, &changed, - progress, cancellable, error); - ostree_async_progress_finish (progress); - if (!res) - return FALSE; - flatpak_terminal_progress_end (&terminal_progress); + gboolean found = FALSE; + + for (j = 0; j < dirs->len; j++) + { + FlatpakDir *dir = g_ptr_array_index (dirs, j); + + if (flatpak_dir_has_remote (dir, remote)) + { + FlatpakTerminalProgress terminal_progress = { 0 }; + + found = TRUE; + + g_autoptr(OstreeAsyncProgress) progress = flatpak_progress_new (flatpak_terminal_progress_cb, &terminal_progress); + res = flatpak_dir_update_appstream (dir, remote, opt_arch, &changed, + progress, cancellable, error); + ostree_async_progress_finish (progress); + if (!res) + return FALSE; + flatpak_terminal_progress_end (&terminal_progress); + } + } + + if (!found) + return flatpak_fail (error, _("Remote \"%s\" not found"), remote); } return TRUE; @@ -125,25 +146,22 @@ flatpak_builtin_update (int argc, { g_autoptr(GOptionContext) context = NULL; g_autoptr(GPtrArray) dirs = NULL; - FlatpakDir *dir; char **prefs = NULL; - int i, j, n_prefs; + int i, j, k, n_prefs; const char *default_branch = NULL; FlatpakKinds kinds; - g_autoptr(FlatpakTransaction) transaction = NULL; + g_autoptr(GPtrArray) transactions = NULL; context = g_option_context_new (_("[REF...] - Update applications or runtimes")); g_option_context_set_translation_domain (context, GETTEXT_PACKAGE); if (!flatpak_option_context_parse (context, options, &argc, &argv, - FLATPAK_BUILTIN_FLAG_ONE_DIR, + FLATPAK_BUILTIN_FLAG_STANDARD_DIRS, &dirs, cancellable, error)) return FALSE; - dir = g_ptr_array_index (dirs, 0); - if (opt_appstream) - return update_appstream (dir, argc >= 2 ? argv[1] : NULL, cancellable, error); + return update_appstream (dirs, argc >= 2 ? argv[1] : NULL, cancellable, error); prefs = &argv[1]; n_prefs = argc - 1; @@ -155,8 +173,16 @@ flatpak_builtin_update (int argc, n_prefs = 1; } - transaction = flatpak_transaction_new (dir, opt_yes, opt_no_pull, opt_no_deploy, - opt_no_static_deltas, !opt_no_deps, !opt_no_related); + transactions = g_ptr_array_new_with_free_func ((GDestroyNotify)flatpak_transaction_free); + + for (k = 0; k < dirs->len; k++) + { + FlatpakTransaction *transaction = flatpak_transaction_new (g_ptr_array_index (dirs, k), + opt_yes, opt_no_pull, opt_no_deploy, + opt_no_static_deltas, !opt_no_deps, !opt_no_related); + g_ptr_array_add (transactions, transaction); + } + kinds = flatpak_kinds_from_bools (opt_app, opt_runtime); g_print (_("Looking for updates...\n")); @@ -182,64 +208,70 @@ flatpak_builtin_update (int argc, return FALSE; } - if (kinds & FLATPAK_KINDS_APP) + for (k = 0; k < dirs->len; k++) { - g_auto(GStrv) refs = NULL; - - if (!flatpak_dir_list_refs (dir, "app", &refs, - cancellable, - error)) - return FALSE; + FlatpakDir *dir = g_ptr_array_index (dirs, k); + FlatpakTransaction *transaction = g_ptr_array_index (transactions, k); - for (i = 0; refs != NULL && refs[i] != NULL; i++) + if (kinds & FLATPAK_KINDS_APP) { - g_auto(GStrv) parts = flatpak_decompose_ref (refs[i], error); - if (parts == NULL) + g_auto(GStrv) refs = NULL; + + if (!flatpak_dir_list_refs (dir, "app", &refs, + cancellable, + error)) return FALSE; - if (id != NULL && strcmp (parts[1], id) != 0) - continue; + for (i = 0; refs != NULL && refs[i] != NULL; i++) + { + g_auto(GStrv) parts = flatpak_decompose_ref (refs[i], error); + if (parts == NULL) + return FALSE; - if (arch != NULL && strcmp (parts[2], arch) != 0) - continue; + if (id != NULL && strcmp (parts[1], id) != 0) + continue; - if (branch != NULL && strcmp (parts[3], branch) != 0) - continue; + if (arch != NULL && strcmp (parts[2], arch) != 0) + continue; - found = TRUE; - if (!flatpak_transaction_add_update (transaction, refs[i], (const char **)opt_subpaths, opt_commit, error)) - return FALSE; - } - } - - if (kinds & FLATPAK_KINDS_RUNTIME) - { - g_auto(GStrv) refs = NULL; + if (branch != NULL && strcmp (parts[3], branch) != 0) + continue; - if (!flatpak_dir_list_refs (dir, "runtime", &refs, - cancellable, - error)) - return FALSE; + found = TRUE; + if (!flatpak_transaction_add_update (transaction, refs[i], (const char **)opt_subpaths, opt_commit, error)) + return FALSE; + } + } - for (i = 0; refs != NULL && refs[i] != NULL; i++) + if (kinds & FLATPAK_KINDS_RUNTIME) { - g_auto(GStrv) parts = flatpak_decompose_ref (refs[i], error); + g_auto(GStrv) refs = NULL; - if (parts == NULL) + if (!flatpak_dir_list_refs (dir, "runtime", &refs, + cancellable, + error)) return FALSE; - if (id != NULL && strcmp (parts[1], id) != 0) - continue; + for (i = 0; refs != NULL && refs[i] != NULL; i++) + { + g_auto(GStrv) parts = flatpak_decompose_ref (refs[i], error); - if (arch != NULL && strcmp (parts[2], arch) != 0) - continue; + if (parts == NULL) + return FALSE; - if (branch != NULL && strcmp (parts[3], branch) != 0) - continue; + if (id != NULL && strcmp (parts[1], id) != 0) + continue; - found = TRUE; - if (!flatpak_transaction_add_update (transaction, refs[i], (const char **)opt_subpaths, opt_commit, error)) - return FALSE; + if (arch != NULL && strcmp (parts[2], arch) != 0) + continue; + + if (branch != NULL && strcmp (parts[3], branch) != 0) + continue; + + found = TRUE; + if (!flatpak_transaction_add_update (transaction, refs[i], (const char **)opt_subpaths, opt_commit, error)) + return FALSE; + } } } @@ -251,14 +283,22 @@ flatpak_builtin_update (int argc, } } - if (!flatpak_transaction_update_metadata (transaction, n_prefs == 0, cancellable, error)) - return FALSE; + for (k = 0; k < dirs->len; k++) + { + FlatpakTransaction *transaction = g_ptr_array_index (transactions, k); - if (!flatpak_transaction_run (transaction, FALSE, cancellable, error)) - return FALSE; + if (!flatpak_transaction_is_empty (transaction)) + { + if (!flatpak_transaction_update_metadata (transaction, n_prefs == 0, cancellable, error)) + return FALSE; + + if (!flatpak_transaction_run (transaction, FALSE, cancellable, error)) + return FALSE; + } + } if (n_prefs == 0) - return update_appstream (dir, NULL, cancellable, error); + return update_appstream (dirs, NULL, cancellable, error); return TRUE; } diff --git a/app/flatpak-transaction.c b/app/flatpak-transaction.c index 4df48d65..458b6b67 100644 --- a/app/flatpak-transaction.c +++ b/app/flatpak-transaction.c @@ -157,6 +157,12 @@ flatpak_transaction_operation_free (FlatpakTransactionOp *self) g_free (self); } +gboolean +flatpak_transaction_is_empty (FlatpakTransaction *self) +{ + return self->ops == NULL; +} + FlatpakTransaction * flatpak_transaction_new (FlatpakDir *dir, gboolean no_interaction, diff --git a/app/flatpak-transaction.h b/app/flatpak-transaction.h index 8588f23a..5eaf7d13 100644 --- a/app/flatpak-transaction.h +++ b/app/flatpak-transaction.h @@ -58,6 +58,7 @@ gboolean flatpak_transaction_add_update (FlatpakTransaction *self, const char **subpaths, const char *commit, GError **error); +gboolean flatpak_transaction_is_empty (FlatpakTransaction *self); G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakTransaction, flatpak_transaction_free) diff --git a/doc/flatpak-update.xml b/doc/flatpak-update.xml index 079fafa6..52924caf 100644 --- a/doc/flatpak-update.xml +++ b/doc/flatpak-update.xml @@ -76,8 +76,8 @@ version, with the --commit option. </para> <para> - Unless overridden with the --user or the --installation option, this command updates - the default system-wide installation. + Unless overridden with the --user, --system or --installation option, this command updates + any matching refs in the standard system-wide installation and the per-user one. </para> </refsect1> |