From 69aadbb3c0f51672192ecea20b5e9dfbd0ea7f37 Mon Sep 17 00:00:00 2001 From: Leonardo Fagundes Luz Serrano Date: Thu, 11 Apr 2024 22:18:20 -0300 Subject: [PATCH] Remove patch-iso-debian's xmllint pkg requirement With this change, if 'xmllint' is not available, the script will try to use python3's xml default module Other changes: - Corrected misleading logs regarding what info is extracted from the patch xmls - Added support for interchangeable requirements Test Plan: pass - Execute snippet with the changes and confirm ostree commit was properly extracted Story: 2011098 Task: 49860 Change-Id: I13c2440814de337049c0af84f20b83bf524a05ea Signed-off-by: Leonardo Fagundes Luz Serrano --- build-tools/patch-iso-debian | 48 +++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/build-tools/patch-iso-debian b/build-tools/patch-iso-debian index 93dc782e..1a7ef5bc 100755 --- a/build-tools/patch-iso-debian +++ b/build-tools/patch-iso-debian @@ -38,6 +38,18 @@ function usage() { echo "" } +function extract_ostree_commit_from_metadata_xml() { + local XML_PATH=$1 + local XPATH="//contents/ostree/commit1/commit" + + # Check if xmllint is available. Otherwise, use python's xml standard lib + if (which xmllint &>/dev/null); then + xmllint --xpath "string(${XPATH})" ${XML_PATH} + else + python3 -c "import xml.etree.ElementTree as ET ; print(ET.parse('${XML_PATH}').find('.${XPATH}').text, end='')" + fi +} + function extract_metadata() { local patchesdir=${BUILDDIR}/patches local patchfile=$1 @@ -53,11 +65,11 @@ function extract_metadata() { fi # Verify if top commit from metadata exist in ostree log - xml_base=$(xmllint --xpath "string(//contents/ostree/commit1/commit)" ${patchesdir}/${patchid}-metadata.xml) - if [[ "$ostree_log" != *"$xml_base"* ]]; then - echo "Error, xml base commit does not exist in ostree log." - echo "patch base: ${xml_base}" - echo "ostree log:" + ostree_commit=$(extract_ostree_commit_from_metadata_xml ${patchesdir}/${patchid}-metadata.xml) + if [[ "$ostree_log" != *"$ostree_commit"* ]]; then + echo "Error: Patch ${patchid} ostree commit does not exist in ISO ostree log." + echo "patch's ostree commit: ${ostree_commit}" + echo "ISO ostree log:" ostree --repo=${BUILDDIR}/ostree_repo log starlingx exit 1 fi @@ -120,13 +132,15 @@ declare MNTDIR= declare BUILDDIR= function check_requirements { + + # Declare "require reqA or reqB" as "reqA__reqB" local -a required_utils=( rsync mkisofs isohybrid implantisomd5 ostree - xmllint + xmllint__python3 ) if [ $UID -ne 0 ]; then # If running as non-root user, additional utils are required @@ -137,12 +151,24 @@ function check_requirements { fi local -i missing=0 + local reqA + local reqB for req in ${required_utils[@]}; do - which ${req} >&/dev/null - if [ $? -ne 0 ]; then - echo "Unable to find required utility: ${req}" >&2 - let missing++ + if [[ "$req" = *"__"* ]]; then + reqA="${req%__*}" # select everything before "__" + reqB="${req#*__}" # select everything after "__" + + if ! (which ${reqA} &>/dev/null) && ! (which ${reqB} &>/dev/null); then + echo "Unable to find required utility: either ${reqA} or ${reqB}" >&2 + let missing++ + fi + + else + if ! (which ${req} &>/dev/null); then + echo "Unable to find required utility: ${req}" >&2 + let missing++ + fi fi done @@ -236,7 +262,7 @@ mkdir -p ${BUILDDIR}/patches chmod -R +w ${BUILDDIR}/patches echo "Copying only the latest commit from ostree_repo..." -ostree --repo=${BUILDDIR}/ostree_repo init --mode=archive-z2 +ostree --repo=${BUILDDIR}/ostree_repo init --mode=archive-z2 ostree --repo=${BUILDDIR}/ostree_repo pull-local --depth=0 ${OSTREE_REPO} starlingx ostree --repo=${BUILDDIR}/ostree_repo summary --update echo "Updated iso ostree commit:"