166f36c36SLexi Winter#!/usr/libexec/flua 266f36c36SLexi Winter 366f36c36SLexi Winter--[[ usage: 4*9e6cea12SJose Luis Durangenerate-set-ucl.lua <template> [<variablename> <variablevalue>] 566f36c36SLexi Winter 666f36c36SLexi WinterGenerate the UCL for a set metapackage. The variables provided will be 766f36c36SLexi Wintersubstituted as UCL variables. 866f36c36SLexi Winter]]-- 966f36c36SLexi Winter 1066f36c36SLexi Winterlocal ucl = require("ucl") 1166f36c36SLexi Winter 1266f36c36SLexi Winter-- This parser is the output UCL we want to build. 1366f36c36SLexi Winterlocal parser = ucl.parser() 1466f36c36SLexi Winter 1566f36c36SLexi Winterif #arg < 1 then 1666f36c36SLexi Winter io.stderr:write(arg[0] .. ": missing template filename\n") 1766f36c36SLexi Winter os.exit(1) 1866f36c36SLexi Winterend 1966f36c36SLexi Winter 2066f36c36SLexi Winterlocal template = table.remove(arg, 1) 2166f36c36SLexi Winter 2266f36c36SLexi Winter-- Set any $VARIABLES from the command line in the parser. This causes ucl to 2366f36c36SLexi Winter-- automatically replace them when we load the source ucl. 2466f36c36SLexi Winterif #arg % 2 ~= 0 then 2566f36c36SLexi Winter io.stderr:write(arg[0] .. ": expected an even number of arguments, " 2666f36c36SLexi Winter .. "got " .. #arg .. "\n") 2766f36c36SLexi Winter os.exit(1) 2866f36c36SLexi Winterend 2966f36c36SLexi Winter 3066f36c36SLexi Winterlocal pkgprefix = nil 3166f36c36SLexi Winterlocal pkgversion = nil 3266f36c36SLexi Winterlocal pkgdeps = "" 3366f36c36SLexi Winter 3466f36c36SLexi Winterfor i = 2, #arg, 2 do 3566f36c36SLexi Winter local varname = arg[i - 1] 3666f36c36SLexi Winter local varvalue = arg[i] 3766f36c36SLexi Winter 3866f36c36SLexi Winter if varname == "PKG_NAME_PREFIX" and #varvalue > 0 then 3966f36c36SLexi Winter pkgprefix = varvalue 4066f36c36SLexi Winter elseif varname == "VERSION" and #varvalue > 0 then 4166f36c36SLexi Winter pkgversion = varvalue 4266f36c36SLexi Winter elseif varname == "SET_DEPENDS" and #varvalue > 0 then 4366f36c36SLexi Winter pkgdeps = varvalue 4466f36c36SLexi Winter end 4566f36c36SLexi Winter 4666f36c36SLexi Winter parser:register_variable(varname, varvalue) 4766f36c36SLexi Winterend 4866f36c36SLexi Winter 4966f36c36SLexi Winter-- Load the source template. 5066f36c36SLexi Winterlocal res,err = parser:parse_file(template) 5166f36c36SLexi Winterif not res then 5266f36c36SLexi Winter io.stderr:write(arg[0] .. ": fail to parse(" .. template .. "): " 5366f36c36SLexi Winter .. err .. "\n") 5466f36c36SLexi Winter os.exit(1) 5566f36c36SLexi Winterend 5666f36c36SLexi Winter 5766f36c36SLexi Winterlocal obj = parser:get_object() 5866f36c36SLexi Winter 5966f36c36SLexi Winter-- Dependency handling. 6066f36c36SLexi Winterobj["deps"] = obj["deps"] or {} 6166f36c36SLexi Winter 6266f36c36SLexi Winter-- If PKG_NAME_PREFIX is provided, rewrite the names of dependency packages. 6366f36c36SLexi Winter-- We can't do this in UCL since variable substitution doesn't work in array 6466f36c36SLexi Winter-- keys. Note that this only applies to dependencies from the set UCL files, 6566f36c36SLexi Winter-- because SET_DEPENDS already have the correct prefix. 6666f36c36SLexi Winterif pkgprefix ~= nil then 6766f36c36SLexi Winter newdeps = {} 6866f36c36SLexi Winter for dep, opts in pairs(obj["deps"]) do 6966f36c36SLexi Winter local newdep = pkgprefix .. "-" .. dep 7066f36c36SLexi Winter newdeps[newdep] = opts 7166f36c36SLexi Winter end 7266f36c36SLexi Winter obj["deps"] = newdeps 7366f36c36SLexi Winterend 7466f36c36SLexi Winter 7566f36c36SLexi Winter-- Add dependencies from SET_DEPENDS. 7666f36c36SLexi Winterfor dep in string.gmatch(pkgdeps, "[^%s]+") do 7766f36c36SLexi Winter obj["deps"][dep] = { 7866f36c36SLexi Winter ["origin"] = "base" 7966f36c36SLexi Winter } 8066f36c36SLexi Winterend 8166f36c36SLexi Winter 8266f36c36SLexi Winter-- Add a version key to all dependencies, otherwise pkg doesn't like it. 8366f36c36SLexi Winterfor dep, opts in pairs(obj["deps"]) do 8466f36c36SLexi Winter if obj["deps"][dep]["version"] == nil then 8566f36c36SLexi Winter obj["deps"][dep]["version"] = pkgversion 8666f36c36SLexi Winter end 8766f36c36SLexi Winterend 8866f36c36SLexi Winter 8966f36c36SLexi Winter-- If there are no dependencies, remove the deps key, otherwise pkg raises an 9066f36c36SLexi Winter-- error trying to read the manifest. 9166f36c36SLexi Winterif next(obj["deps"]) == nil then 9266f36c36SLexi Winter obj["deps"] = nil 9366f36c36SLexi Winterend 9466f36c36SLexi Winter 9566f36c36SLexi Winter-- Write the output. 9666f36c36SLexi Winterio.stdout:write(ucl.to_format(obj, 'ucl', true)) 97