Skip to content

Commit

Permalink
No sticky mod unload if switched-on mod does not exist
Browse files Browse the repository at this point in the history
Fix switch sub-command not to unload sticky or super-sticky module when
switched-on module does not exist.

Fixes #492
  • Loading branch information
xdelaruelle committed May 14, 2023
1 parent 01d423b commit 2a81b73
Show file tree
Hide file tree
Showing 5 changed files with 248 additions and 3 deletions.
2 changes: 2 additions & 0 deletions NEWS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,8 @@ Modules 5.2.0 (2022-11-08)
page.
* Doc: extend :ref:`Collections` section with examples in :ref:`module(1)` man
page.
* Fix :subcmd:`switch` sub-command not to unload *sticky* module when
switched-on module does not exist. (fix issue #492)

.. _Nagelfar: http://nagelfar.sourceforge.net/
.. _ShellCheck: https://www.shellcheck.net/
Expand Down
17 changes: 14 additions & 3 deletions tcl/subcmd.tcl.in
Original file line number Diff line number Diff line change
Expand Up @@ -436,11 +436,22 @@ proc cmdModuleSwitch {uasked tag_list old {new {}}} {
# enable unload of sticky mod if stickiness is preserved on swapped-on mod
# need to resolve swapped-off module here to get stickiness details
lassign [getPathToModule $old {} 0 $unload_match] modfile oldmod oldmodvr
if {[set sticky_reload [isStickinessReloading $oldmodvr [list $new]]]} {
set sticky_reload [isStickinessReloading $oldmodvr [list $new]]
set supersticky_reload [isStickinessReloading $oldmodvr [list $new]\
super-sticky]
# do not set sticky or supersticky reload states if swap-on module cannot
# be found
if {$supersticky_reload || $sticky_reload} {
lassign [getPathToModule $new] newmodfile newmod newmodvr
if {$newmodfile eq {}} {
set sticky_reload 0
set supersticky_reload 0
}
}
if {$sticky_reload} {
lappendState reloading_sticky $oldmod
}
if {[set supersticky_reload [isStickinessReloading $oldmodvr [list $new]\
super-sticky]]} {
if {$supersticky_reload} {
lappendState reloading_supersticky $oldmod
}
##nagelfar implicitvarcmd {cmdModuleUnload swunload *} oldhidden olduasked\
Expand Down
6 changes: 6 additions & 0 deletions testsuite/modulefiles.3/bar/2.0
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,9 @@ module-whatis [module-info name]
if {[info exists env(TESTSUITE_STICKY_DEP)]} {
prereq sticky/1.0
}
if {[info exists env(TESTSUITE_STICKY_SWITCH_DEP)]} {
switch -- $env(TESTSUITE_STICKY_SWITCH_DEP) {
1 {module switch sticky/1.0 sticky/99}
2 {module switch sticky/99}
}
}
130 changes: 130 additions & 0 deletions testsuite/modules.50-cmds/460-sticky.exp
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,136 @@ set tserr [msg_unload {sticky/1.0 <S>} $err_stickyunloadf]
testouterr_cmd_re sh {purge -f} $ans $tserr


# switch sticky module to a module that does not exist
unsetenv_var TESTSUITE_STICKY_GENERIC
unsetenv_var TESTSUITE_STICKY_DEP
unsetenv_var __MODULES_LMPREREQ
setenv_loaded_module [list sticky/1.0] [list $mp/sticky/1.0]
setenv_var __MODULES_LMTAG sticky/1.0&sticky

set tserr [msg_switch {sticky/1.0 <S>} sticky/99 $err_stickyunload]
testouterr_cmd_re sh {switch sticky/99} ERR $tserr
testouterr_cmd_re sh {switch sticky/1.0 sticky/99} ERR $tserr

set ans [list]
lappend ans [list unset _LMFILES_]
lappend ans [list unset LOADEDMODULES]
lappend ans [list unset __MODULES_LMTAG]
lappend ans [list ERR]
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]

[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99']"
testouterr_cmd_re sh {switch -f sticky/99} $ans $tserr
testouterr_cmd_re sh {switch -f sticky/1.0 sticky/99} $ans $tserr

# switch sticky module to a module that does not exist (generic sticky)
setenv_var TESTSUITE_STICKY_GENERIC 1

set tserr [msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_stickyunload]
testouterr_cmd_re sh {switch sticky/99} ERR $tserr
testouterr_cmd_re sh {switch sticky/1.0 sticky/99} ERR $tserr

set ans [list]
lappend ans [list unset _LMFILES_]
lappend ans [list unset LOADEDMODULES]
lappend ans [list unset __MODULES_LMTAG]
lappend ans [list ERR]
#FIXME: 'unable to locate modulefile' message is reported twice
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]

[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']"
testouterr_cmd_re sh {switch -f sticky/99} $ans $tserr
testouterr_cmd_re sh {switch -f sticky/1.0 sticky/99} $ans $tserr

# switch sticky module to a module that does not exist (generic sticky and dependencies)
setenv_var TESTSUITE_STICKY_DEP 1
setenv_loaded_module [list foo/2.0 sticky/1.0 bar/2.0] [list $mp/foo/2.0 $mp/sticky/1.0 $mp/bar/2.0]
setenv_var __MODULES_LMTAG sticky/1.0&sticky
setenv_var __MODULES_LMPREREQ sticky/1.0&foo|baz:bar/2.0&sticky/1.0

set tserr [msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_stickyunload]
testouterr_cmd_re sh {switch --auto sticky/99} ERR $tserr

set tserr "[msg_unload {sticky/1.0 <S>} [err_prerequn bar/2.0]]

[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' [err_swoff sticky/1.0]]"
testouterr_cmd_re sh {switch --no-auto sticky/99} ERR $tserr

set ans [list]
lappend ans [list set __MODULES_LMPREREQ bar/2.0&sticky/1.0]
lappend ans [list set _LMFILES_ $mp/foo/2.0:$mp/bar/2.0]
lappend ans [list set LOADEDMODULES foo/2.0:bar/2.0]
lappend ans [list unset __MODULES_LMTAG]
lappend ans [list ERR]
#FIXME: 'unable to locate modulefile' message is reported twice
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]

[msg_load bar/2.0 [err_reqmisf sticky/1.0]]

[msg_top_switch {sticky/1.0 <S>} sticky/99 {} {} {} {} bar/2.0 $err_path'sticky/99' $err_path'sticky/99']"
testouterr_cmd_re sh {switch --auto -f sticky/1.0 sticky/99} $ans $tserr

#FIXME: 'unable to locate modulefile' message is reported twice
set tserr "[msg_unload {sticky/1.0 <S>} [err_deplof bar/2.0] $err_stickyunloadf]

[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']"
testouterr_cmd_re sh {switch --no-auto -f sticky/99} $ans $tserr

# switch sticky module within moulefile to a module that does not exist (generic sticky)
unsetenv_var TESTSUITE_STICKY_DEP
setenv_var TESTSUITE_STICKY_SWITCH_DEP 1
setenv_loaded_module [list sticky/1.0] [list $mp/sticky/1.0]
setenv_var __MODULES_LMTAG sticky/1.0&sticky
unsetenv_var __MODULES_LMPREREQ

#FIXME: 'unable to locate modulefile' message is reported twice
set tserr "[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']

[msg_load bar/2.0 $err_stickyunload [err_conun sticky/1.0]]"
testouterr_cmd_re sh {load bar/2.0} ERR $tserr

set ans [list]
lappend ans [list set __MODULES_LMCONFLICT bar/2.0&sticky/1.0]
lappend ans [list set __MODULES_LMPREREQ bar/2.0&sticky/99]
lappend ans [list set _LMFILES_ $mp/bar/2.0]
lappend ans [list set LOADEDMODULES bar/2.0]
lappend ans [list unset __MODULES_LMTAG]
lappend ans [list ERR]
#FIXME: 'unable to locate modulefile' message is reported 3 times
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]

[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99' $err_path'sticky/99']

[msg_top_load bar/2.0 sticky/1.0 {} {} [err_reqlof sticky/99]]"
testouterr_cmd_re sh {load -f bar/2.0} $ans $tserr

setenv_var TESTSUITE_STICKY_SWITCH_DEP 2
#FIXME: requirement (sticky/99) is missing, but bar/2.0 has been loaded
# requirement is not expressed thus not reported in messages
set ans [list]
lappend ans [list set _LMFILES_ $mp/sticky/1.0:$mp/bar/2.0]
lappend ans [list set LOADEDMODULES sticky/1.0:bar/2.0]
lappend ans [list ERR]
set tserr "[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99']

[msg_load bar/2.0 $err_stickyunload]"
testouterr_cmd_re sh {load bar/2.0} $ans $tserr

set ans [list]
lappend ans [list set __MODULES_LMPREREQ bar/2.0&sticky/99]
lappend ans [list set _LMFILES_ $mp/bar/2.0]
lappend ans [list set LOADEDMODULES bar/2.0]
lappend ans [list unset __MODULES_LMTAG]
lappend ans [list ERR]
#FIXME: 'unable to locate modulefile' message is reported twice
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]

[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']

[msg_top_load bar/2.0 sticky/1.0 {} {} [err_reqlof sticky/99]]"
testouterr_cmd_re sh {load -f bar/2.0} $ans $tserr


#
# Cleanup
#
Expand Down
96 changes: 96 additions & 0 deletions testsuite/modules.50-cmds/461-super-sticky.exp
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,102 @@ set tserr [msg_unload {sticky/1.0 <sS>} $err_superstickyunload]\n\n[msg_unload f
testouterr_cmd_re sh {purge -f} $ans $tserr


# switch super-sticky module to a module that does not exist
unsetenv_var TESTSUITE_STICKY_GENERIC
unsetenv_var TESTSUITE_STICKY_DEP
unsetenv_var __MODULES_LMPREREQ
setenv_loaded_module [list sticky/1.0] [list $mp/sticky/1.0]
setenv_var __MODULES_LMTAG sticky/1.0&super-sticky

set tserr [msg_switch {sticky/1.0 <sS>} sticky/99 $err_superstickyunload]
testouterr_cmd_re sh {switch sticky/99} ERR $tserr
testouterr_cmd_re sh {switch sticky/1.0 sticky/99} ERR $tserr

set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_superstickyunload]"
testouterr_cmd_re sh {switch -f sticky/99} ERR $tserr
testouterr_cmd_re sh {switch -f sticky/1.0 sticky/99} ERR $tserr

# switch super-sticky module to a module that does not exist (generic sticky)
setenv_var TESTSUITE_STICKY_GENERIC 1

set tserr [msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_superstickyunload]
testouterr_cmd_re sh {switch sticky/99} ERR $tserr
testouterr_cmd_re sh {switch sticky/1.0 sticky/99} ERR $tserr

set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_superstickyunload]"
testouterr_cmd_re sh {switch -f sticky/99} ERR $tserr
testouterr_cmd_re sh {switch -f sticky/1.0 sticky/99} ERR $tserr

# switch super-sticky module to a module that does not exist (generic sticky and dependencies)
setenv_var TESTSUITE_STICKY_DEP 1
setenv_loaded_module [list foo/2.0 sticky/1.0 bar/2.0] [list $mp/foo/2.0 $mp/sticky/1.0 $mp/bar/2.0]
setenv_var __MODULES_LMTAG sticky/1.0&super-sticky
setenv_var __MODULES_LMPREREQ sticky/1.0&foo|baz:bar/2.0&sticky/1.0

testouterr_cmd_re sh {switch --auto sticky/99} ERR $tserr
testouterr_cmd_re sh {switch --auto -f sticky/1.0 sticky/99} ERR $tserr

set tserr "[msg_unload {sticky/1.0 <sS>} [err_prerequn bar/2.0]]

[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' [err_swoff sticky/1.0]]"
testouterr_cmd_re sh {switch --no-auto sticky/99} ERR $tserr

#FIXME: 'Unload of super-sticky module skipped' not also reported under 'Unloading sticky/1.0 <sS>' block
set tserr "[msg_unload {sticky/1.0 <sS>} [err_deplof bar/2.0]]

[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_superstickyunload]"
testouterr_cmd_re sh {switch --no-auto -f sticky/99} ERR $tserr

# switch sticky module within moulefile to a module that does not exist (generic sticky)
unsetenv_var TESTSUITE_STICKY_DEP
setenv_var TESTSUITE_STICKY_SWITCH_DEP 1
setenv_loaded_module [list sticky/1.0] [list $mp/sticky/1.0]
setenv_var __MODULES_LMTAG sticky/1.0&super-sticky
unsetenv_var __MODULES_LMPREREQ

#FIXME: 'unable to locate modulefile' message is reported twice
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']

[msg_load bar/2.0 $err_superstickyunload [err_conun sticky/1.0]]"
testouterr_cmd_re sh {load bar/2.0} ERR $tserr

#FIXME: requirement (sticky/99) is missing, but bar/2.0 has been loaded
# requirement is not expressed thus not reported in messages
set ans [list]
lappend ans [list set __MODULES_LMCONFLICT bar/2.0&sticky/1.0]
lappend ans [list set _LMFILES_ $mp/sticky/1.0:$mp/bar/2.0]
lappend ans [list set LOADEDMODULES sticky/1.0:bar/2.0]
lappend ans [list ERR]
#FIXME: 'unable to locate modulefile' message is reported twice
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_path'sticky/99' [err_conlof sticky/1.0]]

[msg_load bar/2.0 $err_superstickyunload [err_conunf sticky/1.0]]"
testouterr_cmd_re sh {load -f bar/2.0} $ans $tserr

setenv_var TESTSUITE_STICKY_SWITCH_DEP 2
#FIXME: requirement (sticky/99) is missing, but bar/2.0 has been loaded
# requirement is not expressed thus not reported in messages
set ans [list]
lappend ans [list set _LMFILES_ $mp/sticky/1.0:$mp/bar/2.0]
lappend ans [list set LOADEDMODULES sticky/1.0:bar/2.0]
lappend ans [list ERR]
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99']

[msg_load bar/2.0 $err_superstickyunload]"
testouterr_cmd_re sh {load bar/2.0} $ans $tserr

#FIXME: requirement (sticky/99) is missing, but bar/2.0 has been loaded
# requirement is not expressed thus not reported in messages
set ans [list]
lappend ans [list set _LMFILES_ $mp/sticky/1.0:$mp/bar/2.0]
lappend ans [list set LOADEDMODULES sticky/1.0:bar/2.0]
lappend ans [list ERR]
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99']

[msg_load bar/2.0 $err_superstickyunload]"
testouterr_cmd_re sh {load -f bar/2.0} $ans $tserr


#
# Cleanup
#
Expand Down

0 comments on commit 2a81b73

Please sign in to comment.