git: 2bf7d850c53e - stable/15 - release: use sets to select base packages

From: Lexi Winter <ivy_at_FreeBSD.org>
Date: Fri, 19 Sep 2025 01:20:05 UTC
The branch stable/15 has been updated by ivy:

URL: https://cgit.FreeBSD.org/src/commit/?id=2bf7d850c53e55ffced055235de432055f0cb9e2

commit 2bf7d850c53e55ffced055235de432055f0cb9e2
Author:     Isaac Freund <ifreund@freebsdfoundation.org>
AuthorDate: 2025-09-16 19:38:54 +0000
Commit:     Lexi Winter <ivy@FreeBSD.org>
CommitDate: 2025-09-19 01:18:42 +0000

    release: use sets to select base packages
    
    The introduction of package sets allows us to replace the current
    fragile string matching with this simpler and more robust alternative.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      3 seconds
    Reviewed by:    emaste, ivy
    Differential Revision:  https://reviews.freebsd.org/D52592
    
    (cherry picked from commit 6cdca18d79b9e247d8a34e266fe2215e4bfa1b05)
---
 release/scripts/pkgbase-stage.lua | 96 ++++++++++++---------------------------
 1 file changed, 28 insertions(+), 68 deletions(-)

diff --git a/release/scripts/pkgbase-stage.lua b/release/scripts/pkgbase-stage.lua
index a12ec372d1a9..9e968fd150f8 100755
--- a/release/scripts/pkgbase-stage.lua
+++ b/release/scripts/pkgbase-stage.lua
@@ -18,87 +18,47 @@ local function capture(command)
 	return output:match("(.-)\n$") or output
 end
 
-local function append_list(list, other)
-	for _, item in ipairs(other) do
-		table.insert(list, item)
-	end
-end
-
 -- Returns a list of packages to be included in the given media
 local function select_packages(pkg, media, all_libcompats)
-	local components = {
-		kernel = {},
-		kernel_dbg = {},
-		base = {},
-		base_dbg = {},
-		src = {},
-		tests = {},
-	}
-
-	for compat in all_libcompats:gmatch("%S+") do
-		components["lib" .. compat] = {}
-		components["lib" .. compat .. "_dbg"] = {}
-	end
-
+	local components = {}
 	local rquery = capture(pkg .. "rquery -U -r FreeBSD-base %n")
 	for package in rquery:gmatch("[^\n]+") do
-		if package == "FreeBSD-src" or package:match("^FreeBSD%-src%-.*") then
-			table.insert(components["src"], package)
-		elseif package == "FreeBSD-tests" or package:match("^FreeBSD%-tests%-.*") then
-			table.insert(components["tests"], package)
-		elseif package:match("^FreeBSD%-kernel%-.*") and
-			package ~= "FreeBSD-kernel-man"
-		then
-			-- Kernels other than FreeBSD-kernel-generic are ignored
-			if package == "FreeBSD-kernel-generic" then
-				table.insert(components["kernel"], package)
-			elseif package == "FreeBSD-kernel-generic-dbg" then
-				table.insert(components["kernel_dbg"], package)
-			end
-		elseif package:match(".*%-dbg$") then
-			table.insert(components["base_dbg"], package)
-		else
-			local found = false
-			for compat in all_libcompats:gmatch("%S+") do
-				if package:match(".*%-dbg%-lib" .. compat .. "$") then
-					table.insert(components["lib" .. compat .. "_dbg"], package)
-					found = true
-					break
-				elseif package:match(".*%-lib" .. compat .. "$") then
-					table.insert(components["lib" .. compat], package)
-					found = true
-					break
-				end
-			end
-			if not found then
-				table.insert(components["base"], package)
-			end
+		local set = package:match("^FreeBSD%-set%-(.*)$")
+		if set then
+			components[set] = package
+		-- Kernels other than FreeBSD-kernel-generic are ignored
+		-- Note that on powerpc64 and powerpc64le the names are
+		-- slightly different.
+		elseif package:match("^FreeBSD%-kernel%-generic.*-dbg") then
+			components["kernel-dbg"] = package
+		elseif package:match("^FreeBSD%-kernel%-generic.*") then
+			components["kernel"] = package
 		end
 	end
-	assert(#components["kernel"] == 1)
-	assert(#components["base"] > 0)
+	assert(components["kernel"])
+	assert(components["base"])
 
 	local selected = {}
 	if media == "disc" then
-		append_list(selected, components["base"])
-		append_list(selected, components["kernel"])
-		append_list(selected, components["kernel_dbg"])
-		append_list(selected, components["src"])
-		append_list(selected, components["tests"])
+		table.insert(selected, components["base"])
+		table.insert(selected, components["kernel"])
+		table.insert(selected, components["kernel-dbg"])
+		table.insert(selected, components["src"])
+		table.insert(selected, components["tests"])
 		for compat in all_libcompats:gmatch("%S+") do
-			append_list(selected, components["lib" .. compat])
+			table.insert(selected, components["lib" .. compat])
 		end
 	else
 		assert(media == "dvd")
-		append_list(selected, components["base"])
-		append_list(selected, components["base_dbg"])
-		append_list(selected, components["kernel"])
-		append_list(selected, components["kernel_dbg"])
-		append_list(selected, components["src"])
-		append_list(selected, components["tests"])
+		table.insert(selected, components["base"])
+		table.insert(selected, components["base-dbg"])
+		table.insert(selected, components["kernel"])
+		table.insert(selected, components["kernel-dbg"])
+		table.insert(selected, components["src"])
+		table.insert(selected, components["tests"])
 		for compat in all_libcompats:gmatch("%S+") do
-			append_list(selected, components["lib" .. compat])
-			append_list(selected, components["lib" .. compat .. "_dbg"])
+			table.insert(selected, components["lib" .. compat])
+			table.insert(selected, components["lib" .. compat .. "-dbg"])
 		end
 	end
 
@@ -136,7 +96,7 @@ local function main()
 
 	local packages = select_packages(pkg, media, all_libcompats)
 
-	assert(os.execute(pkg .. "fetch -o " .. target .. " " .. table.concat(packages, " ")))
+	assert(os.execute(pkg .. "fetch -d -o " .. target .. " " .. table.concat(packages, " ")))
 	assert(os.execute(pkg .. "repo " .. target))
 end