From ab117e94fbd2d19ff54b80a7ea03309d89562f14 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 16 May 2019 14:40:17 +0200 Subject: [PATCH 1/4] better debug statements in libmodules.tcl --- Pmodules/libmodules.tcl | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Pmodules/libmodules.tcl b/Pmodules/libmodules.tcl index e898051..733cf3c 100644 --- a/Pmodules/libmodules.tcl +++ b/Pmodules/libmodules.tcl @@ -28,7 +28,8 @@ proc module-addgroup { group } { global version debug "called with arg $group" - + debug "mode=[module-info mode]" + set GROUP [string toupper $group] regsub -- "-" ${GROUP} "_" GROUP setenv ${GROUP} $name @@ -38,8 +39,6 @@ proc module-addgroup { group } { set ::${group}_version $version if { [module-info mode load] } { - debug "mode is load" - prepend-path MODULEPATH [file join \ $::PmodulesRoot \ $group \ @@ -50,22 +49,22 @@ proc module-addgroup { group } { debug "mode=load: new UsedGroups=$env(UsedGroups)" } elseif { [module-info mode remove] } { set GROUP [string toupper $group] - debug "remove hierarchical group '${GROUP}'" + debug "mode=remove: hierarchical group '${GROUP}'" if { [info exists ::env(PMODULES_LOADED_${GROUP})] } { - debug "unloading orphan modules" + debug "mode=remove: unloading orphan modules" set modules [split $env(PMODULES_LOADED_${GROUP}) ":"] foreach m ${modules} { if { ${m} == "--APPMARKER--" } { continue } if { [is-loaded ${m}] } { - debug "unloading: $m" + debug "mode=remove: unloading $m" module unload ${m} } } } else { - debug "no orphan modules to unload" + debug "mode=remove: no orphan modules to unload" } debug "mode=remove: $env(MODULEPATH)" set dir [file join \ @@ -80,7 +79,6 @@ proc module-addgroup { group } { debug "mode=remove: $env(UsedGroups)" } if { [module-info mode switch2] } { - debug "mode=switch2" set dir [file join \ $::PmodulesRoot \ $group \ @@ -89,6 +87,7 @@ proc module-addgroup { group } { if { [file isdirectory $dir] } { append-path MODULEPATH $dir } + debug "mode=switch2: new MODULEPATH=$env(MODULEPATH)" append-path UsedGroups ${group} } } From e86930feee8184f19f75129d425ba14a65229466 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 16 May 2019 16:06:26 +0200 Subject: [PATCH 2/4] simplified module() function, do NOT loop over arguments - all arguments are passed to modulemcd without being parsed/checked --- Pmodules/bash | 42 +----------------------------------------- 1 file changed, 1 insertion(+), 41 deletions(-) diff --git a/Pmodules/bash b/Pmodules/bash index 5476ca7..fa5da29 100644 --- a/Pmodules/bash +++ b/Pmodules/bash @@ -42,50 +42,10 @@ PATH="${PMODULES_HOME}/bin:$PATH" # module() { unset BASH_ENV - local -r modulecmd="${PMODULES_HOME}/bin/modulecmd" - - local -a args=() - local -a modulecmd_opts=() - local -a subcmd_opts=() - - while (( $# > 0 )); do - case $1 in - -* ) - modulecmd_opts+=( $1 ) - shift - ;; - * ) - break - ;; - esac - done - while (( $# > 0 )); do - case $1 in - -* ) - subcmd_opts+=( $1 ) - ;; - [/~a-zA-Z]* ) - args+=( $1 ) - ;; - esac - shift - done - - [[ ${#args[@]} == 0 ]] && args+=( 'help' ) - [[ ${#args[@]} == 1 ]] && args+=( '--' ) - - # Loop over all modules to load. - # Note: We have to eval here, otherwise we cannot do something like - # $ module load gcc/5.2.0 openmpi/1.8.8 hdf5/1.8.15 - local -i i=1 - for (( i=1; i < ${#args[@]}; i++ )); do - eval $( "${modulecmd}" bash "${modulecmd_opts[@]}" "${args[0]}" \ - "${subcmd_opts[@]}" "${args[i]}" ) - done + eval $("${PMODULES_HOME}/bin/modulecmd" bash "$@") } export -f module - # Local Variables: # mode: sh # sh-basic-offset: 8 From 41b6e2a26e7b63d5e5e5d5d53963681740963ce5 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 16 May 2019 16:42:05 +0200 Subject: [PATCH 3/4] cleanup in libmodules.tcl - unused procedures removed - implementation of the output of the .info file moved to modulecmd.bash - swap is now implemented in modulecmd.bash as unload followed by a load --- Pmodules/libmodules.tcl | 57 ----------------------------------------- 1 file changed, 57 deletions(-) diff --git a/Pmodules/libmodules.tcl b/Pmodules/libmodules.tcl index 733cf3c..e94b022 100644 --- a/Pmodules/libmodules.tcl +++ b/Pmodules/libmodules.tcl @@ -78,18 +78,6 @@ proc module-addgroup { group } { remove-path UsedGroups $group debug "mode=remove: $env(UsedGroups)" } - if { [module-info mode switch2] } { - set dir [file join \ - $::PmodulesRoot \ - $group \ - $::PmodulesModulfilesDir \ - [module-info name]] - if { [file isdirectory $dir] } { - append-path MODULEPATH $dir - } - debug "mode=switch2: new MODULEPATH=$env(MODULEPATH)" - append-path UsedGroups ${group} - } } proc set-family { group } { @@ -106,37 +94,6 @@ proc _pmodules_update_loaded_modules { group name version } { remove-path PMODULES_LOADED_${GROUP} "--APPMARKER--" } -# -# load dependencies, but do *not* unload dependencies -# -proc _pmodules_load_dependencies { fname } { - if { ! [ file exists ${fname} ] } { - return - } - if { ! [module-info mode load] } { - return - } - debug "load dependencies from: ${fname}" - # Slurp up the data file - set fp [open ${fname} r] - set file_data [read ${fp}] - close ${fp} - set data [split ${file_data} "\n"] - foreach line ${data} { - debug "MODULEPATH=$::env(MODULEPATH)" - set module_name [string trim $line] - if { ${module_name} == "#" || ${module_name} == "" } { - continue - } - if { [is-loaded ${module_name}] } { - debug "module already loaded: ${module_name}" - continue - } - debug "module load: ${module_name}" - module load ${module_name} - } -} - proc lreverse_n { list n } { set res {} set i [expr [llength $list] - $n] @@ -354,15 +311,6 @@ proc _pmodules_init_global_vars { } { debug "group of module $name: $group" } -proc _pmodules_output_message { fname } { - if { [ file exists "${fname}" ] } { - set fp [open "${fname}" r] - set info_text [read $fp] - close $fp - puts stderr ${info_text} - } -} - if { [info exists ::whatis] } { module-whatis "$whatis" } @@ -374,11 +322,6 @@ _pmodules_init_global_vars # conflict $name -if { [module-info mode load] } { - debug "${name}/${version}: loading ... " - _pmodules_output_message "${PREFIX}/.info" -} - _pmodules_setenv ${PREFIX} ${name} ${version} _pmodules_update_loaded_modules ${group} ${name} ${version} From 0fe304880427b2c1a6b3900e071fbf7ee1937ac4 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 16 May 2019 16:44:23 +0200 Subject: [PATCH 4/4] re-implementation of sub-command 'swap' - sub-command 'swap' is now implemented via unload/load - tmpfile variable in subcommand_load() cannot be read-only any more --- Pmodules/modulecmd.bash.in | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index f6f49c9..7d3800c 100755 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -824,11 +824,12 @@ subcommand_load() { if [[ ${current_modulefile} =~ ${PMODULES_ROOT} ]]; then # modulefile is in our hierarchy # ${prefix} was set in is_available()! + test -r "${prefix}/.info" && cat "$_" 1>&2 test -r "${prefix}/.dependencies" && load_dependencies "$_" fi - local -r tmpfile=$( "${mktemp}" /tmp/Pmodules.XXXXXX ) \ + local tmpfile=$( "${mktemp}" /tmp/Pmodules.XXXXXX ) \ || std::die 1 "Oops: unable to create tmp file!\n" - local output=$("${modulecmd}" "${shell}" ${opts} load "${current_modulefile}" 2> "${tmpfile}") + local output=$("${modulecmd}" "${shell}" ${opts} 'load' "${current_modulefile}" 2> "${tmpfile}") echo "${output}" eval "${output}" local error=$( < "${tmpfile}") @@ -884,7 +885,7 @@ subcommand_unload() { fi for arg in "${args[@]}"; do - local output=$("${modulecmd}" "${g_shell}" "${subcommand}" "${arg}") + local output=$("${modulecmd}" "${g_shell}" 'unload' "${arg}") echo "${output}" eval "${output}" done @@ -894,7 +895,36 @@ subcommand_unload() { # swap [] # subcommand_swap() { - subcommand_generic1or2 swap "$@" + local opts=() + pmodules::get_options opts -- '' "$@" || subcommand_help_${subcommand} + eval set -- "${opts[@]}" + local args=() + while (( $# > 0 )); do + case $1 in + -- ) + ;; + * ) + args+=( "$1" ) + ;; + esac + shift + done + if (( ${#args[@]} == 0 )); then + std::die 3 "%s %s: missing argument\n" \ + "${CMD}" 'unload' + elif (( ${#args[@]} > 2 )); then + std::die 3 "%s %s: too many arguments\n" \ + "${CMD}" 'unload' + fi + if (( ${#args[@]} == 1 )); then + module_to_load=${args[0]} + module_to_unload=${module_to_load%/*} + else + module_to_unload=${args[0]} + module_to_load=${args[1]} + fi + subcommand_unload "${module_to_unload}" + subcommand_load "${module_to_load}" } #