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 */