#!/usr/libexec/flua
local function capture(command)
local p = io.popen(command)
local output = p:read("*a")
assert(p:close())
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
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 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
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
end
end
assert(#components["kernel"] == 1)
assert(#components["base"] > 0)
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"])
for compat in all_libcompats:gmatch("%S+") do
append_list(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"])
for compat in all_libcompats:gmatch("%S+") do
append_list(selected, components["lib" .. compat])
append_list(selected, components["lib" .. compat .. "_dbg"])
end
end
return selected
end
local function main()
local media = assert(arg[1])
assert(media == "disc" or media == "dvd")
local source = assert(arg[2])
local target = assert(arg[3])
local all_libcompats = assert(arg[4])
assert(os.execute("mkdir -p pkgbase-repo-conf"))
local f <close> = assert(io.open("pkgbase-repo-conf/FreeBSD-base.conf", "w"))
assert(f:write(string.format([[
FreeBSD-base: {
url: "file://%s",
enabled: yes
}
]], source)))
assert(f:close())
local pkg = "pkg -o ASSUME_ALWAYS_YES=yes -o IGNORE_OSVERSION=yes " ..
"-o INSTALL_AS_USER=1 -o PKG_DBDIR=./pkgdb -R ./pkgbase-repo-conf "
assert(os.execute(pkg .. "update"))
local packages = select_packages(pkg, media, all_libcompats)
assert(os.execute(pkg .. "fetch -o " .. target .. " " .. table.concat(packages, " ")))
assert(os.execute(pkg .. "repo " .. target))
end
main()