Introduce 'module-info loaded' modulefile command

Add 'loaded' sub-command to the 'module-info' modulefile Tcl command.
This new sub-command returns name of the modules currently loaded
corresponding to the name passed as argument. May return multiple
modules if passed name matches more than one loaded modules.

Document new command in modulefile.4 and test it with a 285-info-loaded
tests in 50-cmds suite.

Acknowledgment: this development has been made and funded within the
framework of the PRACE Fifth Implementation Phase (PRACE-5IP) project
(http://www.prace-ri.eu/). PRACE-5IP receives funding from the EU's
Horizon 2020 research and innovation programme (2014-2020) under grant
agreement no. 730913.
This commit is contained in:
Xavier Delaruelle
2017-11-30 09:22:12 +01:00
parent ab5b446a03
commit 2dcd8da58d
5 changed files with 217 additions and 69 deletions

View File

@@ -317,6 +317,13 @@ the *modulefile* is being loaded.
*modulefile* with name and version, another symbolic *modulefile* name
or a *modulefile* alias.
**module-info loaded** modulefile
Returns the names of currently loaded modules matching passed *modulefile*.
The parameter *modulefile* might either be a full qualified *modulefile*
with name and version or just a directory which in case all loaded
*modulefiles* from the directory will be returned.
**module-version** modulefile version-name...
Assigns the symbolic *version-name* to the *modulefile*. This command

View File

@@ -926,6 +926,10 @@ proc module-info {what {more {}}} {
lassign [getModuleNameVersion $more 1] mod
return [resolveModuleVersionOrAlias $mod]
}
{loaded} {
lassign [getModuleNameVersion $more 1] mod
return [getLoadedMatchingName $mod "returnall"]
}
default {
error "module-info $what not supported"
return {}
@@ -2626,16 +2630,25 @@ proc getLoadedWithClosestName {name} {
# return the currently loaded module whose name is equal or include the name
# passed as argument. if no loaded module match, an empty string is returned.
proc getLoadedMatchingName {name} {
set ret ""
proc getLoadedMatchingName {name {behavior "returnlast"}} {
set ret {}
set retmax 0
set namesplit [split $name "/"]
# compare name to each currently loaded module name, if multiple mod
# match name, the last loaded module will be returned
# match name:
foreach mod [getLoadedModuleList] {
if {[string first "$name/" "$mod/"] == 0} {
set ret $mod
switch -- $behavior {
{returnlast} {
# the last loaded module will be returned
set ret $mod
}
{returnall} {
# all loaded modules will be returned
lappend ret $mod
}
}
}
}

View File

@@ -0,0 +1,30 @@
#%Module1.0
##############################################################################
# Modules Revision 3.0
# Providing a flexible user environment
#
# File: info/%M%
# Revision: %I%
# First Edition: 2017/11/30
# Last Mod.: %U%, %G%
#
# Authors: Xavier Delaruelle, xavier.delaruelle@cea.fr
#
# Description: Testuite modulefile
# Command:
# Sub-Command: setenv, module-info loaded
#
# Invocation: load @M@/@V@
# Result: %R{
# }R%
# Comment: %C{
# The 'module-info loaded name' command retrieves loaded version
# of the given module 'name'
# }C%
#
##############################################################################
setenv testsuite1 "[module-info loaded info/name]"
setenv testsuite2 "[module-info loaded info]"
setenv testsuite3 "[module-info loaded inf]"

View File

@@ -0,0 +1,98 @@
##############################################################################
# Modules Revision 3.0
# Providing a flexible user environment
#
# File: modules.50-cmds/%M%
# Revision: %I%
# First Edition: 2017/11/30
# Last Mod.: %U%, %G%
#
# Authors: Xavier Delaruelle, xavier.delaruelle@cea.fr
#
# Description: Testuite testsequence
# Command: load
# Modulefiles: info/loaded, info/name, info/type
# Sub-Command:
#
# Comment: %C{
# Tests the 'module-info loaded' modulefile subcommand
# }C%
#
##############################################################################
set module "info/loaded"
set modulefile "$modpath/$module"
set module1 "info/name"
set modulefile1 "$modpath/$module1"
set module2 "info/type"
set modulefile2 "$modpath/$module2"
#
# The tests
#
lappend ans [list set testsuite1 ""]
lappend ans [list set testsuite2 ""]
lappend ans [list set testsuite3 ""]
lappend ans [list setpath LOADEDMODULES $module]
lappend ans [list setpath _LMFILES_ $modulefile]
testouterr_cmd "sh" "load $module" $ans ""
if { $verbose > 0 } {
send_user "\tSetup LOADEDMODULES = '$module1'\n"
send_user "\tSetup _LMFILES_ = '$modulefile1'\n"
}
set env(LOADEDMODULES) $module1
set env(_LMFILES_) $modulefile1
set ans [list]
lappend ans [list set testsuite1 "$module1"]
lappend ans [list set testsuite2 "$module1"]
lappend ans [list set testsuite3 ""]
lappend ans [list setpath LOADEDMODULES "$module1:$module"]
lappend ans [list setpath _LMFILES_ "$modulefile1:$modulefile"]
testouterr_cmd_re "sh" "load $module" $ans ""
if { $verbose > 0 } {
send_user "\tSetup LOADEDMODULES = '$module1:$module2'\n"
send_user "\tSetup _LMFILES_ = '$modulefile1:$modulefile2'\n"
}
set env(LOADEDMODULES) "$module1:$module2"
set env(_LMFILES_) "$modulefile1:$modulefile2"
set ans [list]
lappend ans [list set testsuite1 "$module1"]
lappend ans [list set testsuite2 "$module1 $module2"]
lappend ans [list set testsuite3 ""]
lappend ans [list setpath LOADEDMODULES "$module1:$module2:$module"]
lappend ans [list setpath _LMFILES_ "$modulefile1:$modulefile2:$modulefile"]
testouterr_cmd_re "sh" "load $module" $ans ""
#
# Cleanup
#
# Clean up the environment
if { $verbose > 0 } {
send_user "\tUnset LOADEDMODULES\n"
send_user "\tUnset _LMFILES_\n"
}
unset env(LOADEDMODULES)
unset env(_LMFILES_)
unset ans
unset modulefile
unset module
unset modulefile1
unset module1
unset modulefile2
unset module2

View File

@@ -37,71 +37,71 @@ 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/type loc_rc7/0.9 log/err_file symlink2/2.0
alias/2.0 info/user loc_rc7/1(@) log/err_syslog system/2.0
append/0.1 info/userexp loc_rc7/1.2 modbad/append-path test/1.0
append/0.2 inforc/1.0 loc_rc7/bar(@) modbad/autoinit test/1.2
append/1.0 inforc/2.0(avail:bar:default) loc_rc8/0.9(@) modbad/foo test/2.0
append/1.1 inforc/foo(@) loc_rc8/1.0 modbad/help tr2_loc(trreg)
append/2.0 load/00 loc_sym/1.0 modbad/is-avail tr2_loc/al1(tr2unstable:@)
append/2.1 load/10 loc_sym/alias1 modbad/is-loaded tr2_loc/al2(tr2bar:@)
append/2.2 load/11 loc_sym/alias2 modbad/is-saved tr2_loc/al3(default:tr2exp:trreg:@)
averssort/1(@) load/12 loc_sym/alias3 modbad/is-used tr2_loc/al4(@)
averssort/1.2.4(@) load/13 loc_sym/alias4 modbad/path tr2_loc/al5(default:trreg:@)
averssort/1.10(@) load/14 loc_sym/alias5 modbad/paths tr_loc/al1(tr2unstable:trunstable:@)
bad/after(good) load/15 loc_sym/alias6 modbad/prepend-path tr_loc/al2(default:tr2bar:tr2exp:trbar:trreg:@)
bad/before load/16 loc_sym/alias7 modbad/remove-path tr_loc/al3(trexp:@)
bad2/body load/17 loc_sym/exec1 module/2.0 tr_loc/al4(@)
bad2/proc load/18 loc_sym/exec2 module/bad tr_loc/al5(@)
break/1.0 load/19 loc_sym/getvers1 module/err trace/all_off
break/2.0 load/20 loc_sym/getvers2 module/lbad trace/all_on
break/3.0 load/21 loc_sym/getvers3 module/lerr uname/domain
break/4.0 load/22 loc_sym/getvers4 module/lunk uname/machine
break/5.0 load/23 loc_sym/getvers5 module/meta uname/nodename
break/6.0 load/24 loc_sym/getvers6 module/unk uname/release
chdir/1.0 load/25 loc_sym/getvers7 prepend/0.1 uname/sysname
chdir/2.0 load/26 loc_sym/getvers8 prepend/0.2 uname/version
chdir/3.0 load/27 loc_sym/versinf1 prepend/1.0 unsetenv/0.8
chdir/4.0 load/28 loc_sym/versinf2 prepend/1.1 unsetenv/0.9
coll/a load/29 loc_sym/versinf3 prepend/2.0 unsetenv/1.0
coll/b load/30 loc_sym/versinf4 prepend/2.1 use/1.0(default)
coll/c load/all(default) loc_sym/versinf5 prepend/2.2 use/2.0
coll/d loc_def/default loc_sym/versinf6 prereq/full use/2.1
conflict/full loc_def/truedef loc_sym/versinf7 prereq/module use/2.2
conflict/module loc_dv1/1.0 loc_sym/version1 prereq/orlist use/3.0
continue/1.0 loc_dv1/2.0 loc_sym/version2 puts/1 use/3.1
continue/2.0 loc_dv2/1.0(default) loc_sym/version3 puts/2 use/3.2
continue/3.0 loc_dv2/2.0 loc_sym/version4 puts/3 use/4.0
continue/4.0 loc_dv3/1.0 loc_sym/version5 puts/4 user/adv
continue/5.0 loc_dv3/2.0 loc_sym/version6 puts/5 user/advanced
continue/6.0 loc_dv4/1.0 loc_sym/version7 puts/6 user/exp
dirmodalias(@) loc_dv6/1.0 loc_sym/version8 recurs/modA user/expert
dirmodalias/1.0 loc_dv6/2.0/1.0 loc_sym/version9 recurs/modB user/nov
empty/1.0 loc_dv7/1.0 loc_sym/version10 remove/1.0 user/novice
eschars/1.0 loc_dv7/2.0(default) loc_sym/version11 remove/2.0 user/undef
exit/1.0 loc_dv7/2.0/1.0 loc_sym/version12 setenv/0.8 verbose/msg
exit/2.0 loc_dv7/3.0 loc_sym/version13 setenv/1.0 verbose/off
exit/3.0 loc_dv8/1.0 loc_sym/version14 spread/1.0 verbose/on
exit/4.0 loc_dv8/2.0 loc_sym/version15 spread/2.0 verbose/undef
getenv/1.0 loc_dv9/1.0(default) loc_sym/version16 spread/3.0 versions/1.1
help/2.0 loc_dv9/2.0 loc_sym/version17 spread/4.0 versions/1.2
info/command loc_fq/1.0 loc_sym/version18 spread/5.0 versions/1.3
info/commandexp loc_rc1/1.0(foo) loc_sym/version19 spread/6.0 verssort/1
info/isavail loc_rc1/2.0 loc_sym/version20 spread/7.0 verssort/1.2.1
info/isloaded loc_rc2/1.0(bar:blah:foo) loc_sym/version21 spread/8.0 verssort/1.2.4
info/issaved loc_rc2/2.0 loc_sym/version22 spreadrc/dir1/1.0 verssort/1.8-2015-12-01
info/isused loc_rc3/1.0(default) loc_sym/version23 spreadrc/dir2/1.0 verssort/1.8-2016-02-01
info/mode1 loc_rc3/2.0(cur:stable) loc_tr(reg) spreadrc/dir3/1.0 verssort/1.10
info/mode2 loc_rc3/3.0(chk:exp:new:test) loc_tr/1.0(cur:stable) spreadrc/dir4/1.0 whatis/lines
info/mode3 loc_rc4/1.0 loc_tr/2.0(next:tr2unstable:trunstable:unstable) spreadrc/dir5/1.0 whatis/multiple
info/mode4 loc_rc4/2.0(default) loc_tr/3.0(bar:default:exp:foo:reg:tr2bar:tr2exp:trbar:trexp:trreg) spreadrc/dir6/1.0 whatis/none
info/mode5 loc_rc4/3.0 loc_tr/al1(unstable:@) spreadrc/dir7/1.0 whatis/single
info/mode6 loc_rc5/1.0 loc_tr/al2(bar:default:exp:reg:trexp:@) spreadrc/dir8/1.0 whatis/string
info/name loc_rc5/2.0 loc_tr/al3(default:exp:reg:@) symlink/0.9 x-resource/1
info/others loc_rc6/0.9 loc_tr/al4(default:reg:@) symlink/1(@)
info/shells loc_rc6/1(@) log/badfac symlink/1.2(default:new)
info/shellsexp loc_rc6/1.2(default:new) log/err_both_1 symlink/bar(@)
info/specified(foo) loc_rc6/bar(@) log/err_both_2 symlink2/1.0 "
alias/1.0 info/specified(foo) loc_rc6/bar(@) log/err_both_2 symlink2/1.0
alias/2.0 info/type loc_rc7/0.9 log/err_file symlink2/2.0
append/0.1 info/user loc_rc7/1(@) log/err_syslog system/2.0
append/0.2 info/userexp loc_rc7/1.2 modbad/append-path test/1.0
append/1.0 inforc/1.0 loc_rc7/bar(@) modbad/autoinit test/1.2
append/1.1 inforc/2.0(avail:bar:default) loc_rc8/0.9(@) modbad/foo test/2.0
append/2.0 inforc/foo(@) loc_rc8/1.0 modbad/help tr2_loc(trreg)
append/2.1 load/00 loc_sym/1.0 modbad/is-avail tr2_loc/al1(tr2unstable:@)
append/2.2 load/10 loc_sym/alias1 modbad/is-loaded tr2_loc/al2(tr2bar:@)
averssort/1(@) load/11 loc_sym/alias2 modbad/is-saved tr2_loc/al3(default:tr2exp:trreg:@)
averssort/1.2.4(@) load/12 loc_sym/alias3 modbad/is-used tr2_loc/al4(@)
averssort/1.10(@) load/13 loc_sym/alias4 modbad/path tr2_loc/al5(default:trreg:@)
bad/after(good) load/14 loc_sym/alias5 modbad/paths tr_loc/al1(tr2unstable:trunstable:@)
bad/before load/15 loc_sym/alias6 modbad/prepend-path tr_loc/al2(default:tr2bar:tr2exp:trbar:trreg:@)
bad2/body load/16 loc_sym/alias7 modbad/remove-path tr_loc/al3(trexp:@)
bad2/proc load/17 loc_sym/exec1 module/2.0 tr_loc/al4(@)
break/1.0 load/18 loc_sym/exec2 module/bad tr_loc/al5(@)
break/2.0 load/19 loc_sym/getvers1 module/err trace/all_off
break/3.0 load/20 loc_sym/getvers2 module/lbad trace/all_on
break/4.0 load/21 loc_sym/getvers3 module/lerr uname/domain
break/5.0 load/22 loc_sym/getvers4 module/lunk uname/machine
break/6.0 load/23 loc_sym/getvers5 module/meta uname/nodename
chdir/1.0 load/24 loc_sym/getvers6 module/unk uname/release
chdir/2.0 load/25 loc_sym/getvers7 prepend/0.1 uname/sysname
chdir/3.0 load/26 loc_sym/getvers8 prepend/0.2 uname/version
chdir/4.0 load/27 loc_sym/versinf1 prepend/1.0 unsetenv/0.8
coll/a load/28 loc_sym/versinf2 prepend/1.1 unsetenv/0.9
coll/b load/29 loc_sym/versinf3 prepend/2.0 unsetenv/1.0
coll/c load/30 loc_sym/versinf4 prepend/2.1 use/1.0(default)
coll/d load/all(default) loc_sym/versinf5 prepend/2.2 use/2.0
conflict/full loc_def/default loc_sym/versinf6 prereq/full use/2.1
conflict/module loc_def/truedef loc_sym/versinf7 prereq/module use/2.2
continue/1.0 loc_dv1/1.0 loc_sym/version1 prereq/orlist use/3.0
continue/2.0 loc_dv1/2.0 loc_sym/version2 puts/1 use/3.1
continue/3.0 loc_dv2/1.0(default) loc_sym/version3 puts/2 use/3.2
continue/4.0 loc_dv2/2.0 loc_sym/version4 puts/3 use/4.0
continue/5.0 loc_dv3/1.0 loc_sym/version5 puts/4 user/adv
continue/6.0 loc_dv3/2.0 loc_sym/version6 puts/5 user/advanced
dirmodalias(@) loc_dv4/1.0 loc_sym/version7 puts/6 user/exp
dirmodalias/1.0 loc_dv6/1.0 loc_sym/version8 recurs/modA user/expert
empty/1.0 loc_dv6/2.0/1.0 loc_sym/version9 recurs/modB user/nov
eschars/1.0 loc_dv7/1.0 loc_sym/version10 remove/1.0 user/novice
exit/1.0 loc_dv7/2.0(default) loc_sym/version11 remove/2.0 user/undef
exit/2.0 loc_dv7/2.0/1.0 loc_sym/version12 setenv/0.8 verbose/msg
exit/3.0 loc_dv7/3.0 loc_sym/version13 setenv/1.0 verbose/off
exit/4.0 loc_dv8/1.0 loc_sym/version14 spread/1.0 verbose/on
getenv/1.0 loc_dv8/2.0 loc_sym/version15 spread/2.0 verbose/undef
help/2.0 loc_dv9/1.0(default) loc_sym/version16 spread/3.0 versions/1.1
info/command loc_dv9/2.0 loc_sym/version17 spread/4.0 versions/1.2
info/commandexp loc_fq/1.0 loc_sym/version18 spread/5.0 versions/1.3
info/isavail loc_rc1/1.0(foo) loc_sym/version19 spread/6.0 verssort/1
info/isloaded loc_rc1/2.0 loc_sym/version20 spread/7.0 verssort/1.2.1
info/issaved loc_rc2/1.0(bar:blah:foo) loc_sym/version21 spread/8.0 verssort/1.2.4
info/isused loc_rc2/2.0 loc_sym/version22 spreadrc/dir1/1.0 verssort/1.8-2015-12-01
info/loaded loc_rc3/1.0(default) loc_sym/version23 spreadrc/dir2/1.0 verssort/1.8-2016-02-01
info/mode1 loc_rc3/2.0(cur:stable) loc_tr(reg) spreadrc/dir3/1.0 verssort/1.10
info/mode2 loc_rc3/3.0(chk:exp:new:test) loc_tr/1.0(cur:stable) spreadrc/dir4/1.0 whatis/lines
info/mode3 loc_rc4/1.0 loc_tr/2.0(next:tr2unstable:trunstable:unstable) spreadrc/dir5/1.0 whatis/multiple
info/mode4 loc_rc4/2.0(default) loc_tr/3.0(bar:default:exp:foo:reg:tr2bar:tr2exp:trbar:trexp:trreg) spreadrc/dir6/1.0 whatis/none
info/mode5 loc_rc4/3.0 loc_tr/al1(unstable:@) spreadrc/dir7/1.0 whatis/single
info/mode6 loc_rc5/1.0 loc_tr/al2(bar:default:exp:reg:trexp:@) spreadrc/dir8/1.0 whatis/string
info/name loc_rc5/2.0 loc_tr/al3(default:exp:reg:@) symlink/0.9 x-resource/1
info/others loc_rc6/0.9 loc_tr/al4(default:reg:@) symlink/1(@)
info/shells loc_rc6/1(@) log/badfac symlink/1.2(default:new)
info/shellsexp loc_rc6/1.2(default:new) log/err_both_1 symlink/bar(@) "
#
# test