diff --git a/modulecmd.tcl.in b/modulecmd.tcl.in index f1e42a77..e9c9681d 100755 --- a/modulecmd.tcl.in +++ b/modulecmd.tcl.in @@ -482,10 +482,9 @@ proc unset-env {var} { proc execute-modulefile {modfile {must_have_cookie 1}} { global g_debug g_inhibit_interp g_inhibit_errreport g_inhibit_dispreport - global ModulesCurrentModulefile global g_modfileUntrackVars g_modfileAliases - set ModulesCurrentModulefile $modfile + pushModuleFile $modfile # skip modulefile if interpretation has been inhibited if {$g_inhibit_interp} { @@ -617,6 +616,8 @@ proc execute-modulefile {modfile {must_have_cookie 1}} { } }] + popModuleFile + reportDebug "Exiting $modfile" return $errorVal } @@ -626,12 +627,11 @@ proc execute-modulefile {modfile {must_have_cookie 1}} { proc execute-modulerc {modfile} { global g_rcfilesSourced ModulesVersion global g_debug g_inhibit_errreport g_inhibit_dispreport - global ModulesCurrentModulefile global g_modrcUntrackVars g_modrcAliases reportDebug "execute-modulerc: $modfile" - set ModulesCurrentModulefile $modfile + pushModuleFile $modfile set ModulesVersion {} # does not report commands from rc file on display mode set g_inhibit_dispreport 1 @@ -715,6 +715,8 @@ proc execute-modulerc {modfile} { # re-enable command report on display mode set g_inhibit_dispreport 0 + popModuleFile + return $g_rcfilesSourced($modfile) } @@ -829,7 +831,6 @@ proc resetInterpState {itrp dumpVarsVN dumpArrayVarsVN untrackVarsVN\ ######################################################################## # commands run from inside a module file # -set ModulesCurrentModulefile {} # Dummy procedures for commands available on C-version but not # implemented here. These dummy procedures enables support for @@ -2609,6 +2610,22 @@ proc popModuleName {} { set g_moduleNameStack [lrange $g_moduleNameStack 0 end-1] } +set g_moduleFileStack {} + +proc pushModuleFile {modfile} { + global g_moduleFileStack ModulesCurrentModulefile + + lappend g_moduleFileStack $modfile + set ModulesCurrentModulefile $modfile +} + +proc popModuleFile {} { + global g_moduleFileStack ModulesCurrentModulefile + + set g_moduleFileStack [lrange $g_moduleFileStack 0 end-1] + set ModulesCurrentModulefile [lindex $g_moduleFileStack end] +} + set g_specifiedNameStack {} proc currentSpecifiedName {} { @@ -4189,9 +4206,7 @@ proc getModules {dir {mod {}} {fetch_mtime 0} {search {}} {fetch_hidden 0}} { # push name to be found by module-alias and version pushSpecifiedName $elt pushModuleName $elt - # set is needed for execute-modulerc - set ModulesCurrentModulefile $dir/$elt - execute-modulerc $ModulesCurrentModulefile + execute-modulerc $dir/$elt popModuleName popSpecifiedName # add other entry kind to the result list @@ -4384,8 +4399,7 @@ proc getModules {dir {mod {}} {fetch_mtime 0} {search {}} {fetch_hidden 0}} { # Finds all module versions for mod in the module path dir proc listModules {dir mod {show_flags {1}} {filter {}} {search "wild"}} { - global ignoreDir ModulesCurrentModulefile - global flag_default_mf flag_default_dir show_modtimes + global ignoreDir flag_default_mf flag_default_dir show_modtimes reportDebug "listModules: get '$mod' in $dir\ (show_flags=$show_flags, filter=$filter, search=$search)" @@ -5609,7 +5623,6 @@ proc cmdModuleUnsource {args} { proc cmdModuleLoad {args} { global g_loadedModules g_force - global ModulesCurrentModulefile reportDebug "cmdModuleLoad: loading $args" @@ -5626,7 +5639,6 @@ proc cmdModuleLoad {args} { } set currentModule $modname - set ModulesCurrentModulefile $modfile if {$g_force || ! [info exists g_loadedModules($currentModule)]} { pushSpecifiedName $mod @@ -5659,7 +5671,6 @@ proc cmdModuleLoad {args} { proc cmdModuleUnload {match args} { global g_loadedModules - global ModulesCurrentModulefile reportDebug "cmdModuleUnload: unloading $args (match=$match)" @@ -5670,7 +5681,6 @@ proc cmdModuleUnload {match args} { lassign [getPathToModule $mod {} $match] modfile modname if {$modfile ne ""} { set currentModule $modname - set ModulesCurrentModulefile $modfile if {[info exists g_loadedModules($currentModule)]} { pushSpecifiedName $mod @@ -6371,6 +6381,9 @@ if {[catch { cacheCurrentModules + # no modulefile is currently being interpreted + pushModuleFile {} + # Find and execute any .modulerc file found in the module directories # defined in env(MODULESPATH) runModulerc diff --git a/testsuite/modulefiles/modvar/modfile b/testsuite/modulefiles/modvar/modfile new file mode 100644 index 00000000..c9f3cfcb --- /dev/null +++ b/testsuite/modulefiles/modvar/modfile @@ -0,0 +1,27 @@ +#%Module1.0 + +############################################################################## +# Modules Revision 3.0 +# Providing a flexible user environment +# +# File: modvar/%M% +# Revision: %I% +# First Edition: 2018/01/07 +# Last Mod.: %U%, %G% +# +# Authors: Xavier Delaruelle, xavier.delaruelle@cea.fr +# +# Description: Testuite modulefile +# Command: +# Sub-Command: +# +# Invocation: load @M@ +# Comment: %C{ +# Check the 'ModulesCurrentModulefile' variable +# }C% +# +############################################################################## + +setenv ts1 $ModulesCurrentModulefile +module load modvar/submodfile +setenv ts3 $ModulesCurrentModulefile diff --git a/testsuite/modulefiles/modvar/submodfile b/testsuite/modulefiles/modvar/submodfile new file mode 100644 index 00000000..18a0b2f2 --- /dev/null +++ b/testsuite/modulefiles/modvar/submodfile @@ -0,0 +1,25 @@ +#%Module1.0 + +############################################################################## +# Modules Revision 3.0 +# Providing a flexible user environment +# +# File: modvar/%M% +# Revision: %I% +# First Edition: 2018/01/07 +# Last Mod.: %U%, %G% +# +# Authors: Xavier Delaruelle, xavier.delaruelle@cea.fr +# +# Description: Testuite modulefile +# Command: +# Sub-Command: +# +# Invocation: load @M@ +# Comment: %C{ +# Check the 'ModulesCurrentModulefile' variable +# }C% +# +############################################################################## + +setenv ts2 $ModulesCurrentModulefile diff --git a/testsuite/modules.50-cmds/340-modvar.exp b/testsuite/modules.50-cmds/340-modvar.exp new file mode 100644 index 00000000..88005af2 --- /dev/null +++ b/testsuite/modules.50-cmds/340-modvar.exp @@ -0,0 +1,51 @@ +############################################################################## +# Modules Revision 3.0 +# Providing a flexible user environment +# +# File: modules.50-cmds/%M% +# Revision: %I% +# First Edition: 2018/01/07 +# Last Mod.: %U%, %G% +# +# Authors: Xavier Delaruelle, xavier.delaruelle@cea.fr +# +# Description: Testuite testsequence +# Command: load +# Modulefiles: modvar/modfile, modvar/submodfile +# Sub-Command: +# +# Comment: %C{ +# Tests the availability of known variables in modulefile +# interpretation context. +# }C% +# +############################################################################## + +set module1 "modvar/modfile" +set modulefile1 "$modpath/$module1" +set module2 "modvar/submodfile" +set modulefile2 "$modpath/$module2" + + +# +# The tests +# + +lappend ans [list set ts1 $modulefile1] +lappend ans [list set ts2 $modulefile2] +lappend ans [list setpath LOADEDMODULES "$module2:$module1"] +lappend ans [list setpath _LMFILES_ "$modulefile2:$modulefile1"] +lappend ans [list set ts3 $modulefile1] + +testouterr_cmd_re "sh" "load $module1" $ans "" + + +# +# Cleanup +# + +unset ans +unset modulefile1 +unset module1 +unset modulefile2 +unset module2 diff --git a/testsuite/modules.90-avail/070-full.exp b/testsuite/modules.90-avail/070-full.exp index ea25bec3..6670bd5a 100644 --- a/testsuite/modules.90-avail/070-full.exp +++ b/testsuite/modules.90-avail/070-full.exp @@ -37,80 +37,81 @@ set len [string length $modpath] set lrep [expr {($test_cols - $len - 2)/2}] set rrep [expr {$test_cols - $len - 2 - $lrep}] set ts_sh "[string repeat {-} $lrep] $modpath [string repeat {-} $rrep] -alias/1.0 info/name loc_rc8/0.9(@) modbad/prepend-path spreadrc/dir2/1.0 -alias/2.0 info/others loc_rc8/1.0 modbad/remove-path spreadrc/dir3/1.0 -append/0.1 info/shells loc_sym/1.0 module/2.0 spreadrc/dir4/1.0 -append/0.2 info/shellsexp loc_sym/alias1 module/bad spreadrc/dir5/1.0 -append/0.3 info/specified(foo) loc_sym/alias2 module/err spreadrc/dir6/1.0 -append/0.4 info/type loc_sym/alias3 module/lbad spreadrc/dir7/1.0 -append/0.5 info/user loc_sym/alias4 module/lerr spreadrc/dir8/1.0 -append/1.0 info/userexp loc_sym/alias5 module/lunk symlink/0.9 -append/1.1 inforc/1.0 loc_sym/alias6 module/meta symlink/1(@) -append/1.3 inforc/2.0(avail:bar:default) loc_sym/alias7 module/unk symlink/1.2(default:new) -append/1.4 inforc/foo(@) loc_sym/exec1 prepend/0.1 symlink/bar(@) -append/1.5 load/00 loc_sym/exec2 prepend/0.2 symlink2/1.0 -append/1.6 load/10 loc_sym/getvers1 prepend/0.3 symlink2/2.0 -append/1.7 load/11 loc_sym/getvers2 prepend/0.4 system/2.0 -append/2.0 load/12 loc_sym/getvers3 prepend/0.5 test/1.0 -append/2.1 load/13 loc_sym/getvers4 prepend/1.0 test/1.2 -append/2.2 load/14 loc_sym/getvers5 prepend/1.1 test/2.0 -append/2.3 load/15 loc_sym/getvers6 prepend/1.3 tr2_loc(trreg) -append/2.4 load/16 loc_sym/getvers7 prepend/1.4 tr2_loc/al1(tr2unstable:@) -append/4.0 load/17 loc_sym/getvers8 prepend/1.5 tr2_loc/al2(tr2bar:@) -append/4.1 load/18 loc_sym/versinf1 prepend/1.6 tr2_loc/al3(default:tr2exp:trreg:@) -averssort/1(@) load/19 loc_sym/versinf2 prepend/1.7 tr2_loc/al4(@) -averssort/1.2.4(@) load/20 loc_sym/versinf3 prepend/1.8 tr2_loc/al5(default:trreg:@) -averssort/1.10(@) load/21 loc_sym/versinf4 prepend/1.9 tr_loc/al1(tr2unstable:trunstable:@) -bad/after(good) load/22 loc_sym/versinf5 prepend/2.0 tr_loc/al2(default:tr2bar:tr2exp:trbar:trreg:@) -bad/before load/23 loc_sym/versinf6 prepend/2.1 tr_loc/al3(trexp:@) -bad2/body load/24 loc_sym/versinf7 prepend/2.2 tr_loc/al4(@) -bad2/proc load/25 loc_sym/version1 prepend/2.3 tr_loc/al5(@) -break/1.0 load/26 loc_sym/version2 prepend/2.4 trace/all_off -break/2.0 load/27 loc_sym/version3 prepend/3.0 trace/all_on -break/3.0 load/28 loc_sym/version4 prepend/3.1 uname/domain -break/4.0 load/29 loc_sym/version5 prereq/full uname/machine -break/5.0 load/30 loc_sym/version6 prereq/fullpath uname/nodename -break/6.0 load/all(default) loc_sym/version7 prereq/module uname/release -chdir/1.0 loc_def/default loc_sym/version8 prereq/orlist uname/sysname -chdir/2.0 loc_def/truedef loc_sym/version9 puts/1 uname/version -chdir/3.0 loc_dv1/1.0 loc_sym/version10 puts/2 unsetenv/0.8 -chdir/4.0 loc_dv1/2.0 loc_sym/version11 puts/3 unsetenv/0.9 -coll/a loc_dv2/1.0(default) loc_sym/version12 puts/4 unsetenv/1.0 -coll/b loc_dv2/2.0 loc_sym/version13 puts/5 use/1.0(default) -coll/c loc_dv3/1.0 loc_sym/version14 puts/6 use/2.0 -coll/d loc_dv3/2.0 loc_sym/version15 puts/7 use/2.1 -conflict/full loc_dv4/1.0 loc_sym/version16 recurs/modA use/2.2 -conflict/fullpath loc_dv6/1.0 loc_sym/version17 recurs/modB use/3.0 -conflict/module loc_dv6/2.0/1.0 loc_sym/version18 remove/0.3 use/3.1 -continue/1.0 loc_dv7/1.0 loc_sym/version19 remove/0.4 use/3.2 -continue/2.0 loc_dv7/2.0(default) loc_sym/version20 remove/0.5 use/4.0 -continue/3.0 loc_dv7/2.0/1.0 loc_sym/version21 remove/1.0 user/adv -continue/4.0 loc_dv7/3.0 loc_sym/version22 remove/1.3 user/advanced -continue/5.0 loc_dv8/1.0 loc_sym/version23 remove/1.4 user/exp -continue/6.0 loc_dv8/2.0 loc_tr(reg) remove/1.5 user/expert -dirmodalias(@) loc_dv9/1.0(default) loc_tr/1.0(cur:stable) remove/1.6 user/nov -dirmodalias/1.0 loc_dv9/2.0 loc_tr/2.0(next:tr2unstable:trunstable:unstable) remove/1.7 user/novice -empty/1.0 loc_fq/1.0 loc_tr/3.0(bar:default:exp:foo:reg:tr2bar:tr2exp:trbar:trexp:trreg) remove/2.0 user/undef -eschars/1.0 loc_rc1/1.0(foo) loc_tr/al1(unstable:@) remove/2.3 verbose/msg -exit/1.0 loc_rc1/2.0 loc_tr/al2(bar:default:exp:reg:trexp:@) remove/2.4 verbose/off -exit/2.0 loc_rc2/1.0(bar:blah:foo) loc_tr/al3(default:exp:reg:@) remove/3.0 verbose/on -exit/3.0 loc_rc2/2.0 loc_tr/al4(default:reg:@) remove/3.1 verbose/undef -exit/4.0 loc_rc3/1.0(default) log/badfac remove/4.0 versions/1.1 -getenv/1.0 loc_rc3/2.0(cur:stable) log/err_both_1 remove/4.1 versions/1.2 -help/2.0 loc_rc3/3.0(chk:exp:new:test) log/err_both_2 remove/4.2 versions/1.3 -info/command loc_rc4/1.0 log/err_file setenv/0.8 verssort/1 -info/commandexp loc_rc4/2.0(default) log/err_syslog setenv/1.0 verssort/1.2.1 -info/isavail loc_rc4/3.0 modbad/append-path source/0.9 verssort/1.2.4 -info/isloaded loc_rc5/1.0 modbad/autoinit source/1.0 verssort/1.8-2015-12-01 -info/issaved loc_rc5/2.0 modbad/foo spread/1.0 verssort/1.8-2016-02-01 -info/isused loc_rc6/0.9 modbad/help spread/2.0 verssort/1.10 -info/loaded loc_rc6/1(@) modbad/info-loaded spread/3.0 whatis/lines -info/mode1 loc_rc6/1.2(default:new) modbad/is-avail spread/4.0 whatis/multiple -info/mode2 loc_rc6/bar(@) modbad/is-loaded spread/5.0 whatis/none -info/mode3 loc_rc7/0.9 modbad/is-saved spread/6.0 whatis/single -info/mode4 loc_rc7/1(@) modbad/is-used spread/7.0 whatis/string -info/mode5 loc_rc7/1.2 modbad/path spread/8.0 x-resource/1 -info/mode6 loc_rc7/bar(@) modbad/paths spreadrc/dir1/1.0 " +alias/1.0 info/others loc_sym/1.0 module/bad spreadrc/dir4/1.0 +alias/2.0 info/shells loc_sym/alias1 module/err spreadrc/dir5/1.0 +append/0.1 info/shellsexp loc_sym/alias2 module/lbad spreadrc/dir6/1.0 +append/0.2 info/specified(foo) loc_sym/alias3 module/lerr spreadrc/dir7/1.0 +append/0.3 info/type loc_sym/alias4 module/lunk spreadrc/dir8/1.0 +append/0.4 info/user loc_sym/alias5 module/meta symlink/0.9 +append/0.5 info/userexp loc_sym/alias6 module/unk symlink/1(@) +append/1.0 inforc/1.0 loc_sym/alias7 modvar/modfile symlink/1.2(default:new) +append/1.1 inforc/2.0(avail:bar:default) loc_sym/exec1 modvar/submodfile symlink/bar(@) +append/1.3 inforc/foo(@) loc_sym/exec2 prepend/0.1 symlink2/1.0 +append/1.4 load/00 loc_sym/getvers1 prepend/0.2 symlink2/2.0 +append/1.5 load/10 loc_sym/getvers2 prepend/0.3 system/2.0 +append/1.6 load/11 loc_sym/getvers3 prepend/0.4 test/1.0 +append/1.7 load/12 loc_sym/getvers4 prepend/0.5 test/1.2 +append/2.0 load/13 loc_sym/getvers5 prepend/1.0 test/2.0 +append/2.1 load/14 loc_sym/getvers6 prepend/1.1 tr2_loc(trreg) +append/2.2 load/15 loc_sym/getvers7 prepend/1.3 tr2_loc/al1(tr2unstable:@) +append/2.3 load/16 loc_sym/getvers8 prepend/1.4 tr2_loc/al2(tr2bar:@) +append/2.4 load/17 loc_sym/versinf1 prepend/1.5 tr2_loc/al3(default:tr2exp:trreg:@) +append/4.0 load/18 loc_sym/versinf2 prepend/1.6 tr2_loc/al4(@) +append/4.1 load/19 loc_sym/versinf3 prepend/1.7 tr2_loc/al5(default:trreg:@) +averssort/1(@) load/20 loc_sym/versinf4 prepend/1.8 tr_loc/al1(tr2unstable:trunstable:@) +averssort/1.2.4(@) load/21 loc_sym/versinf5 prepend/1.9 tr_loc/al2(default:tr2bar:tr2exp:trbar:trreg:@) +averssort/1.10(@) load/22 loc_sym/versinf6 prepend/2.0 tr_loc/al3(trexp:@) +bad/after(good) load/23 loc_sym/versinf7 prepend/2.1 tr_loc/al4(@) +bad/before load/24 loc_sym/version1 prepend/2.2 tr_loc/al5(@) +bad2/body load/25 loc_sym/version2 prepend/2.3 trace/all_off +bad2/proc load/26 loc_sym/version3 prepend/2.4 trace/all_on +break/1.0 load/27 loc_sym/version4 prepend/3.0 uname/domain +break/2.0 load/28 loc_sym/version5 prepend/3.1 uname/machine +break/3.0 load/29 loc_sym/version6 prereq/full uname/nodename +break/4.0 load/30 loc_sym/version7 prereq/fullpath uname/release +break/5.0 load/all(default) loc_sym/version8 prereq/module uname/sysname +break/6.0 loc_def/default loc_sym/version9 prereq/orlist uname/version +chdir/1.0 loc_def/truedef loc_sym/version10 puts/1 unsetenv/0.8 +chdir/2.0 loc_dv1/1.0 loc_sym/version11 puts/2 unsetenv/0.9 +chdir/3.0 loc_dv1/2.0 loc_sym/version12 puts/3 unsetenv/1.0 +chdir/4.0 loc_dv2/1.0(default) loc_sym/version13 puts/4 use/1.0(default) +coll/a loc_dv2/2.0 loc_sym/version14 puts/5 use/2.0 +coll/b loc_dv3/1.0 loc_sym/version15 puts/6 use/2.1 +coll/c loc_dv3/2.0 loc_sym/version16 puts/7 use/2.2 +coll/d loc_dv4/1.0 loc_sym/version17 recurs/modA use/3.0 +conflict/full loc_dv6/1.0 loc_sym/version18 recurs/modB use/3.1 +conflict/fullpath loc_dv6/2.0/1.0 loc_sym/version19 remove/0.3 use/3.2 +conflict/module loc_dv7/1.0 loc_sym/version20 remove/0.4 use/4.0 +continue/1.0 loc_dv7/2.0(default) loc_sym/version21 remove/0.5 user/adv +continue/2.0 loc_dv7/2.0/1.0 loc_sym/version22 remove/1.0 user/advanced +continue/3.0 loc_dv7/3.0 loc_sym/version23 remove/1.3 user/exp +continue/4.0 loc_dv8/1.0 loc_tr(reg) remove/1.4 user/expert +continue/5.0 loc_dv8/2.0 loc_tr/1.0(cur:stable) remove/1.5 user/nov +continue/6.0 loc_dv9/1.0(default) loc_tr/2.0(next:tr2unstable:trunstable:unstable) remove/1.6 user/novice +dirmodalias(@) loc_dv9/2.0 loc_tr/3.0(bar:default:exp:foo:reg:tr2bar:tr2exp:trbar:trexp:trreg) remove/1.7 user/undef +dirmodalias/1.0 loc_fq/1.0 loc_tr/al1(unstable:@) remove/2.0 verbose/msg +empty/1.0 loc_rc1/1.0(foo) loc_tr/al2(bar:default:exp:reg:trexp:@) remove/2.3 verbose/off +eschars/1.0 loc_rc1/2.0 loc_tr/al3(default:exp:reg:@) remove/2.4 verbose/on +exit/1.0 loc_rc2/1.0(bar:blah:foo) loc_tr/al4(default:reg:@) remove/3.0 verbose/undef +exit/2.0 loc_rc2/2.0 log/badfac remove/3.1 versions/1.1 +exit/3.0 loc_rc3/1.0(default) log/err_both_1 remove/4.0 versions/1.2 +exit/4.0 loc_rc3/2.0(cur:stable) log/err_both_2 remove/4.1 versions/1.3 +getenv/1.0 loc_rc3/3.0(chk:exp:new:test) log/err_file remove/4.2 verssort/1 +help/2.0 loc_rc4/1.0 log/err_syslog setenv/0.8 verssort/1.2.1 +info/command loc_rc4/2.0(default) modbad/append-path setenv/1.0 verssort/1.2.4 +info/commandexp loc_rc4/3.0 modbad/autoinit source/0.9 verssort/1.8-2015-12-01 +info/isavail loc_rc5/1.0 modbad/foo source/1.0 verssort/1.8-2016-02-01 +info/isloaded loc_rc5/2.0 modbad/help spread/1.0 verssort/1.10 +info/issaved loc_rc6/0.9 modbad/info-loaded spread/2.0 whatis/lines +info/isused loc_rc6/1(@) modbad/is-avail spread/3.0 whatis/multiple +info/loaded loc_rc6/1.2(default:new) modbad/is-loaded spread/4.0 whatis/none +info/mode1 loc_rc6/bar(@) modbad/is-saved spread/5.0 whatis/single +info/mode2 loc_rc7/0.9 modbad/is-used spread/6.0 whatis/string +info/mode3 loc_rc7/1(@) modbad/path spread/7.0 x-resource/1 +info/mode4 loc_rc7/1.2 modbad/paths spread/8.0 +info/mode5 loc_rc7/bar(@) modbad/prepend-path spreadrc/dir1/1.0 +info/mode6 loc_rc8/0.9(@) modbad/remove-path spreadrc/dir2/1.0 +info/name loc_rc8/1.0 module/2.0 spreadrc/dir3/1.0 " # # test