"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "tcl/modeval.tcl" between
modules-5.1.1.tar.bz2 and modules-5.2.0.tar.bz2

About: The Environment Modules package provides for the dynamic modification of a user’s environment via modulefiles.

modeval.tcl  (modules-5.1.1.tar.bz2):modeval.tcl  (modules-5.2.0.tar.bz2)
skipping to change at line 170 skipping to change at line 170
} }
} }
return $modlist return $modlist
} }
# sort passed module list following both loaded and dependency orders # sort passed module list following both loaded and dependency orders
proc sortModulePerLoadedAndDepOrder {modlist {nporeq 0} {loading 0}} { proc sortModulePerLoadedAndDepOrder {modlist {nporeq 0} {loading 0}} {
# sort per loaded order # sort per loaded order
set sortlist {} set sortlist {}
if {[llength $modlist] > 0} { if {[llength $modlist] > 0} {
foreach lmmod [getLoadedModuleList] { foreach lmmod [getLoadedModulePropertyList name] {
if {$lmmod in $modlist} { if {$lmmod in $modlist} {
lappend sortlist $lmmod lappend sortlist $lmmod
} }
} }
# also sort eventual loading modules if asked # also sort eventual loading modules if asked
if {$loading} { if {$loading} {
foreach loadingmod [lreverse [getLoadingModuleList]] { foreach loadingmod [lreverse [getLoadingModuleList]] {
if {$loadingmod in $modlist} { if {$loadingmod in $modlist} {
lappend sortlist $loadingmod lappend sortlist $loadingmod
} }
skipping to change at line 195 skipping to change at line 195
# then refine sort with dependencies between loaded modules: a dependent # then refine sort with dependencies between loaded modules: a dependent
# module should be placed prior the loaded module requiring it # module should be placed prior the loaded module requiring it
set reqListVar [expr {$nporeq ? {::g_moduleNPODepend} :\ set reqListVar [expr {$nporeq ? {::g_moduleNPODepend} :\
{::g_moduleDepend}}] {::g_moduleDepend}}]
set i 0 set i 0
set imax [llength $sortlist] set imax [llength $sortlist]
while {$i < $imax} { while {$i < $imax} {
set mod [lindex $sortlist $i] set mod [lindex $sortlist $i]
set jmin $imax set jmin $imax
##nagelfar ignore #4 Suspicious variable name
if {[info exists ${reqListVar}($mod)]} { if {[info exists ${reqListVar}($mod)]} {
# goes over all dependent modules to find the first one in the loaded # goes over all dependent modules to find the first one in the loaded
# order list located after requiring mod # order list located after requiring mod
foreach lmmodlist [set ${reqListVar}($mod)] { foreach lmmodlist [set ${reqListVar}($mod)] {
foreach lmmod $lmmodlist { foreach lmmod $lmmodlist {
set j [lsearch -exact $sortlist $lmmod] set j [lsearch -exact $sortlist $lmmod]
if {$j > $i && $j < $jmin} { if {$j > $i && $j < $jmin} {
set jmin $j set jmin $j
set jminmod $lmmod set jminmod $lmmod
} }
skipping to change at line 308 skipping to change at line 309
# include or not requirements loaded after their dependent # include or not requirements loaded after their dependent
if {$nporeq} { if {$nporeq} {
set depListVar ::g_dependNPOHash set depListVar ::g_dependNPOHash
set reqListVar ::g_moduleNPODepend set reqListVar ::g_moduleNPODepend
} else { } else {
set depListVar ::g_dependHash set depListVar ::g_dependHash
set reqListVar ::g_moduleDepend set reqListVar ::g_moduleDepend
} }
##nagelfar ignore #2 Suspicious variable name
if {[info exists ${depListVar}($mod)]} { if {[info exists ${depListVar}($mod)]} {
foreach depmod [set ${depListVar}($mod)] { foreach depmod [set ${depListVar}($mod)] {
set add 1 set add 1
# skip optional dependency if only looking for strong ones # skip optional dependency if only looking for strong ones
# look at an additionally processed mod list to determine if all # look at an additionally processed mod list to determine if all
# mods from a dependent list (composed of optional parts) are part # mods from a dependent list (composed of optional parts) are part
# of the search, which means mod is not optional but strong dependent # of the search, which means mod is not optional but strong dependent
if {$strong && [llength $depmod] > 1} { if {$strong && [llength $depmod] > 1} {
##nagelfar ignore Suspicious variable name
foreach lmmodlist [set ${reqListVar}([lindex $depmod 0])] { foreach lmmodlist [set ${reqListVar}([lindex $depmod 0])] {
if {$mod in $lmmodlist} { if {$mod in $lmmodlist} {
foreach lmmod $lmmodlist { foreach lmmod $lmmodlist {
# other mod part of the opt list is not there so mod # other mod part of the opt list is not there so mod
# is considered optional # is considered optional
if {$lmmod ni $othmodlist} { if {$lmmod ni $othmodlist} {
set add 0 set add 0
break break
} }
} }
skipping to change at line 339 skipping to change at line 342
} }
if {$add} { if {$add} {
lappend deplist [lindex $depmod 0] lappend deplist [lindex $depmod 0]
} }
} }
} }
# take currently loading modules into account if asked # take currently loading modules into account if asked
if {$loading} { if {$loading} {
set modlist [getLoadedModuleList] set modlist [getLoadedModulePropertyList name]
defineModEqProc [isIcase] [getConf extended_default] 1 defineModEqProc [isIcase] [getConf extended_default] 1
# reverse list to get closest match if returning lastly loaded module # reverse list to get closest match if returning lastly loaded module
if {[getConf unload_match_order] eq {returnlast}} { if {[getConf unload_match_order] eq {returnlast}} {
set modlist [lreverse $modlist] set modlist [lreverse $modlist]
} }
foreach loadingmod [getLoadingModuleList] { foreach loadingmod [getLoadingModuleList] {
foreach prereq [getLoadedPrereq $loadingmod] { foreach prereq [getLoadedPrereq $loadingmod] {
set lmprelist {} set lmprelist {}
set moddep 0 set moddep 0
foreach modpre $prereq { foreach modpre $prereq {
skipping to change at line 537 skipping to change at line 540
} }
# manage settings to save as a stack to have a separate set of settings # manage settings to save as a stack to have a separate set of settings
# for each module loaded or unloaded in order to be able to restore the # for each module loaded or unloaded in order to be able to restore the
# correct set in case of failure # correct set in case of failure
proc pushSettings {} { proc pushSettings {} {
foreach var {env g_clearedEnvVars g_Aliases g_stateEnvVars g_stateAliases\ foreach var {env g_clearedEnvVars g_Aliases g_stateEnvVars g_stateAliases\
g_stateFunctions g_Functions g_stateCompletes g_Completes\ g_stateFunctions g_Functions g_stateCompletes g_Completes\
g_newXResources g_delXResources g_loadedModules g_loadedModuleFiles\ g_newXResources g_delXResources g_loadedModules g_loadedModuleFiles\
g_loadedModuleVariant g_loadedModuleConflict g_loadedModulePrereq\ g_loadedModuleVariant g_loadedModuleConflict g_loadedModulePrereq\
g_loadedModuleAltname g_loadedModuleAutoAltname\ g_loadedModulesRefresh g_loadedModuleAltname g_loadedModuleAutoAltname\
g_loadedModuleAliasAltname g_moduleDepend g_dependHash\ g_loadedModuleAliasAltname g_moduleDepend g_dependHash\
g_moduleNPODepend g_dependNPOHash g_prereqViolation\ g_moduleNPODepend g_dependNPOHash g_prereqViolation\
g_prereqNPOViolation g_conflictViolation g_moduleUnmetDep\ g_prereqNPOViolation g_conflictViolation g_moduleUnmetDep\
g_unmetDepHash g_moduleEval g_moduleHiddenEval} { g_unmetDepHash g_moduleEval g_moduleHiddenEval} {
##nagelfar ignore Suspicious variable name
lappend ::g_SAVE_$var [array get ::$var] lappend ::g_SAVE_$var [array get ::$var]
} }
# save non-array variable and indication if it was set # save non-array variable and indication if it was set
foreach var {g_changeDir g_stdoutPuts g_prestdoutPuts g_return_text} { foreach var {g_changeDir g_stdoutPuts g_prestdoutPuts g_return_text} {
##nagelfar ignore #4 Suspicious variable name
if {[info exists ::$var]} { if {[info exists ::$var]} {
lappend ::g_SAVE_$var [list 1 [set ::$var]] lappend ::g_SAVE_$var [list 1 [set ::$var]]
} else { } else {
lappend ::g_SAVE_$var [list 0 {}] lappend ::g_SAVE_$var [list 0 {}]
} }
} }
reportDebug "settings saved (#[getSavedSettingsStackDepth])" reportDebug "settings saved (#[getSavedSettingsStackDepth])"
} }
proc popSettings {} { proc popSettings {} {
set flushedid [getSavedSettingsStackDepth] set flushedid [getSavedSettingsStackDepth]
foreach var {env g_clearedEnvVars g_Aliases g_stateEnvVars g_stateAliases\ foreach var {env g_clearedEnvVars g_Aliases g_stateEnvVars g_stateAliases\
g_stateFunctions g_Functions g_stateCompletes g_Completes\ g_stateFunctions g_Functions g_stateCompletes g_Completes\
g_newXResources g_delXResources g_changeDir g_stdoutPuts\ g_newXResources g_delXResources g_changeDir g_stdoutPuts\
g_prestdoutPuts g_return_text g_loadedModules g_loadedModuleFiles\ g_prestdoutPuts g_return_text g_loadedModules g_loadedModuleFiles\
g_loadedModuleVariant g_loadedModuleConflict g_loadedModulePrereq\ g_loadedModuleVariant g_loadedModuleConflict g_loadedModulePrereq\
g_loadedModuleAltname g_loadedModuleAutoAltname\ g_loadedModulesRefresh g_loadedModuleAltname g_loadedModuleAutoAltname\
g_loadedModuleAliasAltname g_moduleDepend g_dependHash\ g_loadedModuleAliasAltname g_moduleDepend g_dependHash\
g_moduleNPODepend g_dependNPOHash g_prereqViolation\ g_moduleNPODepend g_dependNPOHash g_prereqViolation\
g_prereqNPOViolation g_conflictViolation g_moduleUnmetDep\ g_prereqNPOViolation g_conflictViolation g_moduleUnmetDep\
g_unmetDepHash g_moduleEval g_moduleHiddenEval} { g_unmetDepHash g_moduleEval g_moduleHiddenEval} {
##nagelfar ignore Suspicious variable name
set ::g_SAVE_$var [lrange [set ::g_SAVE_$var] 0 end-1] set ::g_SAVE_$var [lrange [set ::g_SAVE_$var] 0 end-1]
} }
reportDebug "previously saved settings flushed (#$flushedid)" reportDebug "previously saved settings flushed (#$flushedid)"
} }
proc restoreSettings {} { proc restoreSettings {} {
foreach var {g_clearedEnvVars g_Aliases g_stateEnvVars g_stateAliases\ foreach var {g_clearedEnvVars g_Aliases g_stateEnvVars g_stateAliases\
g_stateFunctions g_Functions g_stateCompletes g_Completes\ g_stateFunctions g_Functions g_stateCompletes g_Completes\
g_newXResources g_delXResources g_loadedModules g_loadedModuleFiles\ g_newXResources g_delXResources g_loadedModules g_loadedModuleFiles\
g_loadedModuleVariant g_loadedModuleConflict g_loadedModulePrereq\ g_loadedModuleVariant g_loadedModuleConflict g_loadedModulePrereq\
g_loadedModuleAltname g_loadedModuleAutoAltname\ g_loadedModulesRefresh g_loadedModuleAltname g_loadedModuleAutoAltname\
g_loadedModuleAliasAltname g_moduleDepend g_dependHash\ g_loadedModuleAliasAltname g_moduleDepend g_dependHash\
g_moduleNPODepend g_dependNPOHash g_prereqViolation\ g_moduleNPODepend g_dependNPOHash g_prereqViolation\
g_prereqNPOViolation g_conflictViolation g_moduleUnmetDep\ g_prereqNPOViolation g_conflictViolation g_moduleUnmetDep\
g_unmetDepHash g_moduleEval g_moduleHiddenEval} { g_unmetDepHash g_moduleEval g_moduleHiddenEval} {
# clear current $var arrays # clear current $var arrays
##nagelfar ignore #5 Suspicious variable name
if {[info exists ::$var]} { if {[info exists ::$var]} {
unset ::$var unset ::$var
array set ::$var {} array set ::$var {}
} }
array set ::$var [lindex [set ::g_SAVE_$var] end] array set ::$var [lindex [set ::g_SAVE_$var] end]
} }
# specific restore mechanism for ::env as unsetting this array will make # specific restore mechanism for ::env as unsetting this array will make
# Tcl stop monitoring env accesses and not update env variables anymore # Tcl stop monitoring env accesses and not update env variables anymore
set envvarlist [list] set envvarlist [list]
foreach {var val} [lindex $::g_SAVE_env end] { foreach {var val} [lindex $::g_SAVE_env end] {
lappend envvarlist $var lappend envvarlist $var
interp-sync-env set $var $val interp-sync-env set $var $val
} }
foreach var [array names ::env] { foreach var [array names ::env] {
if {$var ni $envvarlist} { if {$var ni $envvarlist} {
interp-sync-env unset $var interp-sync-env unset $var
} }
} }
# restore non-array variable if it was set # restore non-array variable if it was set
foreach var {g_changeDir g_stdoutPuts g_prestdoutPuts g_return_text} { foreach var {g_changeDir g_stdoutPuts g_prestdoutPuts g_return_text} {
##nagelfar ignore #6 Suspicious variable name
if {[info exists ::$var]} { if {[info exists ::$var]} {
unset ::$var unset ::$var
} }
lassign [lindex [set ::g_SAVE_$var] end] isdefined val lassign [lindex [set ::g_SAVE_$var] end] isdefined val
if {$isdefined} { if {$isdefined} {
set ::$var $val set ::$var $val
} }
} }
reportDebug "previously saved settings restored\ reportDebug "previously saved settings restored\
(#[getSavedSettingsStackDepth])" (#[getSavedSettingsStackDepth])"
} }
# load modules passed as args designated as requirement # load modules passed as args designated as requirement
proc loadRequirementModuleList {tag_list args} { proc loadRequirementModuleList {tryload optional tag_list args} {
set ret 0 set ret 0
set prereqloaded 0 set prereqloaded 0
# calling procedure must have already parsed module specification in args # calling procedure must have already parsed module specification in args
set loadedmod_list {} set loadedmod_list {}
foreach mod $args { foreach mod $args {
# get all loaded or loading mod in args list # get all loaded or loading mod in args list
if {[set loadedmod [getLoadedMatchingName $mod returnfirst]] ne {} ||\ if {[set loadedmod [getLoadedMatchingName $mod returnfirst]] ne {} ||\
[set loadedmod [getLoadedMatchingName $mod returnfirst 1]] ne {}} { [set loadedmod [getLoadedMatchingName $mod returnfirst 1]] ne {}} {
lappend loadedmod_list $loadedmod lappend loadedmod_list $loadedmod
skipping to change at line 638 skipping to change at line 646
} }
if {[llength $loadedmod_list] == 0} { if {[llength $loadedmod_list] == 0} {
set imax [llength $args] set imax [llength $args]
# if prereq list specified, try to load first then # if prereq list specified, try to load first then
# try next if load of first module not successful # try next if load of first module not successful
for {set i 0} {$i<$imax && $prereqloaded==0} {incr i 1} { for {set i 0} {$i<$imax && $prereqloaded==0} {incr i 1} {
set arg [lindex $args $i] set arg [lindex $args $i]
# hold output of each evaluation until they are all done to drop # hold output of each evaluation until they are all done to drop
# those that failed if one succeed # those that failed if one succeed or if optional
set curholdid load-$i-$arg set curholdid load-$i-$arg
lappendState reportholdid $curholdid lappendState reportholdid $curholdid
if {[catch {set retlo [cmdModuleLoad reqlo 0 $tag_list $arg]}\ if {[catch {set retlo [cmdModuleLoad reqlo 0 $tryload 0 $tag_list\
errorMsg]} { $arg]} errorMsg]} {
# if an error is raised, release output and rethrow the error # if an error is raised, release output and rethrow the error
# (could be raised if no modulepath defined for instance) # (could be raised if no modulepath defined for instance)
lpopState reportholdid lpopState reportholdid
lappend holdidlist $curholdid report lappend holdidlist $curholdid report
releaseHeldReport {*}$holdidlist releaseHeldReport {*}$holdidlist
knerror $errorMsg knerror $errorMsg
} }
# update return value if an issue occurred in cmdModuleLoad # update return value if an issue occurred in cmdModuleLoad
if {$retlo != 0} { if {$retlo != 0} {
set ret $retlo set ret $retlo
skipping to change at line 666 skipping to change at line 674
if {[is-loaded $arg]} { if {[is-loaded $arg]} {
set prereqloaded 1 set prereqloaded 1
# set previous reports to be dropped as this one succeed # set previous reports to be dropped as this one succeed
if {[info exists holdidlist]} { if {[info exists holdidlist]} {
foreach {holdid action} $holdidlist { foreach {holdid action} $holdidlist {
lappend newholdidlist $holdid drop lappend newholdidlist $holdid drop
} }
set holdidlist $newholdidlist set holdidlist $newholdidlist
} }
} }
lappend holdidlist $curholdid report # drop report if not loaded and optional
set action [expr {$prereqloaded || !$optional ? {report} : {drop}}]
lappend holdidlist $curholdid $action
} }
# output held messages # output held messages
releaseHeldReport {*}$holdidlist releaseHeldReport {*}$holdidlist
} else { } else {
set prereqloaded 1 set prereqloaded 1
# apply missing tag to all loaded module found # apply missing tag to all loaded module found
cmdModuleTag 0 0 $tag_list {*}$loadedmod_list cmdModuleTag 0 0 $tag_list {*}$loadedmod_list
} }
return [list $ret $prereqloaded] return [list $ret $prereqloaded]
skipping to change at line 734 skipping to change at line 744
array set extratag $extrataglist array set extratag $extrataglist
# loads are made with auto handling mode disabled to avoid disturbances # loads are made with auto handling mode disabled to avoid disturbances
# from a missing prereq automatically reloaded, so these module loads may # from a missing prereq automatically reloaded, so these module loads may
# fail as prereq may not be satisfied anymore # fail as prereq may not be satisfied anymore
setConf auto_handling 0 setConf auto_handling 0
foreach mod $lmlist { foreach mod $lmlist {
# if an auto set default was excluded, module spec need parsing # if an auto set default was excluded, module spec need parsing
lassign [parseModuleSpecification 0 $mod {*}$vr($mod)] modnamevr lassign [parseModuleSpecification 0 $mod {*}$vr($mod)] modnamevr
# reload module with user asked property and extra tags preserved # reload module with user asked property and extra tags preserved
if {[cmdModuleLoad $context $isuasked($mod) $extratag($mod)\ if {[cmdModuleLoad $context $isuasked($mod) 0 0 $extratag($mod)\
$modnamevr]} { $modnamevr]} {
set errMsg [string map [list _MOD_ [getModuleDesignation spec\ set errMsg [string map [list _MOD_ [getModuleDesignation spec\
$modnamevr]] $errmsgtpl] $modnamevr]] $errmsgtpl]
if {$force} { if {$force} {
# errMsg will always be set as force mode could not be enabled # errMsg will always be set as force mode could not be enabled
# for reload sub-cmd which provides an empty msg template # for reload sub-cmd which provides an empty msg template
reportWarning $errMsg 1 reportWarning $errMsg 1
# stop if one load fails unless force mode enabled # stop if one load fails unless force mode enabled
} else { } else {
knerror $errMsg knerror $errMsg
 End of changes. 18 change blocks. 
11 lines changed or deleted 21 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)