[PATCH v5] templates: introduce GRUB_TOP_LEVEL_* vars

2022-10-24 Thread Denton Liu
A user may wish to use an image that is not sorted as the "latest"
version as the top-level entry. For example, in Arch Linux, if a user
has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
gets sorted as the "latest" compared to `/boot/vmlinuz-linux`, meaning
the LTS kernel becomes the top-level entry. However, a user may wish to
use the regular kernel as the top-level default with the LTS only
existing as a backup.

This need can be seen in Arch Linux's AUR with two user-submitted
packages[0][1] providing an update hook which patches
/etc/grub.d/10_linux to move the desired kernel to the top-level. This
patch serves to solve this in a more generic way.

Introduce the GRUB_TOP_LEVEL, GRUB_TOP_LEVEL_XEN and
GRUB_TOP_LEVEL_OS_PROBER variables to allow users to specify the
top-level entry.

Create grub_move_to_front() as a helper function which moves entries to
the front of a list. This function does the heavy lifting of moving
the menu entry to the front in each script.

In 10_netbsd, since there isn't an explicit list variable, extract the
items that are being iterated through into a list so that we can
optionally apply grub_move_to_front() to the list before the loop.

[0]: https://aur.archlinux.org/packages/grub-linux-default-hook
[1]: https://aur.archlinux.org/packages/grub-linux-rt-default-hook

Signed-off-by: Denton Liu 
---

Notes:
The only file that was tested is 10_linux. I do not have access to any
of the other images or systems so they remain untested.

Changes since v4:

* Update docs to specify that GRUB_TOP_LEVEL and GRUB_TOP_LEVEL_XEN take
  an absolute path

* Add more justification in the commit message

Changes since v3:

* Fix if formatting nit

* Rebase on top of latest 'master'

Changes since v2:

* Added more detail to GRUB_TOP_LEVEL docs

* Moved GRUB_TOP_LEVEL_OS_PROBER to separate section in docs

* Renamed grub_move_entry_to_front() to grub_move_to_front() and added
  code comment

* Give 10_netbsd an intermediate list of images to interact with

Range-diff against v4:
1:  d3a693804 ! 1:  ee633189b templates: introduce GRUB_TOP_LEVEL_* vars
@@ Commit message
 A user may wish to use an image that is not sorted as the "latest"
 version as the top-level entry. For example, in Arch Linux, if a user
 has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
-gets sorted as the "latest" compared to `/boot/vmlinuz-linux`. However,
-a user may wish to use the regular kernel as the default with the LTS
-only existing as a backup.
+gets sorted as the "latest" compared to `/boot/vmlinuz-linux`, meaning
+the LTS kernel becomes the top-level entry. However, a user may wish to
+use the regular kernel as the top-level default with the LTS only
+existing as a backup.
+
+This need can be seen in Arch Linux's AUR with two user-submitted
+packages[0][1] providing an update hook which patches
+/etc/grub.d/10_linux to move the desired kernel to the top-level. This
+patch serves to solve this in a more generic way.
 
 Introduce the GRUB_TOP_LEVEL, GRUB_TOP_LEVEL_XEN and
 GRUB_TOP_LEVEL_OS_PROBER variables to allow users to specify the
@@ Commit message
 items that are being iterated through into a list so that we can
 optionally apply grub_move_to_front() to the list before the loop.
 
+[0]: https://aur.archlinux.org/packages/grub-linux-default-hook
+[1]: https://aur.archlinux.org/packages/grub-linux-rt-default-hook
+
 Signed-off-by: Denton Liu 
 
 
@@ Notes
 The only file that was tested is 10_linux. I do not have access to any
 of the other images or systems so they remain untested.
 
+Changes since v4:
+
+* Update docs to specify that GRUB_TOP_LEVEL and GRUB_TOP_LEVEL_XEN 
take
+  an absolute path
+
+* Add more justification in the commit message
+
 Changes since v3:
 
 * Fix if formatting nit
@@ docs/grub.texi: for all respectively normal entries.
  
 +@item GRUB_TOP_LEVEL
 +@item GRUB_TOP_LEVEL_XEN
-+This option should be a path to a kernel image. If provided, the image
-+specified will be made the top-level entry if it is found in the scan.
++This option should be an absolute path to a kernel image. If provided, the
++image specified will be made the top-level entry if it is found in the 
scan.
 +
 +@item GRUB_TOP_LEVEL_OS_PROBER
 +This option should be a line of output from @command{os-prober}. As

 docs/grub.texi  | 10 ++
 util/grub-mkconfig.in   |  3 +++
 util/grub-mkconfig_lib.in   | 26 ++
 util/grub.d/10_hurd.in  |  4 
 util/grub.d/

Re: [PATCH v4] templates: introduce GRUB_TOP_LEVEL_* vars

2022-10-21 Thread Denton Liu
Hi Olaf,

On Thu, Oct 20, 2022 at 05:13:06PM +0200, Olaf Hering wrote:
> After reading the patch again, the newly added documentation states:
> "This option should be a path to a kernel image."
> 
> I think it needs to be more specific: is it expecting an absolute path, or 
> just the basename of the desired image?

Thanks for the feedback, it should be an absolute path. I can submit a
new version of the patch later. However, before I do so, are you still
a NAK on the general idea?

-Denton

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: [PATCH v4] templates: introduce GRUB_TOP_LEVEL_* vars

2022-10-18 Thread Denton Liu
Hi Olaf,

