From 07cbe2cc08908ffef4a4543f2e50f0c3a80ed559 Mon Sep 17 00:00:00 2001 From: Arcitec <38923130+Arcitec@users.noreply.github.com> Date: Tue, 9 May 2023 16:56:23 +0200 Subject: [PATCH] fix: extremely robust handling for YAML data fetching This new technique is way easier to use, more maintainable, and safely handles special characters and spaces in the YAML data. It will also enable other features, such as the rpm-ostree improvement coming in the next commit. The function name is `get_yaml_array()` because it literally reads it into a Bash array, by the way. Don't change the function name in the future. We may need other functions to read values into strings, etc. --- build.sh | 60 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/build.sh b/build.sh index df5fda3239..ad9ced6fe5 100644 --- a/build.sh +++ b/build.sh @@ -3,47 +3,59 @@ # Tell build process to exit if there are any errors. set -oue pipefail +# Helper functions. +get_yaml_array() { + mapfile -t "$1" < <(yq "$2" < /usr/etc/ublue-recipe.yml) +} + # Add custom repos. -repos=$(yq '.extrarepos[]' < /usr/etc/ublue-recipe.yml) -if [[ -n "$repos" ]]; then +get_yaml_array repos '.extrarepos[]' +if [[ ${#repos[@]} -gt 0 ]]; then echo "-- Adding repos defined in recipe.yml --" - for repo in $(echo -e "$repos"); do \ - wget $repo -P /etc/yum.repos.d/; \ + for repo in "${repos[@]}"; do + wget "$repo" -P /etc/yum.repos.d/ done echo "---" fi # Run scripts. -echo "-- Running scripts defined in recipe.yml --" -buildscripts=$(yq '.scripts[]' < /usr/etc/ublue-recipe.yml) -for script in $(echo -e "$buildscripts"); do \ - echo "Running: ${script}" && \ - /tmp/scripts/$script; \ -done -echo "---" +get_yaml_array buildscripts '.scripts[]' +if [[ ${#buildscripts[@]} -gt 0 ]]; then + echo "-- Running scripts defined in recipe.yml --" + for script in "${buildscripts[@]}"; do + echo "Running: ${script}" + /tmp/scripts/"$script" + done + echo "---" +fi # Remove the default firefox (from fedora) in favor of the flatpak. rpm-ostree override remove firefox firefox-langpacks # Install RPMs. -echo "-- Installing RPMs defined in recipe.yml --" -rpm_packages=$(yq '.rpms[]' < /usr/etc/ublue-recipe.yml) -for pkg in $(echo -e "$rpm_packages"); do \ - echo "Installing: ${pkg}" && \ - rpm-ostree install $pkg; \ -done -echo "---" +get_yaml_array install_rpms '.rpms[]' +if [[ ${#install_rpms[@]} -gt 0 ]]; then + echo "-- Installing RPMs defined in recipe.yml --" + for pkg in "${install_rpms[@]}"; do + echo "Installing: ${pkg}" + rpm-ostree install $pkg + done + echo "---" +fi # Install yafti to install flatpaks on first boot, https://github.com/ublue-os/yafti. pip install --prefix=/usr yafti -# Add a package group for yafti using the packages defined in recipe.yml. -flatpaks=$(yq '.flatpaks[]' < /tmp/ublue-recipe.yml) -# Only try to add package groups if some flatpaks are defined in the recipe. -if [[ -n "$flatpaks" ]]; then +# Add a new yafti "package group" called Custom, for the packages defined in recipe.yml. +# Only adds the package group if some flatpaks are defined in the recipe. +get_yaml_array flatpaks '.flatpaks[]' +if [[ ${#flatpaks[@]} -gt 0 ]]; then + echo "-- yafti: Adding Flatpaks defined in recipe.yml --" yq -i '.screens.applications.values.groups.Custom.description = "Flatpaks defined by the image maintainer"' /usr/etc/yafti.yml yq -i '.screens.applications.values.groups.Custom.default = true' /usr/etc/yafti.yml - for pkg in $(echo -e "$flatpaks"); do \ + for pkg in "${flatpaks[@]}"; do + echo "Adding to yafti: ${pkg}" yq -i ".screens.applications.values.groups.Custom.packages += [{\"$pkg\": \"$pkg\"}]" /usr/etc/yafti.yml done -fi \ No newline at end of file + echo "---" +fi