Handle ModulesCurrentModulefile in a push/pop fashion

Refactor handling of the ModulesCurrentModulefile public global variable
to get same treatment like ModuleName with a push/pop mechanism.

Then call to the new pushModuleFile and popModuleFile procedures is
gathered in the execute-modulefile and execute-modulerc procedures to
push filename before interpretation and popping it when interpretation
is done.

Change is that ModulesCurrentModulefile is reset after interpretation,
so when this variable is queried in a master interpretation context it
is possible to know if some file is currently being interpreted or not
(value restored to the empty string).
This commit is contained in:
Xavier Delaruelle
2018-01-07 18:09:20 +01:00
parent 26502e2b04
commit 261970ce6b
5 changed files with 205 additions and 88 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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