ee5ec5afe5
The `features` file is converted to a Lua-based DSL. A helper function `_` is used in the DSL; this will return the original string for enabled features, and nil for disabled features. This allows to use boolean operations on features without making the code too verbose. Besides having more readable and robust code, this also fixes the bug that all files `packages/*/features` were evaluated instead of only using the feature definitions of currently active feeds.
61 lines
989 B
Lua
61 lines
989 B
Lua
local M = {}
|
|
|
|
local function to_keys(t)
|
|
local ret = {}
|
|
for _, v in ipairs(t) do
|
|
ret[v] = true
|
|
end
|
|
return ret
|
|
end
|
|
|
|
local function collect_keys(t)
|
|
local ret = {}
|
|
for v in pairs(t) do
|
|
table.insert(ret, v)
|
|
end
|
|
return ret
|
|
end
|
|
|
|
function M.get_packages(file, features)
|
|
local feature_table = to_keys(features)
|
|
|
|
local funcs = {}
|
|
|
|
function funcs._(feature)
|
|
if feature_table[feature] then
|
|
return feature
|
|
end
|
|
end
|
|
|
|
local nodefault = {}
|
|
local packages = {}
|
|
function funcs.feature(match, options)
|
|
if not match then
|
|
return
|
|
end
|
|
|
|
if options.nodefault then
|
|
nodefault[match] = true
|
|
end
|
|
for _, package in ipairs(options.packages or {}) do
|
|
packages[package] = true
|
|
end
|
|
end
|
|
|
|
-- Evaluate the feature definition file
|
|
local f = loadfile(file)
|
|
setfenv(f, funcs)
|
|
f()
|
|
|
|
-- Handle default packages
|
|
for _, feature in ipairs(features) do
|
|
if not nodefault[feature] then
|
|
packages['gluon-' .. feature] = true
|
|
end
|
|
end
|
|
|
|
return collect_keys(packages)
|
|
end
|
|
|
|
return M
|