git: 0f4dfa3fd45d - stable/13 - loader: create a generic vendor sub-menu place holder

From: Warner Losh <imp_at_FreeBSD.org>
Date: Tue, 24 Jan 2023 22:09:45 UTC
The branch stable/13 has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=0f4dfa3fd45d3e3a01e52ccae2aac989d1a1696f

commit 0f4dfa3fd45d3e3a01e52ccae2aac989d1a1696f
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2021-03-31 00:35:29 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2023-01-24 21:49:16 +0000

    loader: create a generic vendor sub-menu place holder
    
    Add a dummy vendor menu entry on the main welcome menu. Vendors can override
    this in their local.lua file to create whatever sub-menu they need for their
    products.
    
    Also fix the adding a 'welcome' entry as well based on a suggestion from Kyle.
    Silly option menu code also from Kyle. They seem to work for me, but any
    transcription error is likely mine.
    
    Reviewed by: kevans@ (the vendor stuff)
    
    (cherry picked from commit e7ccd5b4187d15cd91697f1f4e12cf40e3ce86c3)
---
 stand/lua/menu.lua   |  5 ++++
 stand/lua/menu.lua.8 | 83 +++++++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 78 insertions(+), 10 deletions(-)

diff --git a/stand/lua/menu.lua b/stand/lua/menu.lua
index fe6f7da64283..0db52d7c3920 100644
--- a/stand/lua/menu.lua
+++ b/stand/lua/menu.lua
@@ -257,6 +257,7 @@ menu.welcome = {
 			menu_entries.zpool_checkpoints,
 			menu_entries.boot_envs,
 			menu_entries.chainload,
+			menu_entries.vendor,
 		}
 	end,
 	all_entries = {
@@ -400,6 +401,10 @@ menu.welcome = {
 			end,
 			alias = {"l", "L"},
 		},
+		vendor = {
+			entry_type = core.MENU_ENTRY,
+			visible = false,
+		},
 	},
 }
 
diff --git a/stand/lua/menu.lua.8 b/stand/lua/menu.lua.8
index 4358981d4755..82863791903d 100644
--- a/stand/lua/menu.lua.8
+++ b/stand/lua/menu.lua.8
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd February 23, 2018
+.Dd March 31, 2021
 .Dt MENU.LUA 8
 .Os
 .Sh NAME
@@ -204,19 +204,82 @@ To add another option to the welcome menu:
 local core = require("core")
 local menu = require("menu")
 
+local my_entry = {
+	entry_type = core.MENU_ENTRY,
+	name = "Fancy Boot",
+	func = core.boot,
+},
+
+local stock_entries = menu.welcome.entries
+function menu.welcome.entries()
+	local ents = stock_entries()
+	ents[#ents + 1] = my_entry
+	return ents
+end
+.Ed
+.Pp
+To create a vendor submenu or other vendor menu option,
+override
+.Ic menu.welcome.all_entires.vendor
+like so:
+.Pp
+.Bd -literal -offset indent -compact
+local core = require("core")
+local menu = require("menu")
+
+-- Fill in with vendor specific entries
+local vendor_options = {
+	entries = {
+	...
+	},
+}
+
 local welcome_entries = menu.welcome.all_entries
-welcome_entries[#welcome_entries + 1] = {
-	entry_type = core.MENU_CAROUSEL_ENTRY,
-	carousel_id = "unique_boot_entry_name",
-	items = {"NO", "YES"},
-	name = function(_, choice, _)
-		return "Option: " .. choice
+welcome_entries.vendor = {
+        entry_type = core.MENU_SUBMENU,
+        name = color.highlight("V") .. "endor Options",
+        submenu = vendor_options,
+        alias = {"v", "V"},
+}
+.Ed
+In the above example,
+.Ic vendor_options
+is a local variable that defines the vendor submenu.
+.Pp
+To add an additional option, change the
+.Ic menu.boot_options.entries
+array.
+The following illustrates this concept:
+.Pp
+.Bd -literal -offset indent -compact
+-- This is a silly example that rotates local_option through the values
+-- 0 to 4.  local_option would still need to be used elsewhere.
+local local_option = 0
+
+-- The `entries` of a menu may either be a table or a function.  In this
+-- example we're augmenting a menu that just has a static table, but if we
+-- wanted to be more robust then we would need to instead check the type
+-- of `stock_options` here to determine our next move.
+--
+-- If `entries` is a table, then the stock menu system won't be changing it
+-- so we can just add our menu option as we do below.
+--
+-- If `entries` is a function, then we would need to provide a new function to
+-- replace `entries` that does a core.deepCopyTable() of the result and adds
+-- the below item to it.  The deep copy is necessary to avoid duplicating our
+-- new menu item and allowing the menu to alter its behavior however it pleases.
+local stock_options = menu.boot_options.entries
+stock_options[#stock_options + 1] = {
+	entry_type = core.MENU_ENTRY,
+	name = function()
+		return color.highlight('L') ..
+		    "ocal Option     : " .. local_option
 	end,
-	func = function(_, _, _)
-		loader.setenv("some_envvar", "some_value")
+	func = function()
+		local_option = (local_option + 1) % 5
 	end,
+	alias= {"l", "L"}
 }
-.Ed
 .Sh SEE ALSO
 .Xr loader.conf 5 ,
 .Xr core.lua 8 ,