From f05e9be3c1dfce6ceaaecd3949160e2e5e8db0b8 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Mon, 29 Apr 2019 17:15:01 +0200 Subject: [PATCH 1/4] cleanup initialisation - Pmodules/bash: contains now only the 'module()' function, some sanity checks and initialization of bash completion plus unsetting some unused variables. - Pmodules/libstd.bash: bug fixed in std::append_path if path includes spaces - Pmodules/modulecmd.bash.in: (re-)initialize if 'PMODULES_ENV' is empty or unset --- Pmodules/bash | 144 +++++++------------------------------ Pmodules/libstd.bash | 43 ++++++++--- Pmodules/modulecmd.bash.in | 74 ++++++++++++++----- 3 files changed, 119 insertions(+), 142 deletions(-) diff --git a/Pmodules/bash b/Pmodules/bash index 976cd75..893730f 100644 --- a/Pmodules/bash +++ b/Pmodules/bash @@ -8,8 +8,34 @@ if [ ${BASH_VERSINFO:-0} -lt 3 ]; then return 1 fi +############################################################################ +# some sanity checks +# +if [[ ! -d ${PMODULES_ROOT} ]]; then + echo "Oops: ${PMODULES_ROOT}: Set as Pmodules root, but this is not a directory." 1>&2 + return 1 +fi +if [[ ! -d ${PMODULES_HOME} ]]; then + echo "Oops: ${PMODULES_HOME}: Set as Pmodules home, but this is not a directory." 1>&2 + return 1 +fi + ############################################################################# -# implement module comand as function +# initialize bash completion +# +if [[ -r "${PMODULES_HOME}/init/bash_completion" ]]; then + source "${PMODULES_HOME}/init/bash_completion" +fi + +############################################################################# +# legacy... +# +unset MODULE_VERSION +unset MODULE_VERSION_STACK +unset MODULESHOME + +############################################################################# +# implement module comand as shell function # module() { unset BASH_ENV @@ -56,122 +82,6 @@ module() { } export -f module -############################################################################# -# helper functions -# -std::append_path () { - local -r P="$1" - local -r d="$2" - - if ! echo ${!P} | egrep -q "(^|:)${d}($|:)" ; then - if [[ -z ${!P} ]]; then - eval $P=\"${d}\" - else - eval $P=\"${!P}:${d}\" - fi - fi -} - -# -# Replace or remove a directory in a path variable. -# -# To remove a dir: -# std::replace_path PATH -# -# To replace a dir: -# std::replace_path PATH /replacement/path -# -# Args: -# $1 name of the shell variable to set (e.g. PATH) -# $2 a grep pattern identifying the element to be removed/replaced -# $3 the replacement string (use "" for removal) -# -# Based on solution published here: -# https://stackoverflow.com/questions/273909/how-do-i-manipulate-path-elements-in-shell-scripts -# -std::replace_path () { - local -r path="$1" - local -r removepat="$2" - local -r replacestr="$3" - - local -r removestr=$(echo "${!path}" | tr ":" "\n" | grep -m 1 "^$removepat\$") - export $path="$(echo "${!path}" | tr ":" "\n" | sed "s:^${removestr}\$:${replacestr}:" | - sed '/^\s*$/d' | tr "\n" ":" | sed -e 's|^:||' -e 's|:$||')" -} - -save_env() { - local s='' - while (( $# > 0 )); do - s+="$( typeset -p $1 );" - shift - done - echo export PMODULES_ENV=$( "${PMODULES_HOME}/sbin/base64" --wrap=0 <<< "$s" ) -} - -############################################################################ -# some sanity checks -# -if [[ ! -d ${PMODULES_ROOT} ]]; then - echo "Oops: ${PMODULES_ROOT}: Set as Pmodules root, but this is not a directory." 1>&2 - return 1 -fi -if [[ ! -d ${PMODULES_HOME} ]]; then - echo "Oops: ${PMODULES_HOME}: Set as Pmodules home, but this is not a directory." 1>&2 - return 1 -fi - -############################################################################# -# setup environment -# -declare -x LOADEDMODULES='' -declare -x _LMFILES_='' -declare -x MODULEPATH='' -for group in ${PMODULES_DEFAULT_GROUPS//:/ }; do - std::append_path MODULEPATH "${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" -done -declare -x UsedReleases='' -for r in ${PMODULES_DEFAULT_RELEASES//:/ }; do - std::append_path UsedReleases "${r}" -done - -eval $(save_env UsedReleases PMODULES_DEFAULT_RELEASES PMODULES_DEFAULT_GROUPS PMODULES_DEFINED_RELEASES) -unset UsedReleases -unset PMODULES_DEFAULT_RELEASES -unset PMODULES_DEFAULT_GROUPS -unset PMODULES_DEFINED_RELEASES - -std::replace_path PATH "${PMODULES_HOME%/*}/.*" -std::replace_path MANPATH "${PMODULES_HOME%/*}/.*" -std::append_path PATH "${PMODULES_HOME}/bin" - -if [[ -r /etc/man.config ]]; then - declare _manconf='/etc/man.config' -elif [[ -r /etc/man.conf ]]; then - declare _manconf='/etc/man.conf' -fi -if [[ -n ${_manconf} ]]; then - while read name value rest; do - std::append_path MANPATH "${value}" - done < <(grep "^MANPATH\s" "${_manconf}") - unset _manconf -else - std::append_path MANPATH "${PMODULES_HOME}/share/man" - std::append_path MANPATH "/usr/share/man" -fi - -############################################################################# -# initialize bash completion -# -if [[ -r "${PMODULES_HOME}/init/bash_completion" ]]; then - source "${PMODULES_HOME}/init/bash_completion" -fi - -############################################################################# -# legacy... -# -unset MODULE_VERSION -unset MODULE_VERSION_STACK -unset MODULESHOME # Local Variables: # mode: sh diff --git a/Pmodules/libstd.bash b/Pmodules/libstd.bash index 1773f17..ad7f0e6 100644 --- a/Pmodules/libstd.bash +++ b/Pmodules/libstd.bash @@ -67,16 +67,16 @@ std::get_abspath() { } std::append_path () { - local -r P=$1 - local -r d=$2 + local -r P="$1" + local -r d="$2" if ! echo ${!P} | egrep -q "(^|:)${d}($|:)" ; then - if [[ -z ${!P} ]]; then - eval $P=${d} - else - eval $P=${!P}:${d} - fi - fi + if [[ -z ${!P} ]]; then + eval $P=\"${d}\" + else + eval $P=\"${!P}:${d}\" + fi + fi } std::prepend_path () { @@ -105,6 +105,33 @@ std::remove_path() { eval ${P}="${new_path:1}" } +# +# Replace or remove a directory in a path variable. +# +# To remove a dir: +# std::replace_path PATH +# +# To replace a dir: +# std::replace_path PATH /replacement/path +# +# Args: +# $1 name of the shell variable to set (e.g. PATH) +# $2 a grep pattern identifying the element to be removed/replaced +# $3 the replacement string (use "" for removal) +# +# Based on solution published here: +# https://stackoverflow.com/questions/273909/how-do-i-manipulate-path-elements-in-shell-scripts +# +std::replace_path () { + local -r path="$1" + local -r removepat="$2" + local -r replacestr="$3" + + local -r removestr=$(echo "${!path}" | tr ":" "\n" | grep -m 1 "^$removepat\$") + export $path="$(echo "${!path}" | tr ":" "\n" | sed "s:^${removestr}\$:${replacestr}:" | + sed '/^\s*$/d' | tr "\n" ":" | sed -e 's|^:||' -e 's|:$||')" +} + # # split file name # diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 3605424..290d7af 100755 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -1378,19 +1378,39 @@ subcommand_refresh() { subcommand_generic0 refresh "$@" } +reset_modulepath() { + MODULEPATH='' + local group + local root="${PMODULES_ROOT}" + for group in ${PMODULES_DEFAULT_GROUPS}; do + local dir="${root}/${group}/${PMODULES_MODULEFILES_DIR}" + [[ -d "${dir}" ]] && std::prepend_path MODULEPATH "${dir}" + done +} + +reset_used_groups() { + PMODULES_USED_GROUPS='' + local group + for group in ${PMODULES_DEFAULT_GROUPS}; do + std::append_path PMODULES_USED_GROUPS "${group}" + done +} + +reset_used_releases() { + declare -g UsedReleases='' + for r in ${PMODULES_DEFAULT_RELEASES//:/ }; do + std::append_path UsedReleases "${r}" + done +} + ############################################################################## # # purge # subcommand_purge() { subcommand_generic0 purge "$@" - PMODULES_USED_GROUPS='' - MODULEPATH='' - - for group in ${PMODULES_DEFAULT_GROUPS}; do - std::append_path MODULEPATH "${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" - std::append_path PMODULES_USED_GROUPS "${group}" - done + reset_modulepath + reset_used_groups pbuild::export_env ${g_shell} MODULEPATH PMODULES_USED_GROUPS } @@ -1428,25 +1448,45 @@ subcommand_list() { "${modulecmd}" "${g_shell}" list "${opts[@]}" } +init_path() { + std::replace_path PATH "${PMODULES_HOME%/*}/.*" + std::append_path PATH "${PMODULES_HOME}/bin" +} + +init_manpath() { + std::replace_path MANPATH "${PMODULES_HOME%/*}/.*" + + if [[ -r /etc/man.config ]]; then + declare _manconf='/etc/man.config' + elif [[ -r /etc/man.conf ]]; then + declare _manconf='/etc/man.conf' + fi + if [[ -n ${_manconf} ]]; then + while read name value rest; do + std::append_path MANPATH "${value}" + done < <(grep "^MANPATH\s" "${_manconf}") + unset _manconf + else + std::append_path MANPATH "${PMODULES_HOME}/share/man" + std::append_path MANPATH "/usr/share/man" + fi +} + ############################################################################## pmodules_init() { declare -g LOADEDMODULES='' + declare -g _LMFILES_='' declare -g PMODULES_USED_GROUPS='' declare -g MODULEPATH='' - declare -g _LMFILES_='' - for group in ${PMODULES_DEFAULT_GROUPS}; do - std::append_path MODULEPATH "${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" - std::append_path PMODULES_USED_GROUPS "${group}" - done declare -ag Groups='()' declare -Ag GroupDepths='()' - declare -g UsedReleases='' declare -g UseFlags=() - for r in ${PMODULES_DEFAULT_RELEASES//:/ }; do - std::append_path UsedReleases "${r}" - done - + reset_modulepath + reset_used_groups + reset_used_releases + init_path + init_manpath } ############################################################################## From 6ad8cd07cd98836310a7faf54e506fd2d5932c54 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Mon, 29 Apr 2019 17:53:54 +0200 Subject: [PATCH 2/4] more cleanup - PMODULES_USED_GROUPS renamed to UsedGroups, now saved to PMODULES_ENV - fixes in exporting variables --- Pmodules/libmodules.tcl | 10 ++++----- Pmodules/modulecmd.bash.in | 44 +++++++++++++++++++++++--------------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/Pmodules/libmodules.tcl b/Pmodules/libmodules.tcl index d929a7b..1174be5 100644 --- a/Pmodules/libmodules.tcl +++ b/Pmodules/libmodules.tcl @@ -42,9 +42,9 @@ proc module-addgroup { group } { debug "mode is load" prepend-path MODULEPATH $::PmodulesRoot/$group/$::PmodulesModulfilesDir/$Implementation - prepend-path PMODULES_USED_GROUPS $group + prepend-path UsedGroups $group debug "mode=load: new MODULEPATH=$env(MODULEPATH)" - debug "mode=load: new PMODULES_USED_GROUPS=$env(PMODULES_USED_GROUPS)" + debug "mode=load: new UsedGroups=$env(UsedGroups)" } elseif { [module-info mode remove] } { set GROUP [string toupper $group] debug "remove hierarchical group '${GROUP}'" @@ -66,13 +66,13 @@ proc module-addgroup { group } { } debug "mode=remove: $env(MODULEPATH)" remove-path MODULEPATH $::PmodulesRoot/$group/$::PmodulesModulfilesDir/$Implementation - debug "mode=remove: $env(PMODULES_USED_GROUPS)" - remove-path PMODULES_USED_GROUPS $group + debug "mode=remove: $env(UsedGroups)" + remove-path UsedGroups $group } if { [module-info mode switch2] } { debug "mode=switch2" append-path MODULEPATH $::PmodulesRoot/$group/$::PmodulesModulfilesDir/[module-info name] - append-path PMODULES_USED_GROUPS ${group} + append-path UsedGroups ${group} } } diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 290d7af..360dd09 100755 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -77,7 +77,7 @@ pbuild::save_env() { pbuild::export_env ${shell} PMODULES_ENV } -trap 'pbuild::save_env ${g_shell} Groups GroupDepths UsedReleases UseFlags PMODULES_DEFAULT_GROUPS PMODULES_DEFINED_RELEASES PMODULES_DEFAULT_RELEASES' EXIT +trap 'pbuild::save_env ${g_shell} Groups GroupDepths UsedReleases UseFlags UsedGroups PMODULES_DEFAULT_GROUPS PMODULES_DEFINED_RELEASES PMODULES_DEFAULT_RELEASES' EXIT print_version() { echo " @@ -493,7 +493,7 @@ is_group () { } is_used_group() { - [[ :${PMODULES_USED_GROUPS}: =~ :$1: ]] + [[ :${UsedGroups}: =~ :$1: ]] } module_is_loaded() { @@ -1176,7 +1176,7 @@ subcommand_use() { local f local r std::info "Used groups:\n" - for f in ${PMODULES_USED_GROUPS//:/ }; do + for f in ${UsedGroups//:/ }; do std::info "\t${f}\n" done std::info "\nUnused groups:\n" @@ -1219,7 +1219,7 @@ subcommand_use() { } use () { - declare -g PMODULES_USED_GROUPS + declare -g UsedGroups declare -g MODULEPATH local dirs_to_add=() @@ -1252,7 +1252,7 @@ subcommand_use() { std::die 3 "%s %s: cannot add group to module path -- %s\n" \ "${CMD}" "${FUNCNAME[0]##*_}" "${arg}" fi - std::append_path PMODULES_USED_GROUPS "${arg}" + std::append_path UsedGroups "${arg}" dirs_to_add+=( ${modulefiles_dir} ) elif [[ ${arg} =~ ^${PMODULES_ROOT} ]]; then std::die 3 "%s %s: illegal directory -- %s\n" \ @@ -1273,7 +1273,7 @@ subcommand_use() { std::prepend_path MODULEPATH "${dir}" fi done - pbuild::export_env ${g_shell} MODULEPATH PMODULES_USED_GROUPS + pbuild::export_env ${g_shell} MODULEPATH UsedGroups } local opts=() @@ -1339,7 +1339,7 @@ subcommand_unuse() { std::die 3 "%s %s: cannot remove group from module path -- %s\n" \ "${CMD}" "${FUNCNAME[0]##*_}" "${arg}" fi - std::remove_path PMODULES_USED_GROUPS "${arg}" + std::remove_path UsedGroups "${arg}" dirs_to_remove+=( ${modulefiles_dir} ) elif [[ -d ${arg} ]]; then local normalized_dir=$(cd "${arg}" && pwd) @@ -1354,8 +1354,8 @@ subcommand_unuse() { shift done - declare -g PMODULES_USED_GROUPS - pbuild::export_env ${g_shell} PMODULES_USED_GROUPS + declare -g UsedGroups + pbuild::export_env ${g_shell} UsedGroups [[ ${#dirs_to_remove[@]} == 0 ]] && return for dir in "${dirs_to_remove[@]}"; do subcommand_generic1 unuse "${dir}" @@ -1389,10 +1389,10 @@ reset_modulepath() { } reset_used_groups() { - PMODULES_USED_GROUPS='' + UsedGroups='' local group for group in ${PMODULES_DEFAULT_GROUPS}; do - std::append_path PMODULES_USED_GROUPS "${group}" + std::append_path UsedGroups "${group}" done } @@ -1411,7 +1411,7 @@ subcommand_purge() { subcommand_generic0 purge "$@" reset_modulepath reset_used_groups - pbuild::export_env ${g_shell} MODULEPATH PMODULES_USED_GROUPS + pbuild::export_env ${g_shell} MODULEPATH UsedGroups } ############################################################################## @@ -1472,12 +1472,17 @@ init_manpath() { fi } +export LOADEDMODULES +export _LMFILES_ +export UsedGroups +export MODULEPATH + ############################################################################## pmodules_init() { - declare -g LOADEDMODULES='' - declare -g _LMFILES_='' - declare -g PMODULES_USED_GROUPS='' - declare -g MODULEPATH='' + declare -gx LOADEDMODULES='' + declare -gx _LMFILES_='' + declare -gx UsedGroups='' + declare -gx MODULEPATH='' declare -ag Groups='()' declare -Ag GroupDepths='()' @@ -1487,6 +1492,11 @@ pmodules_init() { reset_used_releases init_path init_manpath + pbuild::export_env "${g_shell}" \ + LOADEDMODULES \ + _LMFILES_ \ + MODULEPATH \ + PATH } ############################################################################## @@ -1510,7 +1520,7 @@ subcommand_clear() { esac done pmodules_init - pbuild::export_env ${g_shell} LOADEDMODULES PMODULES_USED_GROUPS MODULEPATH _LMFILES_ + pbuild::export_env ${g_shell} LOADEDMODULES MODULEPATH _LMFILES_ } ############################################################################## From 07a643c742bf17376c2871defddf6371d2f503c2 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Tue, 30 Apr 2019 11:30:32 +0200 Subject: [PATCH 3/4] review and cleanup - libmodules.tcl: rename implementation to variant, fixes in file name joining - modulecmd.bash.in: get available groups from 'GroupDepths'. There is no need to use a dedicated variable for housekeeping available groups. --- Pmodules/libmodules.tcl | 29 ++++++++----- Pmodules/modulecmd.bash.in | 83 +++++++++----------------------------- 2 files changed, 40 insertions(+), 72 deletions(-) diff --git a/Pmodules/libmodules.tcl b/Pmodules/libmodules.tcl index 1174be5..38f4b55 100644 --- a/Pmodules/libmodules.tcl +++ b/Pmodules/libmodules.tcl @@ -28,7 +28,6 @@ proc module-addgroup { group } { global version debug "called with arg $group" - set Implementation [file join {*}$::implementation] set GROUP [string toupper $group] regsub -- "-" ${GROUP} "_" GROUP @@ -41,7 +40,11 @@ proc module-addgroup { group } { if { [module-info mode load] } { debug "mode is load" - prepend-path MODULEPATH $::PmodulesRoot/$group/$::PmodulesModulfilesDir/$Implementation + prepend-path MODULEPATH [file join \ + $::PmodulesRoot \ + $group \ + $::PmodulesModulfilesDir \ + {*}$::variant] prepend-path UsedGroups $group debug "mode=load: new MODULEPATH=$env(MODULEPATH)" debug "mode=load: new UsedGroups=$env(UsedGroups)" @@ -65,13 +68,21 @@ proc module-addgroup { group } { debug "no orphan modules to unload" } debug "mode=remove: $env(MODULEPATH)" - remove-path MODULEPATH $::PmodulesRoot/$group/$::PmodulesModulfilesDir/$Implementation + remove-path MODULEPATH [file join \ + $::PmodulesRoot \ + $group \ + $::PmodulesModulfilesDir \ + {*}$::variant] debug "mode=remove: $env(UsedGroups)" remove-path UsedGroups $group } if { [module-info mode switch2] } { debug "mode=switch2" - append-path MODULEPATH $::PmodulesRoot/$group/$::PmodulesModulfilesDir/[module-info name] + append-path MODULEPATH [file join \ + $::PmodulesRoot \ + $group \ + $::PmodulesModulfilesDir \ + [module-info name]] append-path UsedGroups ${group} } } @@ -304,7 +315,7 @@ proc _pmodules_init_global_vars { } { global V_RELEASE global V_PKG - global implementation + global variant global PREFIX # prefix of package debug "$::ModulesCurrentModulefile" @@ -314,7 +325,8 @@ proc _pmodules_init_global_vars { } { set pmodules_root [file split $::PmodulesRoot] set pmodules_root_num_dirs [llength $pmodules_root] - set modulefile_root [file join {*}[lrange $modulefile 0 [expr $pmodules_root_num_dirs - 1]]] + set modulefile_root [file join {*}[lrange $modulefile 0 \ + [expr $pmodules_root_num_dirs - 1]]] if { $::PmodulesRoot != $modulefile_root } { debug "stop sourcing: ${::PmodulesRoot} != $modulefile_root" return @@ -330,11 +342,10 @@ proc _pmodules_init_global_vars { } { lassign [split $V -] V_PKG tmp set V_RELEASE [lindex [split $tmp _] 0] lassign [split $V_PKG .] V_MAJOR V_MINOR V_PATCHLVL - set implementation [lrange $rel_modulefile 2 end] - set prefix "$pmodules_root $group [lreverse_n $implementation 2]" + set variant [lrange $rel_modulefile 2 end] + set prefix "$pmodules_root $group [lreverse_n $variant 2]" set PREFIX [file join {*}$prefix] - debug "PREFIX=$PREFIX" debug "group of module $name: $group" } diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 360dd09..5c79405 100755 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -37,7 +37,6 @@ declare verbosity_lvl=${PMODULES_VERBOSITY:-'verbose'} shopt -s nullglob -declare -a Groups='()' declare -A GroupDepths='()' declare current_modulefile='' declare g_shell='' @@ -77,7 +76,7 @@ pbuild::save_env() { pbuild::export_env ${shell} PMODULES_ENV } -trap 'pbuild::save_env ${g_shell} Groups GroupDepths UsedReleases UseFlags UsedGroups PMODULES_DEFAULT_GROUPS PMODULES_DEFINED_RELEASES PMODULES_DEFAULT_RELEASES' EXIT +trap 'pbuild::save_env ${g_shell} GroupDepths UsedReleases UseFlags UsedGroups PMODULES_DEFAULT_GROUPS PMODULES_DEFINED_RELEASES PMODULES_DEFAULT_RELEASES' EXIT print_version() { echo " @@ -485,11 +484,7 @@ is_group () { [[ -n ${group} ]] && [[ -n ${GroupDepths[${group}]} ]] && return 0 # not yet cached or not a group - if [[ -d "${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" ]]; then - Groups+=( "${group}" ) - get_group_depths "${PMODULES_ROOT}" "${group}" - fi - return 1 + get_group_depths "${PMODULES_ROOT}" "${group}" } is_used_group() { @@ -1077,28 +1072,14 @@ subcommand_avail() { done } -# get available groups -# $1: root of modulefile hierarchy -# -get_groups () { - local -r root="$1" - { - cd "${root}" - # for some unknown reason [A-Z]* doesn't work on (some?) SL6 systems - for f in [ABCDEFGHIJKLMNOPQRSTUVWXYZ]*; do - Groups+=( $f ) - done - }; -} - # compute depths or passed group # Note: cwd must be Pmodules root directory # $1: group # -get_group_depth2 () { +get_group_depth () { local -r group="$1" local -r dir="${group}/${PMODULES_MODULEFILES_DIR}" - test -d "${dir}" || return 0 + test -d "${dir}" || return 1 local tmp=$(find "${dir}" -depth -type f -o -type l 2>/dev/null| head -1) local -a tmp2=( ${tmp//\// } ) local depth=${#tmp2[@]} @@ -1110,20 +1091,6 @@ get_group_depth2 () { GroupDepths[$group]=${depth} } -# compute depths or passed group -# $1: root -# $2: group -# -get_group_depth () { - local -r root="$1" - local -r group="$2" - - { - cd "${root}" - get_group_depth2 "${group}" - } -} - # # Compute depth for all known groups # $1: root of modulefile hierarchy @@ -1132,8 +1099,8 @@ get_group_depths () { { cd "${root}" local group - for group in "${Groups[@]}"; do - get_group_depth2 "${group}" + for group in [ABCDEFGHIJKLMNOPQRSTUVWXYZ]*; do + get_group_depth "${group}" done }; } @@ -1152,8 +1119,7 @@ rescan_groups() { # for some unknown reason [A-Z]* doesn't work with some bash versions for group in [ABCDEFGHIJKLMNOPQRSTUVWXYZ]*; do if [[ -z "${GroupDepths[${group}]}" ]]; then - Groups+=( "${group}" ) - get_group_depth2 "${group}" + get_group_depth "${group}" fi done }; @@ -1163,8 +1129,7 @@ rescan_groups() { # use [-a|--append|-p|--prepend] [directory|group|release...] # subcommand_use() { - if (( ${#Groups[@]} == 0 )); then - get_groups "${PMODULES_ROOT}" + if (( ${#GroupDepths[@]} == 0 )); then get_group_depths "${PMODULES_ROOT}" fi local saved_IFS=${IFS}; @@ -1181,7 +1146,7 @@ subcommand_use() { done std::info "\nUnused groups:\n" local _group - for _group in "${Groups[@]}"; do + for _group in "${!GroupDepths[@]}"; do local -i depth=${GroupDepths[${_group}]} if ! is_used_group "${_group}" && (( depth == 0 )); then std::info "\t${_group}\n" @@ -1243,11 +1208,6 @@ subcommand_use() { elif [[ "${arg}" =~ "flag=" ]]; then std::append_path UseFlags "${arg/flag=}" elif [[ ! ${arg} =~ */* ]] && [[ -d ${modulefiles_dir} ]]; then - if [[ -z "${GroupDepths[$arg]}" ]]; then - # not yet cached group - Groups+=( "${arg}" ) - get_group_depth "${PMODULES_ROOT}" "${arg}" - fi if (( ${GroupDepths[$arg]} != 0 )); then std::die 3 "%s %s: cannot add group to module path -- %s\n" \ "${CMD}" "${FUNCNAME[0]##*_}" "${arg}" @@ -1472,10 +1432,10 @@ init_manpath() { fi } -export LOADEDMODULES -export _LMFILES_ -export UsedGroups -export MODULEPATH +#export LOADEDMODULES +#export _LMFILES_ +#export UsedGroups +#export MODULEPATH ############################################################################## pmodules_init() { @@ -1484,7 +1444,6 @@ pmodules_init() { declare -gx UsedGroups='' declare -gx MODULEPATH='' - declare -ag Groups='()' declare -Ag GroupDepths='()' declare -g UseFlags=() reset_modulepath @@ -1594,14 +1553,14 @@ subcommand_search() { # write results to a temporary file for later processing local -r tmpfile=$( "${mktemp}" /tmp/Pmodules.XXXXXX ) \ || std::die 1 "Oops: unable to create tmp file!\n" - local _group + local group # loop over all groups - for _group in "${Groups[@]}"; do + for group in "${!GroupDepths[@]}"; do # loop over all directories which can be added to # MODULEPATH inside current group - local depth=${GroupDepths[${_group}]} + local depth=${GroupDepths[${group}]} local mpaths=( $(find \ - "${src_prefix}/${_group}/modulefiles" \ + "${src_prefix}/${group}/modulefiles" \ -type d \ -mindepth ${depth} -maxdepth ${depth} \ 2>/dev/null)) @@ -1627,7 +1586,7 @@ subcommand_search() { [[ ${#mods[@]} == 0 ]] && continue for (( i=0; i<${#mods[@]}; i+=2 )); do printf "${fmt}" ${mods[i]} "${mods[i+1]}" \ - ${_group} "${requires}" >> "${tmpfile}" + ${group} "${requires}" >> "${tmpfile}" done done done @@ -1707,8 +1666,7 @@ subcommand_search() { modules+=( '' ) fi - if (( ${#Groups[@]} == 0 )) || [[ ${src_prefix} != ${PMODULES_ROOT} ]]; then - get_groups "${src_prefix}" + if (( ${#GroupDepths[@]} == 0 )) || [[ ${src_prefix} != ${PMODULES_ROOT} ]]; then get_group_depths "${src_prefix}" fi @@ -1912,8 +1870,7 @@ if [[ -z "${subcommand}" ]]; then std::die 1 "${CMD}: no sub-command specified.\n" fi -if (( ${#Groups[@]} == 0 )); then - get_groups "${PMODULES_ROOT}" +if (( ${#GroupDepths[@]} == 0 )); then get_group_depths "${PMODULES_ROOT}" fi From 251c0bad772cec252f938c4e15ad5b49c3a71b7e Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Tue, 30 Apr 2019 13:17:56 +0200 Subject: [PATCH 4/4] cleanup --- Pmodules/modulecmd.bash.in | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 5c79405..dd163d4 100755 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -1432,11 +1432,6 @@ init_manpath() { fi } -#export LOADEDMODULES -#export _LMFILES_ -#export UsedGroups -#export MODULEPATH - ############################################################################## pmodules_init() { declare -gx LOADEDMODULES=''