diff --git a/scripts/Bootstrap/Pmodules/libpmodules.bash b/scripts/Bootstrap/Pmodules/libpmodules.bash index caadc17..9e7d27e 100644 --- a/scripts/Bootstrap/Pmodules/libpmodules.bash +++ b/scripts/Bootstrap/Pmodules/libpmodules.bash @@ -5,33 +5,63 @@ if [[ -z ${bindir} ]]; then bindir=$(cd "${bindir}"/.. && pwd)"/bin" fi -log() { +pmodules::get_options() { + "${bindir}/getopt" "$@" +} + +pmodules::check_env_vars() { + [[ -n "${PMODULES_ROOT}" ]] && + [[ -n "${PMODULES_CONFIG_DIR}" ]] && + [[ -n "${PMODULES_TEMPLATES_DIR}" ]] && + [[ -n "${PMODULES_HOME}" ]] && + [[ -n "${PMODULES_VERSION}" ]] || std::die 1 " +Error: the module environment you are going to use as source has not been +initialized properly!" +} + +pmodules::check_directories() { + local -r src_prefix="$1" + + [[ -d "${src_prefix}" ]] && + [[ -d "${src_prefix}/${PMODULES_CONFIG_DIR}" ]] && + [[ -d "${src_prefix}/${PMODULES_TEMPLATES_DIR}" ]] && + [[ -d "${src_prefix}/Tools/Pmodules/${PMODULES_VERSION}" ]] || std::die 1 " +Error: the module environment '${src_prefix}' has not been initialized properly!" +} + +pmodules::check_env() { + pmodules::check_env_vars + pmodules::check_directories "${PMODULES_ROOT}" +} + + +std::log() { local -ri fd=$1 local -r fmt="$2\n" shift 2 printf -- "$fmt" "$@" 1>&$fd } -info() { - log 2 "$1" "${@:2}" +std::info() { + std::log 2 "$1" "${@:2}" } -error() { - log 2 "$1" "${@:2}" +std::error() { + std::log 2 "$1" "${@:2}" } -debug() { +std::debug() { [[ ${PMODULES_DEBUG} ]] || return 0 - log 2 "$@" + std::log 2 "$@" } -die() { +std::die() { local -ri ec=$1 shift if [[ -n $@ ]]; then local -r fmt=$1 shift - log 2 "$fmt" "$@" + std::log 2 "$fmt" "$@" fi exit $ec } @@ -41,7 +71,7 @@ die() { # # $1: prompt # -get_YN_answer() { +std::get_YN_answer() { local -r prompt="$1" local ans read -p "${prompt}" ans @@ -56,7 +86,7 @@ get_YN_answer() { # # return normalized abolute pathname # $1: filename -get_abspath() { +std::get_abspath() { local -r fname=$1 [[ -r "${fname}" ]] || return 1 if [[ -d ${fname} ]]; then @@ -67,36 +97,7 @@ get_abspath() { fi } -get_options() { - "${bindir}/getopt" "$@" -} - -check_pmodules_env_vars() { - [[ -n "${PMODULES_ROOT}" ]] && - [[ -n "${PMODULES_CONFIG_DIR}" ]] && - [[ -n "${PMODULES_TEMPLATES_DIR}" ]] && - [[ -n "${PMODULES_HOME}" ]] && - [[ -n "${PMODULES_VERSION}" ]] || die 1 " -Error: the module environment you are going to use as source has not been -initialized properly!" -} - -check_pmodules_directories() { - local -r src_prefix="$1" - - [[ -d "${src_prefix}" ]] && - [[ -d "${src_prefix}/${PMODULES_CONFIG_DIR}" ]] && - [[ -d "${src_prefix}/${PMODULES_TEMPLATES_DIR}" ]] && - [[ -d "${src_prefix}/Tools/Pmodules/${PMODULES_VERSION}" ]] || die 1 " -Error: the module environment '${src_prefix}' has not been initialized properly!" -} - -check_pmodules_env() { - check_pmodules_env_vars - check_pmodules_directories "${PMODULES_ROOT}" -} - -append_path () { +std::append_path () { local -r P=$1 local -r d=$2 @@ -109,7 +110,7 @@ append_path () { fi } -prepend_path () { +std::prepend_path () { local -r P=$1 local -r d=$2 @@ -122,7 +123,7 @@ prepend_path () { fi } -remove_path() { +std::remove_path() { local -r P=$1 local -r d=$2 local new_path='' @@ -135,6 +136,19 @@ remove_path() { eval ${P}="${new_path:1}" } +# +# split file name +# +std::split_fname() { + local -r savedIFS="${IFS}" + IFS='/' + local std__split_fname_result__=( $(echo "${@: -1}") ) + IFS=${savedIFS} + eval $1=\(\"\${std__split_fname_result__[@]}\"\) + if (( $# >= 3 )); then + eval $2=${#std__split_fname_result__[@]} + fi +} # Local Variables: # mode: sh diff --git a/scripts/Bootstrap/Pmodules/modulecmd.bash.in b/scripts/Bootstrap/Pmodules/modulecmd.bash.in index 61367cf..918b751 100755 --- a/scripts/Bootstrap/Pmodules/modulecmd.bash.in +++ b/scripts/Bootstrap/Pmodules/modulecmd.bash.in @@ -476,7 +476,7 @@ subcommand_generic0() { local -r subcommand=$1 shift local opts='' - opts=$(get_options -- '' "$@") || subcommand_help_${subcommand} + opts=$(pmodules::get_options -- '' "$@") || subcommand_help_${subcommand} eval set -- "${opts}" while (( $# > 0 )); do case $1 in @@ -495,7 +495,7 @@ subcommand_generic1() { local -r subcommand=$1 shift local opts='' - opts=$(get_options -- '' "$@") || subcommand_help_${subcommand} + opts=$(pmodules::get_options -- '' "$@") || subcommand_help_${subcommand} eval set -- "${opts}" local args=() while (( $# > 0 )); do @@ -522,7 +522,7 @@ subcommand_generic1plus() { local -r subcommand=$1 shift local opts='' - opts=$(get_options -- '' "$@") || subcommand_help_${subcommand} + opts=$(pmodules::get_options -- '' "$@") || subcommand_help_${subcommand} eval set -- "${opts}" local args=() while (( $# > 0 )); do @@ -545,7 +545,7 @@ subcommand_generic1or2() { local -r subcommand=$1 shift local opts='' - opts=$(get_options -- '' "$@") || subcommand_help_${subcommand} + opts=$(pmodules::get_options -- '' "$@") || subcommand_help_${subcommand} eval set -- "${opts}" local args=() while (( $# > 0 )); do @@ -631,7 +631,7 @@ subcommand_load() { if [[ -f ${m} ]]; then if [[ "${m:0:1}" != "/" ]]; then # convert to absolte path if relative - m=$(get_abspath "${m}") + m=$(std::get_abspath "${m}") fi is_modulefile "${m}" || return 2 is_loadable "${m}" || return 3 @@ -683,10 +683,10 @@ subcommand_load() { for rel in "${rels[@]}"; do eval $( subcommand_use "${rel}" ) if is_available "${m}"; then - info "${m}: is ${rel}! If you want to load this module, run" - info "\tmodule use ${rel}" - info "before running" - info "\tmodule load ${m}" + std::info "${m}: is ${rel}! If you want to load this module, run" + std::info "\tmodule use ${rel}" + std::info "before running" + std::info "\tmodule load ${m}" exit 42 fi done @@ -706,22 +706,22 @@ subcommand_load() { fi n+=1 done < <(subcommand_search "${m}" -a --no-header 2>&1) - info "${CMD} load: module unavailable -- ${m}" + std::info "${CMD} load: module unavailable -- ${m}" if (( n > 0 )); then # :FIXME: output group - info "\nBut the following modules chain(s) are available in the hierarchy:" + std::info "\nBut the following modules chain(s) are available in the hierarchy:" for ((i=n-1; i >=0; i--)); do if [[ "${loadable[i]}" == "no" ]]; then - info "${output[i]}\t# ${release[i]}" + std::info "${output[i]}\t# ${release[i]}" else - info "${output[i]}" + std::info "${output[i]}" fi done fi } local opts - opts=$(get_options -o fsvw -l force -l silent -l verbose -l warn -- "$@") || \ + opts=$(pmodules::get_options -o fsvw -l force -l silent -l verbose -l warn -- "$@") || \ subcommand_help_load eval set -- "${opts}" local args=() @@ -803,12 +803,12 @@ subcommand_load() { fi if [[ -n ${release} ]]; then is_release "${release}" || die 3 "${CMD} load: illegal release name." - append_path UsedReleases "${release}" + std::append_path UsedReleases "${release}" fi fi if is_available "${m}"; then if [[ ${verbosity_lvl} != silent ]] && [[ ${release} != stable ]]; then - info "Warning: the ${release} module '${m}' has been loaded." + std::info "Warning: the ${release} module '${m}' has been loaded." fi "${modulecmd}" "${shell}" ${opts} load "${m}" else @@ -910,7 +910,7 @@ subcommand_avail() { esac printf "%-20s\t%s\n" "${mod}" "${out}" 1>&2 done - info "" + std::info "" } # @@ -930,7 +930,7 @@ subcommand_avail() { esac printf "%-20s\t%s\n" "${mod}" "${out}" 1>&2 done - info "" + std::info "" } human_readable_output() { @@ -970,7 +970,7 @@ subcommand_avail() { printf -- "\n\n" 1>&2 } local opts='' - opts=$(get_options -o hlt -l human -l long -l terse -- "$@") || subcommand_help_avail + opts=$(pmodules::get_options -o hlt -l human -l long -l terse -- "$@") || subcommand_help_avail eval set -- "${opts}" local pattern=() local output_function='' @@ -1068,42 +1068,42 @@ subcommand_use() { print_info() { local f local r - info "Used groups:" + std::info "Used groups:" for f in ${used_groups//:/ }; do - info "\t${f}" + std::info "\t${f}" done - info "\nUnused groups:" + std::info "\nUnused groups:" local _group for _group in "${Groups[@]}"; do local -i depth=${HierarchyDepths[${_group}]} if ! is_used_group "${_group}" && (( depth == 0 )); then - info "\t${_group}" + std::info "\t${_group}" fi done - info "\nUsed releases:" + std::info "\nUsed releases:" for r in ${UsedReleases//:/ }; do - info "\t${r}" + std::info "\t${r}" done - info "\nUnused releases:" + std::info "\nUnused releases:" for r in ${PMODULES_DEFINED_RELEASES//:/ }; do if ! is_used_release $r; then - info "\t${r}" + std::info "\t${r}" fi done - info "\nAdditonal directories in MODULEPATH:" + std::info "\nAdditonal directories in MODULEPATH:" let n=0 for (( i=0; i<${#modulepath[@]}; i++)); do if [[ ! ${modulepath[i]} =~ ${PMODULES_ROOT} ]]; then - info "\t${modulepath[i]}" + std::info "\t${modulepath[i]}" let n+=1 fi done if (( n == 0 )); then - info "\tnone" + std::info "\tnone" fi - info "\n" + std::info "\n" } use () { @@ -1127,12 +1127,12 @@ subcommand_use() { subcommand_switches='' elif is_release "${arg}"; then # releases are always *appended* - append_path UsedReleases "${arg}" + std::append_path UsedReleases "${arg}" elif [[ ! ${arg} =~ */* ]] && [[ -d ${modulefiles_dir} ]]; then if (( ${HierarchyDepths[$arg]} != 0 )); then die 3 "${CMD} ${0##_}: cannot add group ${arg} to module path" fi - append_path PMODULES_USED_GROUPS "${arg}" + std::append_path PMODULES_USED_GROUPS "${arg}" dirs_to_add+=( ${modulefiles_dir} ) elif [[ ${arg} =~ ^${PMODULES_ROOT} ]]; then die 3 "${CMD} ${0##_}: illegal directory: ${arg}" @@ -1157,7 +1157,7 @@ subcommand_use() { } if [[ $# == 0 ]]; then - print_info + std::print_info else use "$@" fi @@ -1168,7 +1168,7 @@ subcommand_use() { # subcommand_unuse() { local opts='' - opts=$(get_options -- '' "$@") || subcommand_help_unuse + opts=$(pmodules::get_options -- '' "$@") || subcommand_help_unuse eval set -- "${opts}" local dirs_to_remove=() while (( $# > 0)); do @@ -1187,12 +1187,12 @@ subcommand_unuse() { # ... local modulefiles_dir="${PMODULES_ROOT}/${arg}/${PMODULES_MODULEFILES_DIR}" if is_release "${arg}"; then - remove_path UsedReleases "${arg}" + std::remove_path UsedReleases "${arg}" elif [[ ! ${arg} =~ */* ]] && [[ -d ${modulefiles_dir} ]]; then if (( ${HierarchyDepths[$arg]} != 0 )); then die 3 "${CMD} ${0##_}: cannot remove group ${arg} from module path" fi - remove_path PMODULES_USED_GROUPS "${arg}" + std::remove_path PMODULES_USED_GROUPS "${arg}" dirs_to_remove+=( ${modulefiles_dir} ) elif [[ -d ${arg} ]]; then local normalized_dir=$(cd "${arg}" && pwd) @@ -1243,7 +1243,7 @@ subcommand_purge() { # subcommand_list() { local opts='' - opts=$(get_options -o hlt -l human -l long -l terse -- "$@") || subcommand_help_list + opts=$(pmodules::get_options -o hlt -l human -l long -l terse -- "$@") || subcommand_help_list eval set -- "${opts}" local opts='' while (( $# > 0 )); do @@ -1286,14 +1286,14 @@ pmodules_init() { declare -g _LMFILES_='' for group in ${PMODULES_DEFAULT_GROUPS}; do - append_path MODULEPATH "${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" - append_path PMODULES_USED_GROUPS "${group}" + std::append_path MODULEPATH "${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" + std::append_path PMODULES_USED_GROUPS "${group}" done declare -ag Groups='()' declare -Ag HierarchyDepths='()' declare -g UsedReleases='' for r in ${PMODULES_DEFAULT_RELEASES//:/ }; do - append_path UsedReleases "${r}" + std::append_path UsedReleases "${r}" done } @@ -1303,7 +1303,7 @@ pmodules_init() { # subcommand_clear() { local opts='' - opts=$(get_options -- '' "$@") || subcommand_help_${subcommand} + opts=$(pmodules::get_options -- '' "$@") || subcommand_help_${subcommand} eval set -- "${opts}" while (( $# > 0 )); do case $1 in @@ -1393,13 +1393,13 @@ subcommand_search() { out+="$d/" done out+="${line[0]}" - info "${out}" + std::info "${out}" done < <(sort -k 1,1 -k 4,4 -k 5,5 "${tmpfile}" | awk "${with_modules}") fi rm -f "${tmpfile}" } - opts=$(get_options -o 'ahH?' \ + opts=$(pmodules::get_options -o 'ahH?' \ -l help \ -l no-header \ -l print-modulefiles \ @@ -1437,7 +1437,7 @@ subcommand_search() { ;; --src ) src_prefix=$2 - check_pmodules_directories "${src_prefix}" + pmodules::check_directories "${src_prefix}" shift ;; @@ -1480,7 +1480,7 @@ subcommand_search() { # subcommand_help() { local opts='' - opts=$(get_options -- '' "$@") || usage + opts=$(pmodules::get_options -- '' "$@") || usage eval set -- "${opts}" local arg=''