You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
4.0 KiB
110 lines
4.0 KiB
-- Convenience Lua functions that can be used within Python srpm/rpm macros |
|
|
|
-- Determine alternate names provided from the given name. |
|
-- Used in pythonname provides generator, python_provide and py_provides. |
|
-- If only_3_to_3_X is false/nil/unused there are 2 rules: |
|
-- python3-foo -> python-foo, python3.X-foo |
|
-- python3.X-foo -> python-foo, python3-foo |
|
-- If only_3_to_3_X is true there is only 1 rule: |
|
-- python3-foo -> python3X-foo |
|
-- There is no python-foo -> rule, python-foo packages are version agnostic. |
|
-- Returns a table/array with strings. Empty when no rule matched. |
|
local function python_altnames(name, only_3_to_3_X) |
|
local xy |
|
if only_3_to_3_X then |
|
-- Here we hardcode the xy prefix we want to obsolete to "39", because: |
|
-- 1. Python 3.9 will remain the main Python version in RHEL 9 |
|
-- 2. python39 in RHEL 8 is still using the dotless naming (as opposed to |
|
-- python3.9) |
|
xy = "39" |
|
else |
|
xy = rpm.expand('%{__default_python3_pkgversion}') |
|
end |
|
local altnames = {} |
|
local replaced |
|
-- NB: dash needs to be escaped! |
|
if name:match('^python3%-') then |
|
local prefixes = only_3_to_3_X and {} or {'python-'} |
|
for i, prefix in ipairs({'python' .. xy .. '-', table.unpack(prefixes)}) do |
|
replaced = name:gsub('^python3%-', prefix) |
|
table.insert(altnames, replaced) |
|
end |
|
elseif name:match('^python' .. xy .. '%-') and not only_3_to_3_X then |
|
for i, prefix in ipairs({'python-', 'python3-'}) do |
|
replaced = name:gsub('^python' .. xy .. '%-', prefix) |
|
table.insert(altnames, replaced) |
|
end |
|
end |
|
return altnames |
|
end |
|
|
|
|
|
local function __python_alttags(name, evr, tag_type) |
|
-- for the "provides" tag_type we want also unversioned provides |
|
local only_3_to_3_X = tag_type ~= "provides" |
|
local operator = tag_type == "provides" and ' = ' or ' < ' |
|
|
|
-- global cache that tells what package NEVRs were already processed for the |
|
-- given tag type |
|
if __python_alttags_beenthere == nil then |
|
__python_alttags_beenthere = {} |
|
end |
|
if __python_alttags_beenthere[tag_type] == nil then |
|
__python_alttags_beenthere[tag_type] = {} |
|
end |
|
__python_alttags_beenthere[tag_type][name .. ' ' .. evr] = true |
|
local alttags = {} |
|
for i, altname in ipairs(python_altnames(name, only_3_to_3_X)) do |
|
table.insert(alttags, altname .. operator .. evr) |
|
end |
|
return alttags |
|
end |
|
|
|
-- For any given name and epoch-version-release, return provides except self. |
|
-- Uses python_altnames under the hood |
|
-- Returns a table/array with strings. |
|
local function python_altprovides(name, evr) |
|
return __python_alttags(name, evr, "provides") |
|
end |
|
|
|
-- For any given name and epoch-version-release, return versioned obsoletes except self. |
|
-- Uses python_altnames under the hood |
|
-- Returns a table/array with strings. |
|
local function python_altobsoletes(name, evr) |
|
return __python_alttags(name, evr, "obsoletes") |
|
end |
|
|
|
|
|
local function __python_alttags_once(name, evr, tag_type) |
|
-- global cache that tells what provides were already processed |
|
if __python_alttags_beenthere == nil |
|
or __python_alttags_beenthere[tag_type] == nil |
|
or __python_alttags_beenthere[tag_type][name .. ' ' .. evr] == nil then |
|
return __python_alttags(name, evr, tag_type) |
|
else |
|
return nil |
|
end |
|
end |
|
|
|
-- Like python_altprovides but only return something once. |
|
-- For each argument can only be used once, returns nil otherwise. |
|
-- Previous usage of python_altprovides counts as well. |
|
local function python_altprovides_once(name, evr) |
|
return __python_alttags_once(name, evr, "provides") |
|
end |
|
|
|
-- Like python_altobsoletes but only return something once. |
|
-- For each argument can only be used once, returns nil otherwise. |
|
-- Previous usage of python_altobsoletes counts as well. |
|
local function python_altobsoletes_once(name, evr) |
|
return __python_alttags_once(name, evr, "obsoletes") |
|
end |
|
|
|
|
|
return { |
|
python_altnames = python_altnames, |
|
python_altprovides = python_altprovides, |
|
python_altobsoletes = python_altobsoletes, |
|
python_altprovides_once = python_altprovides_once, |
|
python_altobsoletes_once = python_altobsoletes_once, |
|
}
|
|
|