diff --git a/docs/xml/releases-data.xml b/docs/xml/releases-data.xml
index afc0b0c7b..69955295d 100644
--- a/docs/xml/releases-data.xml
+++ b/docs/xml/releases-data.xml
@@ -130,6 +130,10 @@
discard any development release if the current version is itself stable. It can
show all versions when development versions of the software are also distributed.
+
+ A release tag may have a name property. This may be a prettier name to present the user.
+ By default, it is assumed to be the release version.
+
The release itself may have the following children:
diff --git a/qt/release.cpp b/qt/release.cpp
index 345229cea..e1701569a 100644
--- a/qt/release.cpp
+++ b/qt/release.cpp
@@ -89,6 +89,11 @@ QString Release::version() const
return QString::fromUtf8(as_release_get_version(d->m_release));
}
+QString Release::name() const
+{
+ return QString::fromUtf8(as_release_get_name(d->m_release));
+}
+
QDateTime Release::timestamp() const
{
const guint64 timestamp = as_release_get_timestamp(d->m_release);
diff --git a/qt/release.h b/qt/release.h
index abac828a7..4877b4955 100644
--- a/qt/release.h
+++ b/qt/release.h
@@ -84,6 +84,7 @@ class APPSTREAMQT_EXPORT Release {
Kind kind() const;
QString version() const;
+ QString name() const;
QDateTime timestamp() const;
QDateTime timestampEol() const;
diff --git a/src/as-release.c b/src/as-release.c
index b47ae1789..69cbbe54f 100644
--- a/src/as-release.c
+++ b/src/as-release.c
@@ -48,6 +48,7 @@ typedef struct
{
AsReleaseKind kind;
gchar *version;
+ gchar *name;
GHashTable *description;
guint64 timestamp;
gchar *date;
@@ -176,6 +177,7 @@ as_release_finalize (GObject *object)
AsReleasePrivate *priv = GET_PRIVATE (release);
g_free (priv->version);
+ g_free (priv->name);
g_free (priv->date);
g_free (priv->date_eol);
g_free (priv->url_details);
@@ -783,6 +785,39 @@ as_release_set_description_translatable (AsRelease *release, gboolean translatab
priv->desc_translatable = translatable;
}
+/**
+ * as_release_get_name:
+ * @release: a #AsRelease instance.
+ *
+ * Gets the release name, or version if unset.
+ *
+ * Returns: (nullable): string, or %NULL for invalid
+ **/
+const gchar*
+as_release_get_name (AsRelease *release)
+{
+ AsReleasePrivate *priv = GET_PRIVATE (release);
+ g_return_val_if_fail (AS_IS_RELEASE (release), NULL);
+ if (priv->name == NULL)
+ return priv->version;
+ return priv->name;
+}
+
+/**
+ * as_release_set_name:
+ * @release: a #AsRelease instance.
+ * @name: the name string.
+ *
+ * Sets the release name.
+ **/
+void
+as_release_set_name (AsRelease *release, const gchar *name)
+{
+ AsReleasePrivate *priv = GET_PRIVATE (release);
+ g_return_if_fail (AS_IS_RELEASE (release));
+ as_assign_string_safe (priv->name, name);
+}
+
/**
* as_release_load_from_xml:
* @release: an #AsRelease
@@ -812,6 +847,12 @@ as_release_load_from_xml (AsRelease *release, AsContext *ctx, xmlNode *node, GEr
as_release_set_version (release, prop);
g_free (prop);
+ prop = as_xml_get_prop_value (node, "name");
+ if (prop != NULL) {
+ as_release_set_name (release, prop);
+ g_free (prop);
+ }
+
prop = as_xml_get_prop_value (node, "date");
if (prop != NULL) {
g_autoptr(GDateTime) time = as_iso8601_to_datetime (prop);
@@ -923,6 +964,8 @@ as_release_to_xml_node (AsRelease *release, AsContext *ctx, xmlNode *root)
as_xml_add_text_prop (subnode,
"version",
priv->version);
+ if (priv->name != NULL)
+ as_xml_add_text_prop (subnode, "name", priv->name);
/* set release timestamp / date */
if (priv->timestamp > 0) {
@@ -1020,6 +1063,8 @@ as_release_load_from_yaml (AsRelease *release, AsContext *ctx, GNode *node, GErr
priv->kind = as_release_kind_from_string (value);
} else if (g_strcmp0 (key, "version") == 0) {
as_release_set_version (release, value);
+ } else if (g_strcmp0 (key, "name") == 0) {
+ as_release_set_name (release, value);
} else if (g_strcmp0 (key, "urgency") == 0) {
priv->urgency = as_urgency_kind_from_string (value);
} else if (g_strcmp0 (key, "description") == 0) {
@@ -1077,6 +1122,8 @@ as_release_emit_yaml (AsRelease *release, AsContext *ctx, yaml_emitter_t *emitte
/* version */
as_yaml_emit_entry (emitter, "version", priv->version);
+ if (priv->name)
+ as_yaml_emit_entry (emitter, "name", priv->name);
/* type */
as_yaml_emit_entry (emitter, "type", as_release_kind_to_string (priv->kind));
diff --git a/src/as-release.h b/src/as-release.h
index a94c19406..36746058b 100644
--- a/src/as-release.h
+++ b/src/as-release.h
@@ -141,6 +141,10 @@ void as_release_set_url (AsRelease *release,
AsReleaseUrlKind url_kind,
const gchar *url);
+const gchar *as_release_get_name (AsRelease *release);
+void as_release_set_name (AsRelease *release,
+ const gchar *name);
+
G_END_DECLS
#endif /* __AS_RELEASE_H */