Bug#1037214: bullseye-pu: package appstream-glib/0.7.18-1+deb11u1
On Wed, 07 Jun 2023 at 21:33:29 +0100, Simon McVittie wrote:
> [x] attach debdiff against the package in (old)stable
That was, in fact, a lie. See attached (or the nmudiff on #1037206 if
you'd prefer the unfiltered version).
smcv
debdiff appstream-glib_0.7.18-1{,+deb11u1}.dsc | filterdiff -p1 -x'debian/patches/*.patch'
diffstat for appstream-glib-0.7.18 appstream-glib-0.7.18
debian/.gitignore | 1
debian/changelog | 10
debian/patches/Improve-handling-of-em-and-code-tags.patch | 220 ++++++++++
debian/patches/Properly-initialize-AsNodeToXmlHelper.patch | 34 +
debian/patches/Support-em-code-tags.patch | 118 +++++
debian/patches/series | 4
debian/patches/trivial-Turn-is_-em-code-_text-fields-into-bitfields.patch | 26 +
libappstream-glib/as-node.c | 120 ++++-
libappstream-glib/as-self-test.c | 51 ++
9 files changed, 552 insertions(+), 32 deletions(-)
diff -Nru appstream-glib-0.7.18/debian/changelog appstream-glib-0.7.18/debian/changelog
--- appstream-glib-0.7.18/debian/changelog 2020-12-21 23:14:10.000000000 +0000
+++ appstream-glib-0.7.18/debian/changelog 2023-06-07 19:25:59.000000000 +0100
@@ -1,3 +1,13 @@
+appstream-glib (0.7.18-1+deb11u1) bullseye; urgency=medium
+
+ * Add patches from upstream to cope with <em> and <code> in metadata.
+ Older versions of appstream-glib mis-parse upstream metadata that
+ contains <em> and <code>, causing flatpak 1.12.x or older to fail
+ to load the metadata now published by Flathub. The symptom is that
+ `flatpak search` fails. (Closes: #1037206, LP: #2023215)
+
+ -- Simon McVittie <smcv@debian.org> Wed, 07 Jun 2023 19:25:59 +0100
+
appstream-glib (0.7.18-1) unstable; urgency=medium
[ Matthias Klumpp ]
diff -Nru appstream-glib-0.7.18/debian/.gitignore appstream-glib-0.7.18/debian/.gitignore
--- appstream-glib-0.7.18/debian/.gitignore 1970-01-01 01:00:00.000000000 +0100
+++ appstream-glib-0.7.18/debian/.gitignore 2023-06-07 19:25:59.000000000 +0100
@@ -0,0 +1 @@
+*~
diff -Nru appstream-glib-0.7.18/debian/patches/series appstream-glib-0.7.18/debian/patches/series
--- appstream-glib-0.7.18/debian/patches/series 1970-01-01 01:00:00.000000000 +0100
+++ appstream-glib-0.7.18/debian/patches/series 2023-06-07 19:25:59.000000000 +0100
@@ -0,0 +1,4 @@
+Support-em-code-tags.patch
+Properly-initialize-AsNodeToXmlHelper.patch
+trivial-Turn-is_-em-code-_text-fields-into-bitfields.patch
+Improve-handling-of-em-and-code-tags.patch
diff -Nru appstream-glib-0.7.18/libappstream-glib/as-node.c appstream-glib-0.7.18/libappstream-glib/as-node.c
--- appstream-glib-0.7.18/libappstream-glib/as-node.c 2020-09-07 11:20:43.894573000 +0100
+++ appstream-glib-0.7.18/libappstream-glib/as-node.c 2023-06-07 20:58:11.000000000 +0100
@@ -555,6 +555,8 @@
AsNode *current;
AsNodeFromXmlFlags flags;
const gchar * const *locales;
+ guint8 is_em_text:1;
+ guint8 is_code_text:1;
} AsNodeToXmlHelper;
/**
@@ -604,6 +606,16 @@
AsNode *current;
guint i;
+ /* do not create a child node for em and code tags */
+ if (g_strcmp0 (element_name, "em") == 0) {
+ helper->is_em_text = 1;
+ return;
+ }
+ if (g_strcmp0 (element_name, "code") == 0) {
+ helper->is_code_text = 1;
+ return;
+ }
+
/* check if we should ignore the locale */
data = g_slice_new0 (AsNodeData);
@@ -662,6 +674,53 @@
GError **error)
{
AsNodeToXmlHelper *helper = (AsNodeToXmlHelper *) user_data;
+ AsNodeData *data = helper->current->data;
+
+ /* do not create a child node for em and code tags */
+ if (g_strcmp0 (element_name, "em") == 0) {
+ helper->is_em_text = 0;
+ return;
+ }
+ if (g_strcmp0 (element_name, "code") == 0) {
+ helper->is_code_text = 0;
+ return;
+ }
+
+ if (data->cdata != NULL) {
+ /* split up into lines and add each with spaces stripped */
+ if ((helper->flags & AS_NODE_FROM_XML_FLAG_LITERAL_TEXT) == 0) {
+ AsRefString *cdata = data->cdata;
+ data->cdata = as_node_reflow_text (cdata, strlen (cdata));
+ as_ref_string_unref (cdata);
+ }
+
+ /* intern commonly duplicated tag values and save a bit of memory */
+ if (data->is_tag_valid) {
+ AsNode *root = g_node_get_root (helper->current);
+ switch (data->tag) {
+ case AS_TAG_CATEGORY:
+ case AS_TAG_COMPULSORY_FOR_DESKTOP:
+ case AS_TAG_CONTENT_ATTRIBUTE:
+ case AS_TAG_DEVELOPER_NAME:
+ case AS_TAG_EXTENDS:
+ case AS_TAG_ICON:
+ case AS_TAG_ID:
+ case AS_TAG_KUDO:
+ case AS_TAG_LANG:
+ case AS_TAG_METADATA_LICENSE:
+ case AS_TAG_MIMETYPE:
+ case AS_TAG_PROJECT_GROUP:
+ case AS_TAG_PROJECT_LICENSE:
+ case AS_TAG_SOURCE_PKGNAME:
+ case AS_TAG_URL:
+ as_node_cdata_to_intern (root, data);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
helper->current = helper->current->parent;
}
@@ -693,8 +752,9 @@
if (i >= text_len)
return;
- /* split up into lines and add each with spaces stripped */
- if (data->cdata != NULL) {
+ if (data->cdata != NULL &&
+ g_strcmp0 (as_tag_data_get_name (data), "p") != 0 &&
+ g_strcmp0 (as_tag_data_get_name (data), "li") != 0) {
g_set_error (error,
AS_NODE_ERROR,
AS_NODE_ERROR_INVALID_MARKUP,
@@ -703,37 +763,33 @@
data->cdata, text);
return;
}
- if ((helper->flags & AS_NODE_FROM_XML_FLAG_LITERAL_TEXT) > 0) {
- data->cdata = as_ref_string_new_with_length (text, text_len + 1);
- } else {
- data->cdata = as_node_reflow_text (text, (gssize) text_len);
- }
- /* intern commonly duplicated tag values and save a bit of memory */
- if (data->is_tag_valid && data->cdata != NULL) {
- AsNode *root = g_node_get_root (helper->current);
- switch (data->tag) {
- case AS_TAG_CATEGORY:
- case AS_TAG_COMPULSORY_FOR_DESKTOP:
- case AS_TAG_CONTENT_ATTRIBUTE:
- case AS_TAG_DEVELOPER_NAME:
- case AS_TAG_EXTENDS:
- case AS_TAG_ICON:
- case AS_TAG_ID:
- case AS_TAG_KUDO:
- case AS_TAG_LANG:
- case AS_TAG_METADATA_LICENSE:
- case AS_TAG_MIMETYPE:
- case AS_TAG_PROJECT_GROUP:
- case AS_TAG_PROJECT_LICENSE:
- case AS_TAG_SOURCE_PKGNAME:
- case AS_TAG_URL:
- as_node_cdata_to_intern (root, data);
- break;
- default:
- break;
+ /* support em and code tags */
+ if (helper->is_em_text || helper->is_code_text || data->cdata != NULL) {
+ g_autoptr(GString) str = g_string_new (NULL);
+
+ if (data->cdata != NULL) {
+ g_string_append (str, data->cdata);
+ as_ref_string_unref (data->cdata);
}
+
+ if (helper->is_em_text)
+ g_string_append (str, "<em>");
+ if (helper->is_code_text)
+ g_string_append (str, "<code>");
+
+ g_string_append_len (str, text, text_len);
+
+ if (helper->is_code_text)
+ g_string_append (str, "</code>");
+ if (helper->is_em_text)
+ g_string_append (str, "</em>");
+
+ data->cdata = as_ref_string_new_with_length (str->str, str->len);
+ return;
}
+
+ data->cdata = as_ref_string_new_with_length (text, text_len);
}
static void
@@ -790,7 +846,7 @@
AsNodeFromXmlFlags flags,
GError **error)
{
- AsNodeToXmlHelper helper;
+ AsNodeToXmlHelper helper = {0};
AsNode *root = NULL;
gboolean ret;
g_autoptr(GError) error_local = NULL;
@@ -927,7 +983,7 @@
GCancellable *cancellable,
GError **error)
{
- AsNodeToXmlHelper helper;
+ AsNodeToXmlHelper helper = {0};
GError *error_local = NULL;
AsNode *root = NULL;
const gchar *content_type = NULL;
diff -Nru appstream-glib-0.7.18/libappstream-glib/as-self-test.c appstream-glib-0.7.18/libappstream-glib/as-self-test.c
--- appstream-glib-0.7.18/libappstream-glib/as-self-test.c 2020-09-07 11:20:43.896573000 +0100
+++ appstream-glib-0.7.18/libappstream-glib/as-self-test.c 2023-06-07 20:58:11.000000000 +0100
@@ -2861,6 +2861,20 @@
"<!-- this documents bar -->"
"<bar key=\"value\">baz</bar>"
"</foo>";
+ const gchar *valid_em_code = "<description>"
+ "<p>"
+ "It now also supports <em>em</em> and <code>code</code> tags."
+ "</p>"
+ "</description>";
+ const gchar *valid_em_code_2 = "<description>"
+ "<p><em>Emphasis</em> at the start of the paragraph</p>"
+ "</description>";
+ const gchar *valid_em_code_empty = "<description>"
+ "<p><em></em></p>"
+ "</description>";
+ const gchar *valid_em_code_empty_2 = "<description>"
+ "<p>empty <em></em> emphasis</p>"
+ "</description>";
GError *error = NULL;
AsNode *n2;
AsNode *root;
@@ -2924,6 +2938,43 @@
g_string_free (xml, TRUE);
as_node_unref (root);
+ /* support em and code tags */
+ root = as_node_from_xml (valid_em_code, 0, &error);
+ g_assert_no_error (error);
+ g_assert (root != NULL);
+
+ n2 = as_node_find (root, "description/p");
+ g_assert (n2 != NULL);
+ g_assert_cmpstr (as_node_get_data (n2), ==, "It now also supports <em>em</em> and <code>code</code> tags.");
+ as_node_unref (root);
+
+ root = as_node_from_xml (valid_em_code_2, 0, &error);
+ g_assert_no_error (error);
+ g_assert (root != NULL);
+
+ n2 = as_node_find (root, "description/p");
+ g_assert (n2 != NULL);
+ g_assert_cmpstr (as_node_get_data (n2), ==, "<em>Emphasis</em> at the start of the paragraph");
+ as_node_unref (root);
+
+ root = as_node_from_xml (valid_em_code_empty, 0, &error);
+ g_assert_no_error (error);
+ g_assert (root != NULL);
+
+ n2 = as_node_find (root, "description/p");
+ g_assert (n2 != NULL);
+ g_assert_cmpstr (as_node_get_data (n2), ==, NULL);
+ as_node_unref (root);
+
+ root = as_node_from_xml (valid_em_code_empty_2, 0, &error);
+ g_assert_no_error (error);
+ g_assert (root != NULL);
+
+ n2 = as_node_find (root, "description/p");
+ g_assert (n2 != NULL);
+ g_assert_cmpstr (as_node_get_data (n2), ==, "empty emphasis");
+ as_node_unref (root);
+
/* keep comments */
root = as_node_from_xml (valid,
AS_NODE_FROM_XML_FLAG_KEEP_COMMENTS,
Reply to: