From ff41103194329c78d8b31a2015c0753abaa80845 Mon Sep 17 00:00:00 2001 From: Ben Grande Date: Fri, 14 Jun 2024 19:22:43 +0200 Subject: [PATCH] build: spec scriptlet fails when it is empty Echoing the word true was getting evaluated instead of being assigned as a string. --- rpm_spec/template/template.spec | 22 +++++++++++++------ scripts/spec-build.sh | 2 +- scripts/spec-gen.sh | 39 +++++++++++++++++++-------------- scripts/spec-get.sh | 17 +++++++++----- 4 files changed, 50 insertions(+), 30 deletions(-) diff --git a/rpm_spec/template/template.spec b/rpm_spec/template/template.spec index 48dc050..3591489 100644 --- a/rpm_spec/template/template.spec +++ b/rpm_spec/template/template.spec @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. +# SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. # # 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@ diff --git a/scripts/spec-build.sh b/scripts/spec-build.sh index 11b5318..4ed93ab 100755 --- a/scripts/spec-build.sh +++ b/scripts/spec-build.sh @@ -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 } diff --git a/scripts/spec-gen.sh b/scripts/spec-gen.sh index fef9a98..42da851 100755 --- a/scripts/spec-gen.sh +++ b/scripts/spec-gen.sh @@ -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 diff --git a/scripts/spec-get.sh b/scripts/spec-get.sh index 1729f3d..b081137 100755 --- a/scripts/spec-get.sh +++ b/scripts/spec-get.sh @@ -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