74b8dd05bb
Using the modification time of the snapshot tarball for computing dist is a bad idea, since it's different on different machines. For example, the computed date during the `buildSRPMfromSCM` koji task is likely different from the local date when the package was prepared, and so package builds (especially EVRs and changelog entries) are not reproducible. With this change, the snapshot date is not calculated magically, but the packager has to set "%global date YYYYMMDD" manually. I also adapted the documentation for the macro to reflect that change. This is related to the following FPC issue: https://pagure.io/packaging-committee/issue/719
283 lines
12 KiB
Plaintext
283 lines
12 KiB
Plaintext
# Map forge information to rpm metadata. This macro will compute default spec
|
||
# variable values.
|
||
#
|
||
# The following spec variables SHOULD be set before calling the macro:
|
||
#
|
||
# forgeurl the project url on the forge, strongly recommended;
|
||
# alternatively, use -u <url>
|
||
# Version if applicable, set it with Version: <version>
|
||
# tag if applicable
|
||
# commit if applicable
|
||
# date if applicable
|
||
#
|
||
# The macro will attempt to compute and set the following variables if they are
|
||
# not already set by the packager:
|
||
#
|
||
# forgesource an URL that can be used as SourceX: value
|
||
# forgesetupargs the correct arguments to pass to %setup for this source
|
||
# used by %forgesetup and %forgeautosetup
|
||
# archivename the source archive filename, without extentions
|
||
# archiveext the source archive filename extensions, without leading dot
|
||
# archiveurl the url that can be used to download the source archive,
|
||
# without renaming
|
||
# scm the scm type, when packaging code snapshots: commits or tags
|
||
#
|
||
# If the macro is unable to parse your forgeurl value set at least archivename
|
||
# and archiveurl before calling it.
|
||
#
|
||
# Most of the computed variables are both overridable and optional. However,
|
||
# the macro WILL REDEFINE %{dist} when packaging a snapshot (commit or tag).
|
||
# The previous %{dist} value will be lost. Don’t call the macro if you don’t
|
||
# wish %{dist} to be changed.
|
||
#
|
||
# Optional parameters:
|
||
# -u <url> Ignore forgeurl even if it exists and use <url> instead. Note
|
||
# that the macro will still end up setting <url> as the forgeurl
|
||
# spec variable if it manages to parse it.
|
||
# -s Silently ignore problems in forgeurl, use it if it can be parsed,
|
||
# ignore it otherwise.
|
||
# -p Restore problem handling, override -s.
|
||
# -v Be verbose and print every spec variable the macro sets.
|
||
# -i Print some info about the state of spec variables the macro may use or
|
||
# set at the end of the processing.
|
||
%forgemeta(u:spvi) %{lua:
|
||
local forgeurl = rpm.expand("%{?-u*}")
|
||
if (forgeurl == "") then
|
||
forgeurl = rpm.expand("%{?forgeurl}")
|
||
end
|
||
local silent = false
|
||
local verbose = false
|
||
local informative = false
|
||
if (rpm.expand("%{?-s}") ~= "") then
|
||
silent = true
|
||
end
|
||
if (rpm.expand("%{?-p}") ~= "") then
|
||
silent = false
|
||
end
|
||
if (rpm.expand("%{?-v}") ~= "") then
|
||
verbose = true
|
||
end
|
||
if (rpm.expand("%{?-i}") ~= "") then
|
||
informative = true
|
||
end
|
||
local tag = rpm.expand("%{?tag}")
|
||
local commit = rpm.expand("%{?commit}")
|
||
-- Be explicit about the spec variables we’re setting
|
||
local function explicitset(rpmvariable,value)
|
||
rpm.define(rpmvariable .. " " .. value)
|
||
if verbose then
|
||
rpm.expand("%{echo:Setting %%{" .. rpmvariable .. "} = " .. value .. "\\n}")
|
||
end
|
||
end
|
||
-- Never ever stomp on a spec variable the packager already set
|
||
local function safeset(rpmvariable,value)
|
||
if (rpm.expand("%{?" .. rpmvariable .. "}") == "") then
|
||
explicitset(rpmvariable,value)
|
||
end
|
||
end
|
||
-- Set spec variable values for each known software publishing service
|
||
if (forgeurl ~= "") then
|
||
local forge = string.match(forgeurl, "^[^:]+://([^/]+)/")
|
||
if (forge == nil) then
|
||
if not silent then
|
||
rpm.expand("%{error:URLs must include a protocol such as https:// and a path starting with / !\\n}")
|
||
end
|
||
else
|
||
if (string.match(forge, "^gitlab[%.-]") or string.match(forge, "[%.-]gitlab[%.]")) then
|
||
forgeurl = string.match(forgeurl, "https://[^/]+/[^/]+/[^/#?]+")
|
||
if (forgeurl == nil) then
|
||
if not silent then
|
||
rpm.expand("%{error:Gitlab URLs must match https://(…[-.])gitlab[-.]…/owner/repo !\\n}")
|
||
end
|
||
else
|
||
explicitset("forgeurl", forgeurl)
|
||
if (commit == "") then
|
||
rpm.expand("%{error:All Gitlab URLs require commit value knowledge: you need to define %{commit}!\\nPlease vote on https://gitlab.com/gitlab-org/gitlab-ce/issues/38830\\n}")
|
||
end
|
||
safeset("archiveext", "tar.bz2")
|
||
safeset("forgesetupargs", "-n %{archivename}")
|
||
if (commit ~= "") or (tag ~= "") then
|
||
safeset("scm", "git")
|
||
end
|
||
local owner = string.match(forgeurl, "^[^:]+://[^/]+/([^/]+)")
|
||
local repo = string.match(forgeurl, "^[^:]+://[^/]+/[^/]+/([^/]+)")
|
||
local version = rpm.expand("%{?version}")
|
||
if (version ~= "") and (version ~= "0") and (tag == "") then
|
||
-- GitLab does not have strong versionning semantics
|
||
-- Some projects use "version" as release tag, others "v" + "version"
|
||
-- Tag value needs to be explicitly declared before calling the macro
|
||
-- in the second case
|
||
tag = version
|
||
safeset("tag", tag)
|
||
end
|
||
if (tag ~= "") then
|
||
safeset("archivename", repo .. "-%{tag}-%{commit}")
|
||
safeset("archiveurl", "%{forgeurl}/repository/%{tag}/archive.%{archiveext}")
|
||
else
|
||
safeset("archivename", repo .. "-%{commit}")
|
||
safeset("archiveurl", "%{forgeurl}/repository/%{commit}/archive.%{archiveext}")
|
||
end
|
||
end
|
||
end
|
||
if (string.match(forge, "^github[%.-]") or string.match(forge, "[%.-]github[%.]")) then
|
||
forgeurl = string.match(forgeurl, "https://[^/]+/[^/]+/[^/#?]+")
|
||
if (forgeurl == nil) then
|
||
if not silent then
|
||
rpm.expand("%{error:GitHub URLs must match https://(…[-.])github[-.]…/owner/repo !\\n}")
|
||
end
|
||
else
|
||
explicitset("forgeurl", forgeurl)
|
||
safeset("archiveext", "tar.gz")
|
||
local forgesetupargs = "-n %{archivename}"
|
||
if (commit ~= "") or (tag ~= "") then
|
||
safeset("scm", "git")
|
||
end
|
||
local owner = string.match(forgeurl, "^[^:]+://[^/]+/([^/]+)")
|
||
local repo = string.match(forgeurl, "^[^:]+://[^/]+/[^/]+/([^/]+)")
|
||
if (tag ~= "") then
|
||
-- if upstream used a version suffix such as -rc1 or -beta it will not
|
||
-- be a valid version string for rpm but github will accept it fine and
|
||
-- use the same naming as for other versions: v prefix in the tag and
|
||
-- archivename, no v prefix in the topdir naming inside the archive
|
||
local version = rpm.expand("%{?version}")
|
||
if version ~= "" and
|
||
(string.match(tag, "^v" .. version .. "[^%d]") or
|
||
string.match(tag, "^v" .. version .. "$")) then
|
||
forgesetupargs = "-n " .. repo .. "-" .. string.gsub(tag, "^v", "")
|
||
end
|
||
safeset("archivename", repo .. "-%{tag}")
|
||
safeset("archiveurl", "%{forgeurl}/archive/%{tag}.%{archiveext}")
|
||
else
|
||
if (commit ~= "") then
|
||
safeset("archivename", repo .. "-%{commit}")
|
||
safeset("archiveurl", "%{forgeurl}/archive/%{commit}/" .. repo .. "-%{commit}.%{archiveext}")
|
||
else
|
||
safeset("archivename", repo .. "-%{version}")
|
||
safeset("archiveurl", "%{forgeurl}/archive/v%{version}.%{archiveext}")
|
||
end
|
||
end
|
||
safeset("forgesetupargs", forgesetupargs)
|
||
end
|
||
end
|
||
if (forge == "code.googlesource.com") then
|
||
forgeurl = string.match(forgeurl, "https://code.googlesource.com/[^#?]*[^/#?]+")
|
||
if (forgeurl == nil) then
|
||
if not silent then
|
||
rpm.expand("%{error:Googlesource URLs must match https://code.googlesource.com/…/repo !\\n}")
|
||
end
|
||
else
|
||
explicitset("forgeurl", forgeurl)
|
||
safeset("archiveext", "tar.gz")
|
||
safeset("forgesetupargs", "-c")
|
||
if (commit ~= "") or (tag ~= "") then
|
||
safeset("scm", "git")
|
||
end
|
||
local repo = string.match(forgeurl, "^[^:]+://.+/([^/?#]+)")
|
||
if (tag ~= "") then
|
||
safeset("archivename", repo .. "-%{tag}")
|
||
safeset("archiveurl", "%{forgeurl}/+archive/%{tag}.%{archiveext}")
|
||
else
|
||
if (commit ~= "") then
|
||
safeset("archivename", repo .. "-%{commit}")
|
||
safeset("archiveurl", "%{forgeurl}/+archive/%{commit}.%{archiveext}")
|
||
else
|
||
safeset("archivename", repo .. "-v%{version}")
|
||
safeset("archiveurl", "%{forgeurl}/+archive/v%{version}.%{archiveext}")
|
||
end
|
||
end
|
||
end
|
||
end
|
||
if (forge == "bitbucket.org") then
|
||
forgeurl = string.match(forgeurl, "https://[^/]+/[^/]+/[^/#?]+")
|
||
if (forgeurl == nil) then
|
||
if not silent then
|
||
rpm.expand("%{error:BitBucket URLs must match https://bitbucket.org/owner/repo !\\n}")
|
||
end
|
||
else
|
||
explicitset("forgeurl", forgeurl)
|
||
if (commit == "") then
|
||
rpm.expand("%{error:All BitBucket URLs require commit value knowledge: you need to define %{commit}!\\n}")
|
||
end
|
||
local shortcommit = string.sub(commit, 1, 12)
|
||
safeset("archiveext", "tar.bz2")
|
||
-- Default to git even though BitBucket allows choosing between several SCMs
|
||
-- Set scm to hg for example before calling the macro if your project does not use git
|
||
safeset("scm", "git")
|
||
local owner = string.match(forgeurl, "^[^:]+://[^/]+/([^/]+)")
|
||
local repo = string.match(forgeurl, "^[^:]+://[^/]+/[^/]+/([^/]+)")
|
||
safeset("archivename", owner .. "-" .. repo .. "-" .. shortcommit)
|
||
safeset("forgesetupargs", "-n %{archivename}")
|
||
if (tag ~= "") then
|
||
safeset("archiveurl", "%{forgeurl}/get/%{tag}.%{archiveext}")
|
||
else
|
||
safeset("archiveurl", "%{forgeurl}/get/%{commit}.%{archiveext}")
|
||
end
|
||
end
|
||
end
|
||
if (forge == "pagure.io") then
|
||
if not silent then
|
||
rpm.expand("%{error:https://pagure.io/pagure/issue/861 needs to be resolved before the “pagure.io”\\nsoftware publishing service can be supported.\\n}")
|
||
end
|
||
end
|
||
-- Final tests to check forgeurl was successfuly parsed
|
||
if not silent then
|
||
if (rpm.expand("%{?archivename}") == "") or (rpm.expand("%{?archiveurl}") == "") then
|
||
rpm.expand("%{error:Automation for the “" .. forge .. "”\\nsoftware publishing service is not implemented yet.\\nPlease extend the %%forgemeta macro!\\n}")
|
||
end
|
||
end
|
||
end
|
||
end
|
||
-- Set defaults if forgeurl is missing or does not parse
|
||
local archivename = rpm.expand("%{?archivename}")
|
||
safeset("archiveext", "tar.gz")
|
||
if (archivename ~= "") then
|
||
safeset("forgesetupargs", "-n %{archivename}")
|
||
end
|
||
if (commit ~= "") or (tag ~= "") then
|
||
safeset("scm", "git")
|
||
end
|
||
-- Source URL processing (computing the forgesource spec variable)
|
||
local archiveurl = rpm.expand("%{?archiveurl}")
|
||
local archiveext = rpm.expand("%{?archiveext}")
|
||
if (archivename ~= "") and (archiveurl ~= "") then
|
||
if (string.match(archiveurl, "/([^/]+)$") == archivename .. "." .. archiveext) then
|
||
safeset("forgesource", "%{archiveurl}")
|
||
else
|
||
safeset("forgesource", "%{?archiveurl}#/%{?archivename}.%{archiveext}")
|
||
end
|
||
end
|
||
-- dist processing (computing the correct pefix for snapshots)
|
||
local distprefix = rpm.expand("%{?tag}")
|
||
local version = rpm.expand("%{?version}")
|
||
if (distprefix == version) or (distprefix == "v" .. version) then
|
||
distprefix = ""
|
||
end
|
||
if (distprefix == "") then
|
||
distprefix = string.sub(rpm.expand("%{?commit}"), 1, 7)
|
||
end
|
||
if (distprefix ~= "") then
|
||
local dist = ".%{date}.%{scm}" .. string.gsub(distprefix, "-",".") .. rpm.expand("%{?dist}")
|
||
explicitset("dist", dist)
|
||
end
|
||
-- Final spec variable summary if the macro was called with -i
|
||
if informative then
|
||
rpm.expand("%{echo:Forge-specific packaging variables\\n}")
|
||
rpm.expand("%{echo: forgeurl: %{?forgeurl}\\n}")
|
||
rpm.expand("%{echo: forgesource: %{?forgesource}\\n}")
|
||
rpm.expand("%{echo: forgesetupargs: %{?forgesetupargs}\\n}")
|
||
rpm.expand("%{echo:Generic variables\\n}")
|
||
rpm.expand("%{echo: archivename: %{?archivename}\\n}")
|
||
rpm.expand("%{echo: archiveext: %{?archiveext}\\n}")
|
||
rpm.expand("%{echo: archiveurl: %{?archiveurl}\\n}")
|
||
rpm.expand("%{echo: scm: %{?scm}\\n}")
|
||
rpm.expand("%{echo: tag: %{?tag}\\n}")
|
||
rpm.expand("%{echo: commit: %{?commit}\\n}")
|
||
rpm.expand("%{echo: dist: %{?dist}\\n}")
|
||
end
|
||
}
|
||
|
||
# Convenience macro to relay computed arguments to %setup
|
||
%forgesetup(a:b:cDn:Tq) %setup %{?forgesetupargs} %{-a} %{-b} %{-c} %{-D} %{-n} %{-T} %{-q}
|
||
|
||
# Convenience macro to relay computed arguments to %autosetup
|
||
%forgeautosetup(a:b:cDn:TvNS:p:) %autosetup %{?forgesetupargs} %{-a} %{-b} %{-c} %{-D} %{-n} %{-T} %{-v} %{-N} %{-S} %{-p} |