1*66f36c36SLexi Winter#!/usr/libexec/flua 2*66f36c36SLexi Winter 3*66f36c36SLexi Winter--[[ usage: 4*66f36c36SLexi Wintergenerare-set-ucl.lua <template> [<variablename> <variablevalue>] 5*66f36c36SLexi Winter 6*66f36c36SLexi WinterGenerate the UCL for a set metapackage. The variables provided will be 7*66f36c36SLexi Wintersubstituted as UCL variables. 8*66f36c36SLexi Winter]]-- 9*66f36c36SLexi Winter 10*66f36c36SLexi Winterlocal ucl = require("ucl") 11*66f36c36SLexi Winter 12*66f36c36SLexi Winter-- This parser is the output UCL we want to build. 13*66f36c36SLexi Winterlocal parser = ucl.parser() 14*66f36c36SLexi Winter 15*66f36c36SLexi Winterif #arg < 1 then 16*66f36c36SLexi Winter io.stderr:write(arg[0] .. ": missing template filename\n") 17*66f36c36SLexi Winter os.exit(1) 18*66f36c36SLexi Winterend 19*66f36c36SLexi Winter 20*66f36c36SLexi Winterlocal template = table.remove(arg, 1) 21*66f36c36SLexi Winter 22*66f36c36SLexi Winter-- Set any $VARIABLES from the command line in the parser. This causes ucl to 23*66f36c36SLexi Winter-- automatically replace them when we load the source ucl. 24*66f36c36SLexi Winterif #arg % 2 ~= 0 then 25*66f36c36SLexi Winter io.stderr:write(arg[0] .. ": expected an even number of arguments, " 26*66f36c36SLexi Winter .. "got " .. #arg .. "\n") 27*66f36c36SLexi Winter os.exit(1) 28*66f36c36SLexi Winterend 29*66f36c36SLexi Winter 30*66f36c36SLexi Winterlocal pkgprefix = nil 31*66f36c36SLexi Winterlocal pkgversion = nil 32*66f36c36SLexi Winterlocal pkgdeps = "" 33*66f36c36SLexi Winter 34*66f36c36SLexi Winterfor i = 2, #arg, 2 do 35*66f36c36SLexi Winter local varname = arg[i - 1] 36*66f36c36SLexi Winter local varvalue = arg[i] 37*66f36c36SLexi Winter 38*66f36c36SLexi Winter if varname == "PKG_NAME_PREFIX" and #varvalue > 0 then 39*66f36c36SLexi Winter pkgprefix = varvalue 40*66f36c36SLexi Winter elseif varname == "VERSION" and #varvalue > 0 then 41*66f36c36SLexi Winter pkgversion = varvalue 42*66f36c36SLexi Winter elseif varname == "SET_DEPENDS" and #varvalue > 0 then 43*66f36c36SLexi Winter pkgdeps = varvalue 44*66f36c36SLexi Winter end 45*66f36c36SLexi Winter 46*66f36c36SLexi Winter parser:register_variable(varname, varvalue) 47*66f36c36SLexi Winterend 48*66f36c36SLexi Winter 49*66f36c36SLexi Winter-- Load the source template. 50*66f36c36SLexi Winterlocal res,err = parser:parse_file(template) 51*66f36c36SLexi Winterif not res then 52*66f36c36SLexi Winter io.stderr:write(arg[0] .. ": fail to parse(" .. template .. "): " 53*66f36c36SLexi Winter .. err .. "\n") 54*66f36c36SLexi Winter os.exit(1) 55*66f36c36SLexi Winterend 56*66f36c36SLexi Winter 57*66f36c36SLexi Winterlocal obj = parser:get_object() 58*66f36c36SLexi Winter 59*66f36c36SLexi Winter-- Dependency handling. 60*66f36c36SLexi Winterobj["deps"] = obj["deps"] or {} 61*66f36c36SLexi Winter 62*66f36c36SLexi Winter-- If PKG_NAME_PREFIX is provided, rewrite the names of dependency packages. 63*66f36c36SLexi Winter-- We can't do this in UCL since variable substitution doesn't work in array 64*66f36c36SLexi Winter-- keys. Note that this only applies to dependencies from the set UCL files, 65*66f36c36SLexi Winter-- because SET_DEPENDS already have the correct prefix. 66*66f36c36SLexi Winterif pkgprefix ~= nil then 67*66f36c36SLexi Winter newdeps = {} 68*66f36c36SLexi Winter for dep, opts in pairs(obj["deps"]) do 69*66f36c36SLexi Winter local newdep = pkgprefix .. "-" .. dep 70*66f36c36SLexi Winter newdeps[newdep] = opts 71*66f36c36SLexi Winter end 72*66f36c36SLexi Winter obj["deps"] = newdeps 73*66f36c36SLexi Winterend 74*66f36c36SLexi Winter 75*66f36c36SLexi Winter-- Add dependencies from SET_DEPENDS. 76*66f36c36SLexi Winterfor dep in string.gmatch(pkgdeps, "[^%s]+") do 77*66f36c36SLexi Winter obj["deps"][dep] = { 78*66f36c36SLexi Winter ["origin"] = "base" 79*66f36c36SLexi Winter } 80*66f36c36SLexi Winterend 81*66f36c36SLexi Winter 82*66f36c36SLexi Winter-- Add a version key to all dependencies, otherwise pkg doesn't like it. 83*66f36c36SLexi Winterfor dep, opts in pairs(obj["deps"]) do 84*66f36c36SLexi Winter if obj["deps"][dep]["version"] == nil then 85*66f36c36SLexi Winter obj["deps"][dep]["version"] = pkgversion 86*66f36c36SLexi Winter end 87*66f36c36SLexi Winterend 88*66f36c36SLexi Winter 89*66f36c36SLexi Winter-- If there are no dependencies, remove the deps key, otherwise pkg raises an 90*66f36c36SLexi Winter-- error trying to read the manifest. 91*66f36c36SLexi Winterif next(obj["deps"]) == nil then 92*66f36c36SLexi Winter obj["deps"] = nil 93*66f36c36SLexi Winterend 94*66f36c36SLexi Winter 95*66f36c36SLexi Winter-- Write the output. 96*66f36c36SLexi Winterio.stdout:write(ucl.to_format(obj, 'ucl', true)) 97