summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2015-07-23 11:05:44 +0100
committerRichard Hughes <richard@hughsie.com>2015-07-23 11:06:22 +0100
commit1c2c2d3bda1d898e0ac4a1fad021dc13f14dc02c (patch)
treed0ca7497cb26e74f828246a867385a2542049b31
parent659420384f7e9a3127c64121f75aa21b4ab4496e (diff)
downloadappstream-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.c16
-rw-r--r--data/tests/firmware/2_0_0/firmware.inf4
-rw-r--r--libappstream-builder/asb-self-test.c6
-rw-r--r--libappstream-builder/plugins/asb-plugin-firmware.c3
-rw-r--r--libappstream-glib/as-release.c54
-rw-r--r--libappstream-glib/as-release.h6
-rw-r--r--libappstream-glib/as-self-test.c2
-rw-r--r--libappstream-glib/as-tag.c1
-rw-r--r--libappstream-glib/as-tag.gperf1
-rw-r--r--libappstream-glib/as-tag.h2
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;