Compare commits
No commits in common. 'c9' and 'i8' have entirely different histories.
@ -1 +1 @@
|
||||
SOURCES/gnome-software-41.5.tar.xz
|
||||
SOURCES/gnome-software-3.36.1.tar.xz
|
||||
|
@ -1 +1 @@
|
||||
bc37c8ed81ddff70749abcf7ab94bdcf3fffad0f SOURCES/gnome-software-41.5.tar.xz
|
||||
9c6342f47f5ad90deac7cc8250f559146f506fff SOURCES/gnome-software-3.36.1.tar.xz
|
||||
|
@ -0,0 +1,813 @@
|
||||
From b6a41a1b9e9020a23dbc418183ebe4746b6ec027 Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Mon, 18 May 2020 14:45:35 +0200
|
||||
Subject: [PATCH 1/2] Add basic auth support to flatpak plugin
|
||||
|
||||
This is useful for e.g. OCI remotes that can use basic auth.
|
||||
|
||||
All user visible strings in the basic auth dialog are taken from the
|
||||
flatpak CLI client.
|
||||
---
|
||||
lib/gs-plugin-loader.c | 29 +++-
|
||||
lib/gs-plugin-loader.h | 7 +-
|
||||
lib/gs-plugin.c | 68 +++++++++-
|
||||
lib/gs-plugin.h | 13 +-
|
||||
plugins/flatpak/gs-plugin-flatpak.c | 55 +++++++-
|
||||
po/POTFILES.in | 2 +
|
||||
src/gnome-software.gresource.xml | 1 +
|
||||
src/gs-basic-auth-dialog.c | 130 ++++++++++++++++++
|
||||
src/gs-basic-auth-dialog.h | 28 ++++
|
||||
src/gs-basic-auth-dialog.ui | 203 ++++++++++++++++++++++++++++
|
||||
src/gs-shell.c | 25 +++-
|
||||
src/meson.build | 1 +
|
||||
12 files changed, 556 insertions(+), 6 deletions(-)
|
||||
create mode 100644 src/gs-basic-auth-dialog.c
|
||||
create mode 100644 src/gs-basic-auth-dialog.h
|
||||
create mode 100644 src/gs-basic-auth-dialog.ui
|
||||
|
||||
diff --git a/lib/gs-plugin-loader.c b/lib/gs-plugin-loader.c
|
||||
index 979f3d5d..35382e3f 100644
|
||||
--- a/lib/gs-plugin-loader.c
|
||||
+++ b/lib/gs-plugin-loader.c
|
||||
@@ -1,7 +1,7 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||
*
|
||||
* Copyright (C) 2007-2018 Richard Hughes <richard@hughsie.com>
|
||||
- * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
|
||||
+ * Copyright (C) 2014-2020 Kalev Lember <klember@redhat.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@@ -74,6 +74,7 @@ enum {
|
||||
SIGNAL_PENDING_APPS_CHANGED,
|
||||
SIGNAL_UPDATES_CHANGED,
|
||||
SIGNAL_RELOAD,
|
||||
+ SIGNAL_BASIC_AUTH_START,
|
||||
SIGNAL_LAST
|
||||
};
|
||||
|
||||
@@ -2016,6 +2017,23 @@ gs_plugin_loader_status_changed_cb (GsPlugin *plugin,
|
||||
0, app, status);
|
||||
}
|
||||
|
||||
+static void
|
||||
+gs_plugin_loader_basic_auth_start_cb (GsPlugin *plugin,
|
||||
+ const gchar *remote,
|
||||
+ const gchar *realm,
|
||||
+ GCallback callback,
|
||||
+ gpointer user_data,
|
||||
+ GsPluginLoader *plugin_loader)
|
||||
+{
|
||||
+ g_debug ("emitting basic-auth-start %s", realm);
|
||||
+ g_signal_emit (plugin_loader,
|
||||
+ signals[SIGNAL_BASIC_AUTH_START], 0,
|
||||
+ remote,
|
||||
+ realm,
|
||||
+ callback,
|
||||
+ user_data);
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
gs_plugin_loader_job_actions_changed_delay_cb (gpointer user_data)
|
||||
{
|
||||
@@ -2102,6 +2120,9 @@ gs_plugin_loader_open_plugin (GsPluginLoader *plugin_loader,
|
||||
g_signal_connect (plugin, "status-changed",
|
||||
G_CALLBACK (gs_plugin_loader_status_changed_cb),
|
||||
plugin_loader);
|
||||
+ g_signal_connect (plugin, "basic-auth-start",
|
||||
+ G_CALLBACK (gs_plugin_loader_basic_auth_start_cb),
|
||||
+ plugin_loader);
|
||||
g_signal_connect (plugin, "report-event",
|
||||
G_CALLBACK (gs_plugin_loader_report_event_cb),
|
||||
plugin_loader);
|
||||
@@ -2712,6 +2733,12 @@ gs_plugin_loader_class_init (GsPluginLoaderClass *klass)
|
||||
G_STRUCT_OFFSET (GsPluginLoaderClass, reload),
|
||||
NULL, NULL, g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
+ signals [SIGNAL_BASIC_AUTH_START] =
|
||||
+ g_signal_new ("basic-auth-start",
|
||||
+ G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
|
||||
+ G_STRUCT_OFFSET (GsPluginLoaderClass, basic_auth_start),
|
||||
+ NULL, NULL, g_cclosure_marshal_generic,
|
||||
+ G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER);
|
||||
}
|
||||
|
||||
static void
|
||||
diff --git a/lib/gs-plugin-loader.h b/lib/gs-plugin-loader.h
|
||||
index 74cbfa53..e88ea2d1 100644
|
||||
--- a/lib/gs-plugin-loader.h
|
||||
+++ b/lib/gs-plugin-loader.h
|
||||
@@ -1,7 +1,7 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||
*
|
||||
* Copyright (C) 2007-2017 Richard Hughes <richard@hughsie.com>
|
||||
- * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
|
||||
+ * Copyright (C) 2015-2020 Kalev Lember <klember@redhat.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@@ -31,6 +31,11 @@ struct _GsPluginLoaderClass
|
||||
void (*pending_apps_changed) (GsPluginLoader *plugin_loader);
|
||||
void (*updates_changed) (GsPluginLoader *plugin_loader);
|
||||
void (*reload) (GsPluginLoader *plugin_loader);
|
||||
+ void (*basic_auth_start) (GsPluginLoader *plugin_loader,
|
||||
+ const gchar *remote,
|
||||
+ const gchar *realm,
|
||||
+ GCallback callback,
|
||||
+ gpointer user_data);
|
||||
};
|
||||
|
||||
GsPluginLoader *gs_plugin_loader_new (void);
|
||||
diff --git a/lib/gs-plugin.c b/lib/gs-plugin.c
|
||||
index 5aed1058..3f63fa97 100644
|
||||
--- a/lib/gs-plugin.c
|
||||
+++ b/lib/gs-plugin.c
|
||||
@@ -1,7 +1,7 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||
*
|
||||
* Copyright (C) 2013-2016 Richard Hughes <richard@hughsie.com>
|
||||
- * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
|
||||
+ * Copyright (C) 2014-2020 Kalev Lember <klember@redhat.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@@ -87,6 +87,7 @@ enum {
|
||||
SIGNAL_RELOAD,
|
||||
SIGNAL_REPORT_EVENT,
|
||||
SIGNAL_ALLOW_UPDATES,
|
||||
+ SIGNAL_BASIC_AUTH_START,
|
||||
SIGNAL_LAST
|
||||
};
|
||||
|
||||
@@ -851,6 +852,64 @@ gs_plugin_status_update (GsPlugin *plugin, GsApp *app, GsPluginStatus status)
|
||||
g_source_attach (idle_source, NULL);
|
||||
}
|
||||
|
||||
+typedef struct {
|
||||
+ GsPlugin *plugin;
|
||||
+ gchar *remote;
|
||||
+ gchar *realm;
|
||||
+ GCallback callback;
|
||||
+ gpointer user_data;
|
||||
+} GsPluginBasicAuthHelper;
|
||||
+
|
||||
+static gboolean
|
||||
+gs_plugin_basic_auth_start_cb (gpointer user_data)
|
||||
+{
|
||||
+ GsPluginBasicAuthHelper *helper = user_data;
|
||||
+ g_signal_emit (helper->plugin,
|
||||
+ signals[SIGNAL_BASIC_AUTH_START], 0,
|
||||
+ helper->remote,
|
||||
+ helper->realm,
|
||||
+ helper->callback,
|
||||
+ helper->user_data);
|
||||
+ g_free (helper->remote);
|
||||
+ g_free (helper->realm);
|
||||
+ g_slice_free (GsPluginBasicAuthHelper, helper);
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * gs_plugin_basic_auth_start:
|
||||
+ * @plugin: a #GsPlugin
|
||||
+ * @remote: a string
|
||||
+ * @realm: a string
|
||||
+ * @callback: callback to invoke to submit the user/password
|
||||
+ * @user_data: callback data to pass to the callback
|
||||
+ *
|
||||
+ * Emit the basic-auth-start signal in the main thread.
|
||||
+ *
|
||||
+ * Since: 3.38
|
||||
+ **/
|
||||
+void
|
||||
+gs_plugin_basic_auth_start (GsPlugin *plugin,
|
||||
+ const gchar *remote,
|
||||
+ const gchar *realm,
|
||||
+ GCallback callback,
|
||||
+ gpointer user_data)
|
||||
+{
|
||||
+ GsPluginBasicAuthHelper *helper;
|
||||
+ g_autoptr(GSource) idle_source = NULL;
|
||||
+
|
||||
+ helper = g_slice_new0 (GsPluginBasicAuthHelper);
|
||||
+ helper->plugin = plugin;
|
||||
+ helper->remote = g_strdup (remote);
|
||||
+ helper->realm = g_strdup (realm);
|
||||
+ helper->callback = callback;
|
||||
+ helper->user_data = user_data;
|
||||
+
|
||||
+ idle_source = g_idle_source_new ();
|
||||
+ g_source_set_callback (idle_source, gs_plugin_basic_auth_start_cb, helper, NULL);
|
||||
+ g_source_attach (idle_source, NULL);
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
gs_plugin_app_launch_cb (gpointer user_data)
|
||||
{
|
||||
@@ -1959,6 +2018,13 @@ gs_plugin_class_init (GsPluginClass *klass)
|
||||
G_STRUCT_OFFSET (GsPluginClass, allow_updates),
|
||||
NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN,
|
||||
G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
|
||||
+
|
||||
+ signals [SIGNAL_BASIC_AUTH_START] =
|
||||
+ g_signal_new ("basic-auth-start",
|
||||
+ G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
|
||||
+ G_STRUCT_OFFSET (GsPluginClass, basic_auth_start),
|
||||
+ NULL, NULL, g_cclosure_marshal_generic,
|
||||
+ G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER);
|
||||
}
|
||||
|
||||
static void
|
||||
diff --git a/lib/gs-plugin.h b/lib/gs-plugin.h
|
||||
index 7dd2d864..d07afd3b 100644
|
||||
--- a/lib/gs-plugin.h
|
||||
+++ b/lib/gs-plugin.h
|
||||
@@ -1,6 +1,7 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||
*
|
||||
* Copyright (C) 2012-2016 Richard Hughes <richard@hughsie.com>
|
||||
+ * Copyright (C) 2020 Kalev Lember <klember@redhat.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@@ -37,7 +38,12 @@ struct _GsPluginClass
|
||||
GsPluginEvent *event);
|
||||
void (*allow_updates) (GsPlugin *plugin,
|
||||
gboolean allow_updates);
|
||||
- gpointer padding[26];
|
||||
+ void (*basic_auth_start) (GsPlugin *plugin,
|
||||
+ const gchar *remote,
|
||||
+ const gchar *realm,
|
||||
+ GCallback callback,
|
||||
+ gpointer user_data);
|
||||
+ gpointer padding[25];
|
||||
};
|
||||
|
||||
typedef struct GsPluginData GsPluginData;
|
||||
@@ -116,5 +122,10 @@ void gs_plugin_report_event (GsPlugin *plugin,
|
||||
void gs_plugin_set_allow_updates (GsPlugin *plugin,
|
||||
gboolean allow_updates);
|
||||
gboolean gs_plugin_get_network_available (GsPlugin *plugin);
|
||||
+void gs_plugin_basic_auth_start (GsPlugin *plugin,
|
||||
+ const gchar *remote,
|
||||
+ const gchar *realm,
|
||||
+ GCallback callback,
|
||||
+ gpointer user_data);
|
||||
|
||||
G_END_DECLS
|
||||
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
|
||||
index 4d6a81ba..2518025d 100644
|
||||
--- a/plugins/flatpak/gs-plugin-flatpak.c
|
||||
+++ b/plugins/flatpak/gs-plugin-flatpak.c
|
||||
@@ -2,7 +2,7 @@
|
||||
*
|
||||
* Copyright (C) 2016 Joaquim Rocha <jrocha@endlessm.com>
|
||||
* Copyright (C) 2016-2018 Richard Hughes <richard@hughsie.com>
|
||||
- * Copyright (C) 2017-2018 Kalev Lember <klember@redhat.com>
|
||||
+ * Copyright (C) 2017-2020 Kalev Lember <klember@redhat.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@@ -456,6 +456,55 @@ _group_apps_by_installation (GsPlugin *plugin,
|
||||
return g_steal_pointer (&applist_by_flatpaks);
|
||||
}
|
||||
|
||||
+#if FLATPAK_CHECK_VERSION(1,6,0)
|
||||
+typedef struct {
|
||||
+ FlatpakTransaction *transaction;
|
||||
+ guint id;
|
||||
+} BasicAuthData;
|
||||
+
|
||||
+static void
|
||||
+basic_auth_data_free (BasicAuthData *data)
|
||||
+{
|
||||
+ g_object_unref (data->transaction);
|
||||
+ g_slice_free (BasicAuthData, data);
|
||||
+}
|
||||
+
|
||||
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(BasicAuthData, basic_auth_data_free)
|
||||
+
|
||||
+static void
|
||||
+_basic_auth_cb (const gchar *user, const gchar *password, gpointer user_data)
|
||||
+{
|
||||
+ g_autoptr(BasicAuthData) data = user_data;
|
||||
+
|
||||
+ g_debug ("Submitting basic auth data");
|
||||
+
|
||||
+ /* NULL user aborts the basic auth request */
|
||||
+ flatpak_transaction_complete_basic_auth (data->transaction, data->id, user, password, NULL /* options */);
|
||||
+}
|
||||
+
|
||||
+static gboolean
|
||||
+_basic_auth_start (FlatpakTransaction *transaction,
|
||||
+ const char *remote,
|
||||
+ const char *realm,
|
||||
+ GVariant *options,
|
||||
+ guint id,
|
||||
+ GsPlugin *plugin)
|
||||
+{
|
||||
+ BasicAuthData *data;
|
||||
+
|
||||
+ if (!gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE))
|
||||
+ return FALSE;
|
||||
+
|
||||
+ data = g_slice_new0 (BasicAuthData);
|
||||
+ data->transaction = g_object_ref (transaction);
|
||||
+ data->id = id;
|
||||
+
|
||||
+ g_debug ("Login required remote %s (realm %s)\n", remote, realm);
|
||||
+ gs_plugin_basic_auth_start (plugin, remote, realm, G_CALLBACK (_basic_auth_cb), data);
|
||||
+ return TRUE;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static FlatpakTransaction *
|
||||
_build_transaction (GsPlugin *plugin, GsFlatpak *flatpak,
|
||||
GCancellable *cancellable, GError **error)
|
||||
@@ -491,6 +540,10 @@ _build_transaction (GsPlugin *plugin, GsFlatpak *flatpak,
|
||||
/* connect up signals */
|
||||
g_signal_connect (transaction, "ref-to-app",
|
||||
G_CALLBACK (_ref_to_app), plugin);
|
||||
+#if FLATPAK_CHECK_VERSION(1,6,0)
|
||||
+ g_signal_connect (transaction, "basic-auth-start",
|
||||
+ G_CALLBACK (_basic_auth_start), plugin);
|
||||
+#endif
|
||||
|
||||
/* use system installations as dependency sources for user installations */
|
||||
flatpak_transaction_add_default_dependency_sources (transaction);
|
||||
diff --git a/po/POTFILES.in b/po/POTFILES.in
|
||||
index 20721c4a..a44a6ad3 100644
|
||||
--- a/po/POTFILES.in
|
||||
+++ b/po/POTFILES.in
|
||||
@@ -10,6 +10,8 @@ src/gs-app-row.c
|
||||
src/gs-app-row.ui
|
||||
src/gs-app-tile.c
|
||||
src/gs-app-tile.ui
|
||||
+src/gs-basic-auth-dialog.c
|
||||
+src/gs-basic-auth-dialog.ui
|
||||
lib/gs-category.c
|
||||
src/gs-category-page.c
|
||||
src/gs-category-page.ui
|
||||
diff --git a/src/gnome-software.gresource.xml b/src/gnome-software.gresource.xml
|
||||
index 3eaabca2..459ecf82 100644
|
||||
--- a/src/gnome-software.gresource.xml
|
||||
+++ b/src/gnome-software.gresource.xml
|
||||
@@ -4,6 +4,7 @@
|
||||
<file preprocess="xml-stripblanks">gnome-software.ui</file>
|
||||
<file preprocess="xml-stripblanks">gs-app-addon-row.ui</file>
|
||||
<file preprocess="xml-stripblanks">gs-app-row.ui</file>
|
||||
+ <file preprocess="xml-stripblanks">gs-basic-auth-dialog.ui</file>
|
||||
<file preprocess="xml-stripblanks">gs-category-page.ui</file>
|
||||
<file preprocess="xml-stripblanks">gs-category-tile.ui</file>
|
||||
<file preprocess="xml-stripblanks">gs-details-page.ui</file>
|
||||
diff --git a/src/gs-basic-auth-dialog.c b/src/gs-basic-auth-dialog.c
|
||||
new file mode 100644
|
||||
index 00000000..c690a327
|
||||
--- /dev/null
|
||||
+++ b/src/gs-basic-auth-dialog.c
|
||||
@@ -0,0 +1,130 @@
|
||||
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||
+ *
|
||||
+ * Copyright (C) 2020 Kalev Lember <klember@redhat.com>
|
||||
+ *
|
||||
+ * SPDX-License-Identifier: GPL-2.0+
|
||||
+ */
|
||||
+
|
||||
+#include "config.h"
|
||||
+
|
||||
+#include "gs-basic-auth-dialog.h"
|
||||
+
|
||||
+#include <glib.h>
|
||||
+#include <glib/gi18n.h>
|
||||
+#include <gtk/gtk.h>
|
||||
+
|
||||
+struct _GsBasicAuthDialog
|
||||
+{
|
||||
+ GtkDialog parent_instance;
|
||||
+
|
||||
+ GsBasicAuthCallback callback;
|
||||
+ gpointer callback_data;
|
||||
+
|
||||
+ /* template widgets */
|
||||
+ GtkButton *login_button;
|
||||
+ GtkLabel *description_label;
|
||||
+ GtkEntry *user_entry;
|
||||
+ GtkEntry *password_entry;
|
||||
+};
|
||||
+
|
||||
+G_DEFINE_TYPE (GsBasicAuthDialog, gs_basic_auth_dialog, GTK_TYPE_DIALOG)
|
||||
+
|
||||
+static void
|
||||
+cancel_button_clicked_cb (GsBasicAuthDialog *dialog)
|
||||
+{
|
||||
+ /* abort the basic auth request */
|
||||
+ dialog->callback (NULL, NULL, dialog->callback_data);
|
||||
+
|
||||
+ gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+login_button_clicked_cb (GsBasicAuthDialog *dialog)
|
||||
+{
|
||||
+ const gchar *user;
|
||||
+ const gchar *password;
|
||||
+
|
||||
+ user = gtk_entry_get_text (dialog->user_entry);
|
||||
+ password = gtk_entry_get_text (dialog->password_entry);
|
||||
+
|
||||
+ /* submit the user/password to basic auth */
|
||||
+ dialog->callback (user, password, dialog->callback_data);
|
||||
+
|
||||
+ gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+dialog_validate (GsBasicAuthDialog *dialog)
|
||||
+{
|
||||
+ const gchar *user;
|
||||
+ const gchar *password;
|
||||
+ gboolean valid_user;
|
||||
+ gboolean valid_password;
|
||||
+
|
||||
+ /* require user */
|
||||
+ user = gtk_entry_get_text (dialog->user_entry);
|
||||
+ valid_user = user != NULL && strlen (user) != 0;
|
||||
+
|
||||
+ /* require password */
|
||||
+ password = gtk_entry_get_text (dialog->password_entry);
|
||||
+ valid_password = password != NULL && strlen (password) != 0;
|
||||
+
|
||||
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->login_button), valid_user && valid_password);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+update_description (GsBasicAuthDialog *dialog, const gchar *remote, const gchar *realm)
|
||||
+{
|
||||
+ g_autofree gchar *description = NULL;
|
||||
+
|
||||
+ /* TRANSLATORS: This is a description for entering user/password */
|
||||
+ description = g_strdup_printf (_("Login required remote %s (realm %s)"),
|
||||
+ remote, realm);
|
||||
+ gtk_label_set_text (dialog->description_label, description);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+gs_basic_auth_dialog_init (GsBasicAuthDialog *dialog)
|
||||
+{
|
||||
+ gtk_widget_init_template (GTK_WIDGET (dialog));
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+gs_basic_auth_dialog_class_init (GsBasicAuthDialogClass *klass)
|
||||
+{
|
||||
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
+
|
||||
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-basic-auth-dialog.ui");
|
||||
+
|
||||
+ gtk_widget_class_bind_template_child (widget_class, GsBasicAuthDialog, login_button);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, GsBasicAuthDialog, description_label);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, GsBasicAuthDialog, user_entry);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, GsBasicAuthDialog, password_entry);
|
||||
+
|
||||
+ gtk_widget_class_bind_template_callback (widget_class, dialog_validate);
|
||||
+ gtk_widget_class_bind_template_callback (widget_class, cancel_button_clicked_cb);
|
||||
+ gtk_widget_class_bind_template_callback (widget_class, login_button_clicked_cb);
|
||||
+}
|
||||
+
|
||||
+GtkWidget *
|
||||
+gs_basic_auth_dialog_new (GtkWindow *parent,
|
||||
+ const gchar *remote,
|
||||
+ const gchar *realm,
|
||||
+ GsBasicAuthCallback callback,
|
||||
+ gpointer callback_data)
|
||||
+{
|
||||
+ GsBasicAuthDialog *dialog;
|
||||
+
|
||||
+ dialog = g_object_new (GS_TYPE_BASIC_AUTH_DIALOG,
|
||||
+ "use-header-bar", TRUE,
|
||||
+ "transient-for", parent,
|
||||
+ "modal", TRUE,
|
||||
+ NULL);
|
||||
+ dialog->callback = callback;
|
||||
+ dialog->callback_data = callback_data;
|
||||
+
|
||||
+ update_description (dialog, remote, realm);
|
||||
+ dialog_validate (dialog);
|
||||
+
|
||||
+ return GTK_WIDGET (dialog);
|
||||
+}
|
||||
diff --git a/src/gs-basic-auth-dialog.h b/src/gs-basic-auth-dialog.h
|
||||
new file mode 100644
|
||||
index 00000000..ec5f1d03
|
||||
--- /dev/null
|
||||
+++ b/src/gs-basic-auth-dialog.h
|
||||
@@ -0,0 +1,28 @@
|
||||
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||
+ *
|
||||
+ * Copyright (C) 2020 Kalev Lember <klember@redhat.com>
|
||||
+ *
|
||||
+ * SPDX-License-Identifier: GPL-2.0+
|
||||
+ */
|
||||
+
|
||||
+#pragma once
|
||||
+
|
||||
+#include <gtk/gtk.h>
|
||||
+
|
||||
+#include "gnome-software-private.h"
|
||||
+
|
||||
+G_BEGIN_DECLS
|
||||
+
|
||||
+typedef void (*GsBasicAuthCallback) (const gchar *user, const gchar *password, gpointer callback_data);
|
||||
+
|
||||
+#define GS_TYPE_BASIC_AUTH_DIALOG (gs_basic_auth_dialog_get_type ())
|
||||
+
|
||||
+G_DECLARE_FINAL_TYPE (GsBasicAuthDialog, gs_basic_auth_dialog, GS, BASIC_AUTH_DIALOG, GtkDialog)
|
||||
+
|
||||
+GtkWidget *gs_basic_auth_dialog_new (GtkWindow *parent,
|
||||
+ const gchar *remote,
|
||||
+ const gchar *realm,
|
||||
+ GsBasicAuthCallback callback,
|
||||
+ gpointer callback_data);
|
||||
+
|
||||
+G_END_DECLS
|
||||
diff --git a/src/gs-basic-auth-dialog.ui b/src/gs-basic-auth-dialog.ui
|
||||
new file mode 100644
|
||||
index 00000000..339e831d
|
||||
--- /dev/null
|
||||
+++ b/src/gs-basic-auth-dialog.ui
|
||||
@@ -0,0 +1,203 @@
|
||||
+<?xml version="1.0" encoding="UTF-8"?>
|
||||
+<interface>
|
||||
+ <template class="GsBasicAuthDialog" parent="GtkDialog">
|
||||
+ <property name="can_focus">False</property>
|
||||
+ <property name="border_width">5</property>
|
||||
+ <property name="resizable">False</property>
|
||||
+ <property name="modal">True</property>
|
||||
+ <property name="destroy_with_parent">True</property>
|
||||
+ <property name="type_hint">dialog</property>
|
||||
+ <property name="title" translatable="yes">Login Required</property>
|
||||
+ <property name="use_header_bar">1</property>
|
||||
+ <child internal-child="headerbar">
|
||||
+ <object class="GtkHeaderBar">
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">False</property>
|
||||
+ <property name="show_close_button">False</property>
|
||||
+ <child>
|
||||
+ <object class="GtkButton" id="cancel_button">
|
||||
+ <property name="label" translatable="yes">_Cancel</property>
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">True</property>
|
||||
+ <property name="can_default">True</property>
|
||||
+ <property name="receives_default">True</property>
|
||||
+ <property name="use_action_appearance">False</property>
|
||||
+ <property name="use_underline">True</property>
|
||||
+ <property name="valign">center</property>
|
||||
+ <signal name="clicked" handler="cancel_button_clicked_cb" object="GsBasicAuthDialog" swapped="yes"/>
|
||||
+ <style>
|
||||
+ <class name="text-button"/>
|
||||
+ </style>
|
||||
+ </object>
|
||||
+ <packing>
|
||||
+ <property name="pack_type">start</property>
|
||||
+ </packing>
|
||||
+ </child>
|
||||
+ <child>
|
||||
+ <object class="GtkButton" id="login_button">
|
||||
+ <property name="label" translatable="yes">_Login</property>
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">True</property>
|
||||
+ <property name="can_default">True</property>
|
||||
+ <property name="has_default">True</property>
|
||||
+ <property name="receives_default">True</property>
|
||||
+ <property name="use_action_appearance">False</property>
|
||||
+ <property name="use_underline">True</property>
|
||||
+ <property name="valign">center</property>
|
||||
+ <signal name="clicked" handler="login_button_clicked_cb" object="GsBasicAuthDialog" swapped="yes"/>
|
||||
+ <style>
|
||||
+ <class name="text-button"/>
|
||||
+ <class name="suggested-action"/>
|
||||
+ </style>
|
||||
+ </object>
|
||||
+ <packing>
|
||||
+ <property name="pack_type">end</property>
|
||||
+ </packing>
|
||||
+ </child>
|
||||
+ </object>
|
||||
+ </child>
|
||||
+ <child internal-child="vbox">
|
||||
+ <object class="GtkBox">
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">False</property>
|
||||
+ <property name="orientation">vertical</property>
|
||||
+ <child>
|
||||
+ <object class="GtkGrid">
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">False</property>
|
||||
+ <property name="hexpand">True</property>
|
||||
+ <property name="row_spacing">8</property>
|
||||
+ <property name="column_spacing">6</property>
|
||||
+ <property name="border_width">20</property>
|
||||
+ <property name="margin_end">20</property>
|
||||
+ <child>
|
||||
+ <object class="GtkLabel" id="description_label">
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">False</property>
|
||||
+ <property name="wrap">True</property>
|
||||
+ <property name="wrap_mode">word-char</property>
|
||||
+ <property name="margin_bottom">20</property>
|
||||
+ <property name="max_width_chars">55</property>
|
||||
+ <property name="xalign">0</property>
|
||||
+ <style>
|
||||
+ <class name="dim-label"/>
|
||||
+ </style>
|
||||
+ </object>
|
||||
+ <packing>
|
||||
+ <property name="left_attach">0</property>
|
||||
+ <property name="top_attach">0</property>
|
||||
+ <property name="width">2</property>
|
||||
+ <property name="height">1</property>
|
||||
+ </packing>
|
||||
+ </child>
|
||||
+ <child>
|
||||
+ <object class="GtkLabel" id="user_label">
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">False</property>
|
||||
+ <property name="xalign">1</property>
|
||||
+ <property name="label" translatable="yes">_User</property>
|
||||
+ <property name="use_underline">True</property>
|
||||
+ <property name="mnemonic_widget">user_entry</property>
|
||||
+ <property name="margin_start">20</property>
|
||||
+ <style>
|
||||
+ <class name="dim-label"/>
|
||||
+ </style>
|
||||
+ </object>
|
||||
+ <packing>
|
||||
+ <property name="left_attach">0</property>
|
||||
+ <property name="top_attach">3</property>
|
||||
+ <property name="width">1</property>
|
||||
+ <property name="height">1</property>
|
||||
+ </packing>
|
||||
+ </child>
|
||||
+ <child>
|
||||
+ <object class="GtkLabel" id="password_label">
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">False</property>
|
||||
+ <property name="xalign">1</property>
|
||||
+ <property name="label" translatable="yes">_Password</property>
|
||||
+ <property name="use_underline">True</property>
|
||||
+ <property name="mnemonic_widget">password_entry</property>
|
||||
+ <property name="margin_start">20</property>
|
||||
+ <style>
|
||||
+ <class name="dim-label"/>
|
||||
+ </style>
|
||||
+ </object>
|
||||
+ <packing>
|
||||
+ <property name="left_attach">0</property>
|
||||
+ <property name="top_attach">4</property>
|
||||
+ <property name="width">1</property>
|
||||
+ <property name="height">1</property>
|
||||
+ </packing>
|
||||
+ </child>
|
||||
+ <child>
|
||||
+ <object class="GtkEntry" id="user_entry">
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">True</property>
|
||||
+ <property name="has_focus">True</property>
|
||||
+ <property name="hexpand">True</property>
|
||||
+ <property name="invisible_char">●</property>
|
||||
+ <property name="activates_default">True</property>
|
||||
+ <property name="invisible_char_set">True</property>
|
||||
+ <property name="input_purpose">password</property>
|
||||
+ <signal name="changed" handler="dialog_validate" object="GsBasicAuthDialog" swapped="yes"/>
|
||||
+ <signal name="activate" handler="dialog_validate" object="GsBasicAuthDialog" swapped="yes"/>
|
||||
+ </object>
|
||||
+ <packing>
|
||||
+ <property name="left_attach">1</property>
|
||||
+ <property name="top_attach">3</property>
|
||||
+ <property name="width">1</property>
|
||||
+ <property name="height">1</property>
|
||||
+ </packing>
|
||||
+ </child>
|
||||
+ <child>
|
||||
+ <object class="GtkEntry" id="password_entry">
|
||||
+ <property name="visible">True</property>
|
||||
+ <property name="can_focus">True</property>
|
||||
+ <property name="hexpand">True</property>
|
||||
+ <property name="visibility">False</property>
|
||||
+ <property name="invisible_char">●</property>
|
||||
+ <property name="activates_default">True</property>
|
||||
+ <property name="invisible_char_set">True</property>
|
||||
+ <property name="input_purpose">password</property>
|
||||
+ <signal name="changed" handler="dialog_validate" object="GsBasicAuthDialog" swapped="yes"/>
|
||||
+ <signal name="activate" handler="dialog_validate" object="GsBasicAuthDialog" swapped="yes"/>
|
||||
+ </object>
|
||||
+ <packing>
|
||||
+ <property name="left_attach">1</property>
|
||||
+ <property name="top_attach">4</property>
|
||||
+ <property name="width">1</property>
|
||||
+ <property name="height">1</property>
|
||||
+ </packing>
|
||||
+ </child>
|
||||
+ </object>
|
||||
+ <packing>
|
||||
+ <property name="expand">False</property>
|
||||
+ <property name="fill">True</property>
|
||||
+ <property name="position">0</property>
|
||||
+ </packing>
|
||||
+ </child>
|
||||
+ </object>
|
||||
+ </child>
|
||||
+ </template>
|
||||
+ <object class="GtkSizeGroup">
|
||||
+ <widgets>
|
||||
+ <widget name="user_label"/>
|
||||
+ <widget name="password_label"/>
|
||||
+ </widgets>
|
||||
+ </object>
|
||||
+ <object class="GtkSizeGroup">
|
||||
+ <widgets>
|
||||
+ <widget name="user_entry"/>
|
||||
+ <widget name="password_entry"/>
|
||||
+ </widgets>
|
||||
+ </object>
|
||||
+ <object class="GtkSizeGroup">
|
||||
+ <property name="mode">horizontal</property>
|
||||
+ <widgets>
|
||||
+ <widget name="login_button"/>
|
||||
+ <widget name="cancel_button"/>
|
||||
+ </widgets>
|
||||
+ </object>
|
||||
+</interface>
|
||||
diff --git a/src/gs-shell.c b/src/gs-shell.c
|
||||
index 009776ad..41503cf8 100644
|
||||
--- a/src/gs-shell.c
|
||||
+++ b/src/gs-shell.c
|
||||
@@ -2,7 +2,7 @@
|
||||
*
|
||||
* Copyright (C) 2013-2017 Richard Hughes <richard@hughsie.com>
|
||||
* Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
|
||||
- * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
|
||||
+ * Copyright (C) 2014-2020 Kalev Lember <klember@redhat.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "gs-common.h"
|
||||
#include "gs-shell.h"
|
||||
+#include "gs-basic-auth-dialog.h"
|
||||
#include "gs-details-page.h"
|
||||
#include "gs-installed-page.h"
|
||||
#include "gs-metered-data-dialog.h"
|
||||
@@ -362,6 +363,25 @@ scheduler_ready_cb (GObject *source_object,
|
||||
}
|
||||
#endif /* HAVE_MOGWAI */
|
||||
|
||||
+static void
|
||||
+gs_shell_basic_auth_start_cb (GsPluginLoader *plugin_loader,
|
||||
+ const gchar *remote,
|
||||
+ const gchar *realm,
|
||||
+ GsBasicAuthCallback callback,
|
||||
+ gpointer callback_data,
|
||||
+ GsShell *shell)
|
||||
+{
|
||||
+ GsShellPrivate *priv = gs_shell_get_instance_private (shell);
|
||||
+ GtkWidget *dialog;
|
||||
+
|
||||
+ dialog = gs_basic_auth_dialog_new (priv->main_window, remote, realm, callback, callback_data);
|
||||
+ gs_shell_modal_dialog_present (shell, GTK_DIALOG (dialog));
|
||||
+
|
||||
+ /* just destroy */
|
||||
+ g_signal_connect_swapped (dialog, "response",
|
||||
+ G_CALLBACK (gtk_widget_destroy), dialog);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
free_back_entry (BackEntry *entry)
|
||||
{
|
||||
@@ -2126,6 +2146,9 @@ gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *can
|
||||
g_signal_connect_object (priv->plugin_loader, "notify::network-metered",
|
||||
G_CALLBACK (gs_shell_network_metered_notify_cb),
|
||||
shell, 0);
|
||||
+ g_signal_connect_object (priv->plugin_loader, "basic-auth-start",
|
||||
+ G_CALLBACK (gs_shell_basic_auth_start_cb),
|
||||
+ shell, 0);
|
||||
priv->cancellable = g_object_ref (cancellable);
|
||||
|
||||
priv->settings = g_settings_new ("org.gnome.software");
|
||||
diff --git a/src/meson.build b/src/meson.build
|
||||
index cbd0a511..6581e77c 100644
|
||||
--- a/src/meson.build
|
||||
+++ b/src/meson.build
|
||||
@@ -20,6 +20,7 @@ gnome_software_sources = [
|
||||
'gs-application.c',
|
||||
'gs-app-row.c',
|
||||
'gs-app-tile.c',
|
||||
+ 'gs-basic-auth-dialog.c',
|
||||
'gs-category-page.c',
|
||||
'gs-category-tile.c',
|
||||
'gs-common.c',
|
||||
--
|
||||
2.26.2
|
||||
|
@ -0,0 +1,61 @@
|
||||
From 9dce785c2a71e81c410c6e314dd4d4db6cc02808 Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Wed, 3 Jun 2020 16:35:03 +0200
|
||||
Subject: [PATCH] Fix hardcoded desktop and appdata names to match what's in
|
||||
RHEL 8.3
|
||||
|
||||
---
|
||||
data/assets/org.gnome.Software.Featured.xml | 2 +-
|
||||
plugins/core/gs-plugin-hardcoded-popular.c | 2 +-
|
||||
src/gs-folders.c | 6 +++---
|
||||
3 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/data/assets/org.gnome.Software.Featured.xml b/data/assets/org.gnome.Software.Featured.xml
|
||||
index d1d920be..822fc6a9 100644
|
||||
--- a/data/assets/org.gnome.Software.Featured.xml
|
||||
+++ b/data/assets/org.gnome.Software.Featured.xml
|
||||
@@ -145,7 +145,7 @@ text-shadow: none;</value>
|
||||
</custom>
|
||||
</component>
|
||||
<component merge="append">
|
||||
- <id>org.gimp.GIMP</id>
|
||||
+ <id>gimp.desktop</id>
|
||||
<custom>
|
||||
<value key="GnomeSoftware::FeatureTile-css">border-color: #4a8c30;
|
||||
text-shadow: none;
|
||||
diff --git a/plugins/core/gs-plugin-hardcoded-popular.c b/plugins/core/gs-plugin-hardcoded-popular.c
|
||||
index 3998a813..03b44475 100644
|
||||
--- a/plugins/core/gs-plugin-hardcoded-popular.c
|
||||
+++ b/plugins/core/gs-plugin-hardcoded-popular.c
|
||||
@@ -29,7 +29,7 @@ gs_plugin_add_popular (GsPlugin *plugin,
|
||||
"org.gnome.clocks.desktop",
|
||||
"org.gnome.Dictionary.desktop",
|
||||
"org.gnome.Documents.desktop",
|
||||
- "org.gnome.Evince",
|
||||
+ "evince.desktop",
|
||||
"org.gnome.gedit.desktop",
|
||||
"org.gnome.Maps.desktop",
|
||||
"org.gnome.Weather",
|
||||
diff --git a/src/gs-folders.c b/src/gs-folders.c
|
||||
index fa068f0e..589cc1e2 100644
|
||||
--- a/src/gs-folders.c
|
||||
+++ b/src/gs-folders.c
|
||||
@@ -560,12 +560,12 @@ gs_folders_convert (void)
|
||||
"org.gnome.DejaDup.desktop",
|
||||
"org.gnome.Dictionary.desktop",
|
||||
"org.gnome.DiskUtility.desktop",
|
||||
- "org.gnome.eog.desktop",
|
||||
- "org.gnome.Evince.desktop",
|
||||
+ "eog.desktop",
|
||||
+ "evince.desktop",
|
||||
"org.gnome.FileRoller.desktop",
|
||||
"org.gnome.fonts.desktop",
|
||||
"org.gnome.Screenshot.desktop",
|
||||
- "org.gnome.seahorse.Application.desktop",
|
||||
+ "seahorse.desktop",
|
||||
"org.gnome.Terminal.desktop",
|
||||
"org.gnome.tweaks.desktop",
|
||||
"org.gnome.Usage.desktop",
|
||||
--
|
||||
2.18.2
|
||||
|
@ -0,0 +1,69 @@
|
||||
From bc31889bf90e14776e4404cd58e9b0244efc4f2e Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Tue, 9 Jun 2020 21:42:41 +0200
|
||||
Subject: [PATCH] Improve the heuristic for detecting old-style AppStream
|
||||
override files
|
||||
|
||||
The heuristic was trying to detect old-style AppStream override files
|
||||
that have the following structure:
|
||||
|
||||
<component type=desktop>
|
||||
<id>org.kde.amarok.desktop</id>
|
||||
<categories>
|
||||
<category>AudioVideo</category>
|
||||
<category>Featured</category>
|
||||
</categories>
|
||||
</component>
|
||||
|
||||
When it found one, it gave it the wildcard quirk to avoid leaking the
|
||||
result to the installed apps list.
|
||||
|
||||
This however incorrectly tripped on old appdata files that didn't
|
||||
specify name and relied on filling the missing name/summary/icon from
|
||||
the desktop file.
|
||||
|
||||
Fix this by tightening the heuristic and also look for
|
||||
<metadata_license> that none of the override files should have.
|
||||
|
||||
This fixes RHEL firefox package to correctly show up when clicking on
|
||||
'Show Details' in GNOME Shell.
|
||||
---
|
||||
plugins/core/gs-appstream.c | 14 ++++++++------
|
||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/plugins/core/gs-appstream.c b/plugins/core/gs-appstream.c
|
||||
index a387f2e0..da9ba970 100644
|
||||
--- a/plugins/core/gs-appstream.c
|
||||
+++ b/plugins/core/gs-appstream.c
|
||||
@@ -746,6 +746,13 @@ gs_appstream_refine_app (GsPlugin *plugin,
|
||||
gs_app_remove_quirk (app, GS_APP_QUIRK_HIDE_EVERYWHERE);
|
||||
}
|
||||
|
||||
+ /* try to detect old-style AppStream 'override'
|
||||
+ * files without the merge attribute */
|
||||
+ if (xb_node_query_text (component, "name", NULL) == NULL &&
|
||||
+ xb_node_query_text (component, "metadata_license", NULL) == NULL) {
|
||||
+ gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD);
|
||||
+ }
|
||||
+
|
||||
/* set id */
|
||||
tmp = xb_node_query_text (component, "id", NULL);
|
||||
if (tmp != NULL && gs_app_get_id (app) == NULL)
|
||||
@@ -770,13 +777,8 @@ gs_appstream_refine_app (GsPlugin *plugin,
|
||||
|
||||
/* set name */
|
||||
tmp = xb_node_query_text (component, "name", NULL);
|
||||
- if (tmp != NULL) {
|
||||
+ if (tmp != NULL)
|
||||
gs_app_set_name (app, GS_APP_QUALITY_HIGHEST, tmp);
|
||||
- } else {
|
||||
- /* this is a heuristic, but works even with old-style AppStream
|
||||
- * files without the merge attribute */
|
||||
- gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD);
|
||||
- }
|
||||
|
||||
/* set summary */
|
||||
tmp = xb_node_query_text (component, "summary", NULL);
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,48 +0,0 @@
|
||||
From 3a644c151f27f439c36170f0958fd21cf1cc54d0 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Thu, 3 Jun 2021 08:33:53 +0200
|
||||
Subject: [PATCH] gs-feature-tile: Do not abort when the theme is broken
|
||||
|
||||
Just print a warning when the theme doesn't provide 'theme_fg_color' and
|
||||
fallback to black color.
|
||||
|
||||
Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1228
|
||||
---
|
||||
src/gs-feature-tile.c | 14 +++++++++++---
|
||||
1 file changed, 11 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/gs-feature-tile.c b/src/gs-feature-tile.c
|
||||
index 1c85083eb..158af1e56 100644
|
||||
--- a/src/gs-feature-tile.c
|
||||
+++ b/src/gs-feature-tile.c
|
||||
@@ -268,7 +268,6 @@ gs_feature_tile_refresh (GsAppTile *self)
|
||||
if (key_colors != tile->key_colors_cache) {
|
||||
g_autoptr(GArray) colors = NULL;
|
||||
GdkRGBA fg_rgba;
|
||||
- gboolean fg_rgba_valid;
|
||||
GsHSBC fg_hsbc;
|
||||
|
||||
/* Look up the foreground colour for the feature tile,
|
||||
@@ -283,8 +282,17 @@ gs_feature_tile_refresh (GsAppTile *self)
|
||||
* @min_abs_contrast contrast with the foreground, so
|
||||
* that the text is legible.
|
||||
*/
|
||||
- fg_rgba_valid = gtk_style_context_lookup_color (context, "theme_fg_color", &fg_rgba);
|
||||
- g_assert (fg_rgba_valid);
|
||||
+ if (!gtk_style_context_lookup_color (context, "theme_fg_color", &fg_rgba)) {
|
||||
+ static gboolean i_know = FALSE;
|
||||
+ if (!i_know) {
|
||||
+ i_know = TRUE;
|
||||
+ g_warning ("The theme doesn't provide 'theme_fg_color', fallbacking to black");
|
||||
+ }
|
||||
+ fg_rgba.red = 0.0;
|
||||
+ fg_rgba.green = 0.0;
|
||||
+ fg_rgba.blue = 0.0;
|
||||
+ fg_rgba.alpha = 1.0;
|
||||
+ }
|
||||
|
||||
gtk_rgb_to_hsv (fg_rgba.red, fg_rgba.green, fg_rgba.blue,
|
||||
&fg_hsbc.hue, &fg_hsbc.saturation, &fg_hsbc.brightness);
|
||||
--
|
||||
GitLab
|
||||
|
@ -0,0 +1,104 @@
|
||||
From de3afc6463aeb0e2d637a0360d1b96acffdf4e6d Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Tue, 19 May 2020 14:28:10 +0200
|
||||
Subject: [PATCH 2/2] Add webflow auth support to flatpak plugin
|
||||
|
||||
This is just the minimal support, launching the auth page in the default
|
||||
web browser when libflatpak signals that we need to do the webflow auth.
|
||||
|
||||
Possible improvements could include doing either a webkitgtk dialog, or
|
||||
maybe asking for confirmation before launching the web browser.
|
||||
---
|
||||
plugins/flatpak/gs-plugin-flatpak.c | 69 +++++++++++++++++++++++++++++
|
||||
1 file changed, 69 insertions(+)
|
||||
|
||||
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
|
||||
index 2518025d..a453cec8 100644
|
||||
--- a/plugins/flatpak/gs-plugin-flatpak.c
|
||||
+++ b/plugins/flatpak/gs-plugin-flatpak.c
|
||||
@@ -503,6 +503,71 @@ _basic_auth_start (FlatpakTransaction *transaction,
|
||||
gs_plugin_basic_auth_start (plugin, remote, realm, G_CALLBACK (_basic_auth_cb), data);
|
||||
return TRUE;
|
||||
}
|
||||
+
|
||||
+static gboolean
|
||||
+_webflow_start (FlatpakTransaction *transaction,
|
||||
+ const char *remote,
|
||||
+ const char *url,
|
||||
+ GVariant *options,
|
||||
+ guint id,
|
||||
+ GsPlugin *plugin)
|
||||
+{
|
||||
+ const char *browser;
|
||||
+ g_autoptr(GError) error_local = NULL;
|
||||
+
|
||||
+ if (!gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE))
|
||||
+ return FALSE;
|
||||
+
|
||||
+ g_debug ("Authentication required for remote '%s'", remote);
|
||||
+
|
||||
+ /* Allow hard overrides with $BROWSER */
|
||||
+ browser = g_getenv ("BROWSER");
|
||||
+ if (browser != NULL) {
|
||||
+ const char *args[3] = { NULL, url, NULL };
|
||||
+ args[0] = browser;
|
||||
+ if (!g_spawn_async (NULL, (char **)args, NULL, G_SPAWN_SEARCH_PATH,
|
||||
+ NULL, NULL, NULL, &error_local)) {
|
||||
+ g_autoptr(GsPluginEvent) event = NULL;
|
||||
+
|
||||
+ g_warning ("Failed to start browser %s: %s", browser, error_local->message);
|
||||
+
|
||||
+ event = gs_plugin_event_new ();
|
||||
+ gs_flatpak_error_convert (&error_local);
|
||||
+ gs_plugin_event_set_error (event, error_local);
|
||||
+ gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING);
|
||||
+ gs_plugin_report_event (plugin, event);
|
||||
+
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (!g_app_info_launch_default_for_uri (url, NULL, &error_local)) {
|
||||
+ g_autoptr(GsPluginEvent) event = NULL;
|
||||
+
|
||||
+ g_warning ("Failed to show url: %s", error_local->message);
|
||||
+
|
||||
+ event = gs_plugin_event_new ();
|
||||
+ gs_flatpak_error_convert (&error_local);
|
||||
+ gs_plugin_event_set_error (event, error_local);
|
||||
+ gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING);
|
||||
+ gs_plugin_report_event (plugin, event);
|
||||
+
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ g_debug ("Waiting for browser...");
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+_webflow_done (FlatpakTransaction *transaction,
|
||||
+ GVariant *options,
|
||||
+ guint id,
|
||||
+ GsPlugin *plugin)
|
||||
+{
|
||||
+ g_debug ("Browser done");
|
||||
+}
|
||||
#endif
|
||||
|
||||
static FlatpakTransaction *
|
||||
@@ -543,6 +608,10 @@ _build_transaction (GsPlugin *plugin, GsFlatpak *flatpak,
|
||||
#if FLATPAK_CHECK_VERSION(1,6,0)
|
||||
g_signal_connect (transaction, "basic-auth-start",
|
||||
G_CALLBACK (_basic_auth_start), plugin);
|
||||
+ g_signal_connect (transaction, "webflow-start",
|
||||
+ G_CALLBACK (_webflow_start), plugin);
|
||||
+ g_signal_connect (transaction, "webflow-done",
|
||||
+ G_CALLBACK (_webflow_done), plugin);
|
||||
#endif
|
||||
|
||||
/* use system installations as dependency sources for user installations */
|
||||
--
|
||||
2.26.2
|
||||
|
@ -0,0 +1,61 @@
|
||||
diff -up gnome-software-3.36.1/lib/gs-plugin-loader.c.12 gnome-software-3.36.1/lib/gs-plugin-loader.c
|
||||
--- gnome-software-3.36.1/lib/gs-plugin-loader.c.12 2022-09-22 12:17:59.367881179 +0200
|
||||
+++ gnome-software-3.36.1/lib/gs-plugin-loader.c 2022-09-22 12:17:59.392881205 +0200
|
||||
@@ -333,10 +333,17 @@ gs_plugin_job_to_failed_event (GsPluginJ
|
||||
|
||||
/* invalid */
|
||||
if (error->domain != GS_PLUGIN_ERROR) {
|
||||
- g_warning ("not GsPlugin error %s:%i: %s",
|
||||
- g_quark_to_string (error->domain),
|
||||
- error->code,
|
||||
- error->message);
|
||||
+ if (g_strcmp0 (BUILD_TYPE, "debug") == 0) {
|
||||
+ g_warning ("not GsPlugin error %s:%i: %s",
|
||||
+ g_quark_to_string (error->domain),
|
||||
+ error->code,
|
||||
+ error->message);
|
||||
+ } else {
|
||||
+ g_debug ("not GsPlugin error %s:%i: %s",
|
||||
+ g_quark_to_string (error->domain),
|
||||
+ error->code,
|
||||
+ error->message);
|
||||
+ }
|
||||
g_set_error_literal (&error_copy,
|
||||
GS_PLUGIN_ERROR,
|
||||
GS_PLUGIN_ERROR_FAILED,
|
||||
diff -up gnome-software-3.36.1/meson.build.12 gnome-software-3.36.1/meson.build
|
||||
--- gnome-software-3.36.1/meson.build.12 2022-09-22 12:18:09.900892043 +0200
|
||||
+++ gnome-software-3.36.1/meson.build 2022-09-22 12:18:19.311901744 +0200
|
||||
@@ -9,6 +9,7 @@ conf = configuration_data()
|
||||
conf.set_quoted('VERSION', meson.project_version())
|
||||
conf.set_quoted('PACKAGE_NAME', meson.project_name())
|
||||
conf.set_quoted('PACKAGE_VERSION', meson.project_version())
|
||||
+conf.set_quoted('BUILD_TYPE', get_option('buildtype'))
|
||||
|
||||
# this refers to the gnome-software plugin API version
|
||||
# this is not in any way related to a package or soname version
|
||||
diff -up gnome-software-3.36.1/src/gs-shell.c.12 gnome-software-3.36.1/src/gs-shell.c
|
||||
--- gnome-software-3.36.1/src/gs-shell.c.12 2022-09-22 12:17:59.301881111 +0200
|
||||
+++ gnome-software-3.36.1/src/gs-shell.c 2022-09-22 12:17:59.392881205 +0200
|
||||
@@ -2044,10 +2044,17 @@ gs_shell_rescan_events (GsShell *shell)
|
||||
!g_error_matches (error,
|
||||
G_IO_ERROR,
|
||||
G_IO_ERROR_CANCELLED)) {
|
||||
- g_warning ("not handling error %s for action %s: %s",
|
||||
- gs_plugin_error_to_string (error->code),
|
||||
- gs_plugin_action_to_string (action),
|
||||
- error->message);
|
||||
+ if (g_strcmp0 (BUILD_TYPE, "debug") == 0) {
|
||||
+ g_warning ("not handling error %s for action %s: %s",
|
||||
+ gs_plugin_error_to_string (error->code),
|
||||
+ gs_plugin_action_to_string (action),
|
||||
+ error->message);
|
||||
+ } else {
|
||||
+ g_debug ("not handling error %s for action %s: %s",
|
||||
+ gs_plugin_error_to_string (error->code),
|
||||
+ gs_plugin_action_to_string (action),
|
||||
+ error->message);
|
||||
+ }
|
||||
}
|
||||
gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INVALID);
|
||||
return;
|
@ -0,0 +1,197 @@
|
||||
diff -up gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit.c.13 gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit.c
|
||||
--- gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit.c.13 2023-04-25 17:12:24.676551145 +0200
|
||||
+++ gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit.c 2023-04-25 17:13:54.026626204 +0200
|
||||
@@ -38,6 +38,7 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
priv->task = pk_task_new ();
|
||||
pk_client_set_background (PK_CLIENT (priv->task), FALSE);
|
||||
pk_client_set_cache_age (PK_CLIENT (priv->task), G_MAXUINT);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -71,6 +72,7 @@ gs_plugin_add_sources_related (GsPlugin
|
||||
PK_FILTER_ENUM_NOT_COLLECTIONS,
|
||||
-1);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_get_packages (PK_CLIENT(priv->task),
|
||||
filter,
|
||||
cancellable,
|
||||
@@ -134,6 +136,7 @@ gs_plugin_add_sources (GsPlugin *plugin,
|
||||
PK_FILTER_ENUM_NOT_SUPPORTED,
|
||||
-1);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_get_repo_list (PK_CLIENT(priv->task),
|
||||
filter,
|
||||
cancellable,
|
||||
@@ -195,6 +198,7 @@ gs_plugin_app_origin_repo_enable (GsPlug
|
||||
/* do sync call */
|
||||
gs_plugin_status_update (plugin, app, GS_PLUGIN_STATUS_WAITING);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_repo_enable (PK_CLIENT (priv->task),
|
||||
repo_id,
|
||||
TRUE,
|
||||
@@ -229,6 +233,7 @@ gs_plugin_repo_enable (GsPlugin *plugin,
|
||||
gs_app_set_state (app, AS_APP_STATE_INSTALLING);
|
||||
gs_packagekit_helper_add_app (helper, app);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_repo_enable (PK_CLIENT (priv->task),
|
||||
gs_app_get_id (app),
|
||||
TRUE,
|
||||
@@ -462,6 +467,7 @@ gs_plugin_repo_disable (GsPlugin *plugin
|
||||
gs_app_set_state (app, AS_APP_STATE_REMOVING);
|
||||
gs_packagekit_helper_add_app (helper, app);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_repo_enable (PK_CLIENT (priv->task),
|
||||
gs_app_get_id (app),
|
||||
FALSE,
|
||||
@@ -594,6 +600,7 @@ gs_plugin_add_updates (GsPlugin *plugin,
|
||||
/* do sync call */
|
||||
gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_get_updates (PK_CLIENT (priv->task),
|
||||
pk_bitfield_value (PK_FILTER_ENUM_NONE),
|
||||
cancellable,
|
||||
@@ -632,6 +639,7 @@ gs_plugin_add_search_files (GsPlugin *pl
|
||||
PK_FILTER_ENUM_ARCH,
|
||||
-1);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_search_files (PK_CLIENT (priv->task),
|
||||
filter,
|
||||
search,
|
||||
@@ -664,6 +672,7 @@ gs_plugin_add_search_what_provides (GsPl
|
||||
PK_FILTER_ENUM_ARCH,
|
||||
-1);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_what_provides (PK_CLIENT (priv->task),
|
||||
filter,
|
||||
search,
|
||||
diff -up gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-local.c.13 gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-local.c
|
||||
--- gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-local.c.13 2020-05-22 16:51:19.876380400 +0200
|
||||
+++ gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-local.c 2023-04-25 17:12:24.756551212 +0200
|
||||
@@ -29,6 +29,7 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
g_mutex_init (&priv->task_mutex);
|
||||
priv->task = pk_task_new ();
|
||||
pk_client_set_background (PK_CLIENT (priv->task), FALSE);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -189,6 +190,7 @@ gs_plugin_file_to_app (GsPlugin *plugin,
|
||||
files = g_strsplit (filename, "\t", -1);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
pk_client_set_cache_age (PK_CLIENT (priv->task), G_MAXUINT);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_get_details_local (PK_CLIENT (priv->task),
|
||||
files,
|
||||
cancellable,
|
||||
diff -up gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refine.c.13 gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refine.c
|
||||
--- gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refine.c.13 2020-05-22 16:51:19.877380400 +0200
|
||||
+++ gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refine.c 2023-04-25 17:12:24.756551212 +0200
|
||||
@@ -56,6 +56,7 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
G_CALLBACK (gs_plugin_packagekit_repo_list_changed_cb), plugin);
|
||||
pk_client_set_background (priv->client, FALSE);
|
||||
pk_client_set_cache_age (priv->client, G_MAXUINT);
|
||||
+ pk_client_set_interactive (priv->client, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
|
||||
/* need pkgname and ID */
|
||||
gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "appstream");
|
||||
@@ -587,6 +588,7 @@ gs_plugin_packagekit_refine_distro_upgra
|
||||
g_mutex_lock (&priv->client_mutex);
|
||||
cache_age_save = pk_client_get_cache_age (priv->client);
|
||||
pk_client_set_cache_age (priv->client, 60 * 60 * 24 * 7); /* once per week */
|
||||
+ pk_client_set_interactive (priv->client, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_upgrade_system (priv->client,
|
||||
pk_bitfield_from_enums (PK_TRANSACTION_FLAG_ENUM_SIMULATE, -1),
|
||||
gs_app_get_version (app),
|
||||
diff -up gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refine-repos.c.13 gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refine-repos.c
|
||||
--- gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refine-repos.c.13 2020-05-22 16:51:19.877380400 +0200
|
||||
+++ gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refine-repos.c 2023-04-25 17:12:24.756551212 +0200
|
||||
@@ -36,6 +36,7 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
priv->client = pk_client_new ();
|
||||
pk_client_set_background (priv->client, FALSE);
|
||||
pk_client_set_cache_age (priv->client, G_MAXUINT);
|
||||
+ pk_client_set_interactive (priv->client, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
|
||||
/* need repos::repo-filename */
|
||||
gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "repos");
|
||||
@@ -65,6 +66,7 @@ gs_plugin_packagekit_refine_repo_from_fi
|
||||
to_array[0] = filename;
|
||||
gs_packagekit_helper_add_app (helper, app);
|
||||
g_mutex_lock (&priv->client_mutex);
|
||||
+ pk_client_set_interactive (priv->client, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_search_files (priv->client,
|
||||
pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED, -1),
|
||||
(gchar **) to_array,
|
||||
diff -up gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refresh.c.13 gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refresh.c
|
||||
--- gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refresh.c.13 2020-05-22 16:51:19.877380400 +0200
|
||||
+++ gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-refresh.c 2023-04-25 17:12:24.756551212 +0200
|
||||
@@ -35,6 +35,7 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
priv->task = pk_task_new ();
|
||||
pk_task_set_only_download (priv->task, TRUE);
|
||||
pk_client_set_background (PK_CLIENT (priv->task), TRUE);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
|
||||
/* we can return better results than dpkg directly */
|
||||
gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_CONFLICTS, "dpkg");
|
||||
@@ -67,6 +68,7 @@ _download_only (GsPlugin *plugin, GsAppL
|
||||
* we end up downloading a different set of packages than what was
|
||||
* shown to the user */
|
||||
pk_client_set_cache_age (PK_CLIENT (priv->task), G_MAXUINT);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_get_updates (PK_CLIENT (priv->task),
|
||||
pk_bitfield_value (PK_FILTER_ENUM_NONE),
|
||||
cancellable,
|
||||
@@ -165,6 +167,7 @@ gs_plugin_refresh (GsPlugin *plugin,
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
/* cache age of 1 is user-initiated */
|
||||
pk_client_set_background (PK_CLIENT (priv->task), cache_age > 1);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
pk_client_set_cache_age (PK_CLIENT (priv->task), cache_age);
|
||||
/* refresh the metadata */
|
||||
results = pk_client_refresh_cache (PK_CLIENT (priv->task),
|
||||
diff -up gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-upgrade.c.13 gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-upgrade.c
|
||||
--- gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-upgrade.c.13 2020-05-22 16:51:19.877380400 +0200
|
||||
+++ gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-upgrade.c 2023-04-25 17:14:16.586645156 +0200
|
||||
@@ -30,6 +30,7 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
pk_task_set_only_download (priv->task, TRUE);
|
||||
pk_client_set_background (PK_CLIENT (priv->task), TRUE);
|
||||
pk_client_set_cache_age (PK_CLIENT (priv->task), 60 * 60 * 24);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -69,6 +70,7 @@ gs_plugin_app_upgrade_download (GsPlugin
|
||||
gs_app_set_state (app, AS_APP_STATE_INSTALLING);
|
||||
gs_packagekit_helper_set_progress_app (helper, app);
|
||||
g_mutex_lock (&priv->task_mutex);
|
||||
+ pk_client_set_interactive (PK_CLIENT (priv->task), gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_task_upgrade_system_sync (priv->task,
|
||||
gs_app_get_version (app),
|
||||
PK_UPGRADE_KIND_ENUM_COMPLETE,
|
||||
diff -up gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-url-to-app.c.13 gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-url-to-app.c
|
||||
--- gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-url-to-app.c.13 2020-05-22 16:51:19.878380300 +0200
|
||||
+++ gnome-software-3.36.1/plugins/packagekit/gs-plugin-packagekit-url-to-app.c 2023-04-25 17:12:24.756551212 +0200
|
||||
@@ -28,6 +28,7 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
|
||||
pk_client_set_background (priv->client, FALSE);
|
||||
pk_client_set_cache_age (priv->client, G_MAXUINT);
|
||||
+ pk_client_set_interactive (priv->client, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -87,6 +88,7 @@ gs_plugin_url_to_app (GsPlugin *plugin,
|
||||
package_ids[0] = g_strdup (path);
|
||||
|
||||
g_mutex_lock (&priv->client_mutex);
|
||||
+ pk_client_set_interactive (priv->client, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
|
||||
results = pk_client_resolve (priv->client,
|
||||
pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, PK_FILTER_ENUM_ARCH, -1),
|
||||
package_ids,
|
@ -1,498 +0,0 @@
|
||||
From dca731ff0daf904911dd6815fb9a1b181329c887 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Tue, 5 Oct 2021 11:00:20 +0200
|
||||
Subject: [PATCH 1/4] gs-repo-row: Use GS_APP_QUIRK_COMPULSORY to recognize
|
||||
required repositories
|
||||
|
||||
The GS_APP_QUIRK_PROVENANCE quirk does not mean it's also required repository,
|
||||
thus use the GS_APP_QUIRK_COMPULSORY for repos, which cannot be disabled.
|
||||
The GS_APP_QUIRK_PROVENANCE is used only for repositories, which cannot be removed.
|
||||
---
|
||||
src/gs-repo-row.c | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/gs-repo-row.c b/src/gs-repo-row.c
|
||||
index 87926092f..bbf67c194 100644
|
||||
--- a/src/gs-repo-row.c
|
||||
+++ b/src/gs-repo-row.c
|
||||
@@ -48,7 +48,8 @@ refresh_ui (GsRepoRow *row)
|
||||
gboolean active = FALSE;
|
||||
gboolean state_sensitive = FALSE;
|
||||
gboolean busy = priv->busy_counter> 0;
|
||||
- gboolean is_system_repo;
|
||||
+ gboolean is_provenance;
|
||||
+ gboolean is_compulsory;
|
||||
|
||||
if (priv->repo == NULL) {
|
||||
gtk_widget_set_sensitive (priv->disable_switch, FALSE);
|
||||
@@ -87,11 +88,12 @@ refresh_ui (GsRepoRow *row)
|
||||
break;
|
||||
}
|
||||
|
||||
- is_system_repo = gs_app_has_quirk (priv->repo, GS_APP_QUIRK_PROVENANCE);
|
||||
+ is_provenance = gs_app_has_quirk (priv->repo, GS_APP_QUIRK_PROVENANCE);
|
||||
+ is_compulsory = gs_app_has_quirk (priv->repo, GS_APP_QUIRK_COMPULSORY);
|
||||
|
||||
/* Disable for the system repos, if installed */
|
||||
- gtk_widget_set_sensitive (priv->disable_switch, priv->supports_enable_disable && (state_sensitive || !is_system_repo || priv->always_allow_enable_disable));
|
||||
- gtk_widget_set_visible (priv->remove_button, priv->supports_remove && !is_system_repo);
|
||||
+ gtk_widget_set_sensitive (priv->disable_switch, priv->supports_enable_disable && (state_sensitive || !is_compulsory || priv->always_allow_enable_disable));
|
||||
+ gtk_widget_set_visible (priv->remove_button, priv->supports_remove && !is_provenance && !is_compulsory);
|
||||
|
||||
/* Set only the 'state' to visually indicate the state is not saved yet */
|
||||
if (busy)
|
||||
--
|
||||
GitLab
|
||||
|
||||
|
||||
From 026218b9d3211de243dfc49eca8b8d46633882b0 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Tue, 5 Oct 2021 11:03:31 +0200
|
||||
Subject: [PATCH 2/4] gs-plugin-provenance: Improve search speed in list of
|
||||
repositories
|
||||
|
||||
Use a GHashTable for bare repository names and a GPtrArray for those
|
||||
with wildcards. This helps with speed, due to not traversing all
|
||||
the repository names with the fnmatch() call.
|
||||
---
|
||||
plugins/core/gs-plugin-provenance.c | 55 ++++++++++++++++++++---------
|
||||
1 file changed, 38 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/plugins/core/gs-plugin-provenance.c b/plugins/core/gs-plugin-provenance.c
|
||||
index 97ff76798..a72c25a27 100644
|
||||
--- a/plugins/core/gs-plugin-provenance.c
|
||||
+++ b/plugins/core/gs-plugin-provenance.c
|
||||
@@ -19,7 +19,8 @@
|
||||
|
||||
struct GsPluginData {
|
||||
GSettings *settings;
|
||||
- gchar **sources;
|
||||
+ GHashTable *repos; /* gchar *name ~> NULL */
|
||||
+ GPtrArray *wildcards; /* non-NULL, when have names with wildcards */
|
||||
};
|
||||
|
||||
static gchar **
|
||||
@@ -42,8 +43,24 @@ gs_plugin_provenance_settings_changed_cb (GSettings *settings,
|
||||
{
|
||||
GsPluginData *priv = gs_plugin_get_data (plugin);
|
||||
if (g_strcmp0 (key, "official-repos") == 0) {
|
||||
- g_strfreev (priv->sources);
|
||||
- priv->sources = gs_plugin_provenance_get_sources (plugin);
|
||||
+ /* The keys are stolen by the hash table, thus free only the array */
|
||||
+ g_autofree gchar **repos = NULL;
|
||||
+ g_hash_table_remove_all (priv->repos);
|
||||
+ g_clear_pointer (&priv->wildcards, g_ptr_array_unref);
|
||||
+ repos = gs_plugin_provenance_get_sources (plugin);
|
||||
+ for (guint ii = 0; repos && repos[ii]; ii++) {
|
||||
+ if (strchr (repos[ii], '*') ||
|
||||
+ strchr (repos[ii], '?') ||
|
||||
+ strchr (repos[ii], '[')) {
|
||||
+ if (priv->wildcards == NULL)
|
||||
+ priv->wildcards = g_ptr_array_new_with_free_func (g_free);
|
||||
+ g_ptr_array_add (priv->wildcards, g_steal_pointer (&(repos[ii])));
|
||||
+ } else {
|
||||
+ g_hash_table_insert (priv->repos, g_steal_pointer (&(repos[ii])), NULL);
|
||||
+ }
|
||||
+ }
|
||||
+ if (priv->wildcards != NULL)
|
||||
+ g_ptr_array_add (priv->wildcards, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,9 +69,10 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
{
|
||||
GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
|
||||
priv->settings = g_settings_new ("org.gnome.software");
|
||||
+ priv->repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
||||
g_signal_connect (priv->settings, "changed",
|
||||
G_CALLBACK (gs_plugin_provenance_settings_changed_cb), plugin);
|
||||
- priv->sources = gs_plugin_provenance_get_sources (plugin);
|
||||
+ gs_plugin_provenance_settings_changed_cb (priv->settings, "official-repos", plugin);
|
||||
|
||||
/* after the package source is set */
|
||||
gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "dummy");
|
||||
@@ -66,7 +84,8 @@ void
|
||||
gs_plugin_destroy (GsPlugin *plugin)
|
||||
{
|
||||
GsPluginData *priv = gs_plugin_get_data (plugin);
|
||||
- g_strfreev (priv->sources);
|
||||
+ g_hash_table_unref (priv->repos);
|
||||
+ g_clear_pointer (&priv->wildcards, g_ptr_array_unref);
|
||||
g_object_unref (priv->settings);
|
||||
}
|
||||
|
||||
@@ -74,12 +93,12 @@ static gboolean
|
||||
refine_app (GsPlugin *plugin,
|
||||
GsApp *app,
|
||||
GsPluginRefineFlags flags,
|
||||
+ GHashTable *repos,
|
||||
+ GPtrArray *wildcards,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
- GsPluginData *priv = gs_plugin_get_data (plugin);
|
||||
const gchar *origin;
|
||||
- gchar **sources;
|
||||
|
||||
/* not required */
|
||||
if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0)
|
||||
@@ -87,14 +106,10 @@ refine_app (GsPlugin *plugin,
|
||||
if (gs_app_has_quirk (app, GS_APP_QUIRK_PROVENANCE))
|
||||
return TRUE;
|
||||
|
||||
- /* nothing to search */
|
||||
- sources = priv->sources;
|
||||
- if (sources == NULL || sources[0] == NULL)
|
||||
- return TRUE;
|
||||
-
|
||||
/* simple case */
|
||||
origin = gs_app_get_origin (app);
|
||||
- if (origin != NULL && gs_utils_strv_fnmatch (sources, origin)) {
|
||||
+ if (origin != NULL && (g_hash_table_contains (repos, origin) ||
|
||||
+ (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, origin)))) {
|
||||
gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
|
||||
return TRUE;
|
||||
}
|
||||
@@ -103,7 +118,8 @@ refine_app (GsPlugin *plugin,
|
||||
* provenance quirk to the system-configured repositories (but not
|
||||
* user-configured ones). */
|
||||
if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY &&
|
||||
- gs_utils_strv_fnmatch (sources, gs_app_get_id (app))) {
|
||||
+ (g_hash_table_contains (repos, gs_app_get_id (app)) ||
|
||||
+ (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, gs_app_get_id (app))))) {
|
||||
if (gs_app_get_scope (app) != AS_COMPONENT_SCOPE_USER)
|
||||
gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
|
||||
return TRUE;
|
||||
@@ -118,7 +134,8 @@ refine_app (GsPlugin *plugin,
|
||||
return TRUE;
|
||||
if (g_str_has_prefix (origin + 1, "installed:"))
|
||||
origin += 10;
|
||||
- if (gs_utils_strv_fnmatch (sources, origin + 1)) {
|
||||
+ if (g_hash_table_contains (repos, origin + 1) ||
|
||||
+ (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, origin + 1))) {
|
||||
gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
|
||||
return TRUE;
|
||||
}
|
||||
@@ -133,17 +150,21 @@ gs_plugin_refine (GsPlugin *plugin,
|
||||
GError **error)
|
||||
{
|
||||
GsPluginData *priv = gs_plugin_get_data (plugin);
|
||||
+ g_autoptr(GHashTable) repos = NULL;
|
||||
+ g_autoptr(GPtrArray) wildcards = NULL;
|
||||
|
||||
/* nothing to do here */
|
||||
if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0)
|
||||
return TRUE;
|
||||
+ repos = g_hash_table_ref (priv->repos);
|
||||
+ wildcards = priv->wildcards != NULL ? g_ptr_array_ref (priv->wildcards) : NULL;
|
||||
/* nothing to search */
|
||||
- if (priv->sources == NULL || priv->sources[0] == NULL)
|
||||
+ if (g_hash_table_size (repos) == 0)
|
||||
return TRUE;
|
||||
|
||||
for (guint i = 0; i < gs_app_list_length (list); i++) {
|
||||
GsApp *app = gs_app_list_index (list, i);
|
||||
- if (!refine_app (plugin, app, flags, cancellable, error))
|
||||
+ if (!refine_app (plugin, app, flags, repos, wildcards, cancellable, error))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
--
|
||||
GitLab
|
||||
|
||||
|
||||
From b5e3356aff5fcd257248f9bb697e272c879249ae Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Tue, 5 Oct 2021 13:03:44 +0200
|
||||
Subject: [PATCH 3/4] settings: Add 'required-repos' key
|
||||
|
||||
To be used to list repositories, which cannot be removed or disabled.
|
||||
It's a complementary option for the 'official-repos' key.
|
||||
---
|
||||
data/org.gnome.software.gschema.xml | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/data/org.gnome.software.gschema.xml b/data/org.gnome.software.gschema.xml
|
||||
index db1c27ce4..0e5706b7c 100644
|
||||
--- a/data/org.gnome.software.gschema.xml
|
||||
+++ b/data/org.gnome.software.gschema.xml
|
||||
@@ -94,6 +94,10 @@
|
||||
<default>[]</default>
|
||||
<summary>A list of official repositories that should not be considered 3rd party</summary>
|
||||
</key>
|
||||
+ <key name="required-repos" type="as">
|
||||
+ <default>[]</default>
|
||||
+ <summary>A list of required repositories that cannot be disabled or removed</summary>
|
||||
+ </key>
|
||||
<key name="free-repos" type="as">
|
||||
<default>[]</default>
|
||||
<summary>A list of official repositories that should be considered free software</summary>
|
||||
--
|
||||
GitLab
|
||||
|
||||
|
||||
From d6b8b206a596bb520a0b77066898b44a5ef18920 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Tue, 5 Oct 2021 14:16:56 +0200
|
||||
Subject: [PATCH 4/4] gs-plugin-provenance: Handle also 'required-repos' key
|
||||
|
||||
Let it handle also 'required-repos' settings key, beside the 'official-repos'
|
||||
key, which are close enough to share the same code and memory. With this
|
||||
done the repositories can be marked as compulsory, independently from the official
|
||||
repositories.
|
||||
|
||||
Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1479
|
||||
---
|
||||
plugins/core/gs-plugin-provenance.c | 142 +++++++++++++++++++++-------
|
||||
1 file changed, 108 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/plugins/core/gs-plugin-provenance.c b/plugins/core/gs-plugin-provenance.c
|
||||
index a72c25a27..22f3c98e1 100644
|
||||
--- a/plugins/core/gs-plugin-provenance.c
|
||||
+++ b/plugins/core/gs-plugin-provenance.c
|
||||
@@ -14,26 +14,61 @@
|
||||
/*
|
||||
* SECTION:
|
||||
* Sets the package provenance to TRUE if installed by an official
|
||||
- * software source.
|
||||
+ * software source. Also sets compulsory quirk when a required repository.
|
||||
*/
|
||||
|
||||
struct GsPluginData {
|
||||
GSettings *settings;
|
||||
- GHashTable *repos; /* gchar *name ~> NULL */
|
||||
- GPtrArray *wildcards; /* non-NULL, when have names with wildcards */
|
||||
+ GHashTable *repos; /* gchar *name ~> guint flags */
|
||||
+ GPtrArray *provenance_wildcards; /* non-NULL, when have names with wildcards */
|
||||
+ GPtrArray *compulsory_wildcards; /* non-NULL, when have names with wildcards */
|
||||
};
|
||||
|
||||
+static GHashTable *
|
||||
+gs_plugin_provenance_remove_by_flag (GHashTable *old_repos,
|
||||
+ GsAppQuirk quirk)
|
||||
+{
|
||||
+ GHashTable *new_repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
||||
+ GHashTableIter iter;
|
||||
+ gpointer key, value;
|
||||
+ g_hash_table_iter_init (&iter, old_repos);
|
||||
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
+ guint flags = GPOINTER_TO_UINT (value);
|
||||
+ flags = flags & (~quirk);
|
||||
+ if (flags != 0)
|
||||
+ g_hash_table_insert (new_repos, g_strdup (key), GUINT_TO_POINTER (flags));
|
||||
+ }
|
||||
+ return new_repos;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+gs_plugin_provenance_add_quirks (GsApp *app,
|
||||
+ guint quirks)
|
||||
+{
|
||||
+ GsAppQuirk array[] = {
|
||||
+ GS_APP_QUIRK_PROVENANCE,
|
||||
+ GS_APP_QUIRK_COMPULSORY
|
||||
+ };
|
||||
+ for (guint ii = 0; ii < G_N_ELEMENTS (array); ii++) {
|
||||
+ if ((quirks & array[ii]) != 0)
|
||||
+ gs_app_add_quirk (app, array[ii]);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static gchar **
|
||||
-gs_plugin_provenance_get_sources (GsPlugin *plugin)
|
||||
+gs_plugin_provenance_get_sources (GsPlugin *plugin,
|
||||
+ const gchar *key)
|
||||
{
|
||||
GsPluginData *priv = gs_plugin_get_data (plugin);
|
||||
const gchar *tmp;
|
||||
tmp = g_getenv ("GS_SELF_TEST_PROVENANCE_SOURCES");
|
||||
if (tmp != NULL) {
|
||||
+ if (g_strcmp0 (key, "required-repos") == 0)
|
||||
+ return NULL;
|
||||
g_debug ("using custom provenance sources of %s", tmp);
|
||||
return g_strsplit (tmp, ",", -1);
|
||||
}
|
||||
- return g_settings_get_strv (priv->settings, "official-repos");
|
||||
+ return g_settings_get_strv (priv->settings, key);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -42,25 +77,43 @@ gs_plugin_provenance_settings_changed_cb (GSettings *settings,
|
||||
GsPlugin *plugin)
|
||||
{
|
||||
GsPluginData *priv = gs_plugin_get_data (plugin);
|
||||
+ GsAppQuirk quirk = GS_APP_QUIRK_NONE;
|
||||
+ GPtrArray **pwildcards = NULL;
|
||||
+
|
||||
if (g_strcmp0 (key, "official-repos") == 0) {
|
||||
+ quirk = GS_APP_QUIRK_PROVENANCE;
|
||||
+ pwildcards = &priv->provenance_wildcards;
|
||||
+ } else if (g_strcmp0 (key, "required-repos") == 0) {
|
||||
+ quirk = GS_APP_QUIRK_COMPULSORY;
|
||||
+ pwildcards = &priv->compulsory_wildcards;
|
||||
+ }
|
||||
+
|
||||
+ if (quirk != GS_APP_QUIRK_NONE) {
|
||||
/* The keys are stolen by the hash table, thus free only the array */
|
||||
g_autofree gchar **repos = NULL;
|
||||
- g_hash_table_remove_all (priv->repos);
|
||||
- g_clear_pointer (&priv->wildcards, g_ptr_array_unref);
|
||||
- repos = gs_plugin_provenance_get_sources (plugin);
|
||||
+ g_autoptr(GHashTable) old_repos = priv->repos;
|
||||
+ g_autoptr(GPtrArray) old_wildcards = *pwildcards;
|
||||
+ GHashTable *new_repos = gs_plugin_provenance_remove_by_flag (old_repos, quirk);
|
||||
+ GPtrArray *new_wildcards = NULL;
|
||||
+ repos = gs_plugin_provenance_get_sources (plugin, key);
|
||||
for (guint ii = 0; repos && repos[ii]; ii++) {
|
||||
- if (strchr (repos[ii], '*') ||
|
||||
- strchr (repos[ii], '?') ||
|
||||
- strchr (repos[ii], '[')) {
|
||||
- if (priv->wildcards == NULL)
|
||||
- priv->wildcards = g_ptr_array_new_with_free_func (g_free);
|
||||
- g_ptr_array_add (priv->wildcards, g_steal_pointer (&(repos[ii])));
|
||||
+ gchar *repo = g_steal_pointer (&(repos[ii]));
|
||||
+ if (strchr (repo, '*') ||
|
||||
+ strchr (repo, '?') ||
|
||||
+ strchr (repo, '[')) {
|
||||
+ if (new_wildcards == NULL)
|
||||
+ new_wildcards = g_ptr_array_new_with_free_func (g_free);
|
||||
+ g_ptr_array_add (new_wildcards, repo);
|
||||
} else {
|
||||
- g_hash_table_insert (priv->repos, g_steal_pointer (&(repos[ii])), NULL);
|
||||
+ g_hash_table_insert (new_repos, repo,
|
||||
+ GUINT_TO_POINTER (quirk |
|
||||
+ GPOINTER_TO_UINT (g_hash_table_lookup (new_repos, repo))));
|
||||
}
|
||||
}
|
||||
- if (priv->wildcards != NULL)
|
||||
- g_ptr_array_add (priv->wildcards, NULL);
|
||||
+ if (new_wildcards != NULL)
|
||||
+ g_ptr_array_add (new_wildcards, NULL);
|
||||
+ priv->repos = new_repos;
|
||||
+ *pwildcards = new_wildcards;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,6 +126,7 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
g_signal_connect (priv->settings, "changed",
|
||||
G_CALLBACK (gs_plugin_provenance_settings_changed_cb), plugin);
|
||||
gs_plugin_provenance_settings_changed_cb (priv->settings, "official-repos", plugin);
|
||||
+ gs_plugin_provenance_settings_changed_cb (priv->settings, "required-repos", plugin);
|
||||
|
||||
/* after the package source is set */
|
||||
gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "dummy");
|
||||
@@ -85,20 +139,42 @@ gs_plugin_destroy (GsPlugin *plugin)
|
||||
{
|
||||
GsPluginData *priv = gs_plugin_get_data (plugin);
|
||||
g_hash_table_unref (priv->repos);
|
||||
- g_clear_pointer (&priv->wildcards, g_ptr_array_unref);
|
||||
+ g_clear_pointer (&priv->provenance_wildcards, g_ptr_array_unref);
|
||||
+ g_clear_pointer (&priv->compulsory_wildcards, g_ptr_array_unref);
|
||||
g_object_unref (priv->settings);
|
||||
}
|
||||
|
||||
+static gboolean
|
||||
+gs_plugin_provenance_find_repo_flags (GHashTable *repos,
|
||||
+ GPtrArray *provenance_wildcards,
|
||||
+ GPtrArray *compulsory_wildcards,
|
||||
+ const gchar *repo,
|
||||
+ guint *out_flags)
|
||||
+{
|
||||
+ if (repo == NULL || *repo == '\0')
|
||||
+ return FALSE;
|
||||
+ *out_flags = GPOINTER_TO_UINT (g_hash_table_lookup (repos, repo));
|
||||
+ if (provenance_wildcards != NULL &&
|
||||
+ gs_utils_strv_fnmatch ((gchar **) provenance_wildcards->pdata, repo))
|
||||
+ *out_flags |= GS_APP_QUIRK_PROVENANCE;
|
||||
+ if (compulsory_wildcards != NULL &&
|
||||
+ gs_utils_strv_fnmatch ((gchar **) compulsory_wildcards->pdata, repo))
|
||||
+ *out_flags |= GS_APP_QUIRK_COMPULSORY;
|
||||
+ return *out_flags != 0;
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
refine_app (GsPlugin *plugin,
|
||||
GsApp *app,
|
||||
GsPluginRefineFlags flags,
|
||||
GHashTable *repos,
|
||||
- GPtrArray *wildcards,
|
||||
+ GPtrArray *provenance_wildcards,
|
||||
+ GPtrArray *compulsory_wildcards,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
const gchar *origin;
|
||||
+ guint quirks;
|
||||
|
||||
/* not required */
|
||||
if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0)
|
||||
@@ -108,9 +184,8 @@ refine_app (GsPlugin *plugin,
|
||||
|
||||
/* simple case */
|
||||
origin = gs_app_get_origin (app);
|
||||
- if (origin != NULL && (g_hash_table_contains (repos, origin) ||
|
||||
- (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, origin)))) {
|
||||
- gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
|
||||
+ if (gs_plugin_provenance_find_repo_flags (repos, provenance_wildcards, compulsory_wildcards, origin, &quirks)) {
|
||||
+ gs_plugin_provenance_add_quirks (app, quirks);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -118,10 +193,9 @@ refine_app (GsPlugin *plugin,
|
||||
* provenance quirk to the system-configured repositories (but not
|
||||
* user-configured ones). */
|
||||
if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY &&
|
||||
- (g_hash_table_contains (repos, gs_app_get_id (app)) ||
|
||||
- (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, gs_app_get_id (app))))) {
|
||||
+ gs_plugin_provenance_find_repo_flags (repos, provenance_wildcards, compulsory_wildcards, gs_app_get_id (app), &quirks)) {
|
||||
if (gs_app_get_scope (app) != AS_COMPONENT_SCOPE_USER)
|
||||
- gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
|
||||
+ gs_plugin_provenance_add_quirks (app, quirks);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -134,11 +208,9 @@ refine_app (GsPlugin *plugin,
|
||||
return TRUE;
|
||||
if (g_str_has_prefix (origin + 1, "installed:"))
|
||||
origin += 10;
|
||||
- if (g_hash_table_contains (repos, origin + 1) ||
|
||||
- (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, origin + 1))) {
|
||||
- gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
|
||||
- return TRUE;
|
||||
- }
|
||||
+ if (gs_plugin_provenance_find_repo_flags (repos, provenance_wildcards, compulsory_wildcards, origin + 1, &quirks))
|
||||
+ gs_plugin_provenance_add_quirks (app, quirks);
|
||||
+
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -151,20 +223,22 @@ gs_plugin_refine (GsPlugin *plugin,
|
||||
{
|
||||
GsPluginData *priv = gs_plugin_get_data (plugin);
|
||||
g_autoptr(GHashTable) repos = NULL;
|
||||
- g_autoptr(GPtrArray) wildcards = NULL;
|
||||
+ g_autoptr(GPtrArray) provenance_wildcards = NULL;
|
||||
+ g_autoptr(GPtrArray) compulsory_wildcards = NULL;
|
||||
|
||||
/* nothing to do here */
|
||||
if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0)
|
||||
return TRUE;
|
||||
repos = g_hash_table_ref (priv->repos);
|
||||
- wildcards = priv->wildcards != NULL ? g_ptr_array_ref (priv->wildcards) : NULL;
|
||||
+ provenance_wildcards = priv->provenance_wildcards != NULL ? g_ptr_array_ref (priv->provenance_wildcards) : NULL;
|
||||
+ compulsory_wildcards = priv->compulsory_wildcards != NULL ? g_ptr_array_ref (priv->compulsory_wildcards) : NULL;
|
||||
/* nothing to search */
|
||||
- if (g_hash_table_size (repos) == 0)
|
||||
+ if (g_hash_table_size (repos) == 0 && provenance_wildcards == NULL && compulsory_wildcards == NULL)
|
||||
return TRUE;
|
||||
|
||||
for (guint i = 0; i < gs_app_list_length (list); i++) {
|
||||
GsApp *app = gs_app_list_index (list, i);
|
||||
- if (!refine_app (plugin, app, flags, repos, wildcards, cancellable, error))
|
||||
+ if (!refine_app (plugin, app, flags, repos, provenance_wildcards, compulsory_wildcards, cancellable, error))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
--
|
||||
GitLab
|
||||
|
@ -1,42 +0,0 @@
|
||||
From 895d1ca748f4f33a852853f5f07903fb549fb66f Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Mon, 11 Oct 2021 09:13:59 +0200
|
||||
Subject: [PATCH] gs-plugin-provenance: Set COMPULSORY quirk only on REPOSITORY
|
||||
apps
|
||||
|
||||
The compulsory quirk related to repositories, which cannot be removed,
|
||||
not to the applications provided by those repositories, thus set that
|
||||
quirk only on repositories, not on the apps from it.
|
||||
|
||||
Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1488
|
||||
---
|
||||
plugins/core/gs-plugin-provenance.c | 13 +++++--------
|
||||
1 file changed, 5 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/plugins/core/gs-plugin-provenance.c b/plugins/core/gs-plugin-provenance.c
|
||||
index 22f3c98e..e44a55f0 100644
|
||||
--- a/plugins/core/gs-plugin-provenance.c
|
||||
+++ b/plugins/core/gs-plugin-provenance.c
|
||||
@@ -45,14 +45,11 @@ static void
|
||||
gs_plugin_provenance_add_quirks (GsApp *app,
|
||||
guint quirks)
|
||||
{
|
||||
- GsAppQuirk array[] = {
|
||||
- GS_APP_QUIRK_PROVENANCE,
|
||||
- GS_APP_QUIRK_COMPULSORY
|
||||
- };
|
||||
- for (guint ii = 0; ii < G_N_ELEMENTS (array); ii++) {
|
||||
- if ((quirks & array[ii]) != 0)
|
||||
- gs_app_add_quirk (app, array[ii]);
|
||||
- }
|
||||
+ if ((quirks & GS_APP_QUIRK_PROVENANCE) != 0)
|
||||
+ gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
|
||||
+ if ((quirks & GS_APP_QUIRK_COMPULSORY) != 0 &&
|
||||
+ gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY)
|
||||
+ gs_app_add_quirk (app, GS_APP_QUIRK_COMPULSORY);
|
||||
}
|
||||
|
||||
static gchar **
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,12 +0,0 @@
|
||||
diff -up gnome-software-41.5/src/gs-removal-dialog.ui.4 gnome-software-41.5/src/gs-removal-dialog.ui
|
||||
--- gnome-software-41.5/src/gs-removal-dialog.ui.4 2022-09-12 08:59:57.819169830 +0200
|
||||
+++ gnome-software-41.5/src/gs-removal-dialog.ui 2022-09-12 09:00:25.148201673 +0200
|
||||
@@ -20,7 +20,7 @@
|
||||
</child>
|
||||
</object>
|
||||
<template class="GsRemovalDialog" parent="GtkMessageDialog">
|
||||
- <property name="text" translatable="yes">Incompatible Software</property>
|
||||
+ <property name="title" translatable="yes">Incompatible Software</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="destroy_with_parent">True</property>
|
||||
<child type="action">
|
@ -1,70 +0,0 @@
|
||||
From 19c19d37ec9ba8b15b806158572a8e4a34c55677 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Wed, 7 Sep 2022 09:01:16 +0200
|
||||
Subject: [PATCH] misc: Hide some errors in non-debug builds
|
||||
|
||||
These two errors are useless for the users, they cannot do anything with them.
|
||||
While it can be useful to know them, they can be also disturbing and they just
|
||||
fill the journal log for the users.
|
||||
|
||||
Related to https://gitlab.gnome.org/GNOME/gnome-software/-/issues/753
|
||||
---
|
||||
lib/gs-plugin-loader.c | 15 +++++++++++----
|
||||
src/gs-shell.c | 15 +++++++++++----
|
||||
2 files changed, 22 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/lib/gs-plugin-loader.c b/lib/gs-plugin-loader.c
|
||||
index 63f741c37..e040358b7 100644
|
||||
--- a/lib/gs-plugin-loader.c
|
||||
+++ b/lib/gs-plugin-loader.c
|
||||
@@ -358,10 +358,17 @@ gs_plugin_loader_claim_error (GsPluginLoader *plugin_loader,
|
||||
|
||||
/* invalid */
|
||||
if (error_copy->domain != GS_PLUGIN_ERROR) {
|
||||
- g_warning ("not GsPlugin error %s:%i: %s",
|
||||
- g_quark_to_string (error_copy->domain),
|
||||
- error_copy->code,
|
||||
- error_copy->message);
|
||||
+ if (g_strcmp0 (BUILD_TYPE, "debug") == 0) {
|
||||
+ g_warning ("not GsPlugin error %s:%i: %s",
|
||||
+ g_quark_to_string (error_copy->domain),
|
||||
+ error_copy->code,
|
||||
+ error_copy->message);
|
||||
+ } else {
|
||||
+ g_debug ("not GsPlugin error %s:%i: %s",
|
||||
+ g_quark_to_string (error_copy->domain),
|
||||
+ error_copy->code,
|
||||
+ error_copy->message);
|
||||
+ }
|
||||
error_copy->domain = GS_PLUGIN_ERROR;
|
||||
error_copy->code = GS_PLUGIN_ERROR_FAILED;
|
||||
}
|
||||
diff --git a/src/gs-shell.c b/src/gs-shell.c
|
||||
index beb76f0e9..af297d240 100644
|
||||
--- a/src/gs-shell.c
|
||||
+++ b/src/gs-shell.c
|
||||
@@ -2080,10 +2080,17 @@ gs_shell_rescan_events (GsShell *shell)
|
||||
!g_error_matches (error,
|
||||
G_IO_ERROR,
|
||||
G_IO_ERROR_CANCELLED)) {
|
||||
- g_warning ("not handling error %s for action %s: %s",
|
||||
- gs_plugin_error_to_string (error->code),
|
||||
- gs_plugin_action_to_string (action),
|
||||
- error->message);
|
||||
+ if (g_strcmp0 (BUILD_TYPE, "debug") == 0) {
|
||||
+ g_warning ("not handling error %s for action %s: %s",
|
||||
+ gs_plugin_error_to_string (error->code),
|
||||
+ gs_plugin_action_to_string (action),
|
||||
+ error->message);
|
||||
+ } else {
|
||||
+ g_debug ("not handling error %s for action %s: %s",
|
||||
+ gs_plugin_error_to_string (error->code),
|
||||
+ gs_plugin_action_to_string (action),
|
||||
+ error->message);
|
||||
+ }
|
||||
}
|
||||
gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INVALID);
|
||||
return;
|
||||
--
|
||||
GitLab
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,27 @@
|
||||
From b50003ed83cab2c6cf6654e5972d6ee3e2303eb6 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Tue, 16 Feb 2021 16:09:08 +0100
|
||||
Subject: [PATCH] odrs: Cannot be disabled by filling empty 'review-server'
|
||||
setting
|
||||
|
||||
Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1143
|
||||
---
|
||||
plugins/odrs/gs-plugin-odrs.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/plugins/odrs/gs-plugin-odrs.c b/plugins/odrs/gs-plugin-odrs.c
|
||||
index f0c0c3b91..2c9bd878d 100644
|
||||
--- a/plugins/odrs/gs-plugin-odrs.c
|
||||
+++ b/plugins/odrs/gs-plugin-odrs.c
|
||||
@@ -175,6 +175,8 @@ gs_plugin_initialize (GsPlugin *plugin)
|
||||
|
||||
/* set name of MetaInfo file */
|
||||
gs_plugin_set_appstream_id (plugin, "org.gnome.Software.Plugin.Odrs");
|
||||
+
|
||||
+ gs_plugin_set_enabled (plugin, priv->review_server && *priv->review_server);
|
||||
}
|
||||
|
||||
static GArray *
|
||||
--
|
||||
GitLab
|
||||
|
@ -0,0 +1,57 @@
|
||||
From 98dbef8b5a547d3d920d377022e20d2e63519b2f Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Tue, 16 Feb 2021 12:58:19 +0100
|
||||
Subject: [PATCH 1/2] GsApplication: Crash when run as root
|
||||
|
||||
The `search_provider` is not initialized in this case, leading
|
||||
to NULL dereference. Skip the call in such cases, because the search
|
||||
provider is not that important.
|
||||
|
||||
Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1142
|
||||
---
|
||||
src/gs-application.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/gs-application.c b/src/gs-application.c
|
||||
index 48f0c6aac..fdb5f55c4 100644
|
||||
--- a/src/gs-application.c
|
||||
+++ b/src/gs-application.c
|
||||
@@ -912,7 +912,8 @@ static void
|
||||
gs_application_setup_search_provider (GsApplication *app)
|
||||
{
|
||||
gs_application_initialize_plugins (app);
|
||||
- gs_shell_search_provider_setup (app->search_provider, app->plugin_loader);
|
||||
+ if (app->search_provider)
|
||||
+ gs_shell_search_provider_setup (app->search_provider, app->plugin_loader);
|
||||
}
|
||||
|
||||
static void
|
||||
--
|
||||
GitLab
|
||||
|
||||
|
||||
From 0055bfa8535bb7c5ccd9ace244d71b2885a47daa Mon Sep 17 00:00:00 2001
|
||||
From: Philip Withnall <philip@tecnocode.co.uk>
|
||||
Date: Mon, 22 Feb 2021 11:41:05 +0000
|
||||
Subject: [PATCH 2/2] Apply 1 suggestion(s) to 1 file(s)
|
||||
|
||||
---
|
||||
src/gs-application.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/gs-application.c b/src/gs-application.c
|
||||
index fdb5f55c4..f05f6f718 100644
|
||||
--- a/src/gs-application.c
|
||||
+++ b/src/gs-application.c
|
||||
@@ -49,7 +49,7 @@ struct _GsApplication {
|
||||
#ifdef HAVE_PACKAGEKIT
|
||||
GsDbusHelper *dbus_helper;
|
||||
#endif
|
||||
- GsShellSearchProvider *search_provider;
|
||||
+ GsShellSearchProvider *search_provider; /* (nullable) (owned) */
|
||||
GSettings *settings;
|
||||
GSimpleActionGroup *action_map;
|
||||
guint shell_loaded_handler_id;
|
||||
--
|
||||
GitLab
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 5b0e476a17129be0d8b451467aded9c8ae861218 Mon Sep 17 00:00:00 2001
|
||||
From: Rasmus Thomsen <oss@cogitri.dev>
|
||||
Date: Fri, 17 Apr 2020 18:55:21 +0200
|
||||
Subject: [PATCH] build: install more headers
|
||||
|
||||
These are required for building out of tree plugins
|
||||
---
|
||||
lib/meson.build | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/lib/meson.build b/lib/meson.build
|
||||
index 1c00d4f3e..6a2e803e5 100644
|
||||
--- a/lib/meson.build
|
||||
+++ b/lib/meson.build
|
||||
@@ -4,12 +4,18 @@ cargs += ['-DLOCALPLUGINDIR=""']
|
||||
install_headers([
|
||||
'gnome-software.h',
|
||||
'gs-app.h',
|
||||
+ 'gs-app-collation.h',
|
||||
'gs-app-list.h',
|
||||
+ 'gs-autocleanups.h',
|
||||
'gs-category.h',
|
||||
+ 'gs-ioprio.h',
|
||||
'gs-metered.h',
|
||||
'gs-os-release.h',
|
||||
'gs-plugin.h',
|
||||
'gs-plugin-event.h',
|
||||
+ 'gs-plugin-job.h',
|
||||
+ 'gs-plugin-loader.h',
|
||||
+ 'gs-plugin-loader-sync.h',
|
||||
'gs-plugin-types.h',
|
||||
'gs-plugin-vfuncs.h',
|
||||
'gs-utils.h'
|
||||
--
|
||||
GitLab
|
||||
|
@ -0,0 +1,117 @@
|
||||
diff -up gnome-software-3.36.1/plugins/flatpak/gs-flatpak.c.10 gnome-software-3.36.1/plugins/flatpak/gs-flatpak.c
|
||||
--- gnome-software-3.36.1/plugins/flatpak/gs-flatpak.c.10 2020-05-22 16:51:19.868380300 +0200
|
||||
+++ gnome-software-3.36.1/plugins/flatpak/gs-flatpak.c 2021-06-21 21:24:00.233689928 +0200
|
||||
@@ -1844,12 +1844,13 @@ gs_flatpak_refine_app_state (GsFlatpak *
|
||||
}
|
||||
|
||||
static GsApp *
|
||||
-gs_flatpak_create_runtime (GsFlatpak *self, GsApp *parent, const gchar *runtime)
|
||||
+gs_flatpak_create_runtime (GsFlatpak *self, GsApp *parent, const gchar *runtime, GCancellable *cancellable)
|
||||
{
|
||||
g_autofree gchar *source = NULL;
|
||||
g_auto(GStrv) split = NULL;
|
||||
g_autoptr(GsApp) app_cache = NULL;
|
||||
g_autoptr(GsApp) app = NULL;
|
||||
+ const gchar *origin;
|
||||
|
||||
/* get the name/arch/branch */
|
||||
split = g_strsplit (runtime, "/", -1);
|
||||
@@ -1864,6 +1865,24 @@ gs_flatpak_create_runtime (GsFlatpak *se
|
||||
gs_app_set_kind (app, AS_APP_KIND_RUNTIME);
|
||||
gs_app_set_branch (app, split[2]);
|
||||
|
||||
+ origin = gs_app_get_origin (parent);
|
||||
+ if (origin != NULL) {
|
||||
+ g_autoptr(FlatpakRemoteRef) xref = NULL;
|
||||
+
|
||||
+ xref = flatpak_installation_fetch_remote_ref_sync (self->installation,
|
||||
+ origin,
|
||||
+ FLATPAK_REF_KIND_RUNTIME,
|
||||
+ gs_app_get_id (app),
|
||||
+ gs_flatpak_app_get_ref_arch (parent),
|
||||
+ gs_app_get_branch (app),
|
||||
+ cancellable,
|
||||
+ NULL);
|
||||
+
|
||||
+ /* Prefer runtime from the same origin as the parent application */
|
||||
+ if (xref)
|
||||
+ gs_app_set_origin (app, origin);
|
||||
+ }
|
||||
+
|
||||
/* search in the cache */
|
||||
app_cache = gs_plugin_cache_lookup (self->plugin, gs_app_get_unique_id (app));
|
||||
if (app_cache != NULL) {
|
||||
@@ -1898,6 +1917,7 @@ gs_flatpak_set_app_metadata (GsFlatpak *
|
||||
GsApp *app,
|
||||
const gchar *data,
|
||||
gsize length,
|
||||
+ GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
gboolean secure = TRUE;
|
||||
@@ -1951,7 +1971,7 @@ gs_flatpak_set_app_metadata (GsFlatpak *
|
||||
gs_app_add_kudo (app, GS_APP_KUDO_SANDBOXED_SECURE);
|
||||
|
||||
/* create runtime */
|
||||
- app_runtime = gs_flatpak_create_runtime (self, app, runtime);
|
||||
+ app_runtime = gs_flatpak_create_runtime (self, app, runtime, cancellable);
|
||||
if (app_runtime != NULL) {
|
||||
gs_plugin_refine_item_scope (self, app_runtime);
|
||||
gs_app_set_runtime (app, app_runtime);
|
||||
@@ -2046,7 +2066,7 @@ gs_plugin_refine_item_metadata (GsFlatpa
|
||||
}
|
||||
|
||||
/* parse key file */
|
||||
- if (!gs_flatpak_set_app_metadata (self, app, str, len, error))
|
||||
+ if (!gs_flatpak_set_app_metadata (self, app, str, len, cancellable, error))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
@@ -2506,6 +2526,7 @@ gs_flatpak_file_to_app_bundle (GsFlatpak
|
||||
if (!gs_flatpak_set_app_metadata (self, app,
|
||||
g_bytes_get_data (metadata, NULL),
|
||||
g_bytes_get_size (metadata),
|
||||
+ cancellable,
|
||||
error))
|
||||
return NULL;
|
||||
|
||||
diff -up gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c.10 gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c
|
||||
--- gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c.10 2021-06-21 20:38:42.585590510 +0200
|
||||
+++ gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c 2021-06-21 21:23:00.977665979 +0200
|
||||
@@ -852,6 +852,36 @@ gs_plugin_app_install (GsPlugin *plugin,
|
||||
ref, NULL, error)) {
|
||||
gs_flatpak_error_convert (error);
|
||||
return FALSE;
|
||||
+ } else {
|
||||
+ GsApp *runtime;
|
||||
+
|
||||
+ runtime = gs_app_get_runtime (app);
|
||||
+ if (runtime != NULL && gs_app_get_origin (runtime) != NULL) {
|
||||
+ g_autoptr(FlatpakInstalledRef) runtime_ref = NULL;
|
||||
+
|
||||
+ runtime_ref = flatpak_installation_get_installed_ref (gs_flatpak_get_installation (flatpak),
|
||||
+ gs_flatpak_app_get_ref_kind (runtime),
|
||||
+ gs_flatpak_app_get_ref_name (runtime),
|
||||
+ gs_flatpak_app_get_ref_arch (runtime),
|
||||
+ gs_app_get_branch (runtime),
|
||||
+ cancellable,
|
||||
+ NULL);
|
||||
+ if (runtime_ref == NULL) {
|
||||
+ g_autoptr(GError) error_local = NULL;
|
||||
+
|
||||
+ g_clear_pointer (&ref, g_free);
|
||||
+ ref = gs_flatpak_app_get_ref_display (runtime);
|
||||
+ if (!flatpak_transaction_add_install (transaction, gs_app_get_origin (runtime), ref, NULL, &error_local)) {
|
||||
+ if (g_error_matches (error_local, FLATPAK_ERROR, FLATPAK_ERROR_ALREADY_INSTALLED)) {
|
||||
+ g_clear_error (&error_local);
|
||||
+ } else {
|
||||
+ g_propagate_error (error, g_steal_pointer (&error_local));
|
||||
+ gs_flatpak_error_convert (error);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,26 @@
|
||||
diff -up gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c.unrelated-refs gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c
|
||||
--- gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c.unrelated-refs 2020-10-09 14:07:16.407235531 -0400
|
||||
+++ gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c 2020-10-09 14:08:48.775544689 -0400
|
||||
@@ -696,6 +696,11 @@ gs_plugin_app_remove (GsPlugin *plugin,
|
||||
gs_flatpak_error_convert (error);
|
||||
return FALSE;
|
||||
}
|
||||
+
|
||||
+ /* add to the transaction cache for quick look up -- other unrelated
|
||||
+ * refs will be matched using gs_plugin_flatpak_find_app_by_ref() */
|
||||
+ gs_flatpak_transaction_add_app (transaction, app);
|
||||
+
|
||||
ref = gs_flatpak_app_get_ref_display (app);
|
||||
if (!flatpak_transaction_add_uninstall (transaction, ref, error)) {
|
||||
gs_flatpak_error_convert (error);
|
||||
@@ -899,6 +904,10 @@ gs_plugin_flatpak_update (GsPlugin *plug
|
||||
gs_flatpak_error_convert (error);
|
||||
return FALSE;
|
||||
}
|
||||
+
|
||||
+ /* add to the transaction cache for quick look up -- other unrelated
|
||||
+ * refs will be matched using gs_plugin_flatpak_find_app_by_ref() */
|
||||
+ gs_flatpak_transaction_add_app (transaction, app);
|
||||
}
|
||||
|
||||
/* run transaction */
|
@ -0,0 +1,97 @@
|
||||
diff -up gnome-software-3.36.1/lib/gs-plugin.c.1888404 gnome-software-3.36.1/lib/gs-plugin.c
|
||||
--- gnome-software-3.36.1/lib/gs-plugin.c.1888404 2021-05-24 13:50:34.302612057 +0200
|
||||
+++ gnome-software-3.36.1/lib/gs-plugin.c 2021-05-24 13:50:39.160609728 +0200
|
||||
@@ -1398,6 +1398,44 @@ gs_plugin_cache_lookup (GsPlugin *plugin
|
||||
}
|
||||
|
||||
/**
|
||||
+ * gs_plugin_cache_lookup_by_state:
|
||||
+ * @plugin: a #GsPlugin
|
||||
+ * @list: a #GsAppList to add applications to
|
||||
+ * @state: a #AsAppState
|
||||
+ *
|
||||
+ * Adds each cached #GsApp with state @state into the @list.
|
||||
+ * When the state is %AS_APP_STATE_UNKNOWN, then adds all
|
||||
+ * cached applications.
|
||||
+ *
|
||||
+ * Since: 3.36.1-8
|
||||
+ **/
|
||||
+void
|
||||
+gs_plugin_cache_lookup_by_state (GsPlugin *plugin,
|
||||
+ GsAppList *list,
|
||||
+ AsAppState state)
|
||||
+{
|
||||
+ GsPluginPrivate *priv;
|
||||
+ GHashTableIter iter;
|
||||
+ gpointer value;
|
||||
+ g_autoptr(GMutexLocker) locker = NULL;
|
||||
+
|
||||
+ g_return_if_fail (GS_IS_PLUGIN (plugin));
|
||||
+ g_return_if_fail (GS_IS_APP_LIST (list));
|
||||
+
|
||||
+ priv = gs_plugin_get_instance_private (plugin);
|
||||
+ locker = g_mutex_locker_new (&priv->cache_mutex);
|
||||
+
|
||||
+ g_hash_table_iter_init (&iter, priv->cache);
|
||||
+ while (g_hash_table_iter_next (&iter, NULL, &value)) {
|
||||
+ GsApp *app = value;
|
||||
+
|
||||
+ if (state == AS_APP_STATE_UNKNOWN ||
|
||||
+ state == gs_app_get_state (app))
|
||||
+ gs_app_list_add (list, app);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* gs_plugin_cache_remove:
|
||||
* @plugin: a #GsPlugin
|
||||
* @key: a key which matches
|
||||
diff -up gnome-software-3.36.1/lib/gs-plugin.h.1888404 gnome-software-3.36.1/lib/gs-plugin.h
|
||||
--- gnome-software-3.36.1/lib/gs-plugin.h.1888404 2021-05-24 13:50:34.302612057 +0200
|
||||
+++ gnome-software-3.36.1/lib/gs-plugin.h 2021-05-24 13:50:39.160609728 +0200
|
||||
@@ -102,6 +102,9 @@ gboolean gs_plugin_check_distro_id (Gs
|
||||
const gchar *distro_id);
|
||||
GsApp *gs_plugin_cache_lookup (GsPlugin *plugin,
|
||||
const gchar *key);
|
||||
+void gs_plugin_cache_lookup_by_state (GsPlugin *plugin,
|
||||
+ GsAppList *list,
|
||||
+ AsAppState state);
|
||||
void gs_plugin_cache_add (GsPlugin *plugin,
|
||||
const gchar *key,
|
||||
GsApp *app);
|
||||
diff -up gnome-software-3.36.1/lib/gs-plugin-loader.c.1888404 gnome-software-3.36.1/lib/gs-plugin-loader.c
|
||||
--- gnome-software-3.36.1/lib/gs-plugin-loader.c.1888404 2021-05-24 13:50:34.302612057 +0200
|
||||
+++ gnome-software-3.36.1/lib/gs-plugin-loader.c 2021-05-24 13:50:39.159609728 +0200
|
||||
@@ -1273,7 +1273,7 @@ static gboolean
|
||||
gs_plugin_loader_app_is_valid_updatable (GsApp *app, gpointer user_data)
|
||||
{
|
||||
return gs_plugin_loader_app_is_valid (app, user_data) &&
|
||||
- gs_app_is_updatable (app);
|
||||
+ (gs_app_is_updatable (app) || gs_app_get_state (app) == AS_APP_STATE_INSTALLING);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
diff -up gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c.1888404 gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c
|
||||
--- gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c.1888404 2021-05-24 13:50:34.310612054 +0200
|
||||
+++ gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c 2021-05-24 13:50:39.161609727 +0200
|
||||
@@ -218,6 +218,7 @@ gs_plugin_add_updates (GsPlugin *plugin,
|
||||
if (!gs_flatpak_add_updates (flatpak, list, cancellable, error))
|
||||
return FALSE;
|
||||
}
|
||||
+ gs_plugin_cache_lookup_by_state (plugin, list, AS_APP_STATE_INSTALLING);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
diff -up gnome-software-3.36.1/src/gs-updates-page.c.1888404 gnome-software-3.36.1/src/gs-updates-page.c
|
||||
--- gnome-software-3.36.1/src/gs-updates-page.c.1888404 2021-05-24 13:50:39.161609727 +0200
|
||||
+++ gnome-software-3.36.1/src/gs-updates-page.c 2021-05-24 13:51:00.211599638 +0200
|
||||
@@ -139,7 +139,8 @@ gs_updates_page_invalidate (GsUpdatesPag
|
||||
static GsUpdatesSectionKind
|
||||
_get_app_section (GsApp *app)
|
||||
{
|
||||
- if (gs_app_get_state (app) == AS_APP_STATE_UPDATABLE_LIVE) {
|
||||
+ if (gs_app_get_state (app) == AS_APP_STATE_UPDATABLE_LIVE ||
|
||||
+ gs_app_get_state (app) == AS_APP_STATE_INSTALLING) {
|
||||
if (gs_app_get_kind (app) == AS_APP_KIND_FIRMWARE)
|
||||
return GS_UPDATES_SECTION_KIND_ONLINE_FIRMWARE;
|
||||
return GS_UPDATES_SECTION_KIND_ONLINE;
|
Loading…
Reference in new issue