Hello community,

here is the log from the commit of package gnome-software for openSUSE:Factory 
checked in at 2019-06-02 15:12:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gnome-software (Old)
 and      /work/SRC/openSUSE:Factory/.gnome-software.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gnome-software"

Sun Jun  2 15:12:41 2019 rev:64 rq:705582 version:3.32.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/gnome-software/gnome-software.changes    
2019-05-10 09:17:33.368257500 +0200
+++ /work/SRC/openSUSE:Factory/.gnome-software.new.5148/gnome-software.changes  
2019-06-02 15:12:48.298171186 +0200
@@ -1,0 +2,18 @@
+Fri May 24 20:17:42 UTC 2019 - Bjørn Lie <bjorn....@gmail.com>
+
+- Update to version 3.32.3:
+  + Add missing XbSilo locking, hopefully fixing a large number of
+    reported crashes.
+  + Fix a regression that caused the fonts category to go missing.
+  + Show a placeholder on the details page when we don't have the
+    actual icon.
+  + Plug a large memory leak.
+  + Use nicer arrows for version numbers on the updates page.
+  + Fix an issue that led to screenshots not being correctly scaled
+    on hidpi.
+  + flatpak:
+    - Fix several double-uses of GErrors.
+    - Handle failure of a libflatpak function updating permissions.
+  + rpm-ostree: Implement what-provides decompose.
+
+-------------------------------------------------------------------

Old:
----
  gnome-software-3.32.2.tar.xz

New:
----
  gnome-software-3.32.3.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gnome-software.spec ++++++
--- /var/tmp/diff_new_pack.zTAlgd/_old  2019-06-02 15:12:50.886170066 +0200
+++ /var/tmp/diff_new_pack.zTAlgd/_new  2019-06-02 15:12:50.890170064 +0200
@@ -18,7 +18,7 @@
 
 %define gs_plugin_api 13
 Name:           gnome-software
-Version:        3.32.2
+Version:        3.32.3
 Release:        0
 Summary:        GNOME Software Store
 License:        GPL-2.0-or-later

++++++ gnome-software-3.32.2.tar.xz -> gnome-software-3.32.3.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/NEWS 
new/gnome-software-3.32.3/NEWS
--- old/gnome-software-3.32.2/NEWS      2019-05-07 15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/NEWS      2019-05-24 21:51:51.000000000 +0200
@@ -1,3 +1,19 @@
+Version 3.32.3
+~~~~~~~~~~~~~~
+Released: 2019-05-24
+
+This is a stable release with the following changes:
+ * Add missing XbSilo locking, hopefully fixing a large number of reported
+   crashes
+ * Fix a regression that caused the fonts category to go missing
+ * Show a placeholder on the details page when we don't have the actual icon
+ * Plug a large memory leak
+ * Use nicer arrows for version numbers on the updates page
+ * Fix an issue that led to screenshots not being correctly scaled on hidpi
+ * flatpak: Fix several double-uses of GErrors
+ * flatpak: Handle failure of a libflatpak function updating permissions
+ * rpm-ostree: Implement what-provides decompose
+
 Version 3.32.2
 ~~~~~~~~~~~~~~
 Released: 2019-05-07
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/RELEASE 
new/gnome-software-3.32.3/RELEASE
--- old/gnome-software-3.32.2/RELEASE   2019-05-07 15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/RELEASE   2019-05-24 21:51:51.000000000 +0200
@@ -2,14 +2,14 @@
 
 Write release entries:
 
-git log --format="%s" --cherry-pick --right-only 3.32.1... | grep -i -v 
trivial | grep -v Merge | sort | uniq
+git log --format="%s" --cherry-pick --right-only 3.32.2... | grep -i -v 
trivial | grep -v Merge | sort | uniq
 Add any user visible changes into 
data/appdata/org.gnome.Software.appdata.xml.in
 
 Generate NEWS file:
 appstream-util appdata-to-news data/appdata/org.gnome.Software.appdata.xml.in 
> NEWS
 
-git commit -a -m "Release version 3.32.2"
-git tag -s 3.32.2 -m "==== Version 3.32.2 ===="
+git commit -a -m "Release version 3.32.3"
+git tag -s 3.32.3 -m "==== Version 3.32.3 ===="
 <enter password>
 
 ninja-build dist
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/contrib/gnome-software.spec.in 
new/gnome-software-3.32.3/contrib/gnome-software.spec.in
--- old/gnome-software-3.32.2/contrib/gnome-software.spec.in    2019-05-07 
15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/contrib/gnome-software.spec.in    2019-05-24 
21:51:51.000000000 +0200
@@ -150,7 +150,7 @@
 %{_mandir}/man1/gnome-software.1.gz
 %{_datadir}/icons/hicolor/*/apps/org.gnome.Software.svg
 %{_datadir}/icons/hicolor/symbolic/apps/org.gnome.Software-symbolic.svg
-%{_datadir}/icons/hicolor/symbolic/status/software-installed-symbolic.svg
+%{_datadir}/icons/hicolor/scalable/status/software-installed-symbolic.svg
 %{_datadir}/gnome-software/featured-*.svg
 %{_datadir}/gnome-software/featured-*.jpg
 %{_datadir}/metainfo/org.gnome.Software.appdata.xml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-software-3.32.2/data/appdata/org.gnome.Software.appdata.xml.in 
new/gnome-software-3.32.3/data/appdata/org.gnome.Software.appdata.xml.in
--- old/gnome-software-3.32.2/data/appdata/org.gnome.Software.appdata.xml.in    
2019-05-07 15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/data/appdata/org.gnome.Software.appdata.xml.in    
2019-05-24 21:51:51.000000000 +0200
@@ -46,6 +46,24 @@
    Validate with `appstream-util validate *.appdata.xml`
   -->
   <releases>
+    <release date="2019-05-24" version="3.32.3">
+      <description>
+        <p>
+          This is a stable release with the following changes:
+        </p>
+        <ul>
+          <li>Add missing XbSilo locking, hopefully fixing a large number of 
reported crashes</li>
+          <li>Fix a regression that caused the fonts category to go 
missing</li>
+          <li>Show a placeholder on the details page when we don't have the 
actual icon</li>
+          <li>Plug a large memory leak</li>
+          <li>Use nicer arrows for version numbers on the updates page</li>
+          <li>Fix an issue that led to screenshots not being correctly scaled 
on hidpi</li>
+          <li>flatpak: Fix several double-uses of GErrors</li>
+          <li>flatpak: Handle failure of a libflatpak function updating 
permissions</li>
+          <li>rpm-ostree: Implement what-provides decompose</li>
+        </ul>
+      </description>
+    </release>
     <release date="2019-05-07" version="3.32.2">
       <description>
         <p>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/lib/gnome-software.h 
new/gnome-software-3.32.3/lib/gnome-software.h
--- old/gnome-software-3.32.2/lib/gnome-software.h      2019-05-07 
15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/lib/gnome-software.h      2019-05-24 
21:51:51.000000000 +0200
@@ -15,6 +15,7 @@
 #include <gs-app-list.h>
 #include <gs-app-collation.h>
 #include <gs-auth.h>
+#include <gs-autocleanups.h>
 #include <gs-category.h>
 #include <gs-os-release.h>
 #include <gs-plugin.h>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/lib/gs-autocleanups.h 
new/gnome-software-3.32.3/lib/gs-autocleanups.h
--- old/gnome-software-3.32.2/lib/gs-autocleanups.h     1970-01-01 
01:00:00.000000000 +0100
+++ new/gnome-software-3.32.3/lib/gs-autocleanups.h     2019-05-24 
21:51:51.000000000 +0200
@@ -0,0 +1,51 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Kalev Lember <klem...@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+G_BEGIN_DECLS
+
+#if !GLIB_CHECK_VERSION(2, 61, 1)
+
+/* Backported GRWLock autoptr support for older glib versions */
+
+typedef void GRWLockWriterLocker;
+
+static inline GRWLockWriterLocker *
+g_rw_lock_writer_locker_new (GRWLock *rw_lock)
+{
+       g_rw_lock_writer_lock (rw_lock);
+       return (GRWLockWriterLocker *) rw_lock;
+}
+
+static inline void
+g_rw_lock_writer_locker_free (GRWLockWriterLocker *locker)
+{
+       g_rw_lock_writer_unlock ((GRWLock *) locker);
+}
+
+typedef void GRWLockReaderLocker;
+
+static inline GRWLockReaderLocker *
+g_rw_lock_reader_locker_new (GRWLock *rw_lock)
+{
+       g_rw_lock_reader_lock (rw_lock);
+       return (GRWLockReaderLocker *) rw_lock;
+}
+
+static inline void
+g_rw_lock_reader_locker_free (GRWLockReaderLocker *locker)
+{
+       g_rw_lock_reader_unlock ((GRWLock *) locker);
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GRWLockWriterLocker, 
g_rw_lock_writer_locker_free)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GRWLockReaderLocker, 
g_rw_lock_reader_locker_free)
+
+#endif
+
+G_END_DECLS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/lib/gs-plugin.c 
new/gnome-software-3.32.3/lib/gs-plugin.c
--- old/gnome-software-3.32.2/lib/gs-plugin.c   2019-05-07 15:11:08.000000000 
+0200
+++ new/gnome-software-3.32.3/lib/gs-plugin.c   2019-05-24 21:51:51.000000000 
+0200
@@ -225,6 +225,8 @@
        if (priv->module != NULL)
                g_module_close (priv->module);
 #endif
+
+       G_OBJECT_CLASS (gs_plugin_parent_class)->finalize (object);
 }
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/meson.build 
new/gnome-software-3.32.3/meson.build
--- old/gnome-software-3.32.2/meson.build       2019-05-07 15:11:08.000000000 
+0200
+++ new/gnome-software-3.32.3/meson.build       2019-05-24 21:51:51.000000000 
+0200
@@ -1,5 +1,5 @@
 project('gnome-software', 'c',
-  version : '3.32.2',
+  version : '3.32.3',
   license : 'GPL-2.0+',
   default_options : ['warning_level=1', 'c_std=c99'],
   meson_version : '>=0.46.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/plugins/core/gs-appstream.c 
new/gnome-software-3.32.3/plugins/core/gs-appstream.c
--- old/gnome-software-3.32.2/plugins/core/gs-appstream.c       2019-05-07 
15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/plugins/core/gs-appstream.c       2019-05-24 
21:51:51.000000000 +0200
@@ -1174,9 +1174,11 @@
                GsCategory *parent = GS_CATEGORY (g_ptr_array_index (list, j));
                GPtrArray *children = gs_category_get_children (parent);
 
-               for (guint i = 1; i < children->len; i++) { /* 1 to ignore all 
*/
+               for (guint i = 0; i < children->len; i++) {
                        GsCategory *cat = g_ptr_array_index (children, i);
                        GPtrArray *groups = gs_category_get_desktop_groups 
(cat);
+                       if (g_strcmp0 (gs_category_get_id (cat), "all") == 0)
+                               continue;
                        for (guint k = 0; k < groups->len; k++) {
                                const gchar *group = g_ptr_array_index (groups, 
k);
                                guint cnt = 
gs_appstream_count_component_for_groups (plugin, silo, group);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-software-3.32.2/plugins/core/gs-plugin-appstream.c 
new/gnome-software-3.32.3/plugins/core/gs-plugin-appstream.c
--- old/gnome-software-3.32.2/plugins/core/gs-plugin-appstream.c        
2019-05-07 15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/plugins/core/gs-plugin-appstream.c        
2019-05-24 21:51:51.000000000 +0200
@@ -27,6 +27,7 @@
 
 struct GsPluginData {
        XbSilo                  *silo;
+       GRWLock                  silo_lock;
        GSettings               *settings;
 };
 
@@ -35,6 +36,10 @@
 {
        GsPluginData *priv = gs_plugin_alloc_data (plugin, 
sizeof(GsPluginData));
 
+       /* XbSilo needs external locking as we destroy the silo and build a new
+        * one when something changes */
+       g_rw_lock_init (&priv->silo_lock);
+
        /* need package name */
        gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "dpkg");
 
@@ -48,6 +53,7 @@
        GsPluginData *priv = gs_plugin_get_data (plugin);
        g_object_unref (priv->silo);
        g_object_unref (priv->settings);
+       g_rw_lock_clear (&priv->silo_lock);
 }
 
 static gboolean
@@ -422,14 +428,20 @@
        g_autoptr(XbBuilder) builder = xb_builder_new ();
        g_autoptr(XbNode) n = NULL;
        g_autoptr(GFile) file = NULL;
+       g_autoptr(GRWLockReaderLocker) reader_locker = NULL;
+       g_autoptr(GRWLockWriterLocker) writer_locker = NULL;
        g_autoptr(GPtrArray) parent_appdata = g_ptr_array_new_with_free_func 
(g_free);
        g_autoptr(GPtrArray) parent_appstream = g_ptr_array_new_with_free_func 
(g_free);
 
+
+       reader_locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        /* everything is okay */
        if (priv->silo != NULL && xb_silo_is_valid (priv->silo))
                return TRUE;
+       g_clear_pointer (&reader_locker, g_rw_lock_reader_locker_free);
 
        /* drat! silo needs regenerating */
+       writer_locker = g_rw_lock_writer_locker_new (&priv->silo_lock);
        g_clear_object (&priv->silo);
 
        /* verbose profiling */
@@ -571,6 +583,7 @@
        g_autofree gchar *path = NULL;
        g_autofree gchar *scheme = NULL;
        g_autofree gchar *xpath = NULL;
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
        g_autoptr(GsApp) app = NULL;
        g_autoptr(XbNode) component = NULL;
 
@@ -583,6 +596,8 @@
        if (g_strcmp0 (scheme, "appstream") != 0)
                return TRUE;
 
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
+
        /* create app */
        path = gs_utils_get_url_path (url);
        xpath = g_strdup_printf ("components/component/id[text()='%s']", path);
@@ -648,8 +663,11 @@
        GsPluginData *priv = gs_plugin_get_data (plugin);
        g_autofree gchar *xpath = NULL;
        g_autoptr(GError) error_local = NULL;
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
        g_autoptr(XbNode) component = NULL;
 
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
+
        xpath = g_strdup_printf ("component/id[text()='%s']", gs_app_get_id 
(app));
        component = xb_silo_query_first (priv->silo, xpath, &error_local);
        if (component == NULL) {
@@ -674,6 +692,7 @@
        GsPluginData *priv = gs_plugin_get_data (plugin);
        const gchar *id;
        g_autoptr(GError) error_local = NULL;
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
        g_autoptr(GString) xpath = g_string_new (NULL);
        g_autoptr(GPtrArray) components = NULL;
 
@@ -682,6 +701,8 @@
        if (id == NULL)
                return TRUE;
 
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
+
        /* look in AppStream then fall back to AppData */
        xb_string_append_union (xpath, 
"components/component/id[text()='%s']/../pkgname/..", id);
        xb_string_append_union (xpath, 
"component/id[text()='%s']/../pkgname/..", id);
@@ -731,8 +752,11 @@
        for (guint j = 0; j < sources->len; j++) {
                const gchar *pkgname = g_ptr_array_index (sources, j);
                g_autofree gchar *xpath = NULL;
+               g_autoptr(GRWLockReaderLocker) locker = NULL;
                g_autoptr(GPtrArray) components = NULL;
 
+               locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
+
                xpath = g_strdup_printf 
("components/component/pkgname[text()='%s']/..",
                                         pkgname);
                components = xb_silo_query (priv->silo, xpath, 0, &error_local);
@@ -799,6 +823,7 @@
        const gchar *id;
        g_autofree gchar *xpath = NULL;
        g_autoptr(GError) error_local = NULL;
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
        g_autoptr(GPtrArray) components = NULL;
 
        /* check silo is valid */
@@ -810,6 +835,8 @@
        if (id == NULL)
                return TRUE;
 
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
+
        /* find all app with package names when matching any prefixes */
        xpath = g_strdup_printf 
("components/component/id[text()='%s']/../pkgname/..", id);
        components = xb_silo_query (priv->silo, xpath, 0, &error_local);
@@ -849,8 +876,12 @@
                             GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_plugin_appstream_check_silo (plugin, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        return gs_appstream_add_category_apps (plugin,
                                               priv->silo,
                                               category,
@@ -867,8 +898,12 @@
                      GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_plugin_appstream_check_silo (plugin, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        return gs_appstream_search (plugin,
                                    priv->silo,
                                    values,
@@ -884,12 +919,15 @@
                         GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
        g_autoptr(GPtrArray) components = NULL;
 
        /* check silo is valid */
        if (!gs_plugin_appstream_check_silo (plugin, cancellable, error))
                return FALSE;
 
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
+
        /* get all installed appdata files (notice no 'components/' prefix...) 
*/
        components = xb_silo_query (priv->silo, "component", 0, NULL);
        if (components == NULL)
@@ -913,8 +951,12 @@
                          GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_plugin_appstream_check_silo (plugin, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        return gs_appstream_add_categories (plugin, priv->silo, list,
                                            cancellable, error);
 }
@@ -926,8 +968,12 @@
                       GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_plugin_appstream_check_silo (plugin, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        return gs_appstream_add_popular (plugin, priv->silo, list, cancellable, 
error);
 }
 
@@ -938,8 +984,12 @@
                        GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_plugin_appstream_check_silo (plugin, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        return gs_appstream_add_featured (plugin, priv->silo, list, 
cancellable, error);
 }
 
@@ -951,8 +1001,12 @@
                      GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_plugin_appstream_check_silo (plugin, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        return gs_appstream_add_recent (plugin, priv->silo, list, age,
                                        cancellable, error);
 }
@@ -965,8 +1019,12 @@
                          GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_plugin_appstream_check_silo (plugin, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        return gs_appstream_add_alternates (plugin, priv->silo, app, list,
                                            cancellable, error);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-software-3.32.2/plugins/external-appstream/gs-plugin-external-appstream.c
 
new/gnome-software-3.32.3/plugins/external-appstream/gs-plugin-external-appstream.c
--- 
old/gnome-software-3.32.2/plugins/external-appstream/gs-plugin-external-appstream.c
 2019-05-07 15:11:08.000000000 +0200
+++ 
new/gnome-software-3.32.3/plugins/external-appstream/gs-plugin-external-appstream.c
 2019-05-24 21:51:51.000000000 +0200
@@ -261,7 +261,7 @@
        appstream_urls = g_settings_get_strv (priv->settings,
                                              "external-appstream-urls");
        for (guint i = 0; appstream_urls[i] != NULL; ++i) {
-               g_autoptr(GError) local_error = NULL;
+               g_autoptr(GError) error_local = NULL;
                if (!g_str_has_prefix (appstream_urls[i], "https")) {
                        g_warning ("Not considering %s as an external "
                                   "appstream source: please use an https URL",
@@ -272,9 +272,9 @@
                                                               
appstream_urls[i],
                                                               cache_age,
                                                               cancellable,
-                                                              &local_error)) {
+                                                              &error_local)) {
                        g_warning ("Failed to update external appstream file: 
%s",
-                                  local_error->message);
+                                  error_local->message);
                }
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/plugins/flatpak/gs-flatpak.c 
new/gnome-software-3.32.3/plugins/flatpak/gs-flatpak.c
--- old/gnome-software-3.32.2/plugins/flatpak/gs-flatpak.c      2019-05-07 
15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/plugins/flatpak/gs-flatpak.c      2019-05-24 
21:51:51.000000000 +0200
@@ -33,6 +33,7 @@
        AsAppScope               scope;
        GsPlugin                *plugin;
        XbSilo                  *silo;
+       GRWLock                  silo_lock;
        gchar                   *id;
        guint                    changed_id;
 };
@@ -162,6 +163,7 @@
        g_autoptr(GBytes) bytes = NULL;
        g_autoptr(GKeyFile) keyfile = NULL;
        GsAppPermissions permissions;
+       g_autoptr(GError) error_local = NULL;
 
        old_bytes = flatpak_installed_ref_load_metadata (FLATPAK_INSTALLED_REF 
(xref), NULL, NULL);
        old_keyfile = g_key_file_new ();
@@ -174,14 +176,21 @@
                                                                 
gs_app_get_origin (app),
                                                                 FLATPAK_REF 
(xref),
                                                                 NULL,
-                                                                NULL);
-       keyfile = g_key_file_new ();
-       g_key_file_load_from_data (keyfile,
-                                  g_bytes_get_data (bytes, NULL),
-                                  g_bytes_get_size (bytes),
-                                  0, NULL);
+                                                                &error_local);
+       if (bytes == NULL) {
+               g_debug ("Failed to get metadata for remote ‘%s’: %s",
+                        gs_app_get_origin (app), error_local->message);
+               g_clear_error (&error_local);
+               permissions = GS_APP_PERMISSIONS_UNKNOWN;
+       } else {
+               keyfile = g_key_file_new ();
+               g_key_file_load_from_data (keyfile,
+                                          g_bytes_get_data (bytes, NULL),
+                                          g_bytes_get_size (bytes),
+                                          0, NULL);
 
-       permissions = perms_from_metadata (keyfile) & ~perms_from_metadata 
(old_keyfile);
+               permissions = perms_from_metadata (keyfile) & 
~perms_from_metadata (old_keyfile);
+       }
 
        /* no new permissions set */
        if (permissions == GS_APP_PERMISSIONS_UNKNOWN)
@@ -499,8 +508,10 @@
 #else
                g_autoptr(GError) error_local = NULL;
                main_ref = gs_flatpak_get_xremote_main_ref (self, xremote, 
&error_local);
-               if (main_ref == NULL)
+               if (main_ref == NULL) {
                        g_warning ("failed to get main ref: %s", 
error_local->message);
+                       g_clear_error (&error_local);
+               }
 #endif
                if (main_ref != NULL) {
                        g_autoptr(XbBuilderFixup) fixup = NULL;
@@ -649,13 +660,18 @@
        g_autofree gchar *blobfn = NULL;
        g_autoptr(GFile) file = NULL;
        g_autoptr(GPtrArray) xremotes = NULL;
+       g_autoptr(GRWLockReaderLocker) reader_locker = NULL;
+       g_autoptr(GRWLockWriterLocker) writer_locker = NULL;
        g_autoptr(XbBuilder) builder = xb_builder_new ();
 
+       reader_locker = g_rw_lock_reader_locker_new (&self->silo_lock);
        /* everything is okay */
        if (self->silo != NULL && xb_silo_is_valid (self->silo))
                return TRUE;
+       g_clear_pointer (&reader_locker, g_rw_lock_reader_locker_free);
 
        /* drat! silo needs regenerating */
+       writer_locker = g_rw_lock_writer_locker_new (&self->silo_lock);
        g_clear_object (&self->silo);
 
        /* verbose profiling */
@@ -800,7 +816,7 @@
        g_autofree gchar *str = NULL;
        g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name 
(self->plugin));
        g_autoptr(GsFlatpakProgressHelper) phelper = NULL;
-       g_autoptr(GError) local_error = NULL;
+       g_autoptr(GError) error_local = NULL;
 
        /* TRANSLATORS: status text when downloading new metadata */
        str = g_strdup_printf (_("Getting flatpak metadata for %s…"), 
remote_name);
@@ -810,11 +826,11 @@
        if (!flatpak_installation_update_remote_sync (self->installation,
                                                      remote_name,
                                                      cancellable,
-                                                     &local_error)) {
+                                                     &error_local)) {
                g_debug ("Failed to update metadata for remote %s: %s\n",
-                        remote_name, local_error->message);
-               gs_flatpak_error_convert (&local_error);
-               g_propagate_error (error, g_steal_pointer (&local_error));
+                        remote_name, error_local->message);
+               gs_flatpak_error_convert (&error_local);
+               g_propagate_error (error, g_steal_pointer (&error_local));
                return FALSE;
        }
        phelper = gs_flatpak_progress_helper_new (self->plugin, app_dl);
@@ -1379,6 +1395,7 @@
                        g_debug ("Couldn't get the main app for updatable app 
extension %s: "
                                 "%s; adding the app itself to the updates 
list...",
                                 gs_app_get_unique_id (app), 
error_local->message);
+                       g_clear_error (&error_local);
                        main_app = g_object_ref (app);
                }
                gs_app_set_state (main_app, AS_APP_STATE_UPDATABLE_LIVE);
@@ -1411,6 +1428,7 @@
                                                                                
  &error_local)) {
                                        g_warning ("failed to get download 
size: %s",
                                                   error_local->message);
+                                       g_clear_error (&error_local);
                                        gs_app_set_size_download (main_app, 
GS_APP_SIZE_UNKNOWABLE);
                                } else {
                                        gs_app_set_size_download (main_app, 
download_size);
@@ -1445,8 +1463,10 @@
        }
 
        /* manually do this in case we created the first appstream file */
+       g_rw_lock_reader_lock (&self->silo_lock);
        if (self->silo != NULL)
                xb_silo_invalidate (self->silo);
+       g_rw_lock_reader_unlock (&self->silo_lock);
 
        /* update AppStream metadata */
        if (!gs_flatpak_refresh_appstream (self, cache_age, cancellable, error))
@@ -1636,20 +1656,17 @@
        return xref;
 }
 
