diff options
author | Richard Hughes <richard@hughsie.com> | 2015-07-23 11:05:44 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2015-07-23 11:06:22 +0100 |
commit | 1c2c2d3bda1d898e0ac4a1fad021dc13f14dc02c (patch) | |
tree | d0ca7497cb26e74f828246a867385a2542049b31 | |
parent | 659420384f7e9a3127c64121f75aa21b4ab4496e (diff) | |
download | appstream-glib-1c2c2d3bda1d898e0ac4a1fad021dc13f14dc02c.tar.gz |
Add as_release_set_filename()
This allows us to save the source package or bundle that is referenced to the
release. This allows us to download the correct file when installing a specific
version of a component.
This also allows us to mirror the correct file if the source filename is
different from the location-specified filename, or if there is no location
tag in the firmware metainfo file.
-rw-r--r-- | client/as-util.c | 16 | ||||
-rw-r--r-- | data/tests/firmware/2_0_0/firmware.inf | 4 | ||||
-rw-r--r-- | libappstream-builder/asb-self-test.c | 6 | ||||
-rw-r--r-- | libappstream-builder/plugins/asb-plugin-firmware.c | 3 | ||||
-rw-r--r-- | libappstream-glib/as-release.c | 54 | ||||
-rw-r--r-- | libappstream-glib/as-release.h | 6 | ||||
-rw-r--r-- | libappstream-glib/as-self-test.c | 2 | ||||
-rw-r--r-- | libappstream-glib/as-tag.c | 1 | ||||
-rw-r--r-- | libappstream-glib/as-tag.gperf | 1 | ||||
-rw-r--r-- | libappstream-glib/as-tag.h | 2 |
10 files changed, 83 insertions, 12 deletions
diff --git a/client/as-util.c b/client/as-util.c index 7eb49cd..8e5cdda 100644 --- a/client/as-util.c +++ b/client/as-util.c @@ -3369,10 +3369,18 @@ as_util_mirror_local_firmware (AsUtilPrivate *priv, gchar **values, GError **err _cleanup_free_ gchar *loc = NULL; _cleanup_free_ gchar *fn = NULL; rel = g_ptr_array_index (releases, j); - tmp = as_release_get_location_default (rel); - if (tmp == NULL) - continue; - fn = g_path_get_basename (tmp); + + /* get the release filename, but fall back to + * the default location basename if unset */ + tmp = as_release_get_filename (rel); + if (tmp != NULL) { + fn = g_strdup (tmp); + } else { + tmp = as_release_get_location_default (rel); + if (tmp == NULL) + continue; + fn = g_path_get_basename (tmp); + } loc = g_build_filename (values[1], fn, NULL); g_ptr_array_set_size (as_release_get_locations (rel), 0); as_release_add_location (rel, loc, -1); diff --git a/data/tests/firmware/2_0_0/firmware.inf b/data/tests/firmware/2_0_0/firmware.inf index 6299370..ce4eeef 100644 --- a/data/tests/firmware/2_0_0/firmware.inf +++ b/data/tests/firmware/2_0_0/firmware.inf @@ -5,10 +5,6 @@ Class=Firmware ClassGuid={f2e7dd72-6468-4e36-b6f1-6488f42c1b52} DriverVer=03/01/2015,2.0.0 -; this is a nonstandard section -[Location] -URLs=http://www.hughski.com/downloads/colorhug2/firmware/colorhug-2.0.0.cab - [Firmware_CopyFiles] firmware.bin diff --git a/libappstream-builder/asb-self-test.c b/libappstream-builder/asb-self-test.c index b4dc0fc..0311938 100644 --- a/libappstream-builder/asb-self-test.c +++ b/libappstream-builder/asb-self-test.c @@ -930,6 +930,7 @@ asb_test_firmware_func (void) "<release version=\"2.0.2\" timestamp=\"1424116753\">\n" "<location>http://www.hughski.com/downloads/colorhug2/firmware/colorhug-2.0.2.cab</location>\n" "<checksum type=\"sha1\">522aeefdcc7f27658d73de76107fe62550c61868</checksum>\n" + "<filename>colorhug-als-2.0.2.cab</filename>\n" "<description><p>This unstable release adds the following features:</p>" "<ul><li>Add TakeReadingArray to enable panel latency measurements</li>" "<li>Speed up the auto-scaled measurements considerably, using 256ms " @@ -938,14 +939,15 @@ asb_test_firmware_func (void) "<release version=\"2.0.1\" timestamp=\"1424116753\">\n" "<location>http://www.hughski.com/downloads/colorhug2/firmware/colorhug-2.0.1.cab</location>\n" "<checksum type=\"sha1\">c7cc46d54d8d4ba452b677a2367214efbaa40fd5</checksum>\n" + "<filename>colorhug-als-2.0.1.cab</filename>\n" "<description><p>This unstable release adds the following features:</p>" "<ul><li>Use TakeReadings() to do a quick non-adaptive measurement</li>" "<li>Scale XYZ measurement with a constant factor to make the CCMX more " "sane</li></ul></description>\n" "</release>\n" "<release version=\"2.0.0\" timestamp=\"1425168000\">\n" - "<location>http://www.hughski.com/downloads/colorhug2/firmware/colorhug-2.0.0.cab</location>\n" - "<checksum type=\"sha1\">70de24d3ef22ad4ded97a3da0167df804c0d1a10</checksum>\n" + "<checksum type=\"sha1\">186ad37fe3e63acc843b8727ac1add4ac15f0bf8</checksum>\n" + "<filename>colorhug-als-2.0.0.cab</filename>\n" "</release>\n" "</releases>\n" "</component>\n" diff --git a/libappstream-builder/plugins/asb-plugin-firmware.c b/libappstream-builder/plugins/asb-plugin-firmware.c index 900635b..96367ff 100644 --- a/libappstream-builder/plugins/asb-plugin-firmware.c +++ b/libappstream-builder/plugins/asb-plugin-firmware.c @@ -140,6 +140,9 @@ asb_plugin_process_filename (AsbPlugin *plugin, if (fw_basename != NULL) as_app_add_metadata (AS_APP (app), "FirmwareBasename", fw_basename, -1); + /* added so we can mirror files */ + as_release_set_filename (release, asb_package_get_basename (pkg), -1); + asb_plugin_add_app (apps, AS_APP (app)); return TRUE; } diff --git a/libappstream-glib/as-release.c b/libappstream-glib/as-release.c index de78f26..43df0e1 100644 --- a/libappstream-glib/as-release.c +++ b/libappstream-glib/as-release.c @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- * - * Copyright (C) 2014 Richard Hughes <richard@hughsie.com> + * Copyright (C) 2014-2015 Richard Hughes <richard@hughsie.com> * * Licensed under the GNU Lesser General Public License Version 2.1 * @@ -51,6 +51,7 @@ typedef struct _AsReleasePrivate AsReleasePrivate; struct _AsReleasePrivate { gchar *version; + gchar *filename; GHashTable *descriptions; guint64 timestamp; GPtrArray *locations; @@ -71,6 +72,7 @@ as_release_finalize (GObject *object) AsReleasePrivate *priv = GET_PRIVATE (release); g_free (priv->version); + g_free (priv->filename); g_strfreev (priv->checksums); g_ptr_array_unref (priv->locations); if (priv->descriptions != NULL) @@ -149,6 +151,23 @@ as_release_get_version (AsRelease *release) } /** + * as_release_get_filename: + * @release: a #AsRelease instance. + * + * Gets the release filename. + * + * Returns: string, or %NULL for not set or invalid + * + * Since: 0.4.2 + **/ +const gchar * +as_release_get_filename (AsRelease *release) +{ + AsReleasePrivate *priv = GET_PRIVATE (release); + return priv->filename; +} + +/** * as_release_get_locations: * @release: a #AsRelease instance. * @@ -260,6 +279,26 @@ as_release_set_version (AsRelease *release, } /** + * as_release_set_filename: + * @release: a #AsRelease instance. + * @filename: the filename string. + * @filename_len: the size of @filename, or -1 if %NULL-terminated. + * + * Sets the release filename. + * + * Since: 0.4.2 + **/ +void +as_release_set_filename (AsRelease *release, + const gchar *filename, + gssize filename_len) +{ + AsReleasePrivate *priv = GET_PRIVATE (release); + g_free (priv->filename); + priv->filename = as_strndup (filename, filename_len); +} + +/** * as_release_add_location: * @release: a #AsRelease instance. * @location: the location string. @@ -432,6 +471,11 @@ as_release_node_insert (AsRelease *release, GNode *parent, AsNodeContext *ctx) "type", _g_checksum_type_to_string (i), NULL); } + if (priv->filename != NULL) { + as_node_insert (n, "filename", priv->filename, + AS_NODE_INSERT_FLAG_NONE, + NULL); + } } if (priv->descriptions != NULL && as_node_context_get_version (ctx) >= 0.6) { as_node_insert_localized (n, "description", priv->descriptions, @@ -481,6 +525,14 @@ as_release_node_parse (AsRelease *release, GNode *node, g_ptr_array_add (priv->locations, as_node_take_data (n)); } + /* get optional filename */ + for (n = node->children; n != NULL; n = n->next) { + if (as_node_get_tag (n) != AS_TAG_FILENAME) + continue; + g_free (priv->filename); + priv->filename = as_node_take_data (n); + } + /* get optional checksums */ for (i = 0; i <= AS_RELEASE_CHECKSUM_TYPE_MAX; i++) { g_free (priv->checksums[i]); diff --git a/libappstream-glib/as-release.h b/libappstream-glib/as-release.h index 64c5b45..c145f8c 100644 --- a/libappstream-glib/as-release.h +++ b/libappstream-glib/as-release.h @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- * - * Copyright (C) 2014 Richard Hughes <richard@hughsie.com> + * Copyright (C) 2014-2015 Richard Hughes <richard@hughsie.com> * * Licensed under the GNU Lesser General Public License Version 2.1 * @@ -66,6 +66,7 @@ gint as_release_vercmp (AsRelease *rel1, /* getters */ const gchar *as_release_get_version (AsRelease *release); +const gchar *as_release_get_filename (AsRelease *release); guint64 as_release_get_timestamp (AsRelease *release); const gchar *as_release_get_description (AsRelease *release, const gchar *locale); @@ -78,6 +79,9 @@ const gchar *as_release_get_checksum (AsRelease *release, void as_release_set_version (AsRelease *release, const gchar *version, gssize version_len); +void as_release_set_filename (AsRelease *release, + const gchar *filename, + gssize filename_len); void as_release_set_timestamp (AsRelease *release, guint64 timestamp); void as_release_set_description (AsRelease *release, diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c index e55a808..535a479 100644 --- a/libappstream-glib/as-self-test.c +++ b/libappstream-glib/as-self-test.c @@ -204,6 +204,7 @@ as_test_release_appstream_func (void) "<location>http://baz.com/bar.cab</location>\n" "<checksum type=\"md5\">deadbeef</checksum>\n" "<checksum type=\"sha1\">12345</checksum>\n" + "<filename>firmware.cab</filename>\n" "<description><p>This is a new release</p><ul><li>Point</li></ul></description>\n" "<description xml:lang=\"pl\"><p>Oprogramowanie</p></description>\n" "</release>\n"; @@ -227,6 +228,7 @@ as_test_release_appstream_func (void) /* verify */ g_assert_cmpint (as_release_get_timestamp (release), ==, 123); g_assert_cmpstr (as_release_get_version (release), ==, "0.1.2"); + g_assert_cmpstr (as_release_get_filename (release), ==, "firmware.cab"); g_assert_cmpstr (as_release_get_location_default (release), ==, "http://foo.com/bar.zip"); g_assert_cmpstr (as_release_get_checksum (release, G_CHECKSUM_SHA1), ==, "12345"); g_assert_cmpstr (as_release_get_checksum (release, G_CHECKSUM_MD5), ==, "deadbeef"); diff --git a/libappstream-glib/as-tag.c b/libappstream-glib/as-tag.c index 31cf7e8..6d00ffe 100644 --- a/libappstream-glib/as-tag.c +++ b/libappstream-glib/as-tag.c @@ -190,6 +190,7 @@ as_tag_to_string (AsTag tag) "permission", "location", "checksum", + "filename", NULL }; if (tag > AS_TAG_LAST) tag = AS_TAG_LAST; diff --git a/libappstream-glib/as-tag.gperf b/libappstream-glib/as-tag.gperf index 3c31b46..7746b90 100644 --- a/libappstream-glib/as-tag.gperf +++ b/libappstream-glib/as-tag.gperf @@ -54,3 +54,4 @@ permissions, AS_TAG_PERMISSIONS permission, AS_TAG_PERMISSION location, AS_TAG_LOCATION checksum, AS_TAG_CHECKSUM +filename, AS_TAG_FILENAME diff --git a/libappstream-glib/as-tag.h b/libappstream-glib/as-tag.h index ed16c5b..8cfc26c 100644 --- a/libappstream-glib/as-tag.h +++ b/libappstream-glib/as-tag.h @@ -77,6 +77,7 @@ * @AS_TAG_PERMISSION: `permission` * @AS_TAG_LOCATION: `location` * @AS_TAG_CHECKSUM: `checksum` + * @AS_TAG_FILENAME: `filename` * * The tag type. **/ @@ -128,6 +129,7 @@ typedef enum { AS_TAG_PERMISSION, /* Since: 0.3.5 */ AS_TAG_LOCATION, /* Since: 0.3.5 */ AS_TAG_CHECKSUM, /* Since: 0.3.5 */ + AS_TAG_FILENAME, /* Since: 0.4.2 */ /*< private >*/ AS_TAG_LAST } AsTag; |