On Tue, Oct 18, 2022 at 04:18:21PM +0200, Olaf Hering wrote:
> I think this can be done already today. At least YaST offers a way to select 
> a specific item in a submenu and pass it to grub-set-default. This leads to 
> an entry like this in grubenv:

Right, we currently offer the ability to navigate to a default _submenu_
but I think that it's bad UI to relegate the most oft-used entry to a
submenu entry instead of the top-level entry. I would like to be able to
specify the top-level entry, that is the first entry in the first menu.

> Maybe the patch description lacks a specific example how the proposed change 
> is supposed to be used in your environment.

My patch description says:

Introduce the GRUB_TOP_LEVEL, GRUB_TOP_LEVEL_XEN and
GRUB_TOP_LEVEL_OS_PROBER variables to allow users to specify the
top-level entry.

and I'm not quite sure how to make it more clear other than, perhaps,
explaining what the top-level entry means.

-Denton

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: [PATCH v4] templates: introduce GRUB_TOP_LEVEL_* vars

2022-10-18 Thread Denton Liu
Hi Olaf,

On Tue, Oct 18, 2022 at 01:12:35PM +0200, Olaf Hering wrote:
> Mon, 17 Oct 2022 03:35:32 -0700 Denton Liu :
> 
> > A user may wish to use an image that is not sorted as the "latest"
> > version as the top-level entry. 
> 
> Correct.
> 
> What is really required is some form of file pattern matching and to use 
> --id= in "menuentry title" commands.
> 
> That way one can have the "latest" of /boot/${short_pattern} as default 
> entry, in case there are multiple variants of files matching 
> ${short_pattern}. The pattern gets enabled with "grub-set-default pattern".

If I'm understanding correctly, what you're proposing is a mechanism for
setting the default entry. If I'm not mistaken, this seems like an
orthogonal discussion to me. My patch proposes a method of setting the
top-level menu entry while this method only sets the default entry,
which may be hidden behind a submenu.

In my case, I keep a LTS kernel as backup but primarily use the latest
kernel as my daily driver. I only ever boot into the LTS kernel in case
there are any breakages, which is quite rare. As such, while it is
possible for me to configure my default to point within a submenu to the
non-LTS kernel, it seems like a bad user experience for Grub to impose a
top-level entry on the user, even if that entry is almost never used.

Allowing users to configure the top-level entry to fit their needs would
certainly make for happier users.

Thanks,
Denton

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


[PATCH v4] templates: introduce GRUB_TOP_LEVEL_* vars

2022-10-17 Thread Denton Liu
A user may wish to use an image that is not sorted as the "latest"
version as the top-level entry. For example, in Arch Linux, if a user
has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
gets sorted as the "latest" compared to `/boot/vmlinuz-linux`. However,
a user may wish to use the regular kernel as the default with the LTS
only existing as a backup.

Introduce the GRUB_TOP_LEVEL, GRUB_TOP_LEVEL_XEN and
GRUB_TOP_LEVEL_OS_PROBER variables to allow users to specify the
top-level entry.

Create grub_move_to_front() as a helper function which moves entries to
the front of a list. This function does the heavy lifting of moving
the menu entry to the front in each script.

In 10_netbsd, since there isn't an explicit list variable, extract the
items that are being iterated through into a list so that we can
optionally apply grub_move_to_front() to the list before the loop.

Signed-off-by: Denton Liu 
---

Notes:
The only file that was tested is 10_linux. I do not have access to any
of the other images or systems so they remain untested.

Changes since v3:

* Fix if formatting nit

* Rebase on top of latest 'master'

Changes since v2:

* Added more detail to GRUB_TOP_LEVEL docs

* Moved GRUB_TOP_LEVEL_OS_PROBER to separate section in docs

* Renamed grub_move_entry_to_front() to grub_move_to_front() and added
  code comment

* Give 10_netbsd an intermediate list of images to interact with

Range-diff against v3:
1:  3684d8fe2 ! 1:  d3a693804 templates: introduce GRUB_TOP_LEVEL_* vars
@@ Notes
 The only file that was tested is 10_linux. I do not have access to any
 of the other images or systems so they remain untested.
 
+Changes since v3:
+
+* Fix if formatting nit
+
+* Rebase on top of latest 'master'
+
 Changes since v2:
 
 * Added more detail to GRUB_TOP_LEVEL docs
@@ util/grub-mkconfig_lib.in: version_sort ()
 +echo "$item"
 +  fi
 +  for i in "$@"; do
-+if [ "x$i" = "x$item" ]; then continue; fi
++if [ "x$i" = "x$item" ]; then
++  continue
++fi
 +echo "$i"
 +  done
 +}

 docs/grub.texi  | 10 ++
 util/grub-mkconfig.in   |  3 +++
 util/grub-mkconfig_lib.in   | 26 ++
 util/grub.d/10_hurd.in  |  4 
 util/grub.d/10_kfreebsd.in  |  4 
 util/grub.d/10_linux.in |  4 
 util/grub.d/10_netbsd.in|  8 +++-
 util/grub.d/20_linux_xen.in |  7 +++
 util/grub.d/30_os-prober.in |  4 
 9 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/docs/grub.texi b/docs/grub.texi
index 0dbbdc374..5d41219ac 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -1444,6 +1444,16 @@ for all respectively normal entries.
 The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX}
 and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries.
 
