Blame SOURCES/0006-optional-repos-cannot-be-disabled.patch

0e7fe2
From dca731ff0daf904911dd6815fb9a1b181329c887 Mon Sep 17 00:00:00 2001
0e7fe2
From: Milan Crha <mcrha@redhat.com>
0e7fe2
Date: Tue, 5 Oct 2021 11:00:20 +0200
0e7fe2
Subject: [PATCH 1/4] gs-repo-row: Use GS_APP_QUIRK_COMPULSORY to recognize
0e7fe2
 required repositories
0e7fe2
0e7fe2
The GS_APP_QUIRK_PROVENANCE quirk does not mean it's also required repository,
0e7fe2
thus use the GS_APP_QUIRK_COMPULSORY for repos, which cannot be disabled.
0e7fe2
The GS_APP_QUIRK_PROVENANCE is used only for repositories, which cannot be removed.
0e7fe2
---
0e7fe2
 src/gs-repo-row.c | 10 ++++++----
0e7fe2
 1 file changed, 6 insertions(+), 4 deletions(-)
0e7fe2
0e7fe2
diff --git a/src/gs-repo-row.c b/src/gs-repo-row.c
0e7fe2
index 87926092f..bbf67c194 100644
0e7fe2
--- a/src/gs-repo-row.c
0e7fe2
+++ b/src/gs-repo-row.c
0e7fe2
@@ -48,7 +48,8 @@ refresh_ui (GsRepoRow *row)
0e7fe2
 	gboolean active = FALSE;
0e7fe2
 	gboolean state_sensitive = FALSE;
0e7fe2
 	gboolean busy = priv->busy_counter> 0;
0e7fe2
-	gboolean is_system_repo;
0e7fe2
+	gboolean is_provenance;
0e7fe2
+	gboolean is_compulsory;
0e7fe2
 
0e7fe2
 	if (priv->repo == NULL) {
0e7fe2
 		gtk_widget_set_sensitive (priv->disable_switch, FALSE);
0e7fe2
@@ -87,11 +88,12 @@ refresh_ui (GsRepoRow *row)
0e7fe2
 		break;
0e7fe2
 	}
0e7fe2
 
0e7fe2
-	is_system_repo = gs_app_has_quirk (priv->repo, GS_APP_QUIRK_PROVENANCE);
0e7fe2
+	is_provenance = gs_app_has_quirk (priv->repo, GS_APP_QUIRK_PROVENANCE);
0e7fe2
+	is_compulsory = gs_app_has_quirk (priv->repo, GS_APP_QUIRK_COMPULSORY);
0e7fe2
 
0e7fe2
 	/* Disable for the system repos, if installed */
0e7fe2
-	gtk_widget_set_sensitive (priv->disable_switch, priv->supports_enable_disable && (state_sensitive || !is_system_repo || priv->always_allow_enable_disable));
0e7fe2
-	gtk_widget_set_visible (priv->remove_button, priv->supports_remove && !is_system_repo);
0e7fe2
+	gtk_widget_set_sensitive (priv->disable_switch, priv->supports_enable_disable && (state_sensitive || !is_compulsory || priv->always_allow_enable_disable));
0e7fe2
+	gtk_widget_set_visible (priv->remove_button, priv->supports_remove && !is_provenance && !is_compulsory);
0e7fe2
 
0e7fe2
 	/* Set only the 'state' to visually indicate the state is not saved yet */
0e7fe2
 	if (busy)
0e7fe2
-- 
0e7fe2
GitLab
0e7fe2
0e7fe2
0e7fe2
From 026218b9d3211de243dfc49eca8b8d46633882b0 Mon Sep 17 00:00:00 2001
0e7fe2
From: Milan Crha <mcrha@redhat.com>
0e7fe2
Date: Tue, 5 Oct 2021 11:03:31 +0200
0e7fe2
Subject: [PATCH 2/4] gs-plugin-provenance: Improve search speed in list of
0e7fe2
 repositories
0e7fe2
0e7fe2
Use a GHashTable for bare repository names and a GPtrArray for those
0e7fe2
with wildcards. This helps with speed, due to not traversing all
0e7fe2
the repository names with the fnmatch() call.
0e7fe2
---
0e7fe2
 plugins/core/gs-plugin-provenance.c | 55 ++++++++++++++++++++---------
0e7fe2
 1 file changed, 38 insertions(+), 17 deletions(-)
0e7fe2
0e7fe2
diff --git a/plugins/core/gs-plugin-provenance.c b/plugins/core/gs-plugin-provenance.c
0e7fe2
index 97ff76798..a72c25a27 100644
0e7fe2
--- a/plugins/core/gs-plugin-provenance.c
0e7fe2
+++ b/plugins/core/gs-plugin-provenance.c
0e7fe2
@@ -19,7 +19,8 @@
0e7fe2
 
0e7fe2
 struct GsPluginData {
0e7fe2
 	GSettings		*settings;
0e7fe2
-	gchar			**sources;
0e7fe2
+	GHashTable		*repos; /* gchar *name ~> NULL */
0e7fe2
+	GPtrArray		*wildcards; /* non-NULL, when have names with wildcards */
0e7fe2
 };
0e7fe2
 
0e7fe2
 static gchar **
0e7fe2
@@ -42,8 +43,24 @@ gs_plugin_provenance_settings_changed_cb (GSettings *settings,
0e7fe2
 {
0e7fe2
 	GsPluginData *priv = gs_plugin_get_data (plugin);
0e7fe2
 	if (g_strcmp0 (key, "official-repos") == 0) {
0e7fe2
-		g_strfreev (priv->sources);
0e7fe2
-		priv->sources = gs_plugin_provenance_get_sources (plugin);
0e7fe2
+		/* The keys are stolen by the hash table, thus free only the array */
0e7fe2
+		g_autofree gchar **repos = NULL;
0e7fe2
+		g_hash_table_remove_all (priv->repos);
0e7fe2
+		g_clear_pointer (&priv->wildcards, g_ptr_array_unref);
0e7fe2
+		repos = gs_plugin_provenance_get_sources (plugin);
0e7fe2
+		for (guint ii = 0; repos && repos[ii]; ii++) {
0e7fe2
+			if (strchr (repos[ii], '*') ||
0e7fe2
+			    strchr (repos[ii], '?') ||
0e7fe2
+			    strchr (repos[ii], '[')) {
0e7fe2
+				if (priv->wildcards == NULL)
0e7fe2
+					priv->wildcards = g_ptr_array_new_with_free_func (g_free);
0e7fe2
+				g_ptr_array_add (priv->wildcards, g_steal_pointer (&(repos[ii])));
0e7fe2
+			} else {
0e7fe2
+				g_hash_table_insert (priv->repos, g_steal_pointer (&(repos[ii])), NULL);
0e7fe2
+			}
0e7fe2
+		}
0e7fe2
+		if (priv->wildcards != NULL)
0e7fe2
+			g_ptr_array_add (priv->wildcards, NULL);
0e7fe2
 	}
0e7fe2
 }
0e7fe2
 
0e7fe2
@@ -52,9 +69,10 @@ gs_plugin_initialize (GsPlugin *plugin)
0e7fe2
 {
0e7fe2
 	GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
0e7fe2
 	priv->settings = g_settings_new ("org.gnome.software");
0e7fe2
+	priv->repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
0e7fe2
 	g_signal_connect (priv->settings, "changed",
0e7fe2
 			  G_CALLBACK (gs_plugin_provenance_settings_changed_cb), plugin);
0e7fe2
-	priv->sources = gs_plugin_provenance_get_sources (plugin);
0e7fe2
+	gs_plugin_provenance_settings_changed_cb (priv->settings, "official-repos", plugin);
0e7fe2
 
0e7fe2
 	/* after the package source is set */
0e7fe2
 	gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "dummy");
0e7fe2
@@ -66,7 +84,8 @@ void
0e7fe2
 gs_plugin_destroy (GsPlugin *plugin)
0e7fe2
 {
0e7fe2
 	GsPluginData *priv = gs_plugin_get_data (plugin);
0e7fe2
-	g_strfreev (priv->sources);
0e7fe2
+	g_hash_table_unref (priv->repos);
0e7fe2
+	g_clear_pointer (&priv->wildcards, g_ptr_array_unref);
0e7fe2
 	g_object_unref (priv->settings);
0e7fe2
 }
0e7fe2
 
0e7fe2
@@ -74,12 +93,12 @@ static gboolean
0e7fe2
 refine_app (GsPlugin             *plugin,
0e7fe2
 	    GsApp                *app,
0e7fe2
 	    GsPluginRefineFlags   flags,
0e7fe2
+	    GHashTable		 *repos,
0e7fe2
+	    GPtrArray		 *wildcards,
0e7fe2
 	    GCancellable         *cancellable,
0e7fe2
 	    GError              **error)
0e7fe2
 {
0e7fe2
-	GsPluginData *priv = gs_plugin_get_data (plugin);
0e7fe2
 	const gchar *origin;
0e7fe2
-	gchar **sources;
0e7fe2
 
0e7fe2
 	/* not required */
0e7fe2
 	if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0)
0e7fe2
@@ -87,14 +106,10 @@ refine_app (GsPlugin             *plugin,
0e7fe2
 	if (gs_app_has_quirk (app, GS_APP_QUIRK_PROVENANCE))
0e7fe2
 		return TRUE;
0e7fe2
 
0e7fe2
-	/* nothing to search */
0e7fe2
-	sources = priv->sources;
0e7fe2
-	if (sources == NULL || sources[0] == NULL)
0e7fe2
-		return TRUE;
0e7fe2
-
0e7fe2
 	/* simple case */
0e7fe2
 	origin = gs_app_get_origin (app);
0e7fe2
-	if (origin != NULL && gs_utils_strv_fnmatch (sources, origin)) {
0e7fe2
+	if (origin != NULL && (g_hash_table_contains (repos, origin) ||
0e7fe2
+	    (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, origin)))) {
0e7fe2
 		gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
0e7fe2
 		return TRUE;
0e7fe2
 	}
0e7fe2
@@ -103,7 +118,8 @@ refine_app (GsPlugin             *plugin,
0e7fe2
 	 * provenance quirk to the system-configured repositories (but not
0e7fe2
 	 * user-configured ones). */
0e7fe2
 	if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY &&
0e7fe2
-	    gs_utils_strv_fnmatch (sources, gs_app_get_id (app))) {
0e7fe2
+	    (g_hash_table_contains (repos, gs_app_get_id (app)) ||
0e7fe2
+	    (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, gs_app_get_id (app))))) {
0e7fe2
 		if (gs_app_get_scope (app) != AS_COMPONENT_SCOPE_USER)
0e7fe2
 			gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
0e7fe2
 		return TRUE;
0e7fe2
@@ -118,7 +134,8 @@ refine_app (GsPlugin             *plugin,
0e7fe2
 		return TRUE;
0e7fe2
 	if (g_str_has_prefix (origin + 1, "installed:"))
0e7fe2
 		origin += 10;
0e7fe2
-	if (gs_utils_strv_fnmatch (sources, origin + 1)) {
0e7fe2
+	if (g_hash_table_contains (repos, origin + 1) ||
0e7fe2
+	    (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, origin + 1))) {
0e7fe2
 		gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
0e7fe2
 		return TRUE;
0e7fe2
 	}
0e7fe2
@@ -133,17 +150,21 @@ gs_plugin_refine (GsPlugin             *plugin,
0e7fe2
 		  GError              **error)
0e7fe2
 {
0e7fe2
 	GsPluginData *priv = gs_plugin_get_data (plugin);
0e7fe2
+	g_autoptr(GHashTable) repos = NULL;
0e7fe2
+	g_autoptr(GPtrArray) wildcards = NULL;
0e7fe2
 
0e7fe2
 	/* nothing to do here */
0e7fe2
 	if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0)
0e7fe2
 		return TRUE;
0e7fe2
+	repos = g_hash_table_ref (priv->repos);
0e7fe2
+	wildcards = priv->wildcards != NULL ? g_ptr_array_ref (priv->wildcards) : NULL;
0e7fe2
 	/* nothing to search */
0e7fe2
-	if (priv->sources == NULL || priv->sources[0] == NULL)
0e7fe2
+	if (g_hash_table_size (repos) == 0)
0e7fe2
 		return TRUE;
0e7fe2
 
0e7fe2
 	for (guint i = 0; i < gs_app_list_length (list); i++) {
0e7fe2
 		GsApp *app = gs_app_list_index (list, i);
0e7fe2
-		if (!refine_app (plugin, app, flags, cancellable, error))
0e7fe2
+		if (!refine_app (plugin, app, flags, repos, wildcards, cancellable, error))
0e7fe2
 			return FALSE;
0e7fe2
 	}
0e7fe2
 
0e7fe2
-- 
0e7fe2
GitLab
0e7fe2
0e7fe2
0e7fe2
From b5e3356aff5fcd257248f9bb697e272c879249ae Mon Sep 17 00:00:00 2001
0e7fe2
From: Milan Crha <mcrha@redhat.com>
0e7fe2
Date: Tue, 5 Oct 2021 13:03:44 +0200
0e7fe2
Subject: [PATCH 3/4] settings: Add 'required-repos' key
0e7fe2
0e7fe2
To be used to list repositories, which cannot be removed or disabled.
0e7fe2
It's a complementary option for the 'official-repos' key.
0e7fe2
---
0e7fe2
 data/org.gnome.software.gschema.xml | 4 ++++
0e7fe2
 1 file changed, 4 insertions(+)
0e7fe2
0e7fe2
diff --git a/data/org.gnome.software.gschema.xml b/data/org.gnome.software.gschema.xml
0e7fe2
index db1c27ce4..0e5706b7c 100644
0e7fe2
--- a/data/org.gnome.software.gschema.xml
0e7fe2
+++ b/data/org.gnome.software.gschema.xml
0e7fe2
@@ -94,6 +94,10 @@
0e7fe2
       <default>[]</default>
0e7fe2
       <summary>A list of official repositories that should not be considered 3rd party</summary>
0e7fe2
     </key>
0e7fe2
+    <key name="required-repos" type="as">
0e7fe2
+      <default>[]</default>
0e7fe2
+      <summary>A list of required repositories that cannot be disabled or removed</summary>
0e7fe2
+    </key>
0e7fe2
     <key name="free-repos" type="as">
0e7fe2
       <default>[]</default>
0e7fe2
       <summary>A list of official repositories that should be considered free software</summary>
0e7fe2
-- 
0e7fe2
GitLab
0e7fe2
0e7fe2
0e7fe2
From d6b8b206a596bb520a0b77066898b44a5ef18920 Mon Sep 17 00:00:00 2001
0e7fe2
From: Milan Crha <mcrha@redhat.com>
0e7fe2
Date: Tue, 5 Oct 2021 14:16:56 +0200
0e7fe2
Subject: [PATCH 4/4] gs-plugin-provenance: Handle also 'required-repos' key
0e7fe2
0e7fe2
Let it handle also 'required-repos' settings key, beside the 'official-repos'
0e7fe2
key, which are close enough to share the same code and memory. With this
0e7fe2
done the repositories can be marked as compulsory, independently from the official
0e7fe2
repositories.
0e7fe2
0e7fe2
Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1479
0e7fe2
---
0e7fe2
 plugins/core/gs-plugin-provenance.c | 142 +++++++++++++++++++++-------
0e7fe2
 1 file changed, 108 insertions(+), 34 deletions(-)
0e7fe2
0e7fe2
diff --git a/plugins/core/gs-plugin-provenance.c b/plugins/core/gs-plugin-provenance.c
0e7fe2
index a72c25a27..22f3c98e1 100644
0e7fe2
--- a/plugins/core/gs-plugin-provenance.c
0e7fe2
+++ b/plugins/core/gs-plugin-provenance.c
0e7fe2
@@ -14,26 +14,61 @@
0e7fe2
 /*
0e7fe2
  * SECTION:
0e7fe2
  * Sets the package provenance to TRUE if installed by an official
0e7fe2
- * software source.
0e7fe2
+ * software source. Also sets compulsory quirk when a required repository.
0e7fe2
  */
0e7fe2
 
0e7fe2
 struct GsPluginData {
0e7fe2
 	GSettings		*settings;
0e7fe2
-	GHashTable		*repos; /* gchar *name ~> NULL */
0e7fe2
-	GPtrArray		*wildcards; /* non-NULL, when have names with wildcards */
0e7fe2
+	GHashTable		*repos; /* gchar *name ~> guint flags */
0e7fe2
+	GPtrArray		*provenance_wildcards; /* non-NULL, when have names with wildcards */
0e7fe2
+	GPtrArray		*compulsory_wildcards; /* non-NULL, when have names with wildcards */
0e7fe2
 };
0e7fe2
 
0e7fe2
+static GHashTable *
0e7fe2
+gs_plugin_provenance_remove_by_flag (GHashTable *old_repos,
0e7fe2
+				     GsAppQuirk quirk)
0e7fe2
+{
0e7fe2
+	GHashTable *new_repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
0e7fe2
+	GHashTableIter iter;
0e7fe2
+	gpointer key, value;
0e7fe2
+	g_hash_table_iter_init (&iter, old_repos);
0e7fe2
+	while (g_hash_table_iter_next (&iter, &key, &value)) {
0e7fe2
+		guint flags = GPOINTER_TO_UINT (value);
0e7fe2
+		flags = flags & (~quirk);
0e7fe2
+		if (flags != 0)
0e7fe2
+			g_hash_table_insert (new_repos, g_strdup (key), GUINT_TO_POINTER (flags));
0e7fe2
+	}
0e7fe2
+	return new_repos;
0e7fe2
+}
0e7fe2
+
0e7fe2
+static void
0e7fe2
+gs_plugin_provenance_add_quirks (GsApp *app,
0e7fe2
+				 guint quirks)
0e7fe2
+{
0e7fe2
+	GsAppQuirk array[] = {
0e7fe2
+		GS_APP_QUIRK_PROVENANCE,
0e7fe2
+		GS_APP_QUIRK_COMPULSORY
0e7fe2
+	};
0e7fe2
+	for (guint ii = 0; ii < G_N_ELEMENTS (array); ii++) {
0e7fe2
+		if ((quirks & array[ii]) != 0)
0e7fe2
+			gs_app_add_quirk (app, array[ii]);
0e7fe2
+	}
0e7fe2
+}
0e7fe2
+
0e7fe2
 static gchar **
0e7fe2
-gs_plugin_provenance_get_sources (GsPlugin *plugin)
0e7fe2
+gs_plugin_provenance_get_sources (GsPlugin *plugin,
0e7fe2
+				  const gchar *key)
0e7fe2
 {
0e7fe2
 	GsPluginData *priv = gs_plugin_get_data (plugin);
0e7fe2
 	const gchar *tmp;
0e7fe2
 	tmp = g_getenv ("GS_SELF_TEST_PROVENANCE_SOURCES");
0e7fe2
 	if (tmp != NULL) {
0e7fe2
+		if (g_strcmp0 (key, "required-repos") == 0)
0e7fe2
+			return NULL;
0e7fe2
 		g_debug ("using custom provenance sources of %s", tmp);
0e7fe2
 		return g_strsplit (tmp, ",", -1);
0e7fe2
 	}
0e7fe2
-	return g_settings_get_strv (priv->settings, "official-repos");
0e7fe2
+	return g_settings_get_strv (priv->settings, key);
0e7fe2
 }
0e7fe2
 
0e7fe2
 static void
0e7fe2
@@ -42,25 +77,43 @@ gs_plugin_provenance_settings_changed_cb (GSettings *settings,
0e7fe2
 					  GsPlugin *plugin)
0e7fe2
 {
0e7fe2
 	GsPluginData *priv = gs_plugin_get_data (plugin);
0e7fe2
+	GsAppQuirk quirk = GS_APP_QUIRK_NONE;
0e7fe2
+	GPtrArray **pwildcards = NULL;
0e7fe2
+
0e7fe2
 	if (g_strcmp0 (key, "official-repos") == 0) {
0e7fe2
+		quirk = GS_APP_QUIRK_PROVENANCE;
0e7fe2
+		pwildcards = &priv->provenance_wildcards;
0e7fe2
+	} else if (g_strcmp0 (key, "required-repos") == 0) {
0e7fe2
+		quirk = GS_APP_QUIRK_COMPULSORY;
0e7fe2
+		pwildcards = &priv->compulsory_wildcards;
0e7fe2
+	}
0e7fe2
+
0e7fe2
+	if (quirk != GS_APP_QUIRK_NONE) {
0e7fe2
 		/* The keys are stolen by the hash table, thus free only the array */
0e7fe2
 		g_autofree gchar **repos = NULL;
0e7fe2
-		g_hash_table_remove_all (priv->repos);
0e7fe2
-		g_clear_pointer (&priv->wildcards, g_ptr_array_unref);
0e7fe2
-		repos = gs_plugin_provenance_get_sources (plugin);
0e7fe2
+		g_autoptr(GHashTable) old_repos = priv->repos;
0e7fe2
+		g_autoptr(GPtrArray) old_wildcards = *pwildcards;
0e7fe2
+		GHashTable *new_repos = gs_plugin_provenance_remove_by_flag (old_repos, quirk);
0e7fe2
+		GPtrArray *new_wildcards = NULL;
0e7fe2
+		repos = gs_plugin_provenance_get_sources (plugin, key);
0e7fe2
 		for (guint ii = 0; repos && repos[ii]; ii++) {
0e7fe2
-			if (strchr (repos[ii], '*') ||
0e7fe2
-			    strchr (repos[ii], '?') ||
0e7fe2
-			    strchr (repos[ii], '[')) {
0e7fe2
-				if (priv->wildcards == NULL)
0e7fe2
-					priv->wildcards = g_ptr_array_new_with_free_func (g_free);
0e7fe2
-				g_ptr_array_add (priv->wildcards, g_steal_pointer (&(repos[ii])));
0e7fe2
+			gchar *repo = g_steal_pointer (&(repos[ii]));
0e7fe2
+			if (strchr (repo, '*') ||
0e7fe2
+			    strchr (repo, '?') ||
0e7fe2
+			    strchr (repo, '[')) {
0e7fe2
+				if (new_wildcards == NULL)
0e7fe2
+					new_wildcards = g_ptr_array_new_with_free_func (g_free);
0e7fe2
+				g_ptr_array_add (new_wildcards, repo);
0e7fe2
 			} else {
0e7fe2
-				g_hash_table_insert (priv->repos, g_steal_pointer (&(repos[ii])), NULL);
0e7fe2
+				g_hash_table_insert (new_repos, repo,
0e7fe2
+					GUINT_TO_POINTER (quirk |
0e7fe2
+					GPOINTER_TO_UINT (g_hash_table_lookup (new_repos, repo))));
0e7fe2
 			}
0e7fe2
 		}
0e7fe2
-		if (priv->wildcards != NULL)
0e7fe2
-			g_ptr_array_add (priv->wildcards, NULL);
0e7fe2
+		if (new_wildcards != NULL)
0e7fe2
+			g_ptr_array_add (new_wildcards, NULL);
0e7fe2
+		priv->repos = new_repos;
0e7fe2
+		*pwildcards = new_wildcards;
0e7fe2
 	}
0e7fe2
 }
0e7fe2
 
0e7fe2
@@ -73,6 +126,7 @@ gs_plugin_initialize (GsPlugin *plugin)
0e7fe2
 	g_signal_connect (priv->settings, "changed",
0e7fe2
 			  G_CALLBACK (gs_plugin_provenance_settings_changed_cb), plugin);
0e7fe2
 	gs_plugin_provenance_settings_changed_cb (priv->settings, "official-repos", plugin);
0e7fe2
+	gs_plugin_provenance_settings_changed_cb (priv->settings, "required-repos", plugin);
0e7fe2
 
0e7fe2
 	/* after the package source is set */
0e7fe2
 	gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "dummy");
0e7fe2
@@ -85,20 +139,42 @@ gs_plugin_destroy (GsPlugin *plugin)
0e7fe2
 {
0e7fe2
 	GsPluginData *priv = gs_plugin_get_data (plugin);
0e7fe2
 	g_hash_table_unref (priv->repos);
0e7fe2
-	g_clear_pointer (&priv->wildcards, g_ptr_array_unref);
0e7fe2
+	g_clear_pointer (&priv->provenance_wildcards, g_ptr_array_unref);
0e7fe2
+	g_clear_pointer (&priv->compulsory_wildcards, g_ptr_array_unref);
0e7fe2
 	g_object_unref (priv->settings);
0e7fe2
 }
0e7fe2
 
0e7fe2
+static gboolean
0e7fe2
+gs_plugin_provenance_find_repo_flags (GHashTable *repos,
0e7fe2
+				      GPtrArray *provenance_wildcards,
0e7fe2
+				      GPtrArray *compulsory_wildcards,
0e7fe2
+				      const gchar *repo,
0e7fe2
+				      guint *out_flags)
0e7fe2
+{
0e7fe2
+	if (repo == NULL || *repo == '\0')
0e7fe2
+		return FALSE;
0e7fe2
+	*out_flags = GPOINTER_TO_UINT (g_hash_table_lookup (repos, repo));
0e7fe2
+	if (provenance_wildcards != NULL &&
0e7fe2
+	    gs_utils_strv_fnmatch ((gchar **) provenance_wildcards->pdata, repo))
0e7fe2
+		*out_flags |= GS_APP_QUIRK_PROVENANCE;
0e7fe2
+	if (compulsory_wildcards != NULL &&
0e7fe2
+	    gs_utils_strv_fnmatch ((gchar **) compulsory_wildcards->pdata, repo))
0e7fe2
+		*out_flags |= GS_APP_QUIRK_COMPULSORY;
0e7fe2
+	return *out_flags != 0;
0e7fe2
+}
0e7fe2
+
0e7fe2
 static gboolean
0e7fe2
 refine_app (GsPlugin             *plugin,
0e7fe2
 	    GsApp                *app,
0e7fe2
 	    GsPluginRefineFlags   flags,
0e7fe2
 	    GHashTable		 *repos,
0e7fe2
-	    GPtrArray		 *wildcards,
0e7fe2
+	    GPtrArray		 *provenance_wildcards,
0e7fe2
+	    GPtrArray		 *compulsory_wildcards,
0e7fe2
 	    GCancellable         *cancellable,
0e7fe2
 	    GError              **error)
0e7fe2
 {
0e7fe2
 	const gchar *origin;
0e7fe2
+	guint quirks;
0e7fe2
 
0e7fe2
 	/* not required */
0e7fe2
 	if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0)
0e7fe2
@@ -108,9 +184,8 @@ refine_app (GsPlugin             *plugin,
0e7fe2
 
0e7fe2
 	/* simple case */
0e7fe2
 	origin = gs_app_get_origin (app);
0e7fe2
-	if (origin != NULL && (g_hash_table_contains (repos, origin) ||
0e7fe2
-	    (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, origin)))) {
0e7fe2
-		gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
0e7fe2
+	if (gs_plugin_provenance_find_repo_flags (repos, provenance_wildcards, compulsory_wildcards, origin, &quirks)) {
0e7fe2
+		gs_plugin_provenance_add_quirks (app, quirks);
0e7fe2
 		return TRUE;
0e7fe2
 	}
0e7fe2
 
0e7fe2
@@ -118,10 +193,9 @@ refine_app (GsPlugin             *plugin,
0e7fe2
 	 * provenance quirk to the system-configured repositories (but not
0e7fe2
 	 * user-configured ones). */
0e7fe2
 	if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY &&
0e7fe2
-	    (g_hash_table_contains (repos, gs_app_get_id (app)) ||
0e7fe2
-	    (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, gs_app_get_id (app))))) {
0e7fe2
+	    gs_plugin_provenance_find_repo_flags (repos, provenance_wildcards, compulsory_wildcards, gs_app_get_id (app), &quirks)) {
0e7fe2
 		if (gs_app_get_scope (app) != AS_COMPONENT_SCOPE_USER)
0e7fe2
-			gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
0e7fe2
+			gs_plugin_provenance_add_quirks (app, quirks);
0e7fe2
 		return TRUE;
0e7fe2
 	}
0e7fe2
 
0e7fe2
@@ -134,11 +208,9 @@ refine_app (GsPlugin             *plugin,
0e7fe2
 		return TRUE;
0e7fe2
 	if (g_str_has_prefix (origin + 1, "installed:"))
0e7fe2
 		origin += 10;
0e7fe2
-	if (g_hash_table_contains (repos, origin + 1) ||
0e7fe2
-	    (wildcards != NULL && gs_utils_strv_fnmatch ((gchar **) wildcards->pdata, origin + 1))) {
0e7fe2
-		gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
0e7fe2
-		return TRUE;
0e7fe2
-	}
0e7fe2
+	if (gs_plugin_provenance_find_repo_flags (repos, provenance_wildcards, compulsory_wildcards, origin + 1, &quirks))
0e7fe2
+		gs_plugin_provenance_add_quirks (app, quirks);
0e7fe2
+
0e7fe2
 	return TRUE;
0e7fe2
 }
0e7fe2
 
0e7fe2
@@ -151,20 +223,22 @@ gs_plugin_refine (GsPlugin             *plugin,
0e7fe2
 {
0e7fe2
 	GsPluginData *priv = gs_plugin_get_data (plugin);
0e7fe2
 	g_autoptr(GHashTable) repos = NULL;
0e7fe2
-	g_autoptr(GPtrArray) wildcards = NULL;
0e7fe2
+	g_autoptr(GPtrArray) provenance_wildcards = NULL;
0e7fe2
+	g_autoptr(GPtrArray) compulsory_wildcards = NULL;
0e7fe2
 
0e7fe2
 	/* nothing to do here */
0e7fe2
 	if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE) == 0)
0e7fe2
 		return TRUE;
0e7fe2
 	repos = g_hash_table_ref (priv->repos);
0e7fe2
-	wildcards = priv->wildcards != NULL ? g_ptr_array_ref (priv->wildcards) : NULL;
0e7fe2
+	provenance_wildcards = priv->provenance_wildcards != NULL ? g_ptr_array_ref (priv->provenance_wildcards) : NULL;
0e7fe2
+	compulsory_wildcards = priv->compulsory_wildcards != NULL ? g_ptr_array_ref (priv->compulsory_wildcards) : NULL;
0e7fe2
 	/* nothing to search */
0e7fe2
-	if (g_hash_table_size (repos) == 0)
0e7fe2
+	if (g_hash_table_size (repos) == 0 && provenance_wildcards == NULL && compulsory_wildcards == NULL)
0e7fe2
 		return TRUE;
0e7fe2
 
0e7fe2
 	for (guint i = 0; i < gs_app_list_length (list); i++) {
0e7fe2
 		GsApp *app = gs_app_list_index (list, i);
0e7fe2
-		if (!refine_app (plugin, app, flags, repos, wildcards, cancellable, error))
0e7fe2
+		if (!refine_app (plugin, app, flags, repos, provenance_wildcards, compulsory_wildcards, cancellable, error))
0e7fe2
 			return FALSE;
0e7fe2
 	}
0e7fe2
 
0e7fe2
-- 
0e7fe2
GitLab
0e7fe2