diff --git a/doc/source/modulefile.rst b/doc/source/modulefile.rst index 705390a7..44d6a3c5 100644 --- a/doc/source/modulefile.rst +++ b/doc/source/modulefile.rst @@ -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 diff --git a/modulecmd.tcl.in b/modulecmd.tcl.in index 21c8a307..72e1938c 100755 --- a/modulecmd.tcl.in +++ b/modulecmd.tcl.in @@ -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 + } + } } } diff --git a/testsuite/modulefiles/info/loaded b/testsuite/modulefiles/info/loaded new file mode 100644 index 00000000..3e30e4de --- /dev/null +++ b/testsuite/modulefiles/info/loaded @@ -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]" diff --git a/testsuite/modules.50-cmds/285-info-loaded.exp b/testsuite/modules.50-cmds/285-info-loaded.exp new file mode 100644 index 00000000..c10389db --- /dev/null +++ b/testsuite/modules.50-cmds/285-info-loaded.exp @@ -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 diff --git a/testsuite/modules.90-avail/070-full.exp b/testsuite/modules.90-avail/070-full.exp index 964930ec..70515ace 100644 --- a/testsuite/modules.90-avail/070-full.exp +++ b/testsuite/modules.90-avail/070-full.exp @@ -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