diff --git a/NEWS.rst b/NEWS.rst index 7f9cbed8c..e9508bf06 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -137,6 +137,21 @@ Modules 5.7.0 (not yet released) :instopt:`--with-domainname` and :instopt:`--with-domainname-opts` options. When :mconfig:`domainname` is changed with :subcmd:`config` sub-command, it sets the :envvar:`MODULES_DOMAINNAME` environment variable. (fix issue #645) +* Update the :mfcmd:`source-sh` modulefile command and :subcmd:`sh-to-mod` + sub-command mechanism to produce a more consistent value for a path-like + environment variable change that requires both a prepended and an appended + part expressed with a different delimiter character: a :mfcmd:`setenv` + command is now generated instead in this situation. +* Update the :mfcmd:`source-sh` modulefile command and :subcmd:`sh-to-mod` + sub-command mechanism to no longer de-duplicate a path entry found several + times in the entries it prepends or in the entries it appends, and to add + the ``--duplicates`` option on a generated :mfcmd:`prepend-path` or + :mfcmd:`append-path` command when one of the path entries it adds is + already found in the variable value prior script evaluation, is found + several times in the entries it adds or is found in both the entries it + prepends and the entries it appends, so this entry is not silently + absorbed by these commands' default de-duplication behavior nor relocated + by the :mconfig:`path_entry_reorder` configuration option. .. _5.6 release notes: diff --git a/doc/source/design/source-shell-script-in-modulefile.rst b/doc/source/design/source-shell-script-in-modulefile.rst index 3c13d065e..a503f63a0 100644 --- a/doc/source/design/source-shell-script-in-modulefile.rst +++ b/doc/source/design/source-shell-script-in-modulefile.rst @@ -183,17 +183,26 @@ Specification - to separate each output kind and then be able to split them for separate analysis -- De-duplication of path entries is applied for changes on path-like environment variables +- Path entries found in the newly prepended entries or in the newly appended entries for a variable are never de-duplicated: every occurrence is kept and passed on the corresponding ``prepend-path`` or ``append-path`` command - - If the same path entry appears several times in the newly prepended entries for a variable, the first occurrence of this entry is kept others are dropped - - If the same path entry appears several times in the newly appended entries for a variable, the first occurrence of this entry is kept others are dropped - - De-duplication is not applied for path entries: +- The ``--duplicates`` option is added to a ``prepend-path`` or ``append-path`` command when one of the entries it adds: - - appearing in both the new prepended entries and newly appended entries - - appearing in newly prepended entries or newly appended entries and in entries defined prior script evaluation + - is already found in the variable value prior script evaluation + - is found several times in the newly prepended entries or in the newly appended entries + - is found in both the newly prepended entries and the newly appended entries + + - Such an entry is genuinely meant to end up at this specific position in the resulting value + - Without this option, ``prepend-path`` and ``append-path``'s default de-duplication behavior would silently absorb the entry, and the ``path_entry_reorder`` configuration option could relocate it, which would not correctly reproduce the change made by the script - An environment variable equaling to the path separator character (``:``) prior script evaluation is considered as undefined prior script evaluation to avoid misleading analysis +- Path-like variable change is recorded as a ``setenv`` command instead of ``prepend-path`` and ``append-path`` commands when the newly prepended and newly appended parts would each need a different delimiter character to be expressed + + - Prior and after variable values are compared to find a common part between them: what is found before this common part is expressed as a ``prepend-path`` command and what is found after it as an ``append-path`` command + - Each of these two commands may need its own delimiter character, determined from the character found in the after value right before (for the prepended part) or right after (for the appended part) the common part, when this character is not the variable path separator + - When the delimiter character determined for the prepended part differs from the one determined for the appended part, describing the change as a ``prepend-path`` and an ``append-path`` command would not correctly reproduce the resulting value, as each command would independently split and de-duplicate the full variable value using its own delimiter + - A ``setenv`` command directly setting the after value is generated instead in this situation, to always accurately reflect the change made by the script + - Environment variables made for Modules private use are filtered-out from the environment changes produced - ``LOADEDMODULES``, ``_LMFILES_`` and any variable prefixed by ``__MODULES_`` are concerned diff --git a/tcl/mfcmd.tcl b/tcl/mfcmd.tcl index 5821b31ca..8f9797202 100644 --- a/tcl/mfcmd.tcl +++ b/tcl/mfcmd.tcl @@ -1676,51 +1676,76 @@ proc sh-to-mod {elt_ignored_list args} { foreach name $diff { if {$name ni $ignvarlist && ![string equal -length 10 $name\ __MODULES_]} { + set idx [string first $varbef($name) $varaft($name)] + set doprepend [expr {$idx > 0}] + if {$doprepend} { + # check from the end to get the largest chunk to prepend + set idx [string last $varbef($name) $varaft($name)] + # get delimiter from char found between new and existing value + set predelim [string index $varaft($name) $idx-1] + set delim $predelim + } + set appdelim_idx [expr {$idx + [string length $varbef($name)]}] + set doappend [expr {$appdelim_idx < [string length $varaft($name)]}] + if {$doappend} { + set appdelim [string index $varaft($name) $appdelim_idx] + set delim $appdelim + } # new value is totally different (also consider a bare ':' as a # totally different value to avoid erroneous matches) - if {$varbef($name) eq $pathsep || [set idx [string first\ - $varbef($name) $varaft($name)]] == -1} { + # if content must both be prepended and appended but each side uses a + # different delimiter character, consider new value totally different + if {$varbef($name) eq $pathsep || $idx == -1 || ($doprepend &&\ + $doappend && $predelim ne $appdelim)} { lappend modcontent [list setenv $name $varaft($name)] } else { + set alllist [list] + # de-dup pre-existing list to correctly determine if new dup added + lappendNoDup alllist {*}[split $varbef($name) $delim] + set addmodcmd [list] # content should be prepended - if {$idx > 0} { - set modcmd [list prepend-path] - # check from the end to get the largest chunk to prepend - set idx [string last $varbef($name) $varaft($name)] - # get delimiter from char found between new and existing value - set delim [string index $varaft($name) $idx-1] - if {$delim ne $pathsep} { - lappend modcmd -d $delim - } - lappend modcmd $name - # split value and remove duplicate entries - set vallist [list] - lappendNoDup vallist {*}[split [string range $varaft($name) 0\ - $idx-2] $delim] + if {$doprepend} { + set prelist [split [string range $varaft($name) 0 $idx-2]\ + $delim] # an empty element is added - if {![llength $vallist]} { - lappend vallist {} + if {![llength $prelist]} { + lappend prelist {} } - lappend modcontent [list {*}$modcmd {*}$vallist] + lappend alllist {*}$prelist + lappend addmodcmd prepend-path $prelist } # content should be appended - if {($idx + [string length $varbef($name)]) < [string length\ - $varaft($name)]} { - set modcmd [list append-path] - set delim [string index $varaft($name) $idx+[string length\ - $varbef($name)]] - if {$delim ne $pathsep} { - lappend modcmd -d $delim + if {$doappend} { + set applist [split [string range $varaft($name) [expr\ + {$appdelim_idx + 1}] end] $delim] + # an empty element is added + if {![llength $applist]} { + lappend applist {} } - lappend modcmd $name - set vallist [list] - lappendNoDup vallist {*}[split [string range $varaft($name)\ - [expr {$idx + [string length $varbef($name)] + 1}] end]\ - $delim] - if {![llength $vallist]} { - lappend vallist {} + lappend alllist {*}$applist + lappend addmodcmd append-path $applist + } + + # if a directory is found several times in prepended or appended + # list, or across both list, or already in pre-existing value: + # should not be de-duplicated by prepend-path/append-path's + # default behavior, nor relocated by the path_entry_reorder + # configuration option. a plain membership test (rather than + # merging pre-existing value into alllist) is required here, as + # merging would let lappendNoDup silently skip an entry already + # in alllist, hiding the very overlap this check looks for + set isdup [isDupInList $alllist] + + foreach {cmd addlist} $addmodcmd { + set addcmd [list $cmd] + if {$isdup} { + lappend addcmd --duplicates + } + if {$delim ne $pathsep} { + lappend addcmd -d $delim } - lappend modcontent [list {*}$modcmd {*}$vallist] + lappend addcmd $name {*}$addlist + lappend modcontent $addcmd } } } diff --git a/tcl/util.tcl b/tcl/util.tcl index b636506f6..03873e530 100644 --- a/tcl/util.tcl +++ b/tcl/util.tcl @@ -322,6 +322,13 @@ proc getDiffBetweenList {list1 list2} { return [list $res1 $res2] } +# returns if at least one element in list is present several times +proc isDupInList {arg_list} { + ##nagelfar ignore #2 Unknown variable + lappendNoDup uniq_list {*}$arg_list + return [expr {[llength $arg_list] != [llength $uniq_list]}] +} + # return intersection of all lists: elements present in every list proc getIntersectBetweenList {args} { foreach lst $args { diff --git a/testsuite/modules.50-cmds/400-source-sh.exp b/testsuite/modules.50-cmds/400-source-sh.exp index e4e245d31..57e53b78c 100644 --- a/testsuite/modules.50-cmds/400-source-sh.exp +++ b/testsuite/modules.50-cmds/400-source-sh.exp @@ -23,13 +23,39 @@ set mp $modpath.2 set mpre [regsub -all "\(\[.+?\]\)" $mp {\\\1}] +foreach path_entry_reorder {0 1} { + +setenv_var MODULES_PATH_ENTRY_REORDER $path_entry_reorder + +# reset state accumulated by a previous run through this loop, so each +# path_entry_reorder value is tested from the same clean starting point +foreach var [array names env -glob FOO*] { + unsetenv_var $var +} +foreach var [array names env -glob __MODULES_*] { + unsetenv_var $var +} +unsetenv_var TESTSUITE_SHTOMOD_NOVAR +unsetenv_var TESTSUITE_SHTOMOD_NOPATH +unsetenv_var TESTSUITE_SHTOMOD_NOFUNC +unsetenv_var TESTSUITE_SHTOMOD_NOALIAS +unsetenv_var TESTSUITE_SHTOMOD_NOCOMP +unsetenv_var TESTSUITE_SHTOMOD_NOCD +unsetenv_var TESTSUITE_SHTOMOD_PATHDUP +unsetenv_var TESTSUITE_SHTOMOD_MODULE +unsetenv_var TESTSUITE_SHTOMOD_UNSETALFUNCCOMP +unsetenv_var TESTSUITE_SHTOMOD_FUZZYOUT1 +unsetenv_var TESTSUITE_SOURCESH_ESCCHAR +unsetenv_var MODULES_SET_SHELL_STARTUP +unsetenv_var MODULES_CMD +unsetenv_loaded_module + # setup specific environment setenv_path_var MODULEPATH $mp setenv_var TESTSUITE_SHTOMOD_PATHDUP 1 setenv_var TESTSUITE_SHTOMOD_NOCOMP 1 -setenv_var MODULES_PATH_ENTRY_REORDER 0 # # load and unload tests @@ -202,13 +228,13 @@ set ans [list] lappend ans [list set FOOPATHDUPEM :/path/to/dir1:/path/to/dir1:/path/to/dir2:/path/to/dir1:/path/to/dir3::/path/to/dir3] lappend ans [list unset __MODULES_SHARE_FOOPATHDUPEM] lappend ans [list set __MODULES_SHARE_FOOPATHDUPMIX ":2:/path/to/dir3:2"] -lappend ans [list set FOOPATHDUPMIX :/path/to/dir1:/path/to/dir1\ /path/to/dir2\ /path/to/dir1:/path/to/dir3] +lappend ans [list set FOOPATHDUPMIX :/path/to/dir1:/path/to/dir1\ /path/to/dir2\ /path/to/dir1:/path/to/dir3:/path/to/dir3:] lappend ans [list set FOOPATH /path/to/dir1:/path/to/dir2:/path/to/dir3] lappend ans [list set __MODULES_LMREFRESH source-sh/1:source-sh/2:source-sh/3] lappend ans [list set _LMFILES_ $mp/source-sh/1:$mp/source-sh/2:$mp/source-sh/3] lappend ans [list set LOADEDMODULES source-sh/1:source-sh/2:source-sh/3] lappend ans [list set FOOPATHDUP "/path/to/dir1:/path/to/dir1:/path/to/dir2:/path/to/dir1:/path/to/dir3:/path/to dir4:/path/to/dir3"] -lappend ans [list set __MODULES_LMSOURCESH source-sh/1\&bash\ testsuite/example/sh-to-mod.sh\|chdir\ $mp\|prepend-path\ FOOPATH\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHCB\ /path/to/dir1\ /path/to/d\\\{r2\ /path/to/dir3\|prepend-path\ FOOPATHDUP\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\ \{/path/to\ dir4\}\|prepend-path\ FOOPATHDUPEM\ \{\}\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHDUPMIX\ \{\}\ /path/to/dir1\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir1\}\ /path/to/dir3\|prepend-path\ FOOPATHDUPSP\ \{/path/to/dir1\ /path/to/dir1\ /path/to/dir2\ /path/to/dir1\ /path/to/dir3\ /path/to\}\ \{dir4\ /path/to/dir3\}\|prepend-path\ FOOPATHEM\ \{\}\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHWC\ /path/to/dir1\ /path/to/d\*r2\ /path/to/dir3\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOO\ value\|setenv\ FOOCB\ va\\\{ue\|setenv\ FOOEM\ \{\}\|setenv\ FOOPATHDUPSPEM\ \{/path/to/dir1\ /path/to/dir1\ /path/to/dir2\ /path/to/dir1\ /path/to/dir3\ /path/to/dir3\ \}\|setenv\ FOOPATHSP\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir3\}\|setenv\ FOOPATHSPEM\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir3\ \}\|setenv\ FOOSP\ \{value\ \}\|setenv\ FOOWC\ va\*ue:source-sh/2\&sh\ testsuite/example/mini-sh-to-mod.sh\|prepend-path\ FOOPATH\ /path/to/mini\|set-alias\ almini\ \{\}\|setenv\ FOOMINI\ value:source-sh/3\&bash\ testsuite/example/sh-to-mod.sh\|append-path\ FOOPATHDUPMIX\ /path/to/dir3\ \{\}\|chdir\ $mp\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOOPATH\ /path/to/dir1\/path/to/dir2\/path/to/dir3\|setenv\ FOOPATHDUP\ \{/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\/path/to\ dir4\/path/to/dir3\}\|setenv\ FOOPATHDUPEM\ \/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\\/path/to/dir3] +lappend ans [list set __MODULES_LMSOURCESH source-sh/1\&bash\ testsuite/example/sh-to-mod.sh\|chdir\ $mp\|prepend-path\ FOOPATH\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHCB\ /path/to/dir1\ /path/to/d\\\{r2\ /path/to/dir3\|prepend-path\ FOOPATHDUP\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\ \{/path/to\ dir4\}\|prepend-path\ FOOPATHDUPEM\ \{\}\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHDUPMIX\ \{\}\ /path/to/dir1\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir1\}\ /path/to/dir3\|prepend-path\ FOOPATHDUPSP\ \{/path/to/dir1\ /path/to/dir1\ /path/to/dir2\ /path/to/dir1\ /path/to/dir3\ /path/to\}\ \{dir4\ /path/to/dir3\}\|prepend-path\ FOOPATHEM\ \{\}\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHWC\ /path/to/dir1\ /path/to/d\*r2\ /path/to/dir3\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOO\ value\|setenv\ FOOCB\ va\\\{ue\|setenv\ FOOEM\ \{\}\|setenv\ FOOPATHDUPSPEM\ \{/path/to/dir1\ /path/to/dir1\ /path/to/dir2\ /path/to/dir1\ /path/to/dir3\ /path/to/dir3\ \}\|setenv\ FOOPATHSP\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir3\}\|setenv\ FOOPATHSPEM\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir3\ \}\|setenv\ FOOSP\ \{value\ \}\|setenv\ FOOWC\ va\*ue:source-sh/2\&sh\ testsuite/example/mini-sh-to-mod.sh\|prepend-path\ FOOPATH\ /path/to/mini\|set-alias\ almini\ \{\}\|setenv\ FOOMINI\ value:source-sh/3\&bash\ testsuite/example/sh-to-mod.sh\|append-path\ --duplicates\ FOOPATHDUPMIX\ /path/to/dir3\ \{\}\|chdir\ $mp\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOOPATH\ /path/to/dir1\/path/to/dir2\/path/to/dir3\|setenv\ FOOPATHDUP\ \{/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\/path/to\ dir4\/path/to/dir3\}\|setenv\ FOOPATHDUPEM\ \/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\\/path/to/dir3] lappend ans [list alias alsp {echo f\"o; echo b\\\"r; echo f\'o}] lappend ans [list alias alfoo {echo $(grep "report .Modules " ../../modulecmd.tcl | tr -d \\ 2>/dev/null | awk '{print $3}')}] lappend ans [list alias alcb echo\ f\{o] @@ -232,16 +258,16 @@ setenv_var FOOPATHDUP "/path/to/dir1:/path/to/dir1:/path/to/dir2:/path/to/dir1:/ unsetenv_var __MODULES_SHARE_FOOPATHDUPEM unsetenv_var __MODULES_SHARE_FOOPATH unsetenv_var __MODULES_SHARE_FOOPATHDUP -setenv_path_var FOOPATHDUPMIX :/path/to/dir1:/path/to/dir1\ /path/to/dir2\ /path/to/dir1:/path/to/dir3 +setenv_path_var FOOPATHDUPMIX :/path/to/dir1:/path/to/dir1\ /path/to/dir2\ /path/to/dir1:/path/to/dir3:/path/to/dir3: setenv_var FOOPATH /path/to/dir1:/path/to/dir2:/path/to/dir3 setenv_var FOOPATHDUPEM :/path/to/dir1:/path/to/dir1:/path/to/dir2:/path/to/dir1:/path/to/dir3::/path/to/dir3 -setenv_var __MODULES_LMSOURCESH source-sh/1\&bash\ testsuite/example/sh-to-mod.sh\|chdir\ $mp\|prepend-path\ FOOPATH\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHCB\ /path/to/dir1\ /path/to/d\\\{r2\ /path/to/dir3\|prepend-path\ FOOPATHDUP\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\ \{/path/to\ dir4\}\|prepend-path\ FOOPATHDUPEM\ \{\}\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHDUPMIX\ \{\}\ /path/to/dir1\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir1\}\ /path/to/dir3\|prepend-path\ FOOPATHDUPSP\ \{/path/to/dir1\ /path/to/dir1\ /path/to/dir2\ /path/to/dir1\ /path/to/dir3\ /path/to\}\ \{dir4\ /path/to/dir3\}\|prepend-path\ FOOPATHEM\ \{\}\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHWC\ /path/to/dir1\ /path/to/d\*r2\ /path/to/dir3\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOO\ value\|setenv\ FOOCB\ va\\\{ue\|setenv\ FOOEM\ \{\}\|setenv\ FOOPATHDUPSPEM\ \{/path/to/dir1\ /path/to/dir1\ /path/to/dir2\ /path/to/dir1\ /path/to/dir3\ /path/to/dir3\ \}\|setenv\ FOOPATHSP\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir3\}\|setenv\ FOOPATHSPEM\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir3\ \}\|setenv\ FOOSP\ \{value\ \}\|setenv\ FOOWC\ va\*ue:source-sh/2\&sh\ testsuite/example/mini-sh-to-mod.sh\|prepend-path\ FOOPATH\ /path/to/mini\|set-alias\ almini\ \{\}\|setenv\ FOOMINI\ value:source-sh/3\&bash\ testsuite/example/sh-to-mod.sh\|append-path\ FOOPATHDUPMIX\ /path/to/dir3\ \{\}\|chdir\ $mp\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOOPATH\ /path/to/dir1\/path/to/dir2\/path/to/dir3\|setenv\ FOOPATHDUP\ \{/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\/path/to\ dir4\/path/to/dir3\}\|setenv\ FOOPATHDUPEM\ \/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\\/path/to/dir3 +setenv_var __MODULES_LMSOURCESH source-sh/1\&bash\ testsuite/example/sh-to-mod.sh\|chdir\ $mp\|prepend-path\ FOOPATH\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHCB\ /path/to/dir1\ /path/to/d\\\{r2\ /path/to/dir3\|prepend-path\ FOOPATHDUP\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\ \{/path/to\ dir4\}\|prepend-path\ FOOPATHDUPEM\ \{\}\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHDUPMIX\ \{\}\ /path/to/dir1\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir1\}\ /path/to/dir3\|prepend-path\ FOOPATHDUPSP\ \{/path/to/dir1\ /path/to/dir1\ /path/to/dir2\ /path/to/dir1\ /path/to/dir3\ /path/to\}\ \{dir4\ /path/to/dir3\}\|prepend-path\ FOOPATHEM\ \{\}\ /path/to/dir1\ /path/to/dir2\ /path/to/dir3\|prepend-path\ FOOPATHWC\ /path/to/dir1\ /path/to/d\*r2\ /path/to/dir3\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOO\ value\|setenv\ FOOCB\ va\\\{ue\|setenv\ FOOEM\ \{\}\|setenv\ FOOPATHDUPSPEM\ \{/path/to/dir1\ /path/to/dir1\ /path/to/dir2\ /path/to/dir1\ /path/to/dir3\ /path/to/dir3\ \}\|setenv\ FOOPATHSP\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir3\}\|setenv\ FOOPATHSPEM\ \{/path/to/dir1\ /path/to/dir2\ /path/to/dir3\ \}\|setenv\ FOOSP\ \{value\ \}\|setenv\ FOOWC\ va\*ue:source-sh/2\&sh\ testsuite/example/mini-sh-to-mod.sh\|prepend-path\ FOOPATH\ /path/to/mini\|set-alias\ almini\ \{\}\|setenv\ FOOMINI\ value:source-sh/3\&bash\ testsuite/example/sh-to-mod.sh\|append-path\ --duplicates\ FOOPATHDUPMIX\ /path/to/dir3\ \{\}\|chdir\ $mp\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOOPATH\ /path/to/dir1\/path/to/dir2\/path/to/dir3\|setenv\ FOOPATHDUP\ \{/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\/path/to\ dir4\/path/to/dir3\}\|setenv\ FOOPATHDUPEM\ \/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\\/path/to/dir3 set ans [list] lappend ans [list set _LMFILES_ $mp/source-sh/2:$mp/source-sh/3] lappend ans [list set LOADEDMODULES source-sh/2:source-sh/3] lappend ans [list unset FOOPATHDUP] -lappend ans [list set __MODULES_LMSOURCESH source-sh/2\&sh\ testsuite/example/mini-sh-to-mod.sh\|prepend-path\ FOOPATH\ /path/to/mini\|set-alias\ almini\ \{\}\|setenv\ FOOMINI\ value:source-sh/3\&bash\ testsuite/example/sh-to-mod.sh\|append-path\ FOOPATHDUPMIX\ /path/to/dir3\ \{\}\|chdir\ $mp\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOOPATH\ /path/to/dir1\/path/to/dir2\/path/to/dir3\|setenv\ FOOPATHDUP\ \{/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\/path/to\ dir4\/path/to/dir3\}\|setenv\ FOOPATHDUPEM\ \/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\\/path/to/dir3] +lappend ans [list set __MODULES_LMSOURCESH source-sh/2\&sh\ testsuite/example/mini-sh-to-mod.sh\|prepend-path\ FOOPATH\ /path/to/mini\|set-alias\ almini\ \{\}\|setenv\ FOOMINI\ value:source-sh/3\&bash\ testsuite/example/sh-to-mod.sh\|append-path\ --duplicates\ FOOPATHDUPMIX\ /path/to/dir3\ \{\}\|chdir\ $mp\|set-alias\ alcb\ \{\}\|set-alias\ alem\ \{\}\|set-alias\ alfoo\ \{\}\|set-alias\ alsp\ \{\}\|set-function\ funccb\ \{\}\|set-function\ funcfoo\ \{\}\|set-function\ funcnl\ \{\}\|set-function\ funcsp\ \{\}\|set-function\ funcwc\ \{\}\|setenv\ FOOPATH\ /path/to/dir1\/path/to/dir2\/path/to/dir3\|setenv\ FOOPATHDUP\ \{/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\/path/to\ dir4\/path/to/dir3\}\|setenv\ FOOPATHDUPEM\ \/path/to/dir1\/path/to/dir1\/path/to/dir2\/path/to/dir1\/path/to/dir3\\/path/to/dir3] lappend ans [list unset FOOPATHEM] lappend ans [list unset FOOPATHSP] lappend ans [list unset FOOPATHCB] @@ -367,7 +393,6 @@ testouterr_cmd sh {display source-sh/4.3} ERR $tserr_disp2 set tserr_disp3 "------------------------------------------------------------------- $mp/source-sh/5.0: -append-path FOOPATHDUPMIX /path/to/dir3 {} chdir $mp set-alias\talcb {echo\ f\{o} set-alias\talem {} @@ -388,7 +413,6 @@ set-function\tfuncwc { echo sou*sh} prepend-path FOOPATH /path/to/mini set-alias almini {echo mini} -append-path FOOPATHDUPMIX /path/to/dir3 {} chdir $mp set-alias\talcb {echo\ f\{o} set-alias\talem {} @@ -414,7 +438,6 @@ testouterr_cmd sh {display source-sh/5.0} OK $tserr_disp3 set tserr_disp4 "------------------------------------------------------------------- $mp/source-sh/5.1: -append-path FOOPATHDUPMIX /path/to/dir3 {} chdir $mp set-alias\talcb {echo\ f\{o} set-alias\talem {} @@ -437,7 +460,6 @@ setenv FOOARG1 arg1 setenv FOOARG2 arg2 prepend-path FOOPATH /path/to/mini set-alias almini {echo mini} -append-path FOOPATHDUPMIX /path/to/dir3 {} chdir $mp set-alias\talcb {echo\ f\{o} set-alias\talem {} @@ -527,7 +549,7 @@ $mp/source-sh/5.0: chdir $mp prepend-path FOOPATH /path/to/dir1 /path/to/dir2 /path/to/dir3 -prepend-path FOOPATHCB /path/to/dir1 /path/to/d{r2 /path/to/dir3 +prepend-path FOOPATHCB /path/to/dir1 /path/to/d\{r2 /path/to/dir3 prepend-path FOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir3 {/path/to dir4} prepend-path FOOPATHDUPEM {} /path/to/dir1 /path/to/dir2 /path/to/dir3 prepend-path FOOPATHDUPMIX {} /path/to/dir1 {/path/to/dir1 /path/to/dir2 /path/to/dir1} /path/to/dir3 @@ -552,7 +574,7 @@ set-function\tfuncsp { set-function\tfuncwc { echo sou*sh} setenv FOO value -setenv FOOCB va{ue +setenv FOOCB va\{ue setenv FOOEM {} setenv FOOPATHDUPSPEM {/path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 /path/to/dir3 } setenv FOOPATHSP {/path/to/dir1 /path/to/dir2 /path/to/dir3} @@ -562,7 +584,7 @@ setenv FOOWC va*ue prepend-path FOOPATH /path/to/mini set-alias almini {echo mini} setenv FOOMINI value -append-path FOOPATHDUPMIX /path/to/dir3 {} +append-path --duplicates FOOPATHDUPMIX /path/to/dir3 {} chdir $mp set-alias\talcb {echo\ f\{o} set-alias\talem {} @@ -592,7 +614,7 @@ $mp/source-sh/5.1: chdir $mp prepend-path FOOPATH /path/to/dir1 /path/to/dir2 /path/to/dir3 -prepend-path FOOPATHCB /path/to/dir1 /path/to/d{r2 /path/to/dir3 +prepend-path FOOPATHCB /path/to/dir1 /path/to/d\{r2 /path/to/dir3 prepend-path FOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir3 {/path/to dir4} prepend-path FOOPATHDUPEM {} /path/to/dir1 /path/to/dir2 /path/to/dir3 prepend-path FOOPATHDUPMIX {} /path/to/dir1 {/path/to/dir1 /path/to/dir2 /path/to/dir1} /path/to/dir3 @@ -619,7 +641,7 @@ set-function\tfuncwc { setenv FOO value setenv FOOARG1 arg1 setenv FOOARG2 arg2 -setenv FOOCB va{ue +setenv FOOCB va\{ue setenv FOOEM {} setenv FOOPATHDUPSPEM {/path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 /path/to/dir3 } setenv FOOPATHSP {/path/to/dir1 /path/to/dir2 /path/to/dir3} @@ -629,7 +651,7 @@ setenv FOOWC va*ue prepend-path FOOPATH /path/to/mini set-alias almini {echo mini} setenv FOOMINI value -append-path FOOPATHDUPMIX /path/to/dir3 {} +append-path --duplicates FOOPATHDUPMIX /path/to/dir3 {} chdir $mp set-alias\talcb {echo\ f\{o} set-alias\talem {} @@ -1002,7 +1024,7 @@ set tserr_disp3 "--------------------------------------------------------------- $mp/source-sh/5.0: setenv FOO value -setenv FOOCB va{ue +setenv FOOCB va\{ue setenv FOOEM {} setenv FOOSP {value } setenv FOOWC va*ue @@ -1968,6 +1990,8 @@ unsetenv_var TESTSUITE_SHTOMOD_UNSETALFUNCCOMP send_user "\tSkip tests relying on an excepted siteconfig file installed\n" } +} + # # Cleanup diff --git a/testsuite/modules.70-maint/310-sh-to-mod.exp b/testsuite/modules.70-maint/310-sh-to-mod.exp index 646024455..652dae30f 100644 --- a/testsuite/modules.70-maint/310-sh-to-mod.exp +++ b/testsuite/modules.70-maint/310-sh-to-mod.exp @@ -147,7 +147,7 @@ if {$install_setbinpath eq {y} && $install_bindir ni [split $::env(PATH) :]} { } } set tsvar "setenv\t\tFOO value -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOPATHSP {/path/to/dir1 /path/to/dir2 /path/to/dir3} setenv\t\tFOOPATHSPEM {/path/to/dir1 /path/to/dir2 /path/to/dir3 } @@ -271,6 +271,35 @@ complete\tfish othercmd {--short-option 'V' --description 'Command version'}" set tscwd "chdir\t\t$env(TESTSUITEDIR)/modulefiles.2" +# +# The tests +# + +foreach path_entry_reorder {0 1} { + +setenv_var MODULES_PATH_ENTRY_REORDER $path_entry_reorder + +# reset state accumulated by a previous run through this loop, so each +# path_entry_reorder value is tested from the same clean starting point +foreach var [array names env -glob FOO*] { + unsetenv_var $var +} +unsetenv_var TESTSUITE_SHTOMOD_NOVAR +unsetenv_var TESTSUITE_SHTOMOD_NOPATH +unsetenv_var TESTSUITE_SHTOMOD_NOFUNC +unsetenv_var TESTSUITE_SHTOMOD_NOALIAS +unsetenv_var TESTSUITE_SHTOMOD_NOCOMP +unsetenv_var TESTSUITE_SHTOMOD_NOCD +unsetenv_var TESTSUITE_SHTOMOD_SHELLVAR +unsetenv_var TESTSUITE_SHTOMOD_PATHDUP +unsetenv_var TESTSUITE_SHTOMOD_MODULE +unsetenv_var MODULES_SET_SHELL_STARTUP +unsetenv_var MODULES_CMD +unsetenv_var MODULES_COLLECTION_TARGET +unsetenv_var testsuite +unsetenv_path_var MODULEPATH +unsetenv_loaded_module + # test unknown shell testouterr_shtomod unk {} ERR "$error_msgs: Shell 'unk' not supported" $testscriptsh @@ -439,7 +468,7 @@ unsetenv_var TESTSUITE_SHTOMOD_SHELLVAR unsetenv_var TESTSUITE_SHTOMOD_NOVAR set tserr_noarg "#%Module setenv\t\tFOO value -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOSP {value } setenv\t\tFOOWC va*ue" @@ -447,8 +476,8 @@ set tserr "#%Module setenv\t\tFOO value setenv\t\tFOOARG1 val setenv\t\tFOOARG2 {value } -setenv\t\tFOOARG3 val\\{ue -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOARG3 val\\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOSP {value } setenv\t\tFOOWC va*ue" @@ -490,7 +519,7 @@ setenv\t\tFOOARG1 v'l setenv\t\tFOOARG2 val\\\"e setenv\t\tFOOARG3 {val\\\"e} setenv\t\tFOOARG4 {} -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOSP {value } setenv\t\tFOOWC va*ue" @@ -534,7 +563,7 @@ setenv\t\tFOOARG1 v'l setenv\t\tFOOARG2 val\\\"e setenv\t\tFOOARG3 {val\\\"e} setenv\t\tFOOARG4 {} -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOSP {value } setenv\t\tFOOWC va*ue" @@ -579,14 +608,14 @@ setenv_var FOOPATH /path/to/dir1:/path/to/dir2:/path/to/dir3 setenv_var FOOPATHEM :/path/to/dir1:/path/to/dir2:/path/to/dir3 setenv_var FOOPATHSP "/path/to/dir1 /path/to/dir2 /path/to/dir3" setenv_var FOOPATHSPEM "/path/to/dir1 /path/to/dir2 /path/to/dir3 " -setenv_var FOOPATHCB /path/to/dir1:/path/to/d{r2:/path/to/dir3 +setenv_var FOOPATHCB /path/to/dir1:/path/to/d\{r2:/path/to/dir3 setenv_var FOOPATHWC /path/to/dir1:/path/to/d*r2:/path/to/dir3 testouterr_shtomod ALL {} OK {} setenv_var FOOPATH /path/to/dir2 setenv_var FOOPATHEM /path/to/dir2 setenv_var FOOPATHSP /path/to/dir2 setenv_var FOOPATHSPEM /path/to/dir2 -setenv_var FOOPATHCB /path/to/d{r2 +setenv_var FOOPATHCB /path/to/d\{r2 setenv_var FOOPATHWC /path/to/d*r2 set tserr "#%Module append-path\t-d { } FOOPATHSP /path/to/dir3 @@ -606,21 +635,18 @@ setenv_var FOOPATH "/path/to/dir2:/path" setenv_var FOOPATHEM "/path/to/dir2:/path" setenv_var FOOPATHSP "/path/to/dir2 /path" setenv_var FOOPATHSPEM "/path/to/dir2 /path" -setenv_var FOOPATHCB "/path/to/d{r2:/path" +setenv_var FOOPATHCB "/path/to/d\{r2:/path" setenv_var FOOPATHWC "/path/to/d*r2:/path" +# the prepend and append chunks here would use a different delimiter +# character ('/' vs ':'): a plain setenv is used instead of the two path +# commands, to produce a more consistent value set tserr "#%Module -append-path\t-d / FOOPATH to dir3 -append-path\t-d / FOOPATHCB to dir3 -append-path\t-d / FOOPATHEM to dir3 -append-path\t-d / FOOPATHSP to dir3 -append-path\t-d / FOOPATHSPEM to {dir3 } -append-path\t-d / FOOPATHWC to dir3 -prepend-path\t-d { } FOOPATHSP /path/to/dir1 -prepend-path\t-d { } FOOPATHSPEM /path/to/dir1 -prepend-path\tFOOPATH /path/to/dir1 -prepend-path\tFOOPATHCB /path/to/dir1 -prepend-path\tFOOPATHEM {} /path/to/dir1 -prepend-path\tFOOPATHWC /path/to/dir1" +setenv\t\tFOOPATH /path/to/dir1:/path/to/dir2:/path/to/dir3 +setenv\t\tFOOPATHCB /path/to/dir1:/path/to/d\\\{r2:/path/to/dir3 +setenv\t\tFOOPATHEM :/path/to/dir1:/path/to/dir2:/path/to/dir3 +setenv\t\tFOOPATHSP {/path/to/dir1 /path/to/dir2 /path/to/dir3} +setenv\t\tFOOPATHSPEM {/path/to/dir1 /path/to/dir2 /path/to/dir3 } +setenv\t\tFOOPATHWC /path/to/dir1:/path/to/d*r2:/path/to/dir3" testouterr_shtomod ALL {} OK $tserr unsetenv_var FOOPATH unsetenv_var FOOPATHEM @@ -663,16 +689,16 @@ setenv_var FOOPATHDUPMIX /path/to/dir2 setenv_var FOOPATHDUPSP /path/to/dir2 setenv_var FOOPATHDUPSPEM /path/to/dir2 set tserr "#%Module +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir3 /path/to:dir4 /path/to/dir3 +append-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir3 /path/to/dir3 {} +append-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir3 {/path/to dir4} /path/to/dir3 +append-path\t--duplicates FOOPATHDUPEM /path/to/dir1 /path/to/dir3 {} /path/to/dir3 append-path\t-d { } FOOPATHDUPMIX /path/to/dir1:/path/to/dir3:/path/to/dir3: -append-path\t-d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir3 /path/to:dir4 -append-path\t-d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir3 {} -append-path\tFOOPATHDUP /path/to/dir1 /path/to/dir3 {/path/to dir4} -append-path\tFOOPATHDUPEM /path/to/dir1 /path/to/dir3 {} -prepend-path\t-d { } FOOPATHDUPMIX :/path/to/dir1:/path/to/dir1 -prepend-path\t-d { } FOOPATHDUPSP /path/to/dir1 -prepend-path\t-d { } FOOPATHDUPSPEM /path/to/dir1 -prepend-path\tFOOPATHDUP /path/to/dir1 -prepend-path\tFOOPATHDUPEM {} /path/to/dir1" +prepend-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates FOOPATHDUPEM {} /path/to/dir1 /path/to/dir1 +prepend-path\t-d { } FOOPATHDUPMIX :/path/to/dir1:/path/to/dir1" testouterr_shtomod ALL {} OK $tserr # multiple paths as prior value @@ -682,16 +708,15 @@ setenv_var FOOPATHDUPMIX "/path/to/dir2 /path/to/dir1" setenv_var FOOPATHDUPSP "/path/to/dir2 /path/to/dir1" setenv_var FOOPATHDUPSPEM "/path/to/dir2 /path/to/dir1" set tserr "#%Module -append-path\t-d { } FOOPATHDUPSP /path/to/dir3 /path/to:dir4 -append-path\t-d { } FOOPATHDUPSPEM /path/to/dir3 {} -append-path\tFOOPATHDUP /path/to/dir3 {/path/to dir4} -append-path\tFOOPATHDUPEM /path/to/dir3 {} -append-path\tFOOPATHDUPMIX /path/to/dir3 {} -prepend-path\t-d { } FOOPATHDUPMIX :/path/to/dir1:/path/to/dir1 -prepend-path\t-d { } FOOPATHDUPSP /path/to/dir1 -prepend-path\t-d { } FOOPATHDUPSPEM /path/to/dir1 -prepend-path\tFOOPATHDUP /path/to/dir1 -prepend-path\tFOOPATHDUPEM {} /path/to/dir1" +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir3 /path/to:dir4 /path/to/dir3 +append-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir3 /path/to/dir3 {} +append-path\t--duplicates FOOPATHDUP /path/to/dir3 {/path/to dir4} /path/to/dir3 +append-path\t--duplicates FOOPATHDUPEM /path/to/dir3 {} /path/to/dir3 +prepend-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates FOOPATHDUPEM {} /path/to/dir1 /path/to/dir1 +setenv\t\tFOOPATHDUPMIX {:/path/to/dir1:/path/to/dir1 /path/to/dir2 /path/to/dir1:/path/to/dir3:/path/to/dir3:}" testouterr_shtomod ALL {} OK $tserr # ambiguous prior value @@ -701,8 +726,8 @@ setenv_var FOOPATHDUPMIX : setenv_var FOOPATHDUPSP /path/to/dir1 setenv_var FOOPATHDUPSPEM { } set tserr "#%Module -append-path\t-d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir2 /path/to/dir3 /path/to:dir4 -append-path\tFOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir3 {/path/to dir4} +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 /path/to:dir4 /path/to/dir3 +append-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 {/path/to dir4} /path/to/dir3 prepend-path\t-d 3 FOOPATHDUPSPEM {/path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir} { /path/to/dir} setenv\t\tFOOPATHDUPEM :/path/to/dir1:/path/to/dir1:/path/to/dir2:/path/to/dir1:/path/to/dir3::/path/to/dir3 setenv\t\tFOOPATHDUPMIX {:/path/to/dir1:/path/to/dir1 /path/to/dir2 /path/to/dir1:/path/to/dir3:/path/to/dir3:}" @@ -715,8 +740,8 @@ setenv_var FOOPATHDUPMIX {} setenv_var FOOPATHDUPSP /path/to/dir1 setenv_var FOOPATHDUPSPEM {} set tserr "#%Module -append-path\t-d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir2 /path/to/dir3 /path/to:dir4 -append-path\tFOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir3 {/path/to dir4} +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 /path/to:dir4 /path/to/dir3 +append-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 {/path/to dir4} /path/to/dir3 setenv\t\tFOOPATHDUPEM :/path/to/dir1:/path/to/dir1:/path/to/dir2:/path/to/dir1:/path/to/dir3::/path/to/dir3 setenv\t\tFOOPATHDUPMIX {:/path/to/dir1:/path/to/dir1 /path/to/dir2 /path/to/dir1:/path/to/dir3:/path/to/dir3:} setenv\t\tFOOPATHDUPSPEM {/path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 /path/to/dir3 }" @@ -729,14 +754,13 @@ setenv_var FOOPATHDUPMIX "/path/to/dir1 /path/to/dir2" setenv_var FOOPATHDUPSP {/path/to:dir4} setenv_var FOOPATHDUPSPEM {/path/to/dir3 } set tserr "#%Module -append-path\t-d { } FOOPATHDUPMIX /path/to/dir1:/path/to/dir3:/path/to/dir3: -append-path\t-d { } FOOPATHDUPSP /path/to/dir3 -append-path\tFOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir3 {/path/to dir4} -append-path\tFOOPATHDUPEM /path/to/dir3 -prepend-path\t-d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir2 /path/to/dir3 -prepend-path\t-d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir2 /path/to/dir3 -prepend-path\tFOOPATHDUPEM {} /path/to/dir1 /path/to/dir2 -prepend-path\tFOOPATHDUPMIX {} /path/to/dir1" +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir3 +append-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 {/path/to dir4} /path/to/dir3 +append-path\t--duplicates FOOPATHDUPEM /path/to/dir3 +prepend-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 +prepend-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 +prepend-path\t--duplicates FOOPATHDUPEM {} /path/to/dir1 /path/to/dir1 /path/to/dir2 +setenv\t\tFOOPATHDUPMIX {:/path/to/dir1:/path/to/dir1 /path/to/dir2 /path/to/dir1:/path/to/dir3:/path/to/dir3:}" testouterr_shtomod ALL {} OK $tserr unsetenv_var TESTSUITE_SHTOMOD_PATHDUP @@ -887,6 +911,8 @@ if {[is_conf_enabled setpythonpath]} { append tserr $extratserr testouterr_shtomod bash {} OK $tserr +} + # # Cleanup diff --git a/testsuite/modules.70-maint/311-eval-sh-to-mod.exp b/testsuite/modules.70-maint/311-eval-sh-to-mod.exp index f0f34f979..43a10a412 100644 --- a/testsuite/modules.70-maint/311-eval-sh-to-mod.exp +++ b/testsuite/modules.70-maint/311-eval-sh-to-mod.exp @@ -20,8 +20,6 @@ # ############################################################################## -setenv_var MODULES_PATH_ENTRY_REORDER 0 - proc testouterr_shtomod {sh cmdline out err {script {}}} { if {$sh eq {ALL}} { set shlist $::shtomod_avail_shells @@ -83,7 +81,7 @@ if {[is_conf_enabled setpythonpath]} { # expected script env changes set tsvarpre "prepend-path\tFOOPATH /path/to/dir1 /path/to/dir2 /path/to/dir3 -prepend-path\tFOOPATHCB /path/to/dir1 /path/to/d\\{r2 /path/to/dir3 +prepend-path\tFOOPATHCB /path/to/dir1 /path/to/d\\\{r2 /path/to/dir3 prepend-path\tFOOPATHEM {} /path/to/dir1 /path/to/dir2 /path/to/dir3 prepend-path\tFOOPATHWC /path/to/dir1 /path/to/d*r2 /path/to/dir3" set tsvarappwpath {} @@ -148,7 +146,7 @@ if {$install_setbinpath eq {y} && $install_bindir ni [split $::env(PATH) :]} { } } set tsvar "setenv\t\tFOO value -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOPATHSP {/path/to/dir1 /path/to/dir2 /path/to/dir3} setenv\t\tFOOPATHSPEM {/path/to/dir1 /path/to/dir2 /path/to/dir3 } @@ -184,6 +182,30 @@ if {[info exists shell_pathname(bash-eval)]} { skip_if_quick_mode +foreach path_entry_reorder {0 1} { + +setenv_var MODULES_PATH_ENTRY_REORDER $path_entry_reorder + +# reset state accumulated by a previous run through this loop, so each +# path_entry_reorder value is tested from the same clean starting point +foreach var [array names env -glob FOO*] { + unsetenv_var $var +} +unsetenv_var TESTSUITE_SHTOMOD_NOVAR +unsetenv_var TESTSUITE_SHTOMOD_NOPATH +unsetenv_var TESTSUITE_SHTOMOD_NOFUNC +unsetenv_var TESTSUITE_SHTOMOD_NOALIAS +unsetenv_var TESTSUITE_SHTOMOD_NOCOMP +unsetenv_var TESTSUITE_SHTOMOD_NOCD +unsetenv_var TESTSUITE_SHTOMOD_PATHDUP +unsetenv_var TESTSUITE_SHTOMOD_MODULE +unsetenv_var MODULES_SET_SHELL_STARTUP +unsetenv_var MODULES_CMD +unsetenv_var MODULES_COLLECTION_TARGET +unsetenv_var testsuite +unsetenv_path_var MODULEPATH +unsetenv_loaded_module + # remove progressively all kind of changes setenv_var TESTSUITE_SHTOMOD_NOVAR 1 setenv_var TESTSUITE_SHTOMOD_NOPATH 1 @@ -211,7 +233,7 @@ testouterr_shtomod ALL {} OK {} unsetenv_var TESTSUITE_SHTOMOD_NOVAR set tserr_noarg "#%Module setenv\t\tFOO value -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOSP {value } setenv\t\tFOOWC va*ue" @@ -219,8 +241,8 @@ set tserr "#%Module setenv\t\tFOO value setenv\t\tFOOARG1 val setenv\t\tFOOARG2 {value } -setenv\t\tFOOARG3 val\\{ue -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOARG3 val\\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOSP {value } setenv\t\tFOOWC va*ue" @@ -234,7 +256,7 @@ setenv\t\tFOOARG1 v'l setenv\t\tFOOARG2 val\\\"e setenv\t\tFOOARG3 {val\\\"e} setenv\t\tFOOARG4 {} -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOSP {value } setenv\t\tFOOWC va*ue" @@ -250,7 +272,7 @@ setenv\t\tFOOARG1 v'l setenv\t\tFOOARG2 val\\\"e setenv\t\tFOOARG3 {val\\\"e} setenv\t\tFOOARG4 {} -setenv\t\tFOOCB va\\{ue +setenv\t\tFOOCB va\\\{ue setenv\t\tFOOEM {} setenv\t\tFOOSP {value } setenv\t\tFOOWC va*ue" @@ -267,14 +289,14 @@ setenv_var FOOPATH /path/to/dir1:/path/to/dir2:/path/to/dir3 setenv_var FOOPATHEM :/path/to/dir1:/path/to/dir2:/path/to/dir3 setenv_var FOOPATHSP "/path/to/dir1 /path/to/dir2 /path/to/dir3" setenv_var FOOPATHSPEM "/path/to/dir1 /path/to/dir2 /path/to/dir3 " -setenv_var FOOPATHCB /path/to/dir1:/path/to/d{r2:/path/to/dir3 +setenv_var FOOPATHCB /path/to/dir1:/path/to/d\{r2:/path/to/dir3 setenv_var FOOPATHWC /path/to/dir1:/path/to/d*r2:/path/to/dir3 testouterr_shtomod ALL {} OK {} setenv_var FOOPATH /path/to/dir2 setenv_var FOOPATHEM /path/to/dir2 setenv_var FOOPATHSP /path/to/dir2 setenv_var FOOPATHSPEM /path/to/dir2 -setenv_var FOOPATHCB /path/to/d{r2 +setenv_var FOOPATHCB /path/to/d\{r2 setenv_var FOOPATHWC /path/to/d*r2 set tserr "#%Module append-path\t-d { } FOOPATHSP /path/to/dir3 @@ -294,21 +316,18 @@ setenv_var FOOPATH "/path/to/dir2:/path" setenv_var FOOPATHEM "/path/to/dir2:/path" setenv_var FOOPATHSP "/path/to/dir2 /path" setenv_var FOOPATHSPEM "/path/to/dir2 /path" -setenv_var FOOPATHCB "/path/to/d{r2:/path" +setenv_var FOOPATHCB "/path/to/d\{r2:/path" setenv_var FOOPATHWC "/path/to/d*r2:/path" +# the prepend and append chunks here would use a different delimiter +# character ('/' vs ':'): a plain setenv is used instead of the two path +# commands, to produce a more consistent value set tserr "#%Module -append-path\t-d / FOOPATH dir3 -append-path\t-d / FOOPATHCB dir3 -append-path\t-d / FOOPATHEM dir3 -append-path\t-d / FOOPATHSP dir3 -append-path\t-d / FOOPATHSPEM {dir3 } -append-path\t-d / FOOPATHWC dir3 -prepend-path\t-d { } FOOPATHSP /path/to/dir1 -prepend-path\t-d { } FOOPATHSPEM /path/to/dir1 -prepend-path\tFOOPATH /path/to/dir1 -prepend-path\tFOOPATHCB /path/to/dir1 -prepend-path\tFOOPATHEM {} /path/to/dir1 -prepend-path\tFOOPATHWC /path/to/dir1" +setenv\t\tFOOPATH /path/to/dir1:/path/to/dir2:/path/to/dir3 +setenv\t\tFOOPATHCB /path/to/dir1:/path/to/d\\\{r2:/path/to/dir3 +setenv\t\tFOOPATHEM :/path/to/dir1:/path/to/dir2:/path/to/dir3 +setenv\t\tFOOPATHSP {/path/to/dir1 /path/to/dir2 /path/to/dir3} +setenv\t\tFOOPATHSPEM {/path/to/dir1 /path/to/dir2 /path/to/dir3 } +setenv\t\tFOOPATHWC /path/to/dir1:/path/to/d*r2:/path/to/dir3" testouterr_shtomod ALL {} OK $tserr unsetenv_var FOOPATH unsetenv_var FOOPATHEM @@ -351,11 +370,15 @@ setenv_var FOOPATHDUPMIX /path/to/dir2 setenv_var FOOPATHDUPSP /path/to/dir2 setenv_var FOOPATHDUPSPEM /path/to/dir2 set tserr "#%Module +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir3 /path/to:dir4 /path/to/dir3 +append-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir3 /path/to/dir3 {} +append-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir3 {/path/to dir4} /path/to/dir3 +append-path\t--duplicates FOOPATHDUPEM /path/to/dir1 /path/to/dir3 {} /path/to/dir3 append-path\t-d { } FOOPATHDUPMIX /path/to/dir1:/path/to/dir3:/path/to/dir3: -append-path\t-d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir3 /path/to:dir4 -append-path\t-d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir3 {} -append-path\tFOOPATHDUP /path/to/dir1 /path/to/dir3 {/path/to dir4} -append-path\tFOOPATHDUPEM /path/to/dir1 /path/to/dir3 {} +prepend-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates FOOPATHDUPEM {} /path/to/dir1 /path/to/dir1 prepend-path\t-d { } FOOPATHDUPMIX :/path/to/dir1:/path/to/dir1" testouterr_shtomod ALL {} OK $tserr @@ -366,12 +389,15 @@ setenv_var FOOPATHDUPMIX "/path/to/dir2 /path/to/dir1" setenv_var FOOPATHDUPSP "/path/to/dir2 /path/to/dir1" setenv_var FOOPATHDUPSPEM "/path/to/dir2 /path/to/dir1" set tserr "#%Module -append-path\t-d { } FOOPATHDUPSP /path/to/dir3 /path/to:dir4 -append-path\t-d { } FOOPATHDUPSPEM /path/to/dir3 {} -append-path\tFOOPATHDUP /path/to/dir3 {/path/to dir4} -append-path\tFOOPATHDUPEM /path/to/dir3 {} -append-path\tFOOPATHDUPMIX /path/to/dir3 {} -prepend-path\t-d { } FOOPATHDUPMIX :/path/to/dir1:/path/to/dir1" +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir3 /path/to:dir4 /path/to/dir3 +append-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir3 /path/to/dir3 {} +append-path\t--duplicates FOOPATHDUP /path/to/dir3 {/path/to dir4} /path/to/dir3 +append-path\t--duplicates FOOPATHDUPEM /path/to/dir3 {} /path/to/dir3 +prepend-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir1 +prepend-path\t--duplicates FOOPATHDUPEM {} /path/to/dir1 /path/to/dir1 +setenv\t\tFOOPATHDUPMIX {:/path/to/dir1:/path/to/dir1 /path/to/dir2 /path/to/dir1:/path/to/dir3:/path/to/dir3:}" testouterr_shtomod ALL {} OK $tserr # ambiguous prior value @@ -381,8 +407,8 @@ setenv_var FOOPATHDUPMIX : setenv_var FOOPATHDUPSP /path/to/dir1 setenv_var FOOPATHDUPSPEM { } set tserr "#%Module -append-path\t-d { } FOOPATHDUPSP /path/to/dir2 /path/to/dir3 /path/to:dir4 -append-path\tFOOPATHDUP /path/to/dir2 /path/to/dir3 {/path/to dir4} +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 /path/to:dir4 /path/to/dir3 +append-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 {/path/to dir4} /path/to/dir3 prepend-path\t-d 3 FOOPATHDUPSPEM {/path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir} { /path/to/dir} setenv\t\tFOOPATHDUPEM :/path/to/dir1:/path/to/dir1:/path/to/dir2:/path/to/dir1:/path/to/dir3::/path/to/dir3 setenv\t\tFOOPATHDUPMIX {:/path/to/dir1:/path/to/dir1 /path/to/dir2 /path/to/dir1:/path/to/dir3:/path/to/dir3:}" @@ -395,8 +421,8 @@ setenv_var FOOPATHDUPMIX {} setenv_var FOOPATHDUPSP /path/to/dir1 setenv_var FOOPATHDUPSPEM {} set tserr "#%Module -append-path\t-d { } FOOPATHDUPSP /path/to/dir2 /path/to/dir3 /path/to:dir4 -append-path\tFOOPATHDUP /path/to/dir2 /path/to/dir3 {/path/to dir4} +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 /path/to:dir4 /path/to/dir3 +append-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 {/path/to dir4} /path/to/dir3 setenv\t\tFOOPATHDUPEM :/path/to/dir1:/path/to/dir1:/path/to/dir2:/path/to/dir1:/path/to/dir3::/path/to/dir3 setenv\t\tFOOPATHDUPMIX {:/path/to/dir1:/path/to/dir1 /path/to/dir2 /path/to/dir1:/path/to/dir3:/path/to/dir3:} setenv\t\tFOOPATHDUPSPEM {/path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 /path/to/dir3 }" @@ -409,13 +435,13 @@ setenv_var FOOPATHDUPMIX "/path/to/dir1 /path/to/dir2" setenv_var FOOPATHDUPSP {/path/to:dir4} setenv_var FOOPATHDUPSPEM {/path/to/dir3 } set tserr "#%Module -append-path\t-d { } FOOPATHDUPMIX /path/to/dir1:/path/to/dir3:/path/to/dir3: -append-path\t-d { } FOOPATHDUPSP /path/to/dir3 -append-path\tFOOPATHDUP /path/to/dir2 /path/to/dir3 {/path/to dir4} -prepend-path\t-d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir2 -prepend-path\t-d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir2 -prepend-path\tFOOPATHDUPEM /path/to/dir2 -prepend-path\tFOOPATHDUPMIX /path/to/dir1" +append-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir3 +append-path\t--duplicates FOOPATHDUP /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 {/path/to dir4} /path/to/dir3 +append-path\t--duplicates FOOPATHDUPEM /path/to/dir3 +prepend-path\t--duplicates -d { } FOOPATHDUPSP /path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 +prepend-path\t--duplicates -d { } FOOPATHDUPSPEM /path/to/dir1 /path/to/dir1 /path/to/dir2 /path/to/dir1 /path/to/dir3 +prepend-path\t--duplicates FOOPATHDUPEM {} /path/to/dir1 /path/to/dir1 /path/to/dir2 +setenv\t\tFOOPATHDUPMIX {:/path/to/dir1:/path/to/dir1 /path/to/dir2 /path/to/dir1:/path/to/dir3:/path/to/dir3:}" testouterr_shtomod ALL {} OK $tserr unsetenv_var TESTSUITE_SHTOMOD_PATHDUP @@ -550,6 +576,7 @@ if {[is_conf_enabled setpythonpath]} { append tserr $extratserr testouterr_shtomod bash-eval {} OK $tserr +} # # Cleanup