59 lines
2.0 KiB
Diff
59 lines
2.0 KiB
Diff
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
|
||
index b61dddb7f43..9c928dda470 100644
|
||
--- 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);
|
||
}
|