+@item GRUB_TOP_LEVEL
+@item GRUB_TOP_LEVEL_XEN
+This option should be a path to a kernel image. If provided, the image
+specified will be made the top-level entry if it is found in the scan.
+
+@item GRUB_TOP_LEVEL_OS_PROBER
+This option should be a line of output from @command{os-prober}. As
+@samp{GRUB_TOP_LEVEL}, if provided, the image specified will be made the
+top-level entry if it is found in the scan.
+
 @item GRUB_EARLY_INITRD_LINUX_CUSTOM
 @itemx GRUB_EARLY_INITRD_LINUX_STOCK
 List of space-separated early initrd images to be loaded from @samp{/boot}.
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
index 62335d027..32c480dae 100644
--- a/util/grub-mkconfig.in
+++ b/util/grub-mkconfig.in
@@ -233,6 +233,9 @@ export GRUB_DEFAULT \
   GRUB_CMDLINE_NETBSD \
   GRUB_CMDLINE_NETBSD_DEFAULT \
   GRUB_CMDLINE_GNUMACH \
+  GRUB_TOP_LEVEL \
+  GRUB_TOP_LEVEL_XEN \
+  GRUB_TOP_LEVEL_OS_PROBER \
   GRUB_EARLY_INITRD_LINUX_CUSTOM \
   GRUB_EARLY_INITRD_LINUX_STOCK \
   GRUB_TERMINAL_INPUT \
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 634bc8a50..08953287c 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -218,6 +218,32 @@ version_sort ()
esac
 }
 
+# Given an item as the first argument and a list as the subsequent arguments,
+# returns the list with the first argument moved to the front if it exists in
+# the list.
+grub_move_to_front ()
+{
+  item="$1"
+  shift
+
+  item_found=false
+  for i in "$@"; do
+if [ "x$i" = "x$item" ]; then
+  item_found=true
+fi
+  done
+
+  if [ "x$item_found" = xtrue ]; then
+echo "$item"
+  fi
+  for i in "$@"; do
+if [ "x$i" = "x$item" ]; then
+  continue
+fi
+echo "$i"
+  done
+}
+
 # One layer of quotation is eaten by "" an

[PATCH v3] templates: introduce GRUB_TOP_LEVEL_* vars

2022-10-05 Thread Denton Liu
A user may wish to use an image that is not sorted as the "latest"
version as the top-level entry. For example, in Arch Linux, if a user
has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
gets sorted as the "latest" compared to `/boot/vmlinuz-linux`. However,
a user may wish to use the regular kernel as the default with the LTS
only existing as a backup.

Introduce the GRUB_TOP_LEVEL, GRUB_TOP_LEVEL_XEN and
GRUB_TOP_LEVEL_OS_PROBER variables to allow users to specify the
top-level entry.

Create grub_move_to_front() as a helper function which moves entries to
the front of a list. This function does the heavy lifting of moving
the menu entry to the front in each script.

In 10_netbsd, since there isn't an explicit list variable, extract the
items that are being iterated through into a list so that we can
optionally apply grub_move_to_front() to the list before the loop.

Signed-off-by: Denton Liu 
---

Notes:
The only file that was tested is 10_linux. I do not have access to any
of the other images or systems so they remain untested.

Changes since v2:

* Added more detail to GRUB_TOP_LEVEL docs

* Moved GRUB_TOP_LEVEL_OS_PROBER to separate section in docs

* Renamed grub_move_entry_to_front() to grub_move_to_front() and added
  code comment

* Give 10_netbsd an intermediate list of images to interact with

Interdiff against v2:
  diff --git a/docs/grub.texi b/docs/grub.texi
  index 16a445178..db6b20531 100644
  --- a/docs/grub.texi
  +++ b/docs/grub.texi
  @@ -1446,9 +1446,13 @@ and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and 
Xen menu entries.
   
   @item GRUB_TOP_LEVEL
   @item GRUB_TOP_LEVEL_XEN
  +This option should be a path to a kernel image. If provided, the image
  +specified will be made the top-level entry if it is found in the scan.
  +
   @item GRUB_TOP_LEVEL_OS_PROBER
  -If this option is provided, the given image file will be made the top-level
  -entry if the image file is found in the scan.
  +This option should be a line of output from @command{os-prober}. As
  +@samp{GRUB_TOP_LEVEL}, if provided, the image specified will be made the
  +top-level entry if it is found in the scan.
   
   @item GRUB_EARLY_INITRD_LINUX_CUSTOM
   @itemx GRUB_EARLY_INITRD_LINUX_STOCK
  diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
  index 5be49a07c..f4ae41f86 100644
  --- a/util/grub-mkconfig_lib.in
  +++ b/util/grub-mkconfig_lib.in
  @@ -218,23 +218,26 @@ version_sort ()
  esac
   }
   
  -grub_move_entry_to_front ()
  +# Given an item as the first argument and a list as the subsequent arguments,
  +# returns the list with the first argument moved to the front if it exists in
  +# the list.
  +grub_move_to_front ()
   {
  -  entry="$1"
  +  item="$1"
 shift
   
  -  entry_found=false
  +  item_found=false
 for i in "$@"; do
  -if [ "x$i" = "x$entry" ]; then
  -  entry_found=true
  +if [ "x$i" = "x$item" ]; then
  +  item_found=true
   fi
 done
   
  -  if [ "x$entry_found" = xtrue ]; then
  -echo "$entry"
  +  if [ "x$item_found" = xtrue ]; then
  +echo "$item"
 fi
 for i in "$@"; do
  -if [ "x$i" = "x$entry" ]; then continue; fi
  +if [ "x$i" = "x$item" ]; then continue; fi
   echo "$i"
 done
   }
  diff --git a/util/grub.d/10_hurd.in b/util/grub.d/10_hurd.in
  index 0ae5a3927..b7be7041c 100644
  --- a/util/grub.d/10_hurd.in
  +++ b/util/grub.d/10_hurd.in
  @@ -206,7 +206,7 @@ submenu_indentation=""
   reverse_sorted_kernels=$(echo ${kernels} | tr ' ' '\n' | sed -e 's/\.old$/ 
1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
   
   if [ "x$GRUB_TOP_LEVEL" != x ]; then
  -  reverse_sorted_kernels=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL" 
${reverse_sorted_kernels})
  +  reverse_sorted_kernels=$(grub_move_to_front "$GRUB_TOP_LEVEL" 
${reverse_sorted_kernels})
   fi
   
   is_top_level=true
  diff --git a/util/grub.d/10_kfreebsd.in b/util/grub.d/10_kfreebsd.in
  index 506b2df66..83e9636e8 100644
  --- a/util/grub.d/10_kfreebsd.in
  +++ b/util/grub.d/10_kfreebsd.in
  @@ -165,7 +165,7 @@ submenu_indentation=""
   reverse_sorted_list=$(echo ${list} | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 
1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
   
   if [ "x$GRUB_TOP_LEVEL" != x ]; then
  -  reverse_sorted_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL" 
${reverse_sorted_list})
  +  reverse_sorted_list=$(grub_move_to_front "$GRUB_TOP_LEVEL" 
${reverse_sorted_list})
   fi
   
   is_top_level=true
  diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
  index a479c16af..7263f2983 100644
  --- a/util/grub.d/10_linux.in
  +++ b/util/grub