-gboolean
-gs_flatpak_refine_app_state (GsFlatpak *self,
-                             GsApp *app,
-                             GCancellable *cancellable,
-                             GError **error)
+/* the _unlocked() version doesn't call gs_flatpak_rescan_appstream_store,
+ * in order to avoid taking the writer lock on self->silo_lock */
+static gboolean
+gs_flatpak_refine_app_state_unlocked (GsFlatpak *self,
+                                      GsApp *app,
+                                      GCancellable *cancellable,
+                                      GError **error)
 {
        g_autoptr(FlatpakInstalledRef) ref = NULL;
-       g_autoptr(GError) error_local = NULL;
        g_autoptr(GPtrArray) refs = NULL;
 
-       /* ensure valid */
-       if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
-               return FALSE;
-
        /* already found */
        if (gs_app_get_state (app) != AS_APP_STATE_UNKNOWN)
                return TRUE;
@@ -1724,6 +1741,19 @@
        return TRUE;
 }
 
+gboolean
+gs_flatpak_refine_app_state (GsFlatpak *self,
+                             GsApp *app,
+                             GCancellable *cancellable,
+                             GError **error)
+{
+       /* ensure valid */
+       if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
+               return FALSE;
+
+       return gs_flatpak_refine_app_state_unlocked (self, app, cancellable, 
error);
+}
+
 static GsApp *
 gs_flatpak_create_runtime (GsFlatpak *self, GsApp *parent, const gchar 
*runtime)
 {
@@ -1989,10 +2019,10 @@
 
                /* is the app_runtime already installed? */
                app_runtime = gs_app_get_runtime (app);
-               if (!gs_flatpak_refine_app_state (self,
-                                                 app_runtime,
-                                                 cancellable,
-                                                 error))
+               if (!gs_flatpak_refine_app_state_unlocked (self,
+                                                          app_runtime,
+                                                          cancellable,
+                                                          error))
                        return FALSE;
                if (gs_app_get_state (app_runtime) == AS_APP_STATE_INSTALLED) {
                        g_debug ("runtime %s is already installed, so not 
adding size",
@@ -2048,6 +2078,7 @@
                if (!ret) {
                        g_warning ("libflatpak failed to return application "
                                   "size: %s", error_local->message);
+                       g_clear_error (&error_local);
                }
        }
 
@@ -2107,22 +2138,23 @@
        return TRUE;
 }
 
-gboolean
-gs_flatpak_refine_app (GsFlatpak *self,
-                      GsApp *app,
-                      GsPluginRefineFlags flags,
-                      GCancellable *cancellable,
-                      GError **error)
+/* the _unlocked() version doesn't call gs_flatpak_rescan_appstream_store,
+ * in order to avoid taking the writer lock on self->silo_lock */
+static gboolean
+gs_flatpak_refine_app_unlocked (GsFlatpak *self,
+                                GsApp *app,
+                                GsPluginRefineFlags flags,
+                                GCancellable *cancellable,
+                                GError **error)
 {
        AsAppState old_state = gs_app_get_state (app);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
 
        /* not us */
        if (gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_FLATPAK)
                return TRUE;
 
-       /* ensure valid */
-       if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
-               return FALSE;
+       locker = g_rw_lock_reader_locker_new (&self->silo_lock);
 
        /* always do AppStream properties */
        if (!gs_flatpak_refine_appstream (self, app, self->silo, flags, error))
@@ -2135,7 +2167,7 @@
        }
 
        /* check the installed state */
-       if (!gs_flatpak_refine_app_state (self, app, cancellable, error)) {
+       if (!gs_flatpak_refine_app_state_unlocked (self, app, cancellable, 
error)) {
                g_prefix_error (error, "failed to get state: ");
                return FALSE;
        }
@@ -2192,6 +2224,20 @@
 }
 
 gboolean
+gs_flatpak_refine_app (GsFlatpak *self,
+                      GsApp *app,
+                      GsPluginRefineFlags flags,
+                      GCancellable *cancellable,
+                      GError **error)
+{
+       /* ensure valid */
+       if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
+               return FALSE;
+
+       return gs_flatpak_refine_app_unlocked (self, app, flags, cancellable, 
error);
+}
+
+gboolean
 gs_flatpak_refine_wildcard (GsFlatpak *self, GsApp *app,
                            GsAppList *list, GsPluginRefineFlags refine_flags,
                            GCancellable *cancellable, GError **error)
@@ -2200,6 +2246,7 @@
        g_autofree gchar *xpath = NULL;
        g_autoptr(GError) error_local = NULL;
        g_autoptr(GPtrArray) components = NULL;
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
 
        /* not enough info to find */
        id = gs_app_get_id (app);
@@ -2210,6 +2257,8 @@
        if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
                return FALSE;
 
+       locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+
        /* find all apps when matching any prefixes */
        xpath = g_strdup_printf ("components/component/id[text()='%s']/..", id);
        components = xb_silo_query (self->silo, xpath, 0, &error_local);
@@ -2229,7 +2278,7 @@
                if (new == NULL)
                        return FALSE;
                gs_flatpak_claim_app (self, new);
-               if (!gs_flatpak_refine_app (self, new, refine_flags, 
cancellable, error))
+               if (!gs_flatpak_refine_app_unlocked (self, new, refine_flags, 
cancellable, error))
                        return FALSE;
                gs_app_subsume_metadata (new, app);
                gs_app_list_add (list, new);
@@ -2614,6 +2663,7 @@
                gs_plugin_event_set_error (event, error_local);
                gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING);
                gs_plugin_report_event (self->plugin, event);
+               g_clear_error (&error_local);
        }
 
        /* get this now, as it's not going to be available at install time */
@@ -2666,13 +2716,19 @@
                   GError **error)
 {
        g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&self->silo_lock);
        if (!gs_appstream_search (self->plugin, self->silo, values, list_tmp,
                                  cancellable, error))
                return FALSE;
+
        gs_flatpak_claim_app_list (self, list_tmp);
        gs_app_list_add_list (list, list_tmp);
+
        return TRUE;
 }
 
@@ -2684,14 +2740,20 @@
                              GError **error)
 {
        g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&self->silo_lock);
        if (!gs_appstream_add_category_apps (self->plugin, self->silo,
                                             category, list_tmp,
                                             cancellable, error))
                return FALSE;
+
        gs_flatpak_claim_app_list (self, list_tmp);
        gs_app_list_add_list (list, list_tmp);
+
        return TRUE;
 }
 
@@ -2701,8 +2763,12 @@
                           GCancellable *cancellable,
                           GError **error)
 {
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&self->silo_lock);
        return gs_appstream_add_categories (self->plugin, self->silo,
                                            list, cancellable, error);
 }
@@ -2714,12 +2780,18 @@
                        GError **error)
 {
        g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&self->silo_lock);
        if (!gs_appstream_add_popular (self->plugin, self->silo, list_tmp,
                                       cancellable, error))
                return FALSE;
+
        gs_app_list_add_list (list, list_tmp);
+
        return TRUE;
 }
 
@@ -2730,12 +2802,18 @@
                         GError **error)
 {
        g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&self->silo_lock);
        if (!gs_appstream_add_featured (self->plugin, self->silo, list_tmp,
                                        cancellable, error))
                return FALSE;
+
        gs_app_list_add_list (list, list_tmp);
+
        return TRUE;
 }
 
@@ -2747,12 +2825,18 @@
                           GError **error)
 {
        g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&self->silo_lock);
        if (!gs_appstream_add_alternates (self->plugin, self->silo, app, 
list_tmp,
                                          cancellable, error))
                return FALSE;
+
        gs_app_list_add_list (list, list_tmp);
+
        return TRUE;
 }
 
@@ -2764,13 +2848,19 @@
                       GError **error)
 {
        g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
+
        if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&self->silo_lock);
        if (!gs_appstream_add_recent (self->plugin, self->silo, list_tmp, age,
                                      cancellable, error))
                return FALSE;
+
        gs_flatpak_claim_app_list (self, list_tmp);
        gs_app_list_add_list (list, list_tmp);
+
        return TRUE;
 }
 
@@ -2823,6 +2913,7 @@
        g_object_unref (self->plugin);
        g_hash_table_unref (self->broken_remotes);
        g_mutex_clear (&self->broken_remotes_mutex);
+       g_rw_lock_clear (&self->silo_lock);
 
        G_OBJECT_CLASS (gs_flatpak_parent_class)->finalize (object);
 }
@@ -2837,6 +2928,10 @@
 static void
 gs_flatpak_init (GsFlatpak *self)
 {
+       /* XbSilo needs external locking as we destroy the silo and build a new
+        * one when something changes */
+       g_rw_lock_init (&self->silo_lock);
+
        g_mutex_init (&self->broken_remotes_mutex);
        self->broken_remotes = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                      g_free, NULL);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-software-3.32.2/plugins/flatpak/gs-plugin-flatpak.c 
new/gnome-software-3.32.3/plugins/flatpak/gs-plugin-flatpak.c
--- old/gnome-software-3.32.2/plugins/flatpak/gs-plugin-flatpak.c       
2019-05-07 15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/plugins/flatpak/gs-plugin-flatpak.c       
2019-05-24 21:51:51.000000000 +0200
@@ -58,6 +58,7 @@
        permission = gs_utils_get_permission (action_id, NULL, &error_local);
        if (permission == NULL) {
                g_debug ("no permission for %s: %s", action_id, 
error_local->message);
+               g_clear_error (&error_local);
        } else {
                priv->has_system_helper = g_permission_get_allowed (permission) 
||
                                          g_permission_get_can_acquire 
(permission);
@@ -373,12 +374,13 @@
                                   GCancellable *cancellable, GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
-       g_autoptr(GError) error_local = NULL;
 
        g_debug ("finding ref %s", ref);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak_tmp = g_ptr_array_index (priv->flatpaks, i);
                g_autoptr(GsApp) app = NULL;
+               g_autoptr(GError) error_local = NULL;
+
                app = gs_flatpak_ref_to_app (flatpak_tmp, ref, cancellable, 
&error_local);
                if (app == NULL) {
                        g_debug ("%s", error_local->message);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-software-3.32.2/plugins/rpm-ostree/gs-plugin-rpm-ostree.c 
new/gnome-software-3.32.3/plugins/rpm-ostree/gs-plugin-rpm-ostree.c
--- old/gnome-software-3.32.2/plugins/rpm-ostree/gs-plugin-rpm-ostree.c 
2019-05-07 15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/plugins/rpm-ostree/gs-plugin-rpm-ostree.c 
2019-05-24 21:51:51.000000000 +0200
@@ -1593,6 +1593,26 @@
        return ret;
 }
 
+static gchar **
+what_provides_decompose (gchar **values)
+{
+       GPtrArray *array = g_ptr_array_new ();
+
+       /* iter on each provide string, and wrap it with the Fedora prefix */
+       for (guint i = 0; values[i] != NULL; i++) {
+               g_ptr_array_add (array, g_strdup (values[i]));
+               g_ptr_array_add (array, g_strdup_printf ("gstreamer0.10(%s)", 
values[i]));
+               g_ptr_array_add (array, g_strdup_printf ("gstreamer1(%s)", 
values[i]));
+               g_ptr_array_add (array, g_strdup_printf ("font(%s)", 
values[i]));
+               g_ptr_array_add (array, g_strdup_printf ("mimehandler(%s)", 
values[i]));
+               g_ptr_array_add (array, g_strdup_printf 
("postscriptdriver(%s)", values[i]));
+               g_ptr_array_add (array, g_strdup_printf ("plasma4(%s)", 
values[i]));
+               g_ptr_array_add (array, g_strdup_printf ("plasma5(%s)", 
values[i]));
+       }
+       g_ptr_array_add (array, NULL);
+       return (gchar **) g_ptr_array_free (array, FALSE);
+}
+
 gboolean
 gs_plugin_add_search_what_provides (GsPlugin *plugin,
                                     gchar **search,
@@ -1603,13 +1623,15 @@
        GsPluginData *priv = gs_plugin_get_data (plugin);
        g_autoptr(GMutexLocker) locker = NULL;
        g_autoptr(GPtrArray) pkglist = NULL;
+       g_auto(GStrv) provides = NULL;
 
        locker = g_mutex_locker_new (&priv->mutex);
 
        if (priv->dnf_context == NULL)
                return TRUE;
 
-       pkglist = find_packages_by_provides (dnf_context_get_sack 
(priv->dnf_context), search);
+       provides = what_provides_decompose (search);
+       pkglist = find_packages_by_provides (dnf_context_get_sack 
(priv->dnf_context), provides);
        for (guint i = 0; i < pkglist->len; i++) {
                DnfPackage *pkg = g_ptr_array_index (pkglist, i);
                g_autoptr(GsApp) app = NULL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-software-3.32.2/plugins/shell-extensions/gs-plugin-shell-extensions.c 
new/gnome-software-3.32.3/plugins/shell-extensions/gs-plugin-shell-extensions.c
--- 
old/gnome-software-3.32.2/plugins/shell-extensions/gs-plugin-shell-extensions.c 
    2019-05-07 15:11:08.000000000 +0200
+++ 
new/gnome-software-3.32.3/plugins/shell-extensions/gs-plugin-shell-extensions.c 
    2019-05-24 21:51:51.000000000 +0200
@@ -36,6 +36,7 @@
        GsApp           *cached_origin;
        GSettings       *settings;
        XbSilo          *silo;
+       GRWLock          silo_lock;
 };
 
 typedef enum {
@@ -62,6 +63,10 @@
 {
        GsPluginData *priv = gs_plugin_alloc_data (plugin, 
sizeof(GsPluginData));
 
+       /* XbSilo needs external locking as we destroy the silo and build a new
+        * one when something changes */
+       g_rw_lock_init (&priv->silo_lock);
+
        /* add source */
        priv->cached_origin = gs_app_new (gs_plugin_get_name (plugin));
        gs_app_set_kind (priv->cached_origin, AS_APP_KIND_SOURCE);
@@ -87,6 +92,7 @@
                g_object_unref (priv->silo);
        g_object_unref (priv->cached_origin);
        g_object_unref (priv->settings);
+       g_rw_lock_clear (&priv->silo_lock);
 }
 
 void
@@ -413,6 +419,7 @@
        const gchar *uuid;
        g_autofree gchar *xpath = NULL;
        g_autoptr(GError) error_local = NULL;
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
        g_autoptr(XbNode) component = NULL;
 
        /* repo not enabled */
@@ -446,9 +453,13 @@
                gs_app_set_size_download (app, GS_APP_SIZE_UNKNOWABLE);
 
 
-       /* find the component using the UUID */
+       /* check silo is valid */
        if (!_check_silo (plugin, cancellable, error))
                return FALSE;
+
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
+
+       /* find the component using the UUID */
        xpath = g_strdup_printf ("components/component/custom/"
                                 
"value[@key='shell-extensions::uuid'][text()='%s']/../..",
                                 uuid);
@@ -477,6 +488,7 @@
        g_autofree gchar *xpath = NULL;
        g_autoptr(GError) error_local = NULL;
        g_autoptr(GPtrArray) components = NULL;
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
 
        /* repo not enabled */
        if (!g_settings_get_boolean (priv->settings, 
"enable-shell-extensions-repo"))
@@ -491,6 +503,8 @@
        if (id == NULL)
                return TRUE;
 
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
+
        /* find all apps */
        xpath = g_strdup_printf ("components/component/id[text()='%s']/..", id);
        components = xb_silo_query (priv->silo, xpath, 0, &error_local);
@@ -726,9 +740,10 @@
 
        /* parse each app */
        for (guint i = 0; i < json_array_get_length (json_extensions_array); 
i++) {
-               XbBuilderNode *component;
                JsonNode *json_extension;
                JsonObject *json_extension_obj;
+               g_autoptr(XbBuilderNode) component = NULL;
+
                json_extension = json_array_get_element (json_extensions_array, 
i);
                json_extension_obj = json_node_get_object (json_extension);
                component = gs_plugin_shell_extensions_parse_app (plugin,
@@ -756,6 +771,7 @@
        g_autofree gchar *fn = NULL;
        g_autofree gchar *uri = NULL;
        g_autoptr(GFile) file = NULL;
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
        g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin));
 
        /* get cache filename */
@@ -788,8 +804,10 @@
        }
 
        /* be explicit */
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        if (priv->silo != NULL)
                xb_silo_invalidate (priv->silo);
+
        return TRUE;
 }
 
@@ -802,16 +820,21 @@
        g_autoptr(GError) error_local = NULL;
        g_autoptr(GFile) blobfile = NULL;
        g_autoptr(GFile) file = NULL;
+       g_autoptr(GRWLockReaderLocker) reader_locker = NULL;
+       g_autoptr(GRWLockWriterLocker) writer_locker = NULL;
        g_autoptr(XbBuilder) builder = xb_builder_new ();
        g_autoptr(XbBuilderSource) source = xb_builder_source_new ();
 
+       reader_locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        /* everything is okay */
        if (priv->silo != NULL && xb_silo_is_valid (priv->silo)) {
                g_debug ("silo already valid");
                return TRUE;
        }
+       g_clear_pointer (&reader_locker, g_rw_lock_reader_locker_free);
 
        /* drat! silo needs regenerating */
+       writer_locker = g_rw_lock_writer_locker_new (&priv->silo_lock);
        g_clear_object (&priv->silo);
 
        /* verbose profiling */
@@ -883,11 +906,13 @@
                      GCancellable *cancellable, GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
        g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
        if (!g_settings_get_boolean (priv->settings, 
"enable-shell-extensions-repo"))
                return TRUE;
        if (!_check_silo (plugin, cancellable, error))
                return FALSE;
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        if (!gs_appstream_search (plugin, priv->silo, values, list_tmp,
                                  cancellable, error))
                return FALSE;
@@ -901,11 +926,13 @@
                             GCancellable *cancellable, GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
+       g_autoptr(GRWLockReaderLocker) locker = NULL;
        g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
        if (!g_settings_get_boolean (priv->settings, 
"enable-shell-extensions-repo"))
                return TRUE;
        if (!_check_silo (plugin, cancellable, error))
                return FALSE;
+       locker = g_rw_lock_reader_locker_new (&priv->silo_lock);
        if (!gs_appstream_add_category_apps (plugin, priv->silo, category,
                                             list_tmp, cancellable, error))
                return FALSE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/src/gs-app-row.ui 
new/gnome-software-3.32.3/src/gs-app-row.ui
--- old/gnome-software-3.32.2/src/gs-app-row.ui 2019-05-07 15:11:08.000000000 
+0200
+++ new/gnome-software-3.32.3/src/gs-app-row.ui 2019-05-24 21:51:52.000000000 
+0200
@@ -71,7 +71,7 @@
                     <property name="xalign">0.0</property>
                     <property name="yalign">0.5</property>
                     <property name="ellipsize">end</property>
-                    <property name="label">▶</property>
+                    <property name="label">→</property>
                     <style>
                       <class name="version-arrow-label"/>
                     </style>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/src/gs-details-page.c 
new/gnome-software-3.32.3/src/gs-details-page.c
--- old/gnome-software-3.32.2/src/gs-details-page.c     2019-05-07 
15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/src/gs-details-page.c     2019-05-24 
21:51:52.000000000 +0200
@@ -515,7 +515,6 @@
                        gs_screenshot_image_set_size (GS_SCREENSHOT_IMAGE 
(ssimg),
                                                      640,
                                                      48);
-                       gs_screenshot_image_set_use_desktop_background 
(GS_SCREENSHOT_IMAGE (ssimg), FALSE);
                        gs_screenshot_image_load_async (GS_SCREENSHOT_IMAGE 
(ssimg), NULL);
                        gtk_container_add (GTK_CONTAINER 
(self->box_details_screenshot_main), ssimg);
                        gtk_widget_set_visible (ssimg, TRUE);
@@ -1082,9 +1081,10 @@
        pixbuf = gs_app_get_pixbuf (self->app);
        if (pixbuf != NULL) {
                gs_image_set_from_pixbuf (GTK_IMAGE 
(self->application_details_icon), pixbuf);
-               gtk_widget_set_visible (self->application_details_icon, TRUE);
        } else {
-               gtk_widget_set_visible (self->application_details_icon, FALSE);
+               gtk_image_set_from_icon_name (GTK_IMAGE 
(self->application_details_icon),
+                                             "application-x-executable",
+                                             GTK_ICON_SIZE_DIALOG);
        }
 
        tmp = gs_app_get_url (self->app, AS_URL_KIND_HOMEPAGE);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/src/gs-screenshot-image.c 
new/gnome-software-3.32.3/src/gs-screenshot-image.c
--- old/gnome-software-3.32.2/src/gs-screenshot-image.c 2019-05-07 
15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/src/gs-screenshot-image.c 2019-05-24 
21:51:52.000000000 +0200
@@ -11,12 +11,6 @@
 
 #include <glib/gi18n.h>
 
-#ifdef HAVE_GNOME_DESKTOP
-#define GNOME_DESKTOP_USE_UNSTABLE_API
-#include <libgnome-desktop/gnome-bg.h>
-#include <libgnome-desktop/gnome-desktop-thumbnail.h>
-#endif
-
 #include "gs-screenshot-image.h"
 #include "gs-common.h"
 
@@ -35,7 +29,6 @@
        SoupMessage     *message;
        gchar           *filename;
        const gchar     *current_image;
-       gboolean         use_desktop_background;
        guint            width;
        guint            height;
        guint            scale;
@@ -66,91 +59,34 @@
        ssimg->showing_image = FALSE;
 }
 
-static GdkPixbuf *
-gs_screenshot_image_get_desktop_pixbuf (GsScreenshotImage *ssimg)
-{
-#ifdef HAVE_GNOME_DESKTOP
-       g_autoptr(GnomeBG) bg = NULL;
-       g_autoptr(GnomeDesktopThumbnailFactory) factory = NULL;
-       g_autoptr(GSettings) settings = NULL;
-
-       factory = gnome_desktop_thumbnail_factory_new 
(GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
-       bg = gnome_bg_new ();
-       settings = g_settings_new ("org.gnome.desktop.background");
-       gnome_bg_load_from_preferences (bg, settings);
-       return gnome_bg_create_thumbnail (bg, factory,
-                                         gdk_screen_get_default (),
-                                         (gint) ssimg->width,
-                                         (gint) ssimg->height);
-#else
-       return NULL;
-#endif
-}
-
-static gboolean
-gs_screenshot_image_use_desktop_background (GsScreenshotImage *ssimg, 
GdkPixbuf *pixbuf)
-{
-       g_autoptr(AsImage) im = NULL;
-
-       /* nothing to show, means no background mode */
-       if (pixbuf == NULL)
-               return FALSE;
-       /* background mode explicitly disabled */
-       if (!ssimg->use_desktop_background)
-               return FALSE;
-
-       /* use a temp AsImage */
-       im = as_image_new ();
-       as_image_set_pixbuf (im, pixbuf);
-       return (as_image_get_alpha_flags (im) & AS_IMAGE_ALPHA_FLAG_INTERNAL) > 
0;
-}
-
 static void
 as_screenshot_show_image (GsScreenshotImage *ssimg)
 {
-       g_autoptr(GdkPixbuf) pixbuf_bg = NULL;
        g_autoptr(GdkPixbuf) pixbuf = NULL;
 
        /* no need to composite */
        if (ssimg->width == G_MAXUINT || ssimg->height == G_MAXUINT) {
-               pixbuf_bg = gdk_pixbuf_new_from_file (ssimg->filename, NULL);
+               pixbuf = gdk_pixbuf_new_from_file (ssimg->filename, NULL);
        } else {
                /* this is always going to have alpha */
                pixbuf = gdk_pixbuf_new_from_file_at_scale (ssimg->filename,
                                                            (gint) 
(ssimg->width * ssimg->scale),
                                                            (gint) 
(ssimg->height * ssimg->scale),
                                                            FALSE, NULL);
-               if (pixbuf != NULL) {
-                       if (gs_screenshot_image_use_desktop_background (ssimg, 
pixbuf)) {
-                               pixbuf_bg = 
gs_screenshot_image_get_desktop_pixbuf (ssimg);
-                               if (pixbuf_bg == NULL) {
-                                       pixbuf_bg = g_object_ref (pixbuf);
-                               } else {
-                                       gdk_pixbuf_composite (pixbuf, pixbuf_bg,
-                                                             0, 0,
-                                                             (gint) 
ssimg->width,
-                                                             (gint) 
ssimg->height,
-                                                             0, 0, 1.0f, 1.0f,
-                                                             
GDK_INTERP_NEAREST, 255);
-                               }
-                       } else {
-                               pixbuf_bg = g_object_ref (pixbuf);
-                       }
-               }
        }
 
        /* show icon */
        if (g_strcmp0 (ssimg->current_image, "image1") == 0) {
-               if (pixbuf_bg != NULL) {
+               if (pixbuf != NULL) {
                        gs_image_set_from_pixbuf_with_scale (GTK_IMAGE 
(ssimg->image2),
-                                                            pixbuf_bg, (gint) 
ssimg->scale);
+                                                            pixbuf, (gint) 
ssimg->scale);
                }
                gtk_stack_set_visible_child_name (GTK_STACK (ssimg->stack), 
"image2");
                ssimg->current_image = "image2";
        } else {
-               if (pixbuf_bg != NULL) {
+               if (pixbuf != NULL) {
                        gs_image_set_from_pixbuf_with_scale (GTK_IMAGE 
(ssimg->image1),
-                                                            pixbuf_bg, (gint) 
ssimg->scale);
+                                                            pixbuf, (gint) 
ssimg->scale);
                }
                gtk_stack_set_visible_child_name (GTK_STACK (ssimg->stack), 
"image1");
                ssimg->current_image = "image1";
@@ -195,7 +131,7 @@
        g_autoptr(AsImage) im = NULL;
        gboolean ret;
        const GPtrArray *images;
-       g_autoptr(GError) local_error = NULL;
+       g_autoptr(GError) error_local = NULL;
        g_autofree char *filename = NULL;
        g_autofree char *size_dir = NULL;
        g_autofree char *cache_kind = NULL;
@@ -239,7 +175,7 @@
        cache_kind = g_build_filename ("screenshots", size_dir, NULL);
        filename = gs_utils_get_cache_filename (cache_kind, basename,
                                                GS_UTILS_CACHE_FLAG_WRITEABLE,
-                                               &local_error);
+                                               &error_local);
 
         if (filename == NULL) {
                /* if we cannot get a cache filename, warn about that but do not
@@ -247,20 +183,20 @@
                 * operation */
                 g_warning ("Failed to get cache filename for counterpart "
                            "screenshot '%s' in folder '%s': %s", basename,
-                           cache_kind, local_error->message);
+                           cache_kind, error_local->message);
                 return TRUE;
         }
 
        ret = as_image_save_filename (im, filename, width, height,
                                      AS_IMAGE_SAVE_FLAG_PAD_16_9,
-                                     &local_error);
+                                     &error_local);
 
        if (!ret) {
                /* if we cannot save this screenshot, warn about that but do not
                 * set a user's visible error because this is a complementary
                 * operation */
                 g_warning ("Failed to save screenshot '%s': %s", filename,
-                           local_error->message);
+                           error_local->message);
         }
 
        return TRUE;
@@ -369,14 +305,6 @@
        gtk_widget_set_size_request (ssimg->stack, (gint) width, (gint) height);
 }
 
-void
-gs_screenshot_image_set_use_desktop_background (GsScreenshotImage *ssimg,
-                                                gboolean 
use_desktop_background)
-{
-       g_return_if_fail (GS_IS_SCREENSHOT_IMAGE (ssimg));
-       ssimg->use_desktop_background = use_desktop_background;
-}
-
 static gchar *
 gs_screenshot_get_cachefn_for_url (const gchar *url)
 {
@@ -592,7 +520,6 @@
 {
        AtkObject *accessible;
 
-       ssimg->use_desktop_background = TRUE;
        ssimg->settings = g_settings_new ("org.gnome.software");
        ssimg->showing_image = FALSE;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/src/gs-screenshot-image.h 
new/gnome-software-3.32.3/src/gs-screenshot-image.h
--- old/gnome-software-3.32.2/src/gs-screenshot-image.h 2019-05-07 
15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/src/gs-screenshot-image.h 2019-05-24 
21:51:52.000000000 +0200
@@ -28,9 +28,6 @@
 void            gs_screenshot_image_set_size           (GsScreenshotImage      
*ssimg,
                                                         guint                  
 width,
                                                         guint                  
 height);
-void            gs_screenshot_image_set_use_desktop_background
-                                                       (GsScreenshotImage      
*ssimg,
-                                                        gboolean               
 use_desktop_background);
 void            gs_screenshot_image_load_async         (GsScreenshotImage      
*ssimg,
                                                         GCancellable           
*cancellable);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-software-3.32.2/src/gs-update-dialog.c 
new/gnome-software-3.32.3/src/gs-update-dialog.c
--- old/gnome-software-3.32.2/src/gs-update-dialog.c    2019-05-07 
15:11:08.000000000 +0200
+++ new/gnome-software-3.32.3/src/gs-update-dialog.c    2019-05-24 
21:51:52.000000000 +0200
@@ -355,7 +355,7 @@
        /* have both */
        if (version_current != NULL && version_update != NULL &&
            g_strcmp0 (version_current, version_update) != 0) {
-               return g_strdup_printf ("%s ▶ %s",
+               return g_strdup_printf ("%s → %s",
                                        version_current,
                                        version_update);
        }


Reply via email to