mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-09 15:23:48 +00:00
Consider the release priority when returning results
This means we might be able to offer two versions of firmware for the same device, where one has additional requirement such as a CHID. The idea here is to allow OEMs to distribute thier own superset dbx updates on the LVFS without having to invent an anti-CHID requirement type.
This commit is contained in:
parent
31f481518b
commit
1c35757f85
@ -5052,19 +5052,24 @@ static gint
|
|||||||
fu_engine_sort_releases_cb(gconstpointer a, gconstpointer b, gpointer user_data)
|
fu_engine_sort_releases_cb(gconstpointer a, gconstpointer b, gpointer user_data)
|
||||||
{
|
{
|
||||||
FuDevice *device = FU_DEVICE(user_data);
|
FuDevice *device = FU_DEVICE(user_data);
|
||||||
FwupdRelease *rel_a = FWUPD_RELEASE(*((FwupdRelease **)a));
|
FuRelease *rel_a = FU_RELEASE(*((FuRelease **)a));
|
||||||
FwupdRelease *rel_b = FWUPD_RELEASE(*((FwupdRelease **)b));
|
FuRelease *rel_b = FU_RELEASE(*((FuRelease **)b));
|
||||||
gint rc;
|
gint rc;
|
||||||
|
|
||||||
/* first by branch */
|
/* first by branch */
|
||||||
rc = g_strcmp0(fwupd_release_get_branch(rel_b), fwupd_release_get_branch(rel_a));
|
rc = g_strcmp0(fu_release_get_branch(rel_b), fu_release_get_branch(rel_a));
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
/* then by version */
|
/* then by version */
|
||||||
return fu_version_compare(fwupd_release_get_version(rel_b),
|
rc = fu_version_compare(fu_release_get_version(rel_b),
|
||||||
fwupd_release_get_version(rel_a),
|
fu_release_get_version(rel_a),
|
||||||
fu_device_get_version_format(device));
|
fu_device_get_version_format(device));
|
||||||
|
if (rc != 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
/* then by priority */
|
||||||
|
return fu_release_compare(rel_a, rel_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -33,6 +33,7 @@ struct _FuRelease {
|
|||||||
gboolean is_downgrade;
|
gboolean is_downgrade;
|
||||||
GPtrArray *soft_reqs; /* nullable, element-type XbNode */
|
GPtrArray *soft_reqs; /* nullable, element-type XbNode */
|
||||||
GPtrArray *hard_reqs; /* nullable, element-type XbNode */
|
GPtrArray *hard_reqs; /* nullable, element-type XbNode */
|
||||||
|
guint64 priority;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE(FuRelease, fu_release, FWUPD_TYPE_RELEASE)
|
G_DEFINE_TYPE(FuRelease, fu_release, FWUPD_TYPE_RELEASE)
|
||||||
@ -618,6 +619,13 @@ fu_release_check_requirements(FuRelease *self,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fu_release_set_priority(FuRelease *self, guint64 priority)
|
||||||
|
{
|
||||||
|
g_return_if_fail(FU_IS_RELEASE(self));
|
||||||
|
self->priority = priority;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_release_load:
|
* fu_release_load:
|
||||||
* @self: a #FuRelease
|
* @self: a #FuRelease
|
||||||
@ -689,6 +697,9 @@ fu_release_load(FuRelease *self,
|
|||||||
tmp = xb_node_query_text(component, "developer_name", NULL);
|
tmp = xb_node_query_text(component, "developer_name", NULL);
|
||||||
if (tmp != NULL)
|
if (tmp != NULL)
|
||||||
fwupd_release_set_vendor(FWUPD_RELEASE(self), tmp);
|
fwupd_release_set_vendor(FWUPD_RELEASE(self), tmp);
|
||||||
|
tmp64 = xb_node_get_attr_as_uint(component, "priority");
|
||||||
|
if (tmp64 != G_MAXUINT64)
|
||||||
|
fu_release_set_priority(self, tmp64);
|
||||||
|
|
||||||
/* use default release */
|
/* use default release */
|
||||||
if (rel_optional == NULL) {
|
if (rel_optional == NULL) {
|
||||||
@ -1014,7 +1025,7 @@ fu_release_get_action_id(FuRelease *self)
|
|||||||
* @release1: first task to compare.
|
* @release1: first task to compare.
|
||||||
* @release2: second task to compare.
|
* @release2: second task to compare.
|
||||||
*
|
*
|
||||||
* Compares two install tasks.
|
* Compares two releases.
|
||||||
*
|
*
|
||||||
* Returns: 1, 0 or -1 if @release1 is greater, equal, or less than @release2, respectively.
|
* Returns: 1, 0 or -1 if @release1 is greater, equal, or less than @release2, respectively.
|
||||||
**/
|
**/
|
||||||
@ -1023,10 +1034,18 @@ fu_release_compare(FuRelease *release1, FuRelease *release2)
|
|||||||
{
|
{
|
||||||
FuDevice *device1 = fu_release_get_device(release1);
|
FuDevice *device1 = fu_release_get_device(release1);
|
||||||
FuDevice *device2 = fu_release_get_device(release2);
|
FuDevice *device2 = fu_release_get_device(release2);
|
||||||
|
|
||||||
|
/* device order, lower is better */
|
||||||
if (fu_device_get_order(device1) < fu_device_get_order(device2))
|
if (fu_device_get_order(device1) < fu_device_get_order(device2))
|
||||||
return -1;
|
return -1;
|
||||||
if (fu_device_get_order(device1) > fu_device_get_order(device2))
|
if (fu_device_get_order(device1) > fu_device_get_order(device2))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
/* release priority, higher is better */
|
||||||
|
if (release1->priority > release2->priority)
|
||||||
|
return -1;
|
||||||
|
if (release1->priority < release2->priority)
|
||||||
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ fu_release_new(void);
|
|||||||
#define fu_release_add_flag(r, v) fwupd_release_add_flag(FWUPD_RELEASE(r), v)
|
#define fu_release_add_flag(r, v) fwupd_release_add_flag(FWUPD_RELEASE(r), v)
|
||||||
#define fu_release_add_tag(r, v) fwupd_release_add_tag(FWUPD_RELEASE(r), v)
|
#define fu_release_add_tag(r, v) fwupd_release_add_tag(FWUPD_RELEASE(r), v)
|
||||||
#define fu_release_add_metadata(r, v) fwupd_release_add_metadata(FWUPD_RELEASE(r), v)
|
#define fu_release_add_metadata(r, v) fwupd_release_add_metadata(FWUPD_RELEASE(r), v)
|
||||||
|
#define fu_release_set_branch(r, v) fwupd_release_set_branch(FWUPD_RELEASE(r), v)
|
||||||
|
|
||||||
FuDevice *
|
FuDevice *
|
||||||
fu_release_get_device(FuRelease *self);
|
fu_release_get_device(FuRelease *self);
|
||||||
@ -58,3 +59,5 @@ const gchar *
|
|||||||
fu_release_get_action_id(FuRelease *self);
|
fu_release_get_action_id(FuRelease *self);
|
||||||
gint
|
gint
|
||||||
fu_release_compare(FuRelease *release1, FuRelease *release2);
|
fu_release_compare(FuRelease *release1, FuRelease *release2);
|
||||||
|
void
|
||||||
|
fu_release_set_priority(FuRelease *self, guint64 priority);
|
||||||
|
@ -4096,7 +4096,6 @@ fu_spawn_timeout_func(void)
|
|||||||
static void
|
static void
|
||||||
fu_release_compare_func(gconstpointer user_data)
|
fu_release_compare_func(gconstpointer user_data)
|
||||||
{
|
{
|
||||||
FuDevice *device_tmp;
|
|
||||||
g_autoptr(GPtrArray) releases = g_ptr_array_new();
|
g_autoptr(GPtrArray) releases = g_ptr_array_new();
|
||||||
g_autoptr(FuDevice) device1 = fu_device_new(NULL);
|
g_autoptr(FuDevice) device1 = fu_device_new(NULL);
|
||||||
g_autoptr(FuDevice) device2 = fu_device_new(NULL);
|
g_autoptr(FuDevice) device2 = fu_device_new(NULL);
|
||||||
@ -4105,25 +4104,31 @@ fu_release_compare_func(gconstpointer user_data)
|
|||||||
g_autoptr(FuRelease) release2 = fu_release_new();
|
g_autoptr(FuRelease) release2 = fu_release_new();
|
||||||
g_autoptr(FuRelease) release3 = fu_release_new();
|
g_autoptr(FuRelease) release3 = fu_release_new();
|
||||||
|
|
||||||
fu_device_set_order(device1, 99);
|
fu_device_set_order(device1, 33);
|
||||||
fu_release_set_device(release1, device1);
|
fu_release_set_device(release1, device1);
|
||||||
g_ptr_array_add(releases, release1);
|
fu_release_set_priority(release1, 0);
|
||||||
|
fu_release_set_branch(release1, "1");
|
||||||
|
|
||||||
fu_device_set_order(device2, 11);
|
fu_device_set_order(device2, 11);
|
||||||
fu_release_set_device(release2, device2);
|
fu_release_set_device(release2, device2);
|
||||||
g_ptr_array_add(releases, release2);
|
fu_release_set_priority(release2, 0);
|
||||||
fu_device_set_order(device3, 33);
|
fu_release_set_branch(release2, "2");
|
||||||
|
|
||||||
|
fu_device_set_order(device3, 11);
|
||||||
fu_release_set_device(release3, device3);
|
fu_release_set_device(release3, device3);
|
||||||
|
fu_release_set_priority(release3, 99);
|
||||||
|
fu_release_set_branch(release3, "3");
|
||||||
|
|
||||||
|
g_ptr_array_add(releases, release1);
|
||||||
|
g_ptr_array_add(releases, release2);
|
||||||
g_ptr_array_add(releases, release3);
|
g_ptr_array_add(releases, release3);
|
||||||
|
|
||||||
/* order the install tasks */
|
/* order the install tasks */
|
||||||
g_ptr_array_sort(releases, fu_release_compare_func_cb);
|
g_ptr_array_sort(releases, fu_release_compare_func_cb);
|
||||||
g_assert_cmpint(releases->len, ==, 3);
|
g_assert_cmpint(releases->len, ==, 3);
|
||||||
device_tmp = fu_release_get_device(g_ptr_array_index(releases, 0));
|
g_assert_cmpstr(fu_release_get_branch(g_ptr_array_index(releases, 0)), ==, "3");
|
||||||
g_assert_cmpint(fu_device_get_order(device_tmp), ==, 11);
|
g_assert_cmpstr(fu_release_get_branch(g_ptr_array_index(releases, 1)), ==, "2");
|
||||||
device_tmp = fu_release_get_device(g_ptr_array_index(releases, 1));
|
g_assert_cmpstr(fu_release_get_branch(g_ptr_array_index(releases, 2)), ==, "1");
|
||||||
g_assert_cmpint(fu_device_get_order(device_tmp), ==, 33);
|
|
||||||
device_tmp = fu_release_get_device(g_ptr_array_index(releases, 2));
|
|
||||||
g_assert_cmpint(fu_device_get_order(device_tmp), ==, 99);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user