Skip to content
Commits on Source (22)
Version 42.3
~~~~~~~~~~~~
Released: 2022-06-30
This is a stable release with the following notable changes:
* Fix some crashes when handling flatpaks
* Fix incorrectly showing a restart notification after a failed firmware update
* Fix a mismatch between app review ratings at the top and bottom of the page
* Fix prompt dialogs when updating firmware on devices which need user interaction
This release also updates translations:
* Catalan
* Czech
Version 42.2
~~~~~~~~~~~~
Released: 2022-05-30
......
......@@ -21,31 +21,31 @@
</description>
<screenshots>
<screenshot type="default">
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/appdata/ss-overview.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/gnome-42/data/appdata/ss-overview.png</image>
<caption>Overview panel</caption>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/appdata/ss-details.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/gnome-42/data/appdata/ss-details.png</image>
<caption>Details panel</caption>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/appdata/ss-details2.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/gnome-42/data/appdata/ss-details2.png</image>
<caption>Details panel</caption>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/appdata/ss-installed.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/gnome-42/data/appdata/ss-installed.png</image>
<caption>Installed panel</caption>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/appdata/ss-up-to-date.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/gnome-42/data/appdata/ss-up-to-date.png</image>
<caption>Updates panel</caption>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/appdata/ss-updates.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/gnome-42/data/appdata/ss-updates.png</image>
<caption>Updates panel</caption>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/appdata/ss-updates-details.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-software/raw/gnome-42/data/appdata/ss-updates-details.png</image>
<caption>The update details</caption>
</screenshot>
</screenshots>
......@@ -66,6 +66,22 @@
Validate with `appstreamcli validate *.appdata.xml`
-->
<releases>
<release date="2022-06-30" version="42.3" type="stable">
<description>
<p>This is a stable release with the following notable changes:</p>
<ul>
<li>Fix some crashes when handling flatpaks</li>
<li>Fix incorrectly showing a restart notification after a failed firmware update</li>
<li>Fix a mismatch between app review ratings at the top and bottom of the page</li>
<li>Fix prompt dialogs when updating firmware on devices which need user interaction</li>
</ul>
<p>This release also updates translations:</p>
<ul>
<li>Catalan</li>
<li>Czech</li>
</ul>
</description>
</release>
<release date="2022-05-30" version="42.2" type="stable">
<description>
<p>This is a stable release with the following notable changes:</p>
......
......@@ -20,7 +20,13 @@ GsApp *
gs_appstream_create_app (GsPlugin *plugin, XbSilo *silo, XbNode *component, GError **error)
{
GsApp *app;
g_autoptr(GsApp) app_new = gs_app_new (NULL);
g_autoptr(GsApp) app_new = NULL;
g_return_val_if_fail (GS_IS_PLUGIN (plugin), NULL);
g_return_val_if_fail (XB_IS_SILO (silo), NULL);
g_return_val_if_fail (XB_IS_NODE (component), NULL);
app_new = gs_app_new (NULL);
/* refine enough to get the unique ID */
if (!gs_appstream_refine_app (plugin, app_new, silo, component,
......@@ -967,6 +973,11 @@ gs_appstream_refine_app (GsPlugin *plugin,
g_autoptr(GPtrArray) launchables = NULL;
g_autoptr(XbNode) req = NULL;
g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE);
g_return_val_if_fail (GS_IS_APP (app), FALSE);
g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
g_return_val_if_fail (XB_IS_NODE (component), FALSE);
/* is compatible */
req = xb_node_query_first (component,
"requires/id[@type='id']"
......@@ -1411,6 +1422,11 @@ gs_appstream_search (GsPlugin *plugin,
{ AS_SEARCH_TOKEN_MATCH_NONE, NULL }
};
g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE);
g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
g_return_val_if_fail (values != NULL, FALSE);
g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE);
/* add some weighted queries */
for (guint i = 0; queries[i].xpath != NULL; i++) {
g_autoptr(GError) error_query = NULL;
......@@ -1487,6 +1503,11 @@ gs_appstream_add_category_apps (GsPlugin *plugin,
{
GPtrArray *desktop_groups;
g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE);
g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
g_return_val_if_fail (GS_IS_CATEGORY (category), FALSE);
g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE);
desktop_groups = gs_category_get_desktop_groups (category);
if (desktop_groups->len == 0) {
g_warning ("no desktop_groups for %s", gs_category_get_id (category));
......@@ -1577,6 +1598,9 @@ gs_appstream_add_categories (XbSilo *silo,
GCancellable *cancellable,
GError **error)
{
g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
g_return_val_if_fail (list != NULL, FALSE);
for (guint j = 0; j < list->len; j++) {
GsCategory *parent = GS_CATEGORY (g_ptr_array_index (list, j));
GPtrArray *children = gs_category_get_children (parent);
......@@ -1611,6 +1635,9 @@ gs_appstream_add_popular (XbSilo *silo,
g_autoptr(GError) error_local = NULL;
g_autoptr(GPtrArray) array = NULL;
g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE);
/* find out how many packages are in each category */
array = xb_silo_query (silo,
"components/component/kudos/"
......@@ -1648,6 +1675,10 @@ gs_appstream_add_recent (GsPlugin *plugin,
g_autoptr(GError) error_local = NULL;
g_autoptr(GPtrArray) array = NULL;
g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE);
g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE);
/* use predicate conditions to the max */
xpath = g_strdup_printf ("components/component/releases/"
"release[@timestamp>%" G_GUINT64_FORMAT "]/../..",
......@@ -1686,6 +1717,10 @@ gs_appstream_add_alternates (XbSilo *silo,
g_autoptr(GPtrArray) ids = NULL;
g_autoptr(GString) xpath = g_string_new (NULL);
g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
g_return_val_if_fail (GS_IS_APP (app), FALSE);
g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE);
/* probably a package we know nothing about */
if (gs_app_get_id (app) == NULL)
return TRUE;
......@@ -1743,6 +1778,9 @@ gs_appstream_add_featured (XbSilo *silo,
g_autoptr(GError) error_local = NULL;
g_autoptr(GPtrArray) array = NULL;
g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE);
/* find out how many packages are in each category */
array = xb_silo_query (silo,
"components/component/custom/value[@key='GnomeSoftware::FeatureTile']/../..|"
......@@ -1782,6 +1820,11 @@ gs_appstream_url_to_app (GsPlugin *plugin,
g_autofree gchar *xpath = NULL;
g_autoptr(GPtrArray) components = NULL;
g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE);
g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE);
g_return_val_if_fail (url != NULL, FALSE);
/* not us */
scheme = gs_utils_get_url_scheme (url);
if (g_strcmp0 (scheme, "appstream") != 0)
......@@ -1812,6 +1855,9 @@ gs_appstream_component_add_keyword (XbBuilderNode *component, const gchar *str)
g_autoptr(XbBuilderNode) keyword = NULL;
g_autoptr(XbBuilderNode) keywords = NULL;
g_return_if_fail (XB_IS_BUILDER_NODE (component));
g_return_if_fail (str != NULL);
/* create <keywords> if it does not already exist */
keywords = xb_builder_node_get_child (component, "keywords", NULL);
if (keywords == NULL)
......@@ -1831,6 +1877,9 @@ gs_appstream_component_add_provide (XbBuilderNode *component, const gchar *str)
g_autoptr(XbBuilderNode) provide = NULL;
g_autoptr(XbBuilderNode) provides = NULL;
g_return_if_fail (XB_IS_BUILDER_NODE (component));
g_return_if_fail (str != NULL);
/* create <provides> if it does not already exist */
provides = xb_builder_node_get_child (component, "provides", NULL);
if (provides == NULL)
......@@ -1850,6 +1899,9 @@ gs_appstream_component_add_category (XbBuilderNode *component, const gchar *str)
g_autoptr(XbBuilderNode) category = NULL;
g_autoptr(XbBuilderNode) categories = NULL;
g_return_if_fail (XB_IS_BUILDER_NODE (component));
g_return_if_fail (str != NULL);
/* create <categories> if it does not already exist */
categories = xb_builder_node_get_child (component, "categories", NULL);
if (categories == NULL)
......@@ -1868,6 +1920,9 @@ gs_appstream_component_add_icon (XbBuilderNode *component, const gchar *str)
{
g_autoptr(XbBuilderNode) icon = NULL;
g_return_if_fail (XB_IS_BUILDER_NODE (component));
g_return_if_fail (str != NULL);
/* create <icon>str</icon> if it does not already exist */
icon = xb_builder_node_get_child (component, "icon", NULL);
if (icon == NULL) {
......@@ -1881,7 +1936,11 @@ gs_appstream_component_add_icon (XbBuilderNode *component, const gchar *str)
void
gs_appstream_component_add_extra_info (XbBuilderNode *component)
{
const gchar *kind = xb_builder_node_get_attr (component, "type");
const gchar *kind;
g_return_if_fail (XB_IS_BUILDER_NODE (component));
kind = xb_builder_node_get_attr (component, "type");
/* add the gnome-software-specific 'Addon' group and ensure they
* all have an icon set */
......@@ -1927,9 +1986,14 @@ gs_appstream_component_add_extra_info (XbBuilderNode *component)
void
gs_appstream_component_fix_url (XbBuilderNode *component, const gchar *baseurl)
{
const gchar *text = xb_builder_node_get_text (component);
const gchar *text;
g_autofree gchar *url = NULL;
g_return_if_fail (XB_IS_BUILDER_NODE (component));
g_return_if_fail (baseurl != NULL);
text = xb_builder_node_get_text (component);
if (text == NULL)
return;
......
project('gnome-software', 'c',
version : '42.2',
version : '42.3',
license : 'GPL-2.0+',
default_options : ['warning_level=1', 'c_std=c11'],
meson_version : '>=0.55.0'
......
......@@ -466,11 +466,19 @@ gs_flatpak_create_source (GsFlatpak *self, FlatpakRemote *xremote)
return g_steal_pointer (&app);
}
static void
gs_flatpak_invalidate_silo (GsFlatpak *self)
{
g_rw_lock_writer_lock (&self->silo_lock);
if (self->silo != NULL)
xb_silo_invalidate (self->silo);
g_rw_lock_writer_unlock (&self->silo_lock);
}
static void
gs_flatpak_internal_data_changed (GsFlatpak *self)
{
g_autoptr(GMutexLocker) locker = NULL;
g_autoptr(GRWLockWriterLocker) writer_locker = NULL;
/* drop the installed refs cache */
locker = g_mutex_locker_new (&self->installed_refs_mutex);
......@@ -487,10 +495,7 @@ gs_flatpak_internal_data_changed (GsFlatpak *self)
g_hash_table_remove_all (self->broken_remotes);
g_clear_pointer (&locker, g_mutex_locker_free);
writer_locker = g_rw_lock_writer_locker_new (&self->silo_lock);
if (self->silo)
xb_silo_invalidate (self->silo);
g_clear_pointer (&writer_locker, g_rw_lock_writer_locker_free);
gs_flatpak_invalidate_silo (self);
self->requires_full_rescan = TRUE;
}
......@@ -1127,6 +1132,41 @@ gs_flatpak_rescan_app_data (GsFlatpak *self,
return TRUE;
}
/* Returns with a read lock held on @self->silo_lock on success.
The *locker should be NULL when being called. */
static gboolean
ensure_flatpak_silo_with_locker (GsFlatpak *self,
GRWLockReaderLocker **locker,
gboolean interactive,
GCancellable *cancellable,
GError **error)
{
/* should not hold the lock when called */
g_return_val_if_fail (*locker == NULL, FALSE);
/* ensure valid */
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
return FALSE;
*locker = g_rw_lock_reader_locker_new (&self->silo_lock);
while (self->silo == NULL) {
g_clear_pointer (locker, g_rw_lock_reader_locker_free);
if (!gs_flatpak_rescan_appstream_store (self, interactive, cancellable, error)) {
gs_flatpak_internal_data_changed (self);
return FALSE;
}
/* At this point either rescan_appstream_store() returned an error or it successfully
* initialised self->silo. There is the possibility that another thread will invalidate
* the silo before we regain the lock. If so, we’ll have to rescan again. */
*locker = g_rw_lock_reader_locker_new (&self->silo_lock);
}
return TRUE;
}
gboolean
gs_flatpak_setup (GsFlatpak *self, GCancellable *cancellable, GError **error)
{
......@@ -2009,10 +2049,7 @@ gs_flatpak_refresh (GsFlatpak *self,
g_mutex_unlock (&self->installed_refs_mutex);
/* 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);
gs_flatpak_invalidate_silo (self);
/* update AppStream metadata */
if (!gs_flatpak_refresh_appstream (self, cache_age_secs, interactive, cancellable, error))
......@@ -2369,21 +2406,32 @@ gs_flatpak_create_runtime (GsFlatpak *self,
/* search in the cache */
app_cache = gs_plugin_cache_lookup (self->plugin, gs_app_get_unique_id (app));
if (app_cache != NULL) {
if (app_cache != NULL &&
g_strcmp0 (gs_flatpak_app_get_ref_name (app_cache), split[0]) == 0 &&
g_strcmp0 (gs_flatpak_app_get_ref_arch (app_cache), split[1]) == 0 &&
g_strcmp0 (gs_app_get_branch (app_cache), split[2]) == 0) {
/* since the cached runtime can have been created somewhere else
* (we're using a global cache), we need to make sure that a
* source is set */
if (gs_app_get_source_default (app_cache) == NULL)
gs_app_add_source (app_cache, source);
return g_steal_pointer (&app_cache);
} else {
g_clear_object (&app_cache);
}
/* if the app is per-user we can also use the installed system runtime */
if (gs_app_get_scope (parent) == AS_COMPONENT_SCOPE_USER) {
gs_app_set_scope (app, AS_COMPONENT_SCOPE_UNKNOWN);
app_cache = gs_plugin_cache_lookup (self->plugin, gs_app_get_unique_id (app));
if (app_cache != NULL)
if (app_cache != NULL &&
g_strcmp0 (gs_flatpak_app_get_ref_name (app_cache), split[0]) == 0 &&
g_strcmp0 (gs_flatpak_app_get_ref_arch (app_cache), split[1]) == 0 &&
g_strcmp0 (gs_app_get_branch (app_cache), split[2]) == 0) {
return g_steal_pointer (&app_cache);
} else {
g_clear_object (&app_cache);
}
}
/* set superclassed app properties */
......@@ -2831,8 +2879,8 @@ gs_plugin_refine_item_size (GsFlatpak *self,
&error_local);
if (!ret) {
g_warning ("libflatpak failed to return application "
"size: %s", error_local->message);
/* This can happen when the remote is filtered */
g_debug ("libflatpak failed to return application size: %s", error_local->message);
g_clear_error (&error_local);
}
}
......@@ -3195,7 +3243,8 @@ gs_flatpak_refine_app_unlocked (GsFlatpak *self,
if (gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_FLATPAK)
return TRUE;
locker = g_rw_lock_reader_locker_new (&self->silo_lock);
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
return FALSE;
/* always do AppStream properties */
if (!gs_flatpak_refine_appstream (self, app, self->silo, flags, interactive, cancellable, error))
......@@ -3388,12 +3437,9 @@ gs_flatpak_refine_wildcard (GsFlatpak *self, GsApp *app,
if (id == NULL)
return TRUE;
/* ensure valid */
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, 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);
......@@ -3487,10 +3533,7 @@ gs_flatpak_app_remove_source (GsFlatpak *self,
}
/* invalidate cache */
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);
gs_flatpak_invalidate_silo (self);
gs_app_set_state (app, is_remove ? GS_APP_STATE_UNAVAILABLE : GS_APP_STATE_AVAILABLE);
......@@ -3949,10 +3992,9 @@ gs_flatpak_search (GsFlatpak *self,
GHashTableIter iter;
gpointer key, value;
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, 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;
......@@ -4018,10 +4060,9 @@ gs_flatpak_add_category_apps (GsFlatpak *self,
{
g_autoptr(GRWLockReaderLocker) locker = NULL;
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
return FALSE;
locker = g_rw_lock_reader_locker_new (&self->silo_lock);
return gs_appstream_add_category_apps (self->plugin, self->silo,
category, list,
cancellable, error);
......@@ -4036,10 +4077,9 @@ gs_flatpak_add_categories (GsFlatpak *self,
{
g_autoptr(GRWLockReaderLocker) locker = NULL;
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
return FALSE;
locker = g_rw_lock_reader_locker_new (&self->silo_lock);
return gs_appstream_add_categories (self->silo,
list, cancellable, error);
}
......@@ -4054,10 +4094,9 @@ gs_flatpak_add_popular (GsFlatpak *self,
g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
g_autoptr(GRWLockReaderLocker) locker = NULL;
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
return FALSE;
locker = g_rw_lock_reader_locker_new (&self->silo_lock);
if (!gs_appstream_add_popular (self->silo, list_tmp,
cancellable, error))
return FALSE;
......@@ -4077,10 +4116,9 @@ gs_flatpak_add_featured (GsFlatpak *self,
g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
g_autoptr(GRWLockReaderLocker) locker = NULL;
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
return FALSE;
locker = g_rw_lock_reader_locker_new (&self->silo_lock);
if (!gs_appstream_add_featured (self->silo, list_tmp,
cancellable, error))
return FALSE;
......@@ -4101,10 +4139,9 @@ gs_flatpak_add_alternates (GsFlatpak *self,
g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
g_autoptr(GRWLockReaderLocker) locker = NULL;
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
return FALSE;
locker = g_rw_lock_reader_locker_new (&self->silo_lock);
if (!gs_appstream_add_alternates (self->silo, app, list_tmp,
cancellable, error))
return FALSE;
......@@ -4125,10 +4162,9 @@ gs_flatpak_add_recent (GsFlatpak *self,
g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
g_autoptr(GRWLockReaderLocker) locker = NULL;
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, 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;
......@@ -4150,10 +4186,9 @@ gs_flatpak_url_to_app (GsFlatpak *self,
g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
g_autoptr(GRWLockReaderLocker) locker = NULL;
if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
return FALSE;
locker = g_rw_lock_reader_locker_new (&self->silo_lock);
if (!gs_appstream_url_to_app (self->plugin, self->silo, list_tmp, url, cancellable, error))
return FALSE;
......
......@@ -605,7 +605,7 @@ refine_app (GsPluginFlatpak *self,
if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME) {
GsApp *runtime = gs_app_get_runtime (app);
if (runtime != NULL) {
if (!gs_plugin_flatpak_refine_app (self, app,
if (!gs_plugin_flatpak_refine_app (self, runtime,
flags,
interactive,
cancellable,
......
......@@ -5,7 +5,7 @@
<extends>org.gnome.Software.desktop</extends>
<name>Flatpak Support</name>
<summary>Flatpak is a framework for desktop applications on Linux</summary>
<url type="homepage">http://flatpak.org/</url>
<url type="homepage">https://flatpak.org/</url>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-2.0+</project_license>
<update_contact>richard_at_hughsie.com</update_contact>
......
......@@ -278,7 +278,7 @@ gs_fwupd_app_set_from_release (GsApp *app, FwupdRelease *rel)
as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_DEFAULT);
as_screenshot_add_image (ss, im);
if (fwupd_release_get_detach_caption (rel) != NULL)
as_screenshot_set_caption (ss, NULL, fwupd_release_get_detach_caption (rel));
as_screenshot_set_caption (ss, fwupd_release_get_detach_caption (rel), NULL);
gs_app_set_action_screenshot (app, ss);
}
}
......@@ -945,7 +945,7 @@ gs_plugin_fwupd_install (GsPluginFwupd *self,
/* caption is required */
as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_DEFAULT);
as_screenshot_set_caption (ss, NULL, fwupd_device_get_update_message (dev));
as_screenshot_set_caption (ss, fwupd_device_get_update_message (dev), NULL);
gs_app_set_action_screenshot (app, ss);
/* require the dialog */
......
......@@ -5,7 +5,7 @@
<extends>org.gnome.Software.desktop</extends>
<name>Firmware Upgrade Support</name>
<summary>Provides support for firmware upgrades</summary>
<url type="homepage">http://www.fwupd.org</url>
<url type="homepage">https://fwupd.org</url>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-2.0+</project_license>
<update_contact>richard_at_hughsie.com</update_contact>
......
This diff is collapsed.
This diff is collapsed.
......@@ -1322,6 +1322,7 @@ gs_details_page_refresh_reviews (GsDetailsPage *self)
review_ratings = gs_app_get_review_ratings (self->app);
if (review_ratings != NULL) {
gs_review_histogram_set_ratings (GS_REVIEW_HISTOGRAM (self->histogram),
gs_app_get_rating (self->app),
review_ratings);
}
if (review_ratings != NULL) {
......
......@@ -319,6 +319,7 @@ gs_page_update_app_response_cb (GtkDialog *dialog,
g_debug ("update %s", gs_app_get_id (helper->app));
plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPDATE,
"interactive", TRUE,
"propagate-error", helper->propagate_error,
"app", helper->app,
NULL);
gs_plugin_loader_job_process_async (priv->plugin_loader,
......@@ -402,6 +403,7 @@ gs_page_update_app (GsPage *page, GsApp *app, GCancellable *cancellable)
helper->app = g_object_ref (app);
helper->page = g_object_ref (page);
helper->cancellable = g_object_ref (cancellable);
helper->propagate_error = TRUE;
/* tell the user what they have to do */
if (gs_app_get_kind (app) == AS_COMPONENT_KIND_FIRMWARE &&
......@@ -416,6 +418,7 @@ gs_page_update_app (GsPage *page, GsApp *app, GCancellable *cancellable)
/* generic fallback */
plugin_job = gs_plugin_job_newv (helper->action,
"interactive", TRUE,
"propagate-error", helper->propagate_error,
"app", app,
NULL);
gs_plugin_loader_job_process_async (priv->plugin_loader, plugin_job,
......
......@@ -35,6 +35,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (GsReviewHistogram, gs_review_histogram, GTK_TYPE_WID
void
gs_review_histogram_set_ratings (GsReviewHistogram *histogram,
gint rating_percent,
GArray *review_ratings)
{
GsReviewHistogramPrivate *priv = gs_review_histogram_get_instance_private (histogram);
......@@ -42,7 +43,6 @@ gs_review_histogram_set_ratings (GsReviewHistogram *histogram,
gdouble fraction[6] = { 0.0f };
guint32 max = 0;
guint32 total = 0;
guint32 star_count = 0;
g_return_if_fail (GS_IS_REVIEW_HISTOGRAM (histogram));
......@@ -56,7 +56,6 @@ gs_review_histogram_set_ratings (GsReviewHistogram *histogram,
for (guint i = 1; i < review_ratings->len; i++) {
guint32 c = g_array_index (review_ratings, guint32, i);
max = MAX (c, max);
star_count += i * c;
}
for (guint i = 1; i < review_ratings->len; i++) {
guint32 c = g_array_index (review_ratings, guint32, i);
......@@ -77,7 +76,7 @@ gs_review_histogram_set_ratings (GsReviewHistogram *histogram,
/* Round explicitly, to avoid rounding inside the printf() call and to use
the same value also for the stars fraction. */
fraction[0] = total > 0 ? round (((gdouble) star_count / (gdouble) total) * 10.0) / 10.0 : 0.0;
fraction[0] = total > 0 ? round (((gdouble) rating_percent ) * 50.0 / 100.0) / 10.0 : 0.0;
text = g_strdup_printf ("%.01f", fraction[0]);
gtk_label_set_text (GTK_LABEL (priv->label_value), text);
......
......@@ -24,6 +24,7 @@ struct _GsReviewHistogramClass
GtkWidget *gs_review_histogram_new (void);
void gs_review_histogram_set_ratings (GsReviewHistogram *histogram,
gint rating_percent,
GArray *review_ratings);
G_END_DECLS
......@@ -84,6 +84,9 @@ gs_star_widget_button_clicked_cb (GtkButton *button, GsStarWidget *star)
g_signal_emit (star, signals[RATING_CHANGED], 0, priv->rating);
}
/* Round to one digit, the same as the GsReviewHistogram */
#define GS_ROUND(x) (round (((gdouble) (x)) * 10.0) / 10.0)
/* Update the star styles to display the new rating */
static void
gs_star_widget_refresh_rating (GsStarWidget *star)
......@@ -100,9 +103,9 @@ gs_star_widget_refresh_rating (GsStarWidget *star)
if (priv->rating >= rate_to_star[i])
fraction = 1.0;
else if (!i)
fraction = priv->rating / 20.0;
fraction = GS_ROUND (priv->rating / 20.0);
else if (priv->rating > rate_to_star[i - 1])
fraction = (priv->rating - rate_to_star[i - 1]) / 20.0;
fraction = GS_ROUND ((priv->rating - rate_to_star[i - 1]) / 20.0);
else
fraction = 0.0;
......