pmaports/temp/gnome-software/0002-gs-external-appstream-utils-hash-url-to-allow-same-b.patch
Pablo Correa Gómez 676b6c20bf
temp/gnome-software: sync upstream and remove pmOS AppStream data (MR 2875)
AppStream data for postmarketOS has been removed until the new format
without a double "--" is deployed. Otherwise transition will be a pain
and we would have to take care of it downstream.

Relates #1384
2022-02-20 16:18:14 +01:00

111 lines
4.6 KiB
Diff

From 413f67451c89d269d3b373cefd4b3a9bb500960e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Correa=20G=C3=B3mez?= <ablocorrea@hotmail.com>
Date: Fri, 31 Dec 2021 00:46:38 +0100
Subject: [PATCH 2/5] gs-external-appstream-utils: hash url to allow same
basename
Component files generated by tools like appstream-generator all
have the same basename: Components-$(ARCH).xml.gz
In consequence, before this patch, if multiple urls are specified
in "external-appstream-urls" and have the same basename, the secondly
downloaded file will either override the first one (user installs),
or skip the download because a file with the said basename already exits
(system-wide installs). Hashing the url and adding the hash to the
basename solves this problem.
(cherry picked from commit 576d336e4994741e64b9384e7e05748b614cf981)
---
lib/gs-external-appstream-utils.c | 26 +++++++++++++++++++-------
1 file changed, 19 insertions(+), 7 deletions(-)
diff --git a/lib/gs-external-appstream-utils.c b/lib/gs-external-appstream-utils.c
index 39d71b29..82c5f700 100644
--- a/lib/gs-external-appstream-utils.c
+++ b/lib/gs-external-appstream-utils.c
@@ -87,6 +87,7 @@ gs_external_appstream_get_modification_date (const gchar *file_path)
static gboolean
gs_external_appstream_refresh_sys (GsPlugin *plugin,
const gchar *url,
+ const gchar *basename,
guint cache_age,
GCancellable *cancellable,
GError **error)
@@ -96,7 +97,6 @@ gs_external_appstream_refresh_sys (GsPlugin *plugin,
guint status_code;
gboolean file_written;
g_autofree gchar *tmp_file_path = NULL;
- g_autofree gchar *file_name = NULL;
g_autofree gchar *local_mod_date = NULL;
g_autofree gchar *target_file_path = NULL;
g_autoptr(GFileIOStream) iostream = NULL;
@@ -104,8 +104,7 @@ gs_external_appstream_refresh_sys (GsPlugin *plugin,
g_autoptr(SoupMessage) msg = NULL;
/* check age */
- file_name = g_path_get_basename (url);
- target_file_path = gs_external_appstream_utils_get_file_cache_path (file_name);
+ target_file_path = gs_external_appstream_utils_get_file_cache_path (basename);
if (!gs_external_appstream_check (target_file_path, cache_age)) {
g_debug ("skipping updating external appstream file %s: "
"cache age is older than file",
@@ -145,7 +144,7 @@ gs_external_appstream_refresh_sys (GsPlugin *plugin,
/* write the download contents into a file that will be copied into
* the system */
tmp_file_path = gs_utils_get_cache_filename ("external-appstream",
- file_name,
+ basename,
GS_UTILS_CACHE_FLAG_WRITEABLE |
GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY,
error);
@@ -196,18 +195,17 @@ gs_external_appstream_refresh_sys (GsPlugin *plugin,
static gboolean
gs_external_appstream_refresh_user (GsPlugin *plugin,
const gchar *url,
+ const gchar *basename,
guint cache_age,
GCancellable *cancellable,
GError **error)
{
guint file_age;
- g_autofree gchar *basename = NULL;
g_autofree gchar *fullpath = NULL;
g_autoptr(GFile) file = NULL;
g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin));
/* check age */
- basename = g_path_get_basename (url);
fullpath = g_build_filename (g_get_user_data_dir (),
"app-info",
"xmls",
@@ -236,13 +234,27 @@ gs_external_appstream_refresh_url (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
+ g_autofree gchar *basename = NULL;
+ g_autofree gchar *basename_url = g_path_get_basename (url);
+ /* make sure different uris with same basenames differ */
+ g_autofree gchar *hash = g_compute_checksum_for_string (G_CHECKSUM_SHA1,
+ url, -1);
+ if (hash == NULL) {
+ g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED,
+ "Failed to hash url %s", url);
+ return FALSE;
+ }
+ basename = g_strdup_printf ("%s-%s", hash, basename_url);
+
if (g_settings_get_boolean (settings, "external-appstream-system-wide")) {
return gs_external_appstream_refresh_sys (plugin, url,
+ basename,
cache_age,
cancellable,
error);
}
- return gs_external_appstream_refresh_user (plugin, url, cache_age,
+ return gs_external_appstream_refresh_user (plugin, url, basename,
+ cache_age,
cancellable, error);
}
--
2.25.1