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 |