build: spec scriptlet fails when it is empty

Echoing the word true was getting evaluated instead of being assigned as
a string.
This commit is contained in:
Ben Grande 2024-06-14 19:22:43 +02:00
parent fcad8cb3e1
commit ff41103194
No known key found for this signature in database
GPG Key ID: 00C64E14F51F9E56
4 changed files with 50 additions and 30 deletions

View File

@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. <ben.grande.b@gmail.com>
# SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. <ben.grande.b@gmail.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
@ -8,10 +8,12 @@
%define project %(./scripts/spec-get.sh @PROJECT@ project)
%define summary %(./scripts/spec-get.sh @PROJECT@ summary)
%define group %(./scripts/spec-get.sh @PROJECT@ group)
%define packager %(./scripts/spec-get.sh @PROJECT@ packager)
%define vendor %(./scripts/spec-get.sh @PROJECT@ vendor)
%define license_csv %(./scripts/spec-get.sh @PROJECT@ license_csv)
%define license %(./scripts/spec-get.sh @PROJECT@ license)
%define url %(./scripts/spec-get.sh @PROJECT@ url)
%define bug_url %(./scripts/spec-get.sh @PROJECT@ bug_url)
%define my_description %(./scripts/spec-get.sh @PROJECT@ description)
## Reproducibility.
@ -31,9 +33,11 @@ Release: 1%{?dist}
Summary: %{summary}
Group: %{group}
Packager: %{packager}
Vendor: %{vendor}
License: %{license}
URL: %{url}
BugURL: %{bug_url}
Source0: %{project}
BuildArch: noarch
@ -50,14 +54,18 @@ Requires: qubes-mgmt-salt-dom0
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}%{file_roots} %{buildroot}%{_defaultlicensedir}/%{project}
mv -v %{project}/LICENSES/* %{buildroot}%{_defaultlicensedir}/%{project}/
rm -rv %{project}/LICENSES
install -m 755 -d \
%{buildroot}%{file_roots} \
%{buildroot}%{_docdir}/%{project} \
%{buildroot}%{_defaultlicensedir}/%{project}
install -m 644 %{project}/LICENSES/* %{buildroot}%{_defaultlicensedir}/%{project}/
install -m 644 %{project}/README.md %{buildroot}%{_docdir}/%{project}/
rm -rv %{project}/LICENSES %{project}/README.md
cp -rv %{project} %{buildroot}%{file_roots}/%{my_name}
%check
%pre
%dnl %pre
%post
if test "$1" = "1"; then
@ -89,10 +97,10 @@ fi
%files
%defattr(-,root,root,-)
%license %{_defaultlicensedir}/%{project}/*
%doc %{_docdir}/%{project}/README.md
%dir %{file_roots}/%{my_name}
%doc %{file_roots}/%{my_name}/README.md
%exclude %{file_roots}/%{my_name}/README.md
%{file_roots}/%{my_name}/*
%dnl TODO: missing '%ghost', files generated during %post, such as Qrexec policies.
%changelog
@CHANGELOG@

View File

@ -59,7 +59,7 @@ build_rpm(){
"${gpg}" --export --armor "${key_id}" | tee "${tmp_file}" >/dev/null
rpmkeys --dbpath="${dbpath}" --import "${tmp_file}"
## TODO: target only the latest relase
rpm --dbpath="${dbpath}" --checksig --verbose \
rpmkeys --dbpath="${dbpath}" --checksig --verbose \
-- "${rpm_basename}"*"${rpm_suffix}"
fi
}

View File

@ -10,13 +10,25 @@ usage(){
echo "Usage: ${0##*/} PROJECT [PROJECT ...]"
}
## Escape multiline strings for sed.
escaped_key(){
echo "${1}" | sed ':a;N;$!ba;s/\n/\\n /g' | sed 's/\$/\\$/'
}
# get_scriptlet scriptlet-action
# [pre|post]-[install|upgrade], [pre|post]un-[uninstall|upgrade]
## Get scriptlet command, else fail safe.
get_scriptlet(){
scriptlet="$1"
sed -n "/^<\!-- pkg:begin:${scriptlet} -->$/,/^<\!-- pkg:end:${scriptlet} -->$/p" \
"${readme}" | sed '/^```.*/d;/^<\!-- pkg:/d;s/^sudo //' || echo "true"
scriptlet="$(sed -n \
"/^<\!-- pkg:begin:${scriptlet} -->$/,/^<\!-- pkg:end:${scriptlet} -->$/p" \
"${readme}" | sed '/^```.*/d;/^<\!-- pkg:/d;s/^sudo //')"
if test -z "${scriptlet}"; then
echo true
return 0
fi
escaped_key "${scriptlet}"
}
get_spec(){
@ -33,21 +45,16 @@ gen_spec(){
template="rpm_spec/template/template.spec"
target="rpm_spec/${group}-${project}.spec"
## Escape multiline strings for sed
escaped_key(){
echo "${1}" | sed ':a;N;$!ba;s/\n/\\n /g' | sed 's/\$/\\$/'
}
readme="$(get_spec readme)"
pre_install="$(escaped_key "$(get_scriptlet pre-install)")"
pre_upgrade="$(escaped_key "$(get_scriptlet pre-upgrade)")"
post_install="$(escaped_key "$(get_scriptlet post-install)")"
post_upgrade="$(escaped_key "$(get_scriptlet post-upgrade)")"
preun_uninstall="$(escaped_key "$(get_scriptlet preun-uninstall)")"
preun_upgrade="$(escaped_key "$(get_scriptlet preun-upgrade)")"
postun_uninstall="$(escaped_key "$(get_scriptlet postun-uninstall)")"
postun_upgrade="$(escaped_key "$(get_scriptlet postun-upgrade)")"
pre_install="$(get_scriptlet pre-install)"
pre_upgrade="$(get_scriptlet pre-upgrade)"
post_install="$(get_scriptlet post-install)"
post_upgrade="$(get_scriptlet post-upgrade)"
preun_uninstall="$(get_scriptlet preun-uninstall)"
preun_upgrade="$(get_scriptlet preun-upgrade)"
postun_uninstall="$(get_scriptlet postun-uninstall)"
postun_upgrade="$(get_scriptlet postun-upgrade)"
version="$(get_spec version)"
changelog="$(get_spec changelog)"
@ -69,7 +76,7 @@ gen_spec(){
requires_key=""
for r in $(printf %s"${requires}" | tr " " "\n" | sort -u); do
requires_key="${requires_key}\nRequires: ${group}-${r}"
requires_key="${requires_key}\nRequires: ${group}-${r}"
done
sed -i "s/@REQUIRES@/${requires_key}/" "${target}" >/dev/null
echo "${changelog}" | tee -a "${target}" >/dev/null

View File

@ -27,7 +27,7 @@ block_max_chars(){
fi
}
keys="name branch group file_roots requires vendor url version project project_dir changelog readme license_csv license description summary saltfiles"
keys="name branch group file_roots requires packager vendor url bug_url version project project_dir changelog readme license_csv license description summary saltfiles"
name=""
key=""
@ -56,8 +56,10 @@ fi
group="qusal"
block_max_chars group "${group}" 70
file_roots="/srv/salt/${group}"
vendor="Benjamin Grande"
url="https://github.com/ben-grande/qusal"
vendor="${QUSAL_VENDOR:-"Benjamin Grande"}"
packager="${QUSAL_PACKAGER:-"Benjamin Grande"}"
url="${QUSAL_URL:-"https://github.com/ben-grande/qusal"}"
bug_url="${QUSAL_BUGURL:-"https://github.com/ben-grande/qusal/issues"}"
version="1.0"
project="${group}-${name}"
@ -88,12 +90,13 @@ if test "${key}" = "changelog"; then
fi
if test "${key}" = "description"; then
description="$(sed -n '/^## Description/,/^## /p' "${readme}" |
description="$(sed -n '/^## Description/,/^## /p' -- "${readme}" |
sed '1d;$d' | sed "1{/^$/d}")"
fi
if test "${key}" = "summary"; then
summary="$(sed -n "/^# ${name}$/,/^## Table of Contents$/{/./!d;/^#/d;p}" "${readme}")"
summary="$(sed -n "/^# ${name}$/,/^## Table of Contents$/{
/./!d; /^#/d; s/\.$//; p}" -- "${readme}")"
block_max_chars summary "${summary}" 70
fi
@ -101,7 +104,7 @@ if test "${key}" = "saltfiles" || test "${key}" = "requires"; then
saltfiles="$(find "${project_dir}" -maxdepth 1 -name "*.sls")"
# shellcheck disable=SC2086
if test -n "${saltfiles}"; then
requires="$(sed -n '/^include:$/,/^\s*$/p' ${saltfiles} | sed "/^\s*- \./d;/{/d" | grep "^\s*- " | cut -d "." -f1 | sort -u | sed "s/- //")"
requires="$(sed -n '/^include:$/,/^\s*$/p' -- ${saltfiles} | sed "/^\s*- \./d;/{/d" | grep "^\s*- " | cut -d "." -f1 | sort -u | sed "s/- //")"
if grep -qrn "{%-\? from \('\|\"\)utils" ${saltfiles}; then
if test -n "${requires}"; then
requires="${requires} utils"
@ -140,6 +143,8 @@ case "${key}" in
saltfiles) echo "${saltfiles}";;
summary) echo "${summary}";;
url) echo "${url}";;
bug_url) echo "${bug_url}";;
vendor) echo "${vendor}";;
packager) echo "${packager}";;
version) echo "${version}";;
esac