[PATCH v2] templates: introduce GRUB_TOP_LEVEL_* vars

2022-09-30 Thread Denton Liu
A user may wish to use an image that is not sorted as the "latest"
version as the top-level entry. For example, in Arch Linux, if a user
has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
gets sorted as the "latest" compared to `/boot/vmlinuz-linux`. However,
a user may wish to use the regular kernel as the default with the LTS
only existing as a backup.

Introduce the GRUB_TOP_LEVEL, GRUB_TOP_LEVEL_XEN and
GRUB_TOP_LEVEL_OS_PROBER variables to allow users to specify the
top-level entry.

The only file that was tested is 10_linux. I do not have access to any
of the other images or systems so they remain untested.

Signed-off-by: Denton Liu 
---
 docs/grub.texi  |  6 ++
 util/grub-mkconfig.in   |  3 +++
 util/grub-mkconfig_lib.in   | 21 +
 util/grub.d/10_hurd.in  |  4 
 util/grub.d/10_kfreebsd.in  |  4 
 util/grub.d/10_linux.in |  4 
 util/grub.d/10_netbsd.in| 10 +-
 util/grub.d/20_linux_xen.in |  7 +++
 util/grub.d/30_os-prober.in |  4 
 9 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/docs/grub.texi b/docs/grub.texi
index 107f66ebc..16a445178 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -1444,6 +1444,12 @@ for all respectively normal entries.
 The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX}
 and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries.
 
+@item GRUB_TOP_LEVEL
+@item GRUB_TOP_LEVEL_XEN
+@item GRUB_TOP_LEVEL_OS_PROBER
+If this option is provided, the given image file will be made the top-level
+entry if the image file is found in the scan.
+
 @item GRUB_EARLY_INITRD_LINUX_CUSTOM
 @itemx GRUB_EARLY_INITRD_LINUX_STOCK
 List of space-separated early initrd images to be loaded from @samp{/boot}.
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
index 62335d027..32c480dae 100644
--- a/util/grub-mkconfig.in
+++ b/util/grub-mkconfig.in
@@ -233,6 +233,9 @@ export GRUB_DEFAULT \
   GRUB_CMDLINE_NETBSD \
   GRUB_CMDLINE_NETBSD_DEFAULT \
   GRUB_CMDLINE_GNUMACH \
+  GRUB_TOP_LEVEL \
+  GRUB_TOP_LEVEL_XEN \
+  GRUB_TOP_LEVEL_OS_PROBER \
   GRUB_EARLY_INITRD_LINUX_CUSTOM \
   GRUB_EARLY_INITRD_LINUX_STOCK \
   GRUB_TERMINAL_INPUT \
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 634bc8a50..5be49a07c 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -218,6 +218,27 @@ version_sort ()
esac
 }
 
