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 <s...@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 via email to