docker-php-extension-installer/scripts/update-readme

219 lines
7.0 KiB
Bash
Executable File

#!/bin/sh
set -o errexit
set -o nounset
SCRIPTS_DIR="$(CDPATH= cd -- "$(dirname -- "${0}")" && pwd)"
ROOT_DIR="$(dirname -- "${SCRIPTS_DIR}")"
DATA_DIR="${ROOT_DIR}/data"
. "${SCRIPTS_DIR}/common"
# Get the list of PHP extensions from the data file
#
# Arguments:
# $1: the path to the data file
#
# Output:
# the list of PHP extensions
getExtensionList () {
getExtensionList_extensions=''
IFS='
'
for getExtensionList_line in $(cat -- "${1}" | sort); do
getExtensionList_extension=''
IFS=' '
for getExtensionList_chunk in ${getExtensionList_line}; do
if test -z "${getExtensionList_extensions}"; then
getExtensionList_extensions="${getExtensionList_chunk}"
else
getExtensionList_extensions="${getExtensionList_extensions} ${getExtensionList_chunk}"
fi
break
done
done
printf '%s' "${getExtensionList_extensions}"
}
# Get the list of PHP versions from the data file
#
# Arguments:
# $1: the path to the data file
#
# Output:
# the list of PHP versions
getVersionList () {
getVersionList_versions=''
IFS='
'
for getVersionList_line in $(cat -- "${1}" | sort); do
getVersionList_extension=''
IFS=' '
for getVersionList_chunk in ${getVersionList_line}; do
if test -z "${getVersionList_extension}"; then
getVersionList_extension="${getVersionList_chunk}"
elif test -z "${getVersionList_versions}"; then
getVersionList_versions="${getVersionList_chunk}"
elif ! stringInList "${getVersionList_chunk}" "${getVersionList_versions}"; then
getVersionList_versions="${getVersionList_versions} ${getVersionList_chunk}"
fi
done
done
sortVersionList "${getVersionList_versions}"
}
# Sort the list of PHP versions
#
# Arguments:
# $1: the list of PHP versions
#
# Output:
# the sorted list of PHP versions
sortVersionList () {
sortVersionList_list=''
IFS='
'
for sortVersionList_version in $(printf '%s' "${1}" | tr ' ' '\n' | sort -t '.' -k 1,1n -k 2,2n -k 3,3n); do
if test -z "${sortVersionList_list}"; then
sortVersionList_list="${sortVersionList_version}"
else
sortVersionList_list="${sortVersionList_list} ${sortVersionList_version}"
fi
done
printf '%s' "${sortVersionList_list}"
}
# Generate the markdown table with the supported PHP extensions
#
# Arguments:
# $1: the path to the data file
#
# Output:
# the markdown table
generateExtensionsTable () {
generateExtensionsTable_data=$(cat "${1}")
generateExtensionsTable_extensions="$(getExtensionList "${1}")"
generateExtensionsTable_versions="$(getVersionList "${1}")"
printf '| Extension |'
IFS=' '
for generateExtensionsTable_version in ${generateExtensionsTable_versions}; do
printf ' PHP %s |' "${generateExtensionsTable_version}"
done
printf '\n'
printf '|:---:|'
for generateExtensionsTable_version in ${generateExtensionsTable_versions}; do
printf -- ':---:|'
done
printf '\n'
IFS=' '
for generateExtensionsTable_extension in ${generateExtensionsTable_extensions}; do
printf '| %s |' "${generateExtensionsTable_extension}"
IFS=' '
for generateExtensionsTable_version in ${generateExtensionsTable_versions}; do
printf ' '
generateExtensionsTable_versionOk=''
IFS='
'
for generateExtensionsTable_dataLine in ${generateExtensionsTable_data}; do
if stringInList "${generateExtensionsTable_extension}" "${generateExtensionsTable_dataLine}"; then
if stringInList "${generateExtensionsTable_version}" "${generateExtensionsTable_dataLine}"; then
generateExtensionsTable_versionOk='y'
fi
break
fi
done
if test -n "${generateExtensionsTable_versionOk}"; then
printf 'V'
fi
printf ' |'
done
printf '\n'
done
}
# Generate the markdown table with the special requirements for the PHP extensions
#
# Arguments:
# $1: the path to the data file
#
# Output:
# the markdown table
generateSpecialRequirementsTable () {
generateSpecialRequirementsTable_started=''
IFS='
'
for generateSpecialRequirementsTable_line in $(cat -- "${1}" | sort); do
if test -z "${generateSpecialRequirementsTable_started}"; then
printf '| Extension | Requirements |\n'
printf '|:---:|:---:|\n'
generateSpecialRequirementsTable_started='y'
fi
resetIFS
generateSpecialRequirementsTable_requirement="$(echo "${generateSpecialRequirementsTable_line}" | sed -E 's/^\s*\w+\s+//')"
case "${generateSpecialRequirementsTable_requirement}" in
zts)
generateSpecialRequirementsTable_requirement='Requires images with PHP compiled with thread-safety enabled (`zts`).'
;;
esac
printf '| %s | %s |\n' \
"$(echo "${generateSpecialRequirementsTable_line}" | awk '{print $1;}')" \
"${generateSpecialRequirementsTable_requirement}"
done
}
# Generate the contents of README.md
#
# Arguments:
# $1: the path to the README file
# $2: the path to the extensions data file
# $3: the path to the special requirements data file
#
# Output:
# the markdown table
generateReadme () {
generateReadme_ph_ExtensionsStart='<!-- START OF EXTENSIONS TABLE -->'
generateReadme_ph_ExtensionsEnd='<!-- END OF EXTENSIONS TABLE -->'
generateReadme_ph_SpecialStart='<!-- START OF SPECIAL REQUIREMENTS -->'
generateReadme_ph_SpecialEnd='<!-- END OF SPECIAL REQUIREMENTS -->'
generateReadme_skip=''
while IFS= read -r generateReadme_line; do
if test "${generateReadme_line}" = "${generateReadme_ph_ExtensionsEnd}" || test "${generateReadme_line}" = "${generateReadme_ph_SpecialEnd}"; then
generateReadme_skip=''
fi
if test -z "${generateReadme_skip}"; then
printf '%s\n' "${generateReadme_line}"
fi
if test "${generateReadme_line}" = "${generateReadme_ph_ExtensionsStart}"; then
generateReadme_skip='y'
printf '<!-- ########################################################### -->\n'
printf '<!-- # # -->\n'
printf '<!-- # DO NOT EDIT THIS TABLE: IT IS GENERATED AUTOMATICALLY # -->\n'
printf '<!-- # # -->\n'
printf '<!-- # EDIT THE data/supported-extensions FILE INSTEAD # -->\n'
printf '<!-- # # -->\n'
printf '<!-- ########################################################### -->\n'
generateExtensionsTable "${2}"
elif test "${generateReadme_line}" = "${generateReadme_ph_SpecialStart}"; then
generateReadme_skip='y'
printf '<!-- ########################################################### -->\n'
printf '<!-- # # -->\n'
printf '<!-- # DO NOT EDIT THIS TABLE: IT IS GENERATED AUTOMATICALLY # -->\n'
printf '<!-- # # -->\n'
printf '<!-- # EDIT THE data/special-requirements FILE INSTEAD # -->\n'
printf '<!-- # # -->\n'
printf '<!-- ########################################################### -->\n'
generateSpecialRequirementsTable "${3}"
fi
done < "${1}"
printf '%s' "${generateReadme_line}"
}
NEW_README="$(generateReadme "${ROOT_DIR}/README.md" "${DATA_DIR}/supported-extensions" "${DATA_DIR}/special-requirements")"
printf '%s\n' "${NEW_README}" > "${ROOT_DIR}/README.md"