+grub_move_entry_to_front ()
+{
+  entry="$1"
+  shift
+
+  entry_found=false
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then
+  entry_found=true
+fi
+  done
+
+  if [ "x$entry_found" = xtrue ]; then
+echo "$entry"
+  fi
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then continue; fi
+echo "$i"
+  done
+}
+
 # One layer of quotation is eaten by "" and the second by sed; so this turns
 # ' into \'.
 grub_quote () {
diff --git a/util/grub.d/10_hurd.in b/util/grub.d/10_hurd.in
index 4294bbe4c..0ae5a3927 100644
--- a/util/grub.d/10_hurd.in
+++ b/util/grub.d/10_hurd.in
@@ -205,6 +205,10 @@ submenu_indentation=""
 
 reverse_sorted_kernels=$(echo ${kernels} | tr ' ' '\n' | sed -e 's/\.old$/ 1/; 
/ 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 
+if [ "x$GRUB_TOP_LEVEL" != x ]; then
+  reverse_sorted_kernels=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL" 
${reverse_sorted_kernels})
+fi
+
 is_top_level=true
 
 for kernel in ${reverse_sorted_kernels}; do
diff --git a/util/grub.d/10_kfreebsd.in b/util/grub.d/10_kfreebsd.in
index 0a67decaa..506b2df66 100644
--- a/util/grub.d/10_kfreebsd.in
+++ b/util/grub.d/10_kfreebsd.in
@@ -164,6 +164,10 @@ submenu_indentation=""
 
 reverse_sorted_list=$(echo ${list} | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 
1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 
+if [ "x$GRUB_TOP_LEVEL" != x ]; then
+  reverse_sorted_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL" 
${reverse_sorted_list})
+fi
+
 is_top_level=true
 
 for kfreebsd in ${reverse_sorted_list}; do
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index c6a1ec935..a479c16af 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -202,6 +202,10 @@ submenu_indentation=""
 
 reverse_sorted_list=$(echo $list | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 1$/! 
s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 
+if [ "x$GRUB_TOP_LEVEL" != x ]; then
+  reverse_sorted_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL" 
${reverse_sorted_list})
+fi
+
 is_top_level=true
 for linux in ${reverse_sorted_list}; do
   gettext_printf "Found linux image: %s\n" "$linux" >&2
diff --git a/util/grub.d/10_netbsd.in b/util/grub.d/10_netbsd.in
index dc0cd1b17..4eae58e82 100644
--- a/util/grub.d/1

Re: [RESEND RESEND RESEND PATCH] templates: introduce GRUB_TOP_LEVEL_* vars

2022-09-30 Thread Denton Liu
Hi Oskari,

On Fri, Sep 30, 2022 at 01:53:59AM -0500, Oskari Pirhonen wrote:
> > I'm not too familiar with what end-users might want. If we want to make
> > this more universal, we could either do GRUB_TOP_LEVEL_KERNEL and have
> > that shared amongst all of the 10_* files or we could have multiple
> > variables, e.g. GRUB_TOP_LEVEL_LINUX, GRUB_TOP_LEVEL_BSD, etc.
> > 
> 
> A single GRUB_TOP_LEVEL or something is what I was thinking. I'm not
> familiar with Xen, but based on your original patch, it may warrant its
> own.

I'm not familiar with Xen either. My understanding is that there can be
parallel top-level entries so it deserves its own variable.

> > > - What about for os-prober? My understanding is that it creates its own
> > >   top level entries as well.
> > 
> > The same thing could work with os-prober, although it wouldn't be a
> > cut-and-paste.
> > 
> 
> os-prober would probably have its own GRUB_TOP_LEVEL_OS_PROBER or
> something as well.

Sounds good!

> > I'm open to all ideas here and I can cook up the patches. The thing is
> > that I'm not sure what the project's conventions are regarding
> > too-granular/not-granular-enough configurations so some advice here
> > would be very much appreciated!
> > 
> 
> Generating a config for multiple OS's would use os-prober, so a single
> "main" variable for top level entries would be simpler and should be
> enough IMO.

Thanks for the feedback! Patch coming soon.

-Denton

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: [RESEND RESEND RESEND PATCH] templates: introduce GRUB_TOP_LEVEL_* vars

2022-09-29 Thread Denton Liu
Thanks for the response, Oskari!

On Thu, Sep 29, 2022 at 01:08:03AM -0500, Oskari Pirhonen wrote:
> On Tue, Sep 27, 2022 at 05:30:45 -0700, Denton Liu wrote:
> > A user may wish to use an image that is not sorted as the "latest"
> > version as the top-level entry. For example, in Arch Linux, if a user
> > has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
> > gets sorted as the "latest" compared to `/boot/vmlinuz-linux`. However,
> > a user may wish to use the regular kernel as the default with the LTS
> > only existing as a backup.
> > 
> > Introduce the GRUB_TOP_LEVEL_LINUX and GRUB_TOP_LEVEL_XEN variables to
> > allow users to specify the top-level entry.
> > 
> 
> A couple questions:
> 
> - If all you're looking for is /boot/vmlinuz-linux to be booted, is
>   setting GRUB_DEFAULT in /etc/default/grub "good enough" for your use
>   case?

I think it is "good enough" for what I need but it feels a little bit
weird that grub doesn't give the user any choice as to what the
top-level kernel is.

> - Is it possible to make this solution more universal? Maybe BSD users
>   would like to set their top level entry.

I'm not too familiar with what end-users might want. If we want to make
this more universal, we could either do GRUB_TOP_LEVEL_KERNEL and have
that shared amongst all of the 10_* files or we could have multiple
variables, e.g. GRUB_TOP_LEVEL_LINUX, GRUB_TOP_LEVEL_BSD, etc.

> - What about for os-prober? My understanding is that it creates its own
>   top level entries as well.

The same thing could work with os-prober, although it wouldn't be a
cut-and-paste.

I'm open to all ideas here and I can cook up the patches. The thing is
that I'm not sure what the project's conventions are regarding
too-granular/not-granular-enough configurations so some advice here
would be very much appreciated!

-Denton

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


[RESEND RESEND RESEND PATCH] templates: introduce GRUB_TOP_LEVEL_* vars

2022-09-27 Thread Denton Liu
A user may wish to use an image that is not sorted as the "latest"
version as the top-level entry. For example, in Arch Linux, if a user
has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
gets sorted as the "latest" compared to `/boot/vmlinuz-linux`. However,
a user may wish to use the regular kernel as the default with the LTS
only existing as a backup.

Introduce the GRUB_TOP_LEVEL_LINUX and GRUB_TOP_LEVEL_XEN variables to
allow users to specify the top-level entry.

Signed-off-by: Denton Liu 
---
 docs/grub.texi  |  5 +
 util/grub-mkconfig.in   |  2 ++
 util/grub-mkconfig_lib.in   | 21 +
 util/grub.d/10_linux.in |  4 
 util/grub.d/20_linux_xen.in |  7 +++
 5 files changed, 39 insertions(+)

diff --git a/docs/grub.texi b/docs/grub.texi
index 107f66ebc..54bd32882 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -1444,6 +1444,11 @@ for all respectively normal entries.
 The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX}
 and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries.
 
