2020-07-21 10:23:41 +00:00
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Will Thompson <wjt@endlessm.com>
|
|
|
|
|
Date: Wed, 11 Jul 2018 15:41:09 +0100
|
|
|
|
|
Subject: [PATCH] blscfg: sort BLS entries by 'version' field
|
|
|
|
|
MIME-Version: 1.0
|
|
|
|
|
Content-Type: text/plain; charset=UTF-8
|
|
|
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
|
|
|
|
|
|
This partially reverts ‘Use BLS fragment filename as menu entry id and
|
|
|
|
|
for criteria to sort’. Sorting by filename only gives the correct order
|
|
|
|
|
if the BLS entries are generated by a version of ostree after this patch
|
|
|
|
|
https://github.com/ostreedev/ostree/commit/9f48e212a3bf9ed418fb3216e4f834d581bc520e
|
|
|
|
|
to use the version (higher is newer) in the filename. Older ostrees,
|
|
|
|
|
including all releases at the time of writing, use the index (lower is
|
|
|
|
|
newer) in the filename, so sorting by filename produces the reverse
|
|
|
|
|
order.
|
|
|
|
|
|
|
|
|
|
Sorting by 'version' field matches libostree's own
|
|
|
|
|
compare_boot_loader_configs(), so I think it's more correct than relying
|
|
|
|
|
on the filename, particularly since we've already gone to the trouble of
|
|
|
|
|
parsing all the fields in the file.
|
|
|
|
|
|
|
|
|
|
Signed-off-by: Will Thompson <wjt@endlessm.com>
|
|
|
|
|
---
|
|
|
|
|
grub-core/commands/blscfg.c | 16 ++++++++++++++++
|
|
|
|
|
1 file changed, 16 insertions(+)
|
|
|
|
|
|
|
|
|
|
diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c
|
2022-05-10 07:20:45 +00:00
|
|
|
|
index b61dddb7f..9c928dda4 100644
|
2020-07-21 10:23:41 +00:00
|
|
|
|
--- a/grub-core/commands/blscfg.c
|
|
|
|
|
+++ b/grub-core/commands/blscfg.c
|
|
|
|
|
@@ -327,10 +327,26 @@ finish:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* return 1: p0 is newer than p1 */
|
|
|
|
|
+/* 0: p0 and p1 are the same version */
|
|
|
|
|
+/* -1: p1 is newer than p0 */
|
|
|
|
|
static int bls_cmp(const void *p0, const void *p1, void *state UNUSED)
|
|
|
|
|
{
|
|
|
|
|
struct bls_entry * e0 = *(struct bls_entry **)p0;
|
|
|
|
|
struct bls_entry * e1 = *(struct bls_entry **)p1;
|
|
|
|
|
+ const char *v0, *v1;
|
|
|
|
|
+ int r;
|
|
|
|
|
+
|
|
|
|
|
+ v0 = bls_get_val(e0, "version", NULL);
|
|
|
|
|
+ v1 = bls_get_val(e1, "version", NULL);
|
|
|
|
|
+
|
|
|
|
|
+ if (v0 && !v1)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ if (!v0 && v1)
|
|
|
|
|
+ return 1;
|
|
|
|
|
+
|
|
|
|
|
+ if ((r = vercmp(v0, v1)) != 0)
|
|
|
|
|
+ return r;
|
|
|
|
|
|
|
|
|
|
return vercmp(e0->filename, e1->filename);
|
|
|
|
|
}
|