From 854a6dc3fcf1e6e4fe25d3550c2ec9ca4d5c680e Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 16 Dec 2021 18:51:19 +0100 Subject: [PATCH] libpmodules.bash: functions added The following function have been added: - get_overlay_info() - get_available_overlays() --- Pmodules/libpmodules.bash.in | 106 +++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/Pmodules/libpmodules.bash.in b/Pmodules/libpmodules.bash.in index 4e35b8a..deacae3 100644 --- a/Pmodules/libpmodules.bash.in +++ b/Pmodules/libpmodules.bash.in @@ -59,6 +59,112 @@ scan_groups () { done } +get_overlay_info(){ + # Args: + # $1 [in] overlay name or directory plus optional type + # $2 [upvar] overlay name + # $2 [upvar] overlay type + # $3 [upvar] overlay root directory + # $4 [upvar] overlay prefix for software installation + # + local name_or_dir="${1%:*}" + [[ -d ${name_or_dir} ]] && name_or_dir=$(cd "${name_or_dir}" && pwd -L) + + local config_files=() + if [[ -v PMODULES_OVERLAYS_CONF ]]; then + config_files+=("${PMODULES_OVERLAYS_CONF}") + fi + config_files+=("${HOME}/.Pmodules/overlays.conf") + config_files+=("${PMODULES_ROOT}/config/overlays.conf") + + for config_file in "${config_files[@]}"; do + [[ -r "${config_file}" ]] || continue + local toks=() + local -i lino=0 + while read -a toks; do + (( lino+=1 )) + [[ -n "${toks[0]}" ]] || continue + [[ ${toks[0]} == \#* ]] && continue + (( ${#toks[@]} < 2 )) && \ + std::warn "%s - %s" \ + "Skipping malformed line ${lino} in configuration file" \ + "${config_file}" + local _name="${toks[0]%:*}" + if [[ "${toks[0]%:*}" == "${name_or_dir}" ]] \ + || [[ "${toks[1]}" == "${name_or_dir}" ]]; then + # take type from + # 1. $1 + # 2. configuration file + # 3. use default type + local _type="${ol_normal}" + if [[ "$1" == *:* ]]; then + _type="${1##*:}" + elif [[ "${toks[0]}" == *:* ]]; then + _type="${toks[0]##*:}" + fi + [[ -n "$2" ]] && std::upvar "$2" "${toks[0]%:*}" + [[ -n "$3" ]] && std::upvar "$3" "${_type}" + [[ -n "$4" ]] && std::upvar "$4" "${toks[1]}" + if [[ -n "$5" ]]; then + if [[ -n "${toks[2]}" ]]; then + std::upvar "$5" "${toks[2]}" + else + std::upvar "$5" "${toks[1]}" + fi + fi + return 0 + fi + done < "${config_file}" + done + return 1 +} + +get_available_overlays(){ + # Args: + # $1 [upvar] result + # + local name_or_dir="${1%:*}" + [[ -d ${name_or_dir} ]] && name_or_dir=$(cd "${name_or_dir}" && pwd -L) + + local config_files=() + if [[ -v PMODULES_OVERLAYS_CONF ]]; then + config_files+=("${PMODULES_OVERLAYS_CONF}") + fi + config_files+=("${HOME}/.Pmodules/overlays.conf") + config_files+=("${PMODULES_ROOT}/config/overlays.conf") + + local -a result=() + for config_file in "${config_files[@]}"; do + [[ -r "${config_file}" ]] || continue + local toks=() + local -i lino=0 + while read -a toks; do + (( lino++ )) + [[ -n "${toks[0]}" ]] || continue + [[ ${toks[0]} == \#* ]] && continue + (( ${#toks[@]} < 2 )) && \ + std::warn "%s - %s" \ + "Skipping malformed line ${lino} in configuration file" \ + "${config_file}" + local _name="${toks[0]%:*}" + # take type from + # 1. $1 + # 2. configuration file + # 3. use default type + local _type="${ol_normal}" + if [[ "$1" == *:* ]]; then + _type="${1##*:}" + elif [[ "${toks[0]}" == *:* ]]; then + _type="${toks[0]##*:}" + fi + local _ol_dir="${toks[1]}" + local _ol_install_dir="${toks[2]}" + _ol_install_dir="${_ol_install_dir:-${toks[1]}}" + result+=( "${_name} ${_type} ${_ol_dir} ${_ol_install_dir}") + done < "${config_file}" + done + std::upvar "$1" "${result[@]}" +} # Local Variables: # mode: sh # sh-basic-offset: 8