+@item GRUB_TOP_LEVEL_LINUX
+@item GRUB_TOP_LEVEL_XEN
+If this option is provided, the given image file will be made the top-level
+entry if the image file is found in the scan.
+
 @item GRUB_EARLY_INITRD_LINUX_CUSTOM
 @itemx GRUB_EARLY_INITRD_LINUX_STOCK
 List of space-separated early initrd images to be loaded from @samp{/boot}.
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
index 62335d027..f7ad160b4 100644
--- a/util/grub-mkconfig.in
+++ b/util/grub-mkconfig.in
@@ -233,6 +233,8 @@ export GRUB_DEFAULT \
   GRUB_CMDLINE_NETBSD \
   GRUB_CMDLINE_NETBSD_DEFAULT \
   GRUB_CMDLINE_GNUMACH \
+  GRUB_TOP_LEVEL_LINUX \
+  GRUB_TOP_LEVEL_XEN \
   GRUB_EARLY_INITRD_LINUX_CUSTOM \
   GRUB_EARLY_INITRD_LINUX_STOCK \
   GRUB_TERMINAL_INPUT \
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 634bc8a50..5be49a07c 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -218,6 +218,27 @@ version_sort ()
esac
 }
 
+grub_move_entry_to_front ()
+{
+  entry="$1"
+  shift
+
+  entry_found=false
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then
+  entry_found=true
+fi
+  done
+
+  if [ "x$entry_found" = xtrue ]; then
+echo "$entry"
+  fi
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then continue; fi
+echo "$i"
+  done
+}
+
 # One layer of quotation is eaten by "" and the second by sed; so this turns
 # ' into \'.
 grub_quote () {
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index c6a1ec935..05e01fc85 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -202,6 +202,10 @@ submenu_indentation=""
 
 reverse_sorted_list=$(echo $list | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 1$/! 
s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 
+if [ "x$GRUB_TOP_LEVEL_LINUX" != x ]; then
+  reverse_sorted_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_LINUX" 
${reverse_sorted_list})
+fi
+
 is_top_level=true
 for linux in ${reverse_sorted_list}; do
   gettext_printf "Found linux image: %s\n" "$linux" >&2
diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in
index 626aed40c..c32bb979f 100644
--- a/util/grub.d/20_linux_xen.in
+++ b/util/grub.d/20_linux_xen.in
@@ -245,6 +245,13 @@ submenu_indentation=""
 reverse_sorted_xen_list=$(echo ${xen_list} | tr ' ' '\n' | sed -e 's/\.old$/ 
1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 reverse_sorted_linux_list=$(echo ${linux_list} | tr ' ' '\n' | sed -e 
's/\.old$/ 1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 
2$//')
 
+if [ "x$GRUB_TOP_LEVEL_XEN" != x ]; then
+  reverse_sorted_xen_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_XEN" 
${reverse_sorted_xen_list})
+fi
+if [ "x$GRUB_TOP_LEVEL_LINUX" != x ]; then
+  reverse_sorted_linux_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_LINUX" 
${reverse_sorted_linux_list})
+fi
+
 is_top_level=true
 
 for current_xen in ${reverse_sorted_xen_list}; do
-- 
2.37.3


___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


[RESEND RESEND PATCH] templates: introduce GRUB_TOP_LEVEL_* vars

2022-09-21 Thread Denton Liu
A user may wish to use an image that is not sorted as the "latest"
version as the top-level entry. For example, in Arch Linux, if a user
has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
gets sorted as the "latest" compared to `/boot/vmlinuz-linux`. However,
a user may wish to use the regular kernel as the default with the LTS
only existing as a backup.

Introduce the GRUB_TOP_LEVEL_LINUX and GRUB_TOP_LEVEL_XEN variables to
allow users to specify the top-level entry.

Signed-off-by: Denton Liu 
---
 docs/grub.texi  |  5 +
 util/grub-mkconfig.in   |  2 ++
 util/grub-mkconfig_lib.in   | 21 +
 util/grub.d/10_linux.in |  4 
 util/grub.d/20_linux_xen.in |  7 +++
 5 files changed, 39 insertions(+)

diff --git a/docs/grub.texi b/docs/grub.texi
index 107f66ebc..54bd32882 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -1444,6 +1444,11 @@ for all respectively normal entries.
 The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX}
 and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries.
 
+@item GRUB_TOP_LEVEL_LINUX
+@item GRUB_TOP_LEVEL_XEN
+If this option is provided, the given image file will be made the top-level
+entry if the image file is found in the scan.
+
 @item GRUB_EARLY_INITRD_LINUX_CUSTOM
 @itemx GRUB_EARLY_INITRD_LINUX_STOCK
 List of space-separated early initrd images to be loaded from @samp{/boot}.
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
index 62335d027..f7ad160b4 100644
--- a/util/grub-mkconfig.in
+++ b/util/grub-mkconfig.in
@@ -233,6 +233,8 @@ export GRUB_DEFAULT \
   GRUB_CMDLINE_NETBSD \
   GRUB_CMDLINE_NETBSD_DEFAULT \
   GRUB_CMDLINE_GNUMACH \
+  GRUB_TOP_LEVEL_LINUX \
+  GRUB_TOP_LEVEL_XEN \
   GRUB_EARLY_INITRD_LINUX_CUSTOM \
   GRUB_EARLY_INITRD_LINUX_STOCK \
   GRUB_TERMINAL_INPUT \
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 634bc8a50..5be49a07c 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -218,6 +218,27 @@ version_sort ()
esac
 }
 
+grub_move_entry_to_front ()
+{
+  entry="$1"
+  shift
+
+  entry_found=false
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then
+  entry_found=true
+fi
+  done
+
+  if [ "x$entry_found" = xtrue ]; then
+echo "$entry"
+  fi
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then continue; fi
+echo "$i"
+  done
+}
+
 # One layer of quotation is eaten by "" and the second by sed; so this turns
 # ' into \'.
 grub_quote () {
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index c6a1ec935..05e01fc85 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -202,6 +202,10 @@ submenu_indentation=""
 
 reverse_sorted_list=$(echo $list | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 1$/! 
s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 
+if [ "x$GRUB_TOP_LEVEL_LINUX" != x ]; then
+  reverse_sorted_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_LINUX" 
${reverse_sorted_list})
+fi
+
 is_top_level=true
 for linux in ${reverse_sorted_list}; do
   gettext_printf "Found linux image: %s\n" "$linux" >&2
diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in
index 626aed40c..c32bb979f 100644
--- a/util/grub.d/20_linux_xen.in
+++ b/util/grub.d/20_linux_xen.in
@@ -245,6 +245,13 @@ submenu_indentation=""
 reverse_sorted_xen_list=$(echo ${xen_list} | tr ' ' '\n' | sed -e 's/\.old$/ 
1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 reverse_sorted_linux_list=$(echo ${linux_list} | tr ' ' '\n' | sed -e 
's/\.old$/ 1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 
2$//')
 
+if [ "x$GRUB_TOP_LEVEL_XEN" != x ]; then
+  reverse_sorted_xen_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_XEN" 
${reverse_sorted_xen_list})
+fi
+if [ "x$GRUB_TOP_LEVEL_LINUX" != x ]; then
+  reverse_sorted_linux_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_LINUX" 
${reverse_sorted_linux_list})
+fi
+
 is_top_level=true
 
 for current_xen in ${reverse_sorted_xen_list}; do
-- 
2.37.3


___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


[RESEND PATCH] templates: introduce GRUB_TOP_LEVEL_* vars

2022-08-29 Thread Denton Liu
A user may wish to use an image that is not sorted as the "latest"
version as the top-level entry. For example, in Arch Linux, if a user
has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
gets sorted as the "latest" compared to `/boot/vmlinuz-linux`. However,
a user may wish to use the regular kernel as the default with the LTS
only existing as a backup.

Introduce the GRUB_TOP_LEVEL_LINUX and GRUB_TOP_LEVEL_XEN variables to
allow users to specify the top-level entry.

Signed-off-by: Denton Liu 
---
 docs/grub.texi  |  5 +
 util/grub-mkconfig.in   |  2 ++
 util/grub-mkconfig_lib.in   | 21 +
 util/grub.d/10_linux.in |  4 
 util/grub.d/20_linux_xen.in |  7 +++
 5 files changed, 39 insertions(+)

diff --git a/docs/grub.texi b/docs/grub.texi
index 107f66ebc..54bd32882 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -1444,6 +1444,11 @@ for all respectively normal entries.
 The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX}
 and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries.
 
+@item GRUB_TOP_LEVEL_LINUX
+@item GRUB_TOP_LEVEL_XEN
+If this option is provided, the given image file will be made the top-level
+entry if the image file is found in the scan.
+
 @item GRUB_EARLY_INITRD_LINUX_CUSTOM
 @itemx GRUB_EARLY_INITRD_LINUX_STOCK
 List of space-separated early initrd images to be loaded from @samp{/boot}.
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
index 62335d027..f7ad160b4 100644
--- a/util/grub-mkconfig.in
+++ b/util/grub-mkconfig.in
@@ -233,6 +233,8 @@ export GRUB_DEFAULT \
   GRUB_CMDLINE_NETBSD \
   GRUB_CMDLINE_NETBSD_DEFAULT \
   GRUB_CMDLINE_GNUMACH \
+  GRUB_TOP_LEVEL_LINUX \
+  GRUB_TOP_LEVEL_XEN \
   GRUB_EARLY_INITRD_LINUX_CUSTOM \
   GRUB_EARLY_INITRD_LINUX_STOCK \
   GRUB_TERMINAL_INPUT \
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 634bc8a50..5be49a07c 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -218,6 +218,27 @@ version_sort ()
esac
 }
 
+grub_move_entry_to_front ()
+{
+  entry="$1"
+  shift
+
+  entry_found=false
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then
+  entry_found=true
+fi
+  done
+
+  if [ "x$entry_found" = xtrue ]; then
+echo "$entry"
+  fi
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then continue; fi
+echo "$i"
+  done
+}
+
 # One layer of quotation is eaten by "" and the second by sed; so this turns
 # ' into \'.
 grub_quote () {
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index c6a1ec935..05e01fc85 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -202,6 +202,10 @@ submenu_indentation=""
 
 reverse_sorted_list=$(echo $list | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 1$/! 
s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 
+if [ "x$GRUB_TOP_LEVEL_LINUX" != x ]; then
+  reverse_sorted_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_LINUX" 
${reverse_sorted_list})
+fi
+
 is_top_level=true
 for linux in ${reverse_sorted_list}; do
   gettext_printf "Found linux image: %s\n" "$linux" >&2
diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in
index 626aed40c..c32bb979f 100644
--- a/util/grub.d/20_linux_xen.in
+++ b/util/grub.d/20_linux_xen.in
@@ -245,6 +245,13 @@ submenu_indentation=""
 reverse_sorted_xen_list=$(echo ${xen_list} | tr ' ' '\n' | sed -e 's/\.old$/ 
1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 reverse_sorted_linux_list=$(echo ${linux_list} | tr ' ' '\n' | sed -e 
's/\.old$/ 1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 
2$//')
 
+if [ "x$GRUB_TOP_LEVEL_XEN" != x ]; then
+  reverse_sorted_xen_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_XEN" 
${reverse_sorted_xen_list})
+fi
+if [ "x$GRUB_TOP_LEVEL_LINUX" != x ]; then
+  reverse_sorted_linux_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_LINUX" 
${reverse_sorted_linux_list})
+fi
+
 is_top_level=true
 
 for current_xen in ${reverse_sorted_xen_list}; do
-- 
2.37.2


___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


[PATCH] templates: introduce GRUB_TOP_LEVEL_* vars

2022-08-21 Thread Denton Liu
A user may wish to use an image that is not sorted as the "latest"
version as the top-level entry. For example, in Arch Linux, if a user
has the LTS and regular kernels installed, `/boot/vmlinuz-linux-lts`
gets sorted as the "latest" compared to `/boot/vmlinuz-linux`. However,
a user may wish to use the regular kernel as the default with the LTS
only existing as a backup.

Introduce the GRUB_TOP_LEVEL_LINUX and GRUB_TOP_LEVEL_XEN variables to
allow users to specify the top-level entry.

Signed-off-by: Denton Liu 
---
 docs/grub.texi  |  5 +
 util/grub-mkconfig.in   |  2 ++
 util/grub-mkconfig_lib.in   | 21 +
 util/grub.d/10_linux.in |  4 
 util/grub.d/20_linux_xen.in |  7 +++
 5 files changed, 39 insertions(+)

diff --git a/docs/grub.texi b/docs/grub.texi
index 107f66ebc..54bd32882 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -1444,6 +1444,11 @@ for all respectively normal entries.
 The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX}
 and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries.
 
+@item GRUB_TOP_LEVEL_LINUX
+@item GRUB_TOP_LEVEL_XEN
+If this option is provided, the given image file will be made the top-level
+entry if the image file is found in the scan.
+
 @item GRUB_EARLY_INITRD_LINUX_CUSTOM
 @itemx GRUB_EARLY_INITRD_LINUX_STOCK
 List of space-separated early initrd images to be loaded from @samp{/boot}.
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
index 62335d027..f7ad160b4 100644
--- a/util/grub-mkconfig.in
+++ b/util/grub-mkconfig.in
@@ -233,6 +233,8 @@ export GRUB_DEFAULT \
   GRUB_CMDLINE_NETBSD \
   GRUB_CMDLINE_NETBSD_DEFAULT \
   GRUB_CMDLINE_GNUMACH \
+  GRUB_TOP_LEVEL_LINUX \
+  GRUB_TOP_LEVEL_XEN \
   GRUB_EARLY_INITRD_LINUX_CUSTOM \
   GRUB_EARLY_INITRD_LINUX_STOCK \
   GRUB_TERMINAL_INPUT \
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 634bc8a50..5be49a07c 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -218,6 +218,27 @@ version_sort ()
esac
 }
 
+grub_move_entry_to_front ()
+{
+  entry="$1"
+  shift
+
+  entry_found=false
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then
+  entry_found=true
+fi
+  done
+
+  if [ "x$entry_found" = xtrue ]; then
+echo "$entry"
+  fi
+  for i in "$@"; do
+if [ "x$i" = "x$entry" ]; then continue; fi
+echo "$i"
+  done
+}
+
 # One layer of quotation is eaten by "" and the second by sed; so this turns
 # ' into \'.
 grub_quote () {
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index c6a1ec935..05e01fc85 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -202,6 +202,10 @@ submenu_indentation=""
 
 reverse_sorted_list=$(echo $list | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 1$/! 
s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 
+if [ "x$GRUB_TOP_LEVEL_LINUX" != x ]; then
+  reverse_sorted_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_LINUX" 
${reverse_sorted_list})
+fi
+
 is_top_level=true
 for linux in ${reverse_sorted_list}; do
   gettext_printf "Found linux image: %s\n" "$linux" >&2
diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in
index 626aed40c..c32bb979f 100644
--- a/util/grub.d/20_linux_xen.in
+++ b/util/grub.d/20_linux_xen.in
@@ -245,6 +245,13 @@ submenu_indentation=""
 reverse_sorted_xen_list=$(echo ${xen_list} | tr ' ' '\n' | sed -e 's/\.old$/ 
1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
 reverse_sorted_linux_list=$(echo ${linux_list} | tr ' ' '\n' | sed -e 
's/\.old$/ 1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 
2$//')
 
+if [ "x$GRUB_TOP_LEVEL_XEN" != x ]; then
+  reverse_sorted_xen_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_XEN" 
${reverse_sorted_xen_list})
+fi
+if [ "x$GRUB_TOP_LEVEL_LINUX" != x ]; then
+  reverse_sorted_linux_list=$(grub_move_entry_to_front "$GRUB_TOP_LEVEL_LINUX" 
${reverse_sorted_linux_list})
+fi
+
 is_top_level=true
 
 for current_xen in ${reverse_sorted_xen_list}; do
-- 
2.37.2


___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel