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

View File

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

View File

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

View File

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