From 450f6594ba3484b983ab1b6ef0cae894fa31af1b Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 16 Jan 2025 17:11:23 +0100 Subject: [PATCH 1/6] zstd-decompressor: Pass output/written data when decompression finished When the decompression finished, there can still be some data written to the output buffer. Without passing it over, the output can be cut. --- src/as-zstd-decompressor.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/as-zstd-decompressor.c b/src/as-zstd-decompressor.c index 18874f93..b8ba388f 100644 --- a/src/as-zstd-decompressor.c +++ b/src/as-zstd-decompressor.c @@ -116,8 +116,11 @@ as_zstd_decompressor_convert (GConverter *converter, size_t res; res = ZSTD_decompressStream (self->zstdstream, &output, &input); - if (res == 0) + if (res == 0) { + *bytes_read = input.pos; + *bytes_written = output.pos; return G_CONVERTER_FINISHED; + } if (ZSTD_isError (res)) { g_set_error (error, G_IO_ERROR, From 980fc4a7e9cba98dec47a3a8a5d6fe86852034be Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 16 Jan 2025 17:15:12 +0100 Subject: [PATCH 2/6] utils: Expect a dash in icons file name The dash (`-`) is used in the appstream generated files, thus expect it. Related to https://github.com/ximion/appstream/issues/683 --- src/as-utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/as-utils.c b/src/as-utils.c index d67c4f1d..f9d2b6ca 100644 --- a/src/as-utils.c +++ b/src/as-utils.c @@ -2656,7 +2656,7 @@ as_utils_install_metadata_file (AsMetadataLocation location, } /* guess origin */ - tmp2 = g_strdup_printf ("_icons-%s.tar.gz", icons_size_id); + tmp2 = g_strdup_printf ("-icons-%s.tar.gz", icons_size_id); tmp = g_strstr_len (basename, -1, tmp2); if (tmp != NULL) { *tmp = '\0'; From 57c37df38409bbb876196303ec687f503bc8dac5 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 16 Jan 2025 17:19:10 +0100 Subject: [PATCH 3/6] metadata: Add more known extensions into as_metadata_file_guess_style() Some parts of the code know of `.yaml*`, but this one knows only about `.yml*`. --- src/as-metadata.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/as-metadata.c b/src/as-metadata.c index 240ee88e..1ef8248b 100644 --- a/src/as-metadata.c +++ b/src/as-metadata.c @@ -84,12 +84,18 @@ G_DEFINE_TYPE_WITH_PRIVATE (AsMetadata, as_metadata, G_TYPE_OBJECT) AsFormatStyle as_metadata_file_guess_style (const gchar *filename) { + if (g_str_has_suffix (filename, ".xml")) + return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".xml.gz")) return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".yml")) return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".yml.gz")) return AS_FORMAT_STYLE_CATALOG; + if (g_str_has_suffix (filename, ".yaml")) + return AS_FORMAT_STYLE_CATALOG; + if (g_str_has_suffix (filename, ".yaml.gz")) + return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".appdata.xml")) return AS_FORMAT_STYLE_METAINFO; if (g_str_has_suffix (filename, ".appdata.xml.in")) @@ -100,8 +106,6 @@ as_metadata_file_guess_style (const gchar *filename) return AS_FORMAT_STYLE_METAINFO; if (g_str_has_suffix (filename, ".metainfo.xml.in.in")) return AS_FORMAT_STYLE_METAINFO; - if (g_str_has_suffix (filename, ".xml")) - return AS_FORMAT_STYLE_CATALOG; return AS_FORMAT_STYLE_UNKNOWN; } From 0d272e3b6613f682b475f2284723338aebbc6e51 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 16 Jan 2025 17:25:01 +0100 Subject: [PATCH 4/6] utils: Recognize .yml* and .yaml* file extension variants The code knows of .yml* and .yaml* variants on various places, this one was only missing. This fixes also a bug, when the YAML file was not compressed, it was treated as XML. --- src/as-utils.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/as-utils.c b/src/as-utils.c index f9d2b6ca..aa7c6da4 100644 --- a/src/as-utils.c +++ b/src/as-utils.c @@ -2578,7 +2578,10 @@ as_utils_install_metadata_file (AsMetadataLocation location, switch (as_metadata_file_guess_style (filename)) { case AS_FORMAT_STYLE_CATALOG: - if (g_strstr_len (filename, -1, ".yml.gz") != NULL) { + if (g_str_has_suffix (filename, ".yml") || + g_str_has_suffix (filename, ".yml.gz") || + g_str_has_suffix (filename, ".yaml") || + g_str_has_suffix (filename, ".yaml.gz")) { path = g_build_filename (as_metadata_location_get_prefix (location), "swcatalog", "yaml", From 530cadc72dec4c7eddf79d7ac7800125c513ff8d Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 16 Jan 2025 17:36:43 +0100 Subject: [PATCH 5/6] utils: Recognize .zst extension The repo data can be compressed with ZSTD, thus teach the as_utils_install_metadata_file() what to do with these files. --- src/as-metadata.c | 6 ++++++ src/as-utils.c | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/as-metadata.c b/src/as-metadata.c index 1ef8248b..89d27b25 100644 --- a/src/as-metadata.c +++ b/src/as-metadata.c @@ -88,14 +88,20 @@ as_metadata_file_guess_style (const gchar *filename) return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".xml.gz")) return AS_FORMAT_STYLE_CATALOG; + if (g_str_has_suffix (filename, ".xml.zst")) + return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".yml")) return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".yml.gz")) return AS_FORMAT_STYLE_CATALOG; + if (g_str_has_suffix (filename, ".yml.zst")) + return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".yaml")) return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".yaml.gz")) return AS_FORMAT_STYLE_CATALOG; + if (g_str_has_suffix (filename, ".yaml.zst")) + return AS_FORMAT_STYLE_CATALOG; if (g_str_has_suffix (filename, ".appdata.xml")) return AS_FORMAT_STYLE_METAINFO; if (g_str_has_suffix (filename, ".appdata.xml.in")) diff --git a/src/as-utils.c b/src/as-utils.c index aa7c6da4..958e536b 100644 --- a/src/as-utils.c +++ b/src/as-utils.c @@ -2580,8 +2580,10 @@ as_utils_install_metadata_file (AsMetadataLocation location, case AS_FORMAT_STYLE_CATALOG: if (g_str_has_suffix (filename, ".yml") || g_str_has_suffix (filename, ".yml.gz") || + g_str_has_suffix (filename, ".yml.zst") || g_str_has_suffix (filename, ".yaml") || - g_str_has_suffix (filename, ".yaml.gz")) { + g_str_has_suffix (filename, ".yaml.gz") || + g_str_has_suffix (filename, ".yaml.zst")) { path = g_build_filename (as_metadata_location_get_prefix (location), "swcatalog", "yaml", @@ -2628,7 +2630,8 @@ as_utils_install_metadata_file (AsMetadataLocation location, default: basename = g_path_get_basename (filename); - if (g_str_has_suffix (basename, ".tar.gz")) { + if (g_str_has_suffix (basename, ".tar.gz") || + g_str_has_suffix (basename, ".tar.zst")) { gchar *tmp; g_autofree gchar *tmp2 = NULL; /* we may have an icon tarball */ @@ -2659,7 +2662,10 @@ as_utils_install_metadata_file (AsMetadataLocation location, } /* guess origin */ - tmp2 = g_strdup_printf ("-icons-%s.tar.gz", icons_size_id); + if (g_str_has_suffix (basename, ".tar.gz")) + tmp2 = g_strdup_printf ("-icons-%s.tar.gz", icons_size_id); + else + tmp2 = g_strdup_printf ("-icons-%s.tar.zst", icons_size_id); tmp = g_strstr_len (basename, -1, tmp2); if (tmp != NULL) { *tmp = '\0'; From 13283ab6db44646ea4947734744e36b4b27835a8 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 16 Jan 2025 17:39:05 +0100 Subject: [PATCH 6/6] utils: Rename the appstream file when re-saving it on install The as_utils_install_metadata_file() can install the .xml* data re-saved, with added origin reference. When it does so, and the original file was compressed, then the file name extension does not reflect the file content anymore (it's a pure XML after re-saving, not a compressed XML data). That can confuse the Appstream data readers, thus rename the file to be .xml, to avoid this problem. --- src/as-utils.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/as-utils.c b/src/as-utils.c index 958e536b..c335e324 100644 --- a/src/as-utils.c +++ b/src/as-utils.c @@ -2487,13 +2487,37 @@ as_utils_install_metadata_file_internal (const gchar *filename, /* update the origin for XML files */ if (origin != NULL && !is_yaml) { g_autoptr(AsMetadata) mdata = as_metadata_new (); + g_autofree gchar *new_dest = NULL; + gboolean renamed = FALSE; as_metadata_set_locale (mdata, "ALL"); as_metadata_set_format_style (mdata, AS_FORMAT_STYLE_CATALOG); if (!as_metadata_parse_file (mdata, file_dest, AS_FORMAT_KIND_XML, error)) return FALSE; as_metadata_set_origin (mdata, origin); + if (!g_str_has_suffix (path_dest, ".xml")) { + g_autofree gchar *basename_new = g_strdup_printf ("%s.xml", origin); + /* it's an XML file now, name it properly */ + g_unlink (path_dest); + g_clear_pointer (&path_dest, g_free); + path_dest = g_build_filename (path_parent, basename_new, NULL); + renamed = TRUE; + } if (!as_metadata_save_catalog (mdata, path_dest, AS_FORMAT_KIND_XML, error)) return FALSE; + if (renamed) { + g_clear_object (&file_dest); + file_dest = g_file_new_for_path (path_dest); + /* explicitly set permissions on the renamed file */ + if (!g_file_set_attribute_uint32 (file_dest, + G_FILE_ATTRIBUTE_UNIX_MODE, + 0644, + G_FILE_QUERY_INFO_NONE, + NULL, + &tmp_error)) { + g_debug ("Error setting renamed file permissions: %s", tmp_error->message); + g_clear_error (&tmp_error); + } + } } g_chmod (path_dest, 0755);