Skip to content

Commit 2a81b73

Browse files
committed
No sticky mod unload if switched-on mod does not exist
Fix switch sub-command not to unload sticky or super-sticky module when switched-on module does not exist. Fixes #492
1 parent 01d423b commit 2a81b73

File tree

5 files changed

+248
-3
lines changed

5 files changed

+248
-3
lines changed

NEWS.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,8 @@ Modules 5.2.0 (2022-11-08)
311311
page.
312312
* Doc: extend :ref:`Collections` section with examples in :ref:`module(1)` man
313313
page.
314+
* Fix :subcmd:`switch` sub-command not to unload *sticky* module when
315+
switched-on module does not exist. (fix issue #492)
314316

315317
.. _Nagelfar: http://nagelfar.sourceforge.net/
316318
.. _ShellCheck: https://www.shellcheck.net/

tcl/subcmd.tcl.in

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -436,11 +436,22 @@ proc cmdModuleSwitch {uasked tag_list old {new {}}} {
436436
# enable unload of sticky mod if stickiness is preserved on swapped-on mod
437437
# need to resolve swapped-off module here to get stickiness details
438438
lassign [getPathToModule $old {} 0 $unload_match] modfile oldmod oldmodvr
439-
if {[set sticky_reload [isStickinessReloading $oldmodvr [list $new]]]} {
439+
set sticky_reload [isStickinessReloading $oldmodvr [list $new]]
440+
set supersticky_reload [isStickinessReloading $oldmodvr [list $new]\
441+
super-sticky]
442+
# do not set sticky or supersticky reload states if swap-on module cannot
443+
# be found
444+
if {$supersticky_reload || $sticky_reload} {
445+
lassign [getPathToModule $new] newmodfile newmod newmodvr
446+
if {$newmodfile eq {}} {
447+
set sticky_reload 0
448+
set supersticky_reload 0
449+
}
450+
}
451+
if {$sticky_reload} {
440452
lappendState reloading_sticky $oldmod
441453
}
442-
if {[set supersticky_reload [isStickinessReloading $oldmodvr [list $new]\
443-
super-sticky]]} {
454+
if {$supersticky_reload} {
444455
lappendState reloading_supersticky $oldmod
445456
}
446457
##nagelfar implicitvarcmd {cmdModuleUnload swunload *} oldhidden olduasked\

testsuite/modulefiles.3/bar/2.0

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,9 @@ module-whatis [module-info name]
33
if {[info exists env(TESTSUITE_STICKY_DEP)]} {
44
prereq sticky/1.0
55
}
6+
if {[info exists env(TESTSUITE_STICKY_SWITCH_DEP)]} {
7+
switch -- $env(TESTSUITE_STICKY_SWITCH_DEP) {
8+
1 {module switch sticky/1.0 sticky/99}
9+
2 {module switch sticky/99}
10+
}
11+
}

testsuite/modules.50-cmds/460-sticky.exp

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,136 @@ set tserr [msg_unload {sticky/1.0 <S>} $err_stickyunloadf]
428428
testouterr_cmd_re sh {purge -f} $ans $tserr
429429

430430

431+
# switch sticky module to a module that does not exist
432+
unsetenv_var TESTSUITE_STICKY_GENERIC
433+
unsetenv_var TESTSUITE_STICKY_DEP
434+
unsetenv_var __MODULES_LMPREREQ
435+
setenv_loaded_module [list sticky/1.0] [list $mp/sticky/1.0]
436+
setenv_var __MODULES_LMTAG sticky/1.0&sticky
437+
438+
set tserr [msg_switch {sticky/1.0 <S>} sticky/99 $err_stickyunload]
439+
testouterr_cmd_re sh {switch sticky/99} ERR $tserr
440+
testouterr_cmd_re sh {switch sticky/1.0 sticky/99} ERR $tserr
441+
442+
set ans [list]
443+
lappend ans [list unset _LMFILES_]
444+
lappend ans [list unset LOADEDMODULES]
445+
lappend ans [list unset __MODULES_LMTAG]
446+
lappend ans [list ERR]
447+
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]
448+
449+
[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99']"
450+
testouterr_cmd_re sh {switch -f sticky/99} $ans $tserr
451+
testouterr_cmd_re sh {switch -f sticky/1.0 sticky/99} $ans $tserr
452+
453+
# switch sticky module to a module that does not exist (generic sticky)
454+
setenv_var TESTSUITE_STICKY_GENERIC 1
455+
456+
set tserr [msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_stickyunload]
457+
testouterr_cmd_re sh {switch sticky/99} ERR $tserr
458+
testouterr_cmd_re sh {switch sticky/1.0 sticky/99} ERR $tserr
459+
460+
set ans [list]
461+
lappend ans [list unset _LMFILES_]
462+
lappend ans [list unset LOADEDMODULES]
463+
lappend ans [list unset __MODULES_LMTAG]
464+
lappend ans [list ERR]
465+
#FIXME: 'unable to locate modulefile' message is reported twice
466+
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]
467+
468+
[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']"
469+
testouterr_cmd_re sh {switch -f sticky/99} $ans $tserr
470+
testouterr_cmd_re sh {switch -f sticky/1.0 sticky/99} $ans $tserr
471+
472+
# switch sticky module to a module that does not exist (generic sticky and dependencies)
473+
setenv_var TESTSUITE_STICKY_DEP 1
474+
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]
475+
setenv_var __MODULES_LMTAG sticky/1.0&sticky
476+
setenv_var __MODULES_LMPREREQ sticky/1.0&foo|baz:bar/2.0&sticky/1.0
477+
478+
set tserr [msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_stickyunload]
479+
testouterr_cmd_re sh {switch --auto sticky/99} ERR $tserr
480+
481+
set tserr "[msg_unload {sticky/1.0 <S>} [err_prerequn bar/2.0]]
482+
483+
[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' [err_swoff sticky/1.0]]"
484+
testouterr_cmd_re sh {switch --no-auto sticky/99} ERR $tserr
485+
486+
set ans [list]
487+
lappend ans [list set __MODULES_LMPREREQ bar/2.0&sticky/1.0]
488+
lappend ans [list set _LMFILES_ $mp/foo/2.0:$mp/bar/2.0]
489+
lappend ans [list set LOADEDMODULES foo/2.0:bar/2.0]
490+
lappend ans [list unset __MODULES_LMTAG]
491+
lappend ans [list ERR]
492+
#FIXME: 'unable to locate modulefile' message is reported twice
493+
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]
494+
495+
[msg_load bar/2.0 [err_reqmisf sticky/1.0]]
496+
497+
[msg_top_switch {sticky/1.0 <S>} sticky/99 {} {} {} {} bar/2.0 $err_path'sticky/99' $err_path'sticky/99']"
498+
testouterr_cmd_re sh {switch --auto -f sticky/1.0 sticky/99} $ans $tserr
499+
500+
#FIXME: 'unable to locate modulefile' message is reported twice
501+
set tserr "[msg_unload {sticky/1.0 <S>} [err_deplof bar/2.0] $err_stickyunloadf]
502+
503+
[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']"
504+
testouterr_cmd_re sh {switch --no-auto -f sticky/99} $ans $tserr
505+
506+
# switch sticky module within moulefile to a module that does not exist (generic sticky)
507+
unsetenv_var TESTSUITE_STICKY_DEP
508+
setenv_var TESTSUITE_STICKY_SWITCH_DEP 1
509+
setenv_loaded_module [list sticky/1.0] [list $mp/sticky/1.0]
510+
setenv_var __MODULES_LMTAG sticky/1.0&sticky
511+
unsetenv_var __MODULES_LMPREREQ
512+
513+
#FIXME: 'unable to locate modulefile' message is reported twice
514+
set tserr "[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']
515+
516+
[msg_load bar/2.0 $err_stickyunload [err_conun sticky/1.0]]"
517+
testouterr_cmd_re sh {load bar/2.0} ERR $tserr
518+
519+
set ans [list]
520+
lappend ans [list set __MODULES_LMCONFLICT bar/2.0&sticky/1.0]
521+
lappend ans [list set __MODULES_LMPREREQ bar/2.0&sticky/99]
522+
lappend ans [list set _LMFILES_ $mp/bar/2.0]
523+
lappend ans [list set LOADEDMODULES bar/2.0]
524+
lappend ans [list unset __MODULES_LMTAG]
525+
lappend ans [list ERR]
526+
#FIXME: 'unable to locate modulefile' message is reported 3 times
527+
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]
528+
529+
[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99' $err_path'sticky/99']
530+
531+
[msg_top_load bar/2.0 sticky/1.0 {} {} [err_reqlof sticky/99]]"
532+
testouterr_cmd_re sh {load -f bar/2.0} $ans $tserr
533+
534+
setenv_var TESTSUITE_STICKY_SWITCH_DEP 2
535+
#FIXME: requirement (sticky/99) is missing, but bar/2.0 has been loaded
536+
# requirement is not expressed thus not reported in messages
537+
set ans [list]
538+
lappend ans [list set _LMFILES_ $mp/sticky/1.0:$mp/bar/2.0]
539+
lappend ans [list set LOADEDMODULES sticky/1.0:bar/2.0]
540+
lappend ans [list ERR]
541+
set tserr "[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99']
542+
543+
[msg_load bar/2.0 $err_stickyunload]"
544+
testouterr_cmd_re sh {load bar/2.0} $ans $tserr
545+
546+
set ans [list]
547+
lappend ans [list set __MODULES_LMPREREQ bar/2.0&sticky/99]
548+
lappend ans [list set _LMFILES_ $mp/bar/2.0]
549+
lappend ans [list set LOADEDMODULES bar/2.0]
550+
lappend ans [list unset __MODULES_LMTAG]
551+
lappend ans [list ERR]
552+
#FIXME: 'unable to locate modulefile' message is reported twice
553+
set tserr "[msg_unload {sticky/1.0 <S>} $err_stickyunloadf]
554+
555+
[msg_switch {sticky/1.0 <S>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']
556+
557+
[msg_top_load bar/2.0 sticky/1.0 {} {} [err_reqlof sticky/99]]"
558+
testouterr_cmd_re sh {load -f bar/2.0} $ans $tserr
559+
560+
431561
#
432562
# Cleanup
433563
#

testsuite/modules.50-cmds/461-super-sticky.exp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,102 @@ set tserr [msg_unload {sticky/1.0 <sS>} $err_superstickyunload]\n\n[msg_unload f
349349
testouterr_cmd_re sh {purge -f} $ans $tserr
350350

351351

352+
# switch super-sticky module to a module that does not exist
353+
unsetenv_var TESTSUITE_STICKY_GENERIC
354+
unsetenv_var TESTSUITE_STICKY_DEP
355+
unsetenv_var __MODULES_LMPREREQ
356+
setenv_loaded_module [list sticky/1.0] [list $mp/sticky/1.0]
357+
setenv_var __MODULES_LMTAG sticky/1.0&super-sticky
358+
359+
set tserr [msg_switch {sticky/1.0 <sS>} sticky/99 $err_superstickyunload]
360+
testouterr_cmd_re sh {switch sticky/99} ERR $tserr
361+
testouterr_cmd_re sh {switch sticky/1.0 sticky/99} ERR $tserr
362+
363+
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_superstickyunload]"
364+
testouterr_cmd_re sh {switch -f sticky/99} ERR $tserr
365+
testouterr_cmd_re sh {switch -f sticky/1.0 sticky/99} ERR $tserr
366+
367+
# switch super-sticky module to a module that does not exist (generic sticky)
368+
setenv_var TESTSUITE_STICKY_GENERIC 1
369+
370+
set tserr [msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_superstickyunload]
371+
testouterr_cmd_re sh {switch sticky/99} ERR $tserr
372+
testouterr_cmd_re sh {switch sticky/1.0 sticky/99} ERR $tserr
373+
374+
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_superstickyunload]"
375+
testouterr_cmd_re sh {switch -f sticky/99} ERR $tserr
376+
testouterr_cmd_re sh {switch -f sticky/1.0 sticky/99} ERR $tserr
377+
378+
# switch super-sticky module to a module that does not exist (generic sticky and dependencies)
379+
setenv_var TESTSUITE_STICKY_DEP 1
380+
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]
381+
setenv_var __MODULES_LMTAG sticky/1.0&super-sticky
382+
setenv_var __MODULES_LMPREREQ sticky/1.0&foo|baz:bar/2.0&sticky/1.0
383+
384+
testouterr_cmd_re sh {switch --auto sticky/99} ERR $tserr
385+
testouterr_cmd_re sh {switch --auto -f sticky/1.0 sticky/99} ERR $tserr
386+
387+
set tserr "[msg_unload {sticky/1.0 <sS>} [err_prerequn bar/2.0]]
388+
389+
[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' [err_swoff sticky/1.0]]"
390+
testouterr_cmd_re sh {switch --no-auto sticky/99} ERR $tserr
391+
392+
#FIXME: 'Unload of super-sticky module skipped' not also reported under 'Unloading sticky/1.0 <sS>' block
393+
set tserr "[msg_unload {sticky/1.0 <sS>} [err_deplof bar/2.0]]
394+
395+
[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_superstickyunload]"
396+
testouterr_cmd_re sh {switch --no-auto -f sticky/99} ERR $tserr
397+
398+
# switch sticky module within moulefile to a module that does not exist (generic sticky)
399+
unsetenv_var TESTSUITE_STICKY_DEP
400+
setenv_var TESTSUITE_STICKY_SWITCH_DEP 1
401+
setenv_loaded_module [list sticky/1.0] [list $mp/sticky/1.0]
402+
setenv_var __MODULES_LMTAG sticky/1.0&super-sticky
403+
unsetenv_var __MODULES_LMPREREQ
404+
405+
#FIXME: 'unable to locate modulefile' message is reported twice
406+
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_path'sticky/99']
407+
408+
[msg_load bar/2.0 $err_superstickyunload [err_conun sticky/1.0]]"
409+
testouterr_cmd_re sh {load bar/2.0} ERR $tserr
410+
411+
#FIXME: requirement (sticky/99) is missing, but bar/2.0 has been loaded
412+
# requirement is not expressed thus not reported in messages
413+
set ans [list]
414+
lappend ans [list set __MODULES_LMCONFLICT bar/2.0&sticky/1.0]
415+
lappend ans [list set _LMFILES_ $mp/sticky/1.0:$mp/bar/2.0]
416+
lappend ans [list set LOADEDMODULES sticky/1.0:bar/2.0]
417+
lappend ans [list ERR]
418+
#FIXME: 'unable to locate modulefile' message is reported twice
419+
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99' $err_path'sticky/99' [err_conlof sticky/1.0]]
420+
421+
[msg_load bar/2.0 $err_superstickyunload [err_conunf sticky/1.0]]"
422+
testouterr_cmd_re sh {load -f bar/2.0} $ans $tserr
423+
424+
setenv_var TESTSUITE_STICKY_SWITCH_DEP 2
425+
#FIXME: requirement (sticky/99) is missing, but bar/2.0 has been loaded
426+
# requirement is not expressed thus not reported in messages
427+
set ans [list]
428+
lappend ans [list set _LMFILES_ $mp/sticky/1.0:$mp/bar/2.0]
429+
lappend ans [list set LOADEDMODULES sticky/1.0:bar/2.0]
430+
lappend ans [list ERR]
431+
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99']
432+
433+
[msg_load bar/2.0 $err_superstickyunload]"
434+
testouterr_cmd_re sh {load bar/2.0} $ans $tserr
435+
436+
#FIXME: requirement (sticky/99) is missing, but bar/2.0 has been loaded
437+
# requirement is not expressed thus not reported in messages
438+
set ans [list]
439+
lappend ans [list set _LMFILES_ $mp/sticky/1.0:$mp/bar/2.0]
440+
lappend ans [list set LOADEDMODULES sticky/1.0:bar/2.0]
441+
lappend ans [list ERR]
442+
set tserr "[msg_switch {sticky/1.0 <sS>} sticky/99 $err_path'sticky/99']
443+
444+
[msg_load bar/2.0 $err_superstickyunload]"
445+
testouterr_cmd_re sh {load -f bar/2.0} $ans $tserr
446+
447+
352448
#
353449
# Cleanup
354450
#

0 commit comments

Comments
 (0)