13b743d51e
The rewrite of the feature handling introduced multiple major bugs. One
of them was caused by the way Lua's logical operators work:
An expression of the form
_'autoupdater' and _'web-advanced'
would return 'web-advanced' rather than the boolean true when _ returned
both strings unchanged (because the features are enabled).
As entries with more than a single feature name in their expressions did
not set no_default, Gluon would then attempt to add gluon-web-advanced to
the package selection, as web-advanced is a "pure" feature.
To fix this, and get rid of the annoying nodefault, separate handling of
"pure" feature and handling of logical expressions into two separate
functions, called feature() and when(). To simplify the feature
definitions, the package list is now passed directly to these functions
rather than in a table with a single field 'packages'.
Fixes: ee5ec5afe5
("build: rewrite features.sh in Lua")
77 lines
1.4 KiB
Lua
77 lines
1.4 KiB
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 enabled_features = to_keys(features)
|
|
local handled_features = {}
|
|
local packages = {}
|
|
|
|
local funcs = {}
|
|
|
|
local function add_pkgs(pkgs)
|
|
for _, pkg in ipairs(pkgs or {}) do
|
|
packages[pkg] = true
|
|
end
|
|
end
|
|
|
|
function funcs._(feature)
|
|
return enabled_features[feature] ~= nil
|
|
end
|
|
|
|
function funcs.feature(feature, pkgs)
|
|
assert(
|
|
type(feature) == 'string',
|
|
'Incorrect use of feature(): pass a feature name without _ as first argument')
|
|
|
|
if enabled_features[feature] then
|
|
handled_features[feature] = true
|
|
add_pkgs(pkgs)
|
|
end
|
|
|
|
end
|
|
|
|
function funcs.when(cond, pkgs)
|
|
assert(
|
|
type(cond) == 'boolean',
|
|
'Incorrect use of when(): pass a locical expression of _-prefixed strings as first argument')
|
|
|
|
if cond then
|
|
add_pkgs(pkgs)
|
|
end
|
|
end
|
|
|
|
-- Evaluate the feature definition file
|
|
local f, err = loadfile(file)
|
|
if not f then
|
|
error('Failed to parse feature definition: ' .. err)
|
|
end
|
|
setfenv(f, funcs)
|
|
f()
|
|
|
|
-- Handle default packages
|
|
for _, feature in ipairs(features) do
|
|
if not handled_features[feature] then
|
|
packages['gluon-' .. feature] = true
|
|
end
|
|
end
|
|
|
|
return collect_keys(packages)
|
|
end
|
|
|
|
return M
|