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); }