From 8ba396930a7eb66dfd6d9ad1e21f56e9b089b4ee Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Tue, 25 May 2021 13:59:30 +0200 Subject: [PATCH 01/11] refactor variable PMODULES_DEFINED_RELEASES - new name is ReleaseStages - new name is ReleaseStages --- Pmodules/libpbuild.bash | 2 +- Pmodules/modulecmd.bash.in | 12 ++++++------ Pmodules/profile.bash.in | 2 +- Pmodules/profile.csh.in | 2 +- Pmodules/profile.zsh.in | 2 +- Pmodules/zsh | 4 ++-- config/modbuild.conf.in | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Pmodules/libpbuild.bash b/Pmodules/libpbuild.bash index 3404b63..50f5687 100644 --- a/Pmodules/libpbuild.bash +++ b/Pmodules/libpbuild.bash @@ -1302,7 +1302,7 @@ pbuild.build_module() { build_dependency() { local -r m=$1 std::debug "${m}: module not available" - local rels=( ${PMODULES_DEFINED_RELEASES//:/ } ) + local rels=( ${ReleaseStages//:/ } ) [[ ${dry_run} == yes ]] && \ std::die 1 \ "%s " \ diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 799ee94..71031c0 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -38,7 +38,7 @@ fi source "${libdir}/libstd.bash" -: ${PMODULES_DEFINED_RELEASES:=':unstable:stable:deprecated:'} +: ${ReleaseStages:=':unstable:stable:deprecated:'} declare -r version='@PMODULES_VERSION@' @@ -103,7 +103,7 @@ declare g_env_must_be_saved='no' save_env() { [[ $1 == 'no' ]] && return 0 local vars=( Version GroupDepths UsedReleases UseFlags UsedGroups ) - vars+=( PMODULES_DEFAULT_GROUPS PMODULES_DEFINED_RELEASES ) + vars+=( PMODULES_DEFAULT_GROUPS ReleaseStages ) vars+=( PMODULES_DEFAULT_RELEASES ) local s=$(typeset -p ${vars[@]}) @@ -151,7 +151,7 @@ get_release() { } is_release() { - [[ ${PMODULES_DEFINED_RELEASES} =~ :$1: ]] + [[ ${ReleaseStages} =~ :$1: ]] } # @@ -937,7 +937,7 @@ subcommand_avail() { print_help "${subcommand}" ;; -a | --all | --all-releases ) - opt_use_releases="${PMODULES_DEFINED_RELEASES}" + opt_use_releases="${ReleaseStages}" ;; -h | --human ) output_function='human_readable_output' @@ -1095,7 +1095,7 @@ subcommand_use() { std::info "\t${r}" done std::info "\nUnused releases:" - for r in ${PMODULES_DEFINED_RELEASES//:/ }; do + for r in ${ReleaseStages//:/ }; do if ! release_is_used $r; then std::info "\t${r}" fi @@ -1916,7 +1916,7 @@ subcommand_search() { done ;; -a | --all-releases ) - opt_use_releases="${PMODULES_DEFINED_RELEASES}" + opt_use_releases="${ReleaseStages}" ;; --src ) # :FIXME: do we have to add some sanity checks here? diff --git a/Pmodules/profile.bash.in b/Pmodules/profile.bash.in index 3cc380c..aec73c1 100644 --- a/Pmodules/profile.bash.in +++ b/Pmodules/profile.bash.in @@ -27,7 +27,7 @@ export PMODULES_DEFAULT_RELEASES export PMODULES_VERSION declare -x PMODULES_MODULEFILES_DIR='modulefiles' -declare -x PMODULES_DEFINED_RELEASES=':unstable:stable:deprecated:' +declare -x ReleaseStages=':unstable:stable:deprecated:' declare -x PMODULES_ROOT=$(cd $(dirname "${BASH_SOURCE}")/.. && pwd) declare -x PMODULES_CONFIG_DIR=$(basename $(cd $(dirname "${BASH_SOURCE}") && pwd)) diff --git a/Pmodules/profile.csh.in b/Pmodules/profile.csh.in index 0047bdb..b5b5843 100755 --- a/Pmodules/profile.csh.in +++ b/Pmodules/profile.csh.in @@ -14,7 +14,7 @@ endif ############################################################################# setenv PMODULES_MODULEFILES_DIR 'modulefiles' -setenv PMODULES_DEFINED_RELEASES ':unstable:stable:deprecated:' +setenv ReleaseStages ':unstable:stable:deprecated:' setenv PMODULES_ROOT "@PMODULES_ROOT@" setenv PMODULES_CONFIG_DIR 'config' diff --git a/Pmodules/profile.zsh.in b/Pmodules/profile.zsh.in index 83a2ac9..04b184e 100644 --- a/Pmodules/profile.zsh.in +++ b/Pmodules/profile.zsh.in @@ -20,7 +20,7 @@ declare -x PMODULES_VERSION ############################################################################# declare -x PMODULES_MODULEFILES_DIR='modulefiles' -declare -x PMODULES_DEFINED_RELEASES=':unstable:stable:deprecated:' +declare -x ReleaseStages=':unstable:stable:deprecated:' declare -x PMODULES_ROOT=$(cd $(dirname "${(%):-%N}")/.. && pwd) declare -x PMODULES_CONFIG_DIR=$(basename $(cd $(dirname "${(%):-%N}") && pwd)) diff --git a/Pmodules/zsh b/Pmodules/zsh index 80dc338..1ef378c 100644 --- a/Pmodules/zsh +++ b/Pmodules/zsh @@ -82,12 +82,12 @@ for r in ${PMODULES_DEFAULT_RELEASES[@]}; do usedreleases=( "${r}" ${(m)usedreleases:#${r}} ) done -eval $(save_env UsedReleases PMODULES_DEFAULT_RELEASES PMODULES_DEFAULT_GROUPS PMODULES_DEFINED_RELEASES) +eval $(save_env UsedReleases PMODULES_DEFAULT_RELEASES PMODULES_DEFAULT_GROUPS ReleaseStages) unset UsedReleases unset PMODULES_DEFAULT_RELEASES unset PMODULES_DEFAULT_GROUPS -unset PMODULES_DEFINED_RELEASES +unset ReleaseStages # initialize MANPATH with output of `man --path` if not set [[ -z "${MANPATH}" ]] && manpath=$( man --path ) diff --git a/config/modbuild.conf.in b/config/modbuild.conf.in index 60d33c3..e943e79 100644 --- a/config/modbuild.conf.in +++ b/config/modbuild.conf.in @@ -13,6 +13,6 @@ declare -x PMODULES_MODULEFILES_DIR='modulefiles' declare -x PMODULES_HOME="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" declare -x PMODULES_DEFAULT_GROUPS='Tools Programming' -declare -x PMODULES_DEFINED_RELEASES=':unstable:stable:deprecated:' +declare ReleaseStages=':unstable:stable:deprecated:' declare -x PMODULES_DEFAULT_RELEASES='stable' From edd3fc40098c3a98a443da7d4dac03713b9ed0b8 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Tue, 25 May 2021 14:35:59 +0200 Subject: [PATCH 02/11] refactor variable PMODULES_DEFAULT_RELEASES - new name is DefaultUsedReleaseStages --- Pmodules/modulecmd.bash.in | 4 ++-- Pmodules/profile.bash.in | 4 ++-- Pmodules/profile.csh.in | 2 +- Pmodules/profile.zsh.in | 4 ++-- Pmodules/zsh | 6 +++--- config/modbuild.conf.in | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 71031c0..37dc83e 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -104,7 +104,7 @@ save_env() { [[ $1 == 'no' ]] && return 0 local vars=( Version GroupDepths UsedReleases UseFlags UsedGroups ) vars+=( PMODULES_DEFAULT_GROUPS ReleaseStages ) - vars+=( PMODULES_DEFAULT_RELEASES ) + vars+=( DefaultUsedReleaseStages ) local s=$(typeset -p ${vars[@]}) declare -g PMODULES_ENV=$( "${base64}" --wrap=0 <<< "$s" ) @@ -1371,7 +1371,7 @@ reset_used_groups() { reset_used_releases() { declare -g UsedReleases='' - for r in ${PMODULES_DEFAULT_RELEASES//:/ }; do + for r in ${DefaultUsedReleaseStages//:/ }; do std::append_path UsedReleases "${r}" done g_env_must_be_saved='yes' diff --git a/Pmodules/profile.bash.in b/Pmodules/profile.bash.in index aec73c1..851d5b8 100644 --- a/Pmodules/profile.bash.in +++ b/Pmodules/profile.bash.in @@ -7,7 +7,7 @@ : ${PMODULES_DEFAULT_GROUPS:='Tools Programming'} # set releases which should be available after initialization -: ${PMODULES_DEFAULT_RELEASES:='stable'} +: ${DefaultUsedReleaseStages:='stable'} # set default version : ${PMODULES_VERSION:=@PMODULES_VERSION@} @@ -23,7 +23,7 @@ # export PMODULES_DEFAULT_GROUPS -export PMODULES_DEFAULT_RELEASES +export DefaultUsedReleaseStages export PMODULES_VERSION declare -x PMODULES_MODULEFILES_DIR='modulefiles' diff --git a/Pmodules/profile.csh.in b/Pmodules/profile.csh.in index b5b5843..5baa5c4 100755 --- a/Pmodules/profile.csh.in +++ b/Pmodules/profile.csh.in @@ -1,7 +1,7 @@ #!/bin/tcsh setenv PMODULES_DEFAULT_GROUPS 'Tools Programming' -setenv PMODULES_DEFAULT_RELEASES 'stable' +setenv DefaultUsedReleaseStages 'stable' if ( ! $?PMODULES_VERSION ) then setenv PMODULES_VERSION "@PMODULES_VERSION@" endif diff --git a/Pmodules/profile.zsh.in b/Pmodules/profile.zsh.in index 04b184e..b8bb938 100644 --- a/Pmodules/profile.zsh.in +++ b/Pmodules/profile.zsh.in @@ -8,11 +8,11 @@ # declare -xa PMODULES_DEFAULT_GROUPS -declare -xa PMODULES_DEFAULT_RELEASES +declare -xa DefaultUsedReleaseStages declare -x PMODULES_VERSION : ${PMODULES_DEFAULT_GROUPS:=(Tools Programming)} -: ${PMODULES_DEFAULT_RELEASES:=(stable)} +: ${DefaultUsedReleaseStages:=(stable)} : ${PMODULES_VERSION:=@PMODULES_VERSION@} ############################################################################# diff --git a/Pmodules/zsh b/Pmodules/zsh index 1ef378c..2fda058 100644 --- a/Pmodules/zsh +++ b/Pmodules/zsh @@ -78,14 +78,14 @@ done # build initial list of used releases declare -x UsedReleases='' typeset -T UsedReleases usedreleases -for r in ${PMODULES_DEFAULT_RELEASES[@]}; do +for r in ${DefaultUsedReleaseStages[@]}; do usedreleases=( "${r}" ${(m)usedreleases:#${r}} ) done -eval $(save_env UsedReleases PMODULES_DEFAULT_RELEASES PMODULES_DEFAULT_GROUPS ReleaseStages) +eval $(save_env UsedReleases DefaultUsedReleaseStages PMODULES_DEFAULT_GROUPS ReleaseStages) unset UsedReleases -unset PMODULES_DEFAULT_RELEASES +unset DefaultUsedReleaseStages unset PMODULES_DEFAULT_GROUPS unset ReleaseStages diff --git a/config/modbuild.conf.in b/config/modbuild.conf.in index e943e79..5c28cd9 100644 --- a/config/modbuild.conf.in +++ b/config/modbuild.conf.in @@ -14,5 +14,5 @@ declare -x PMODULES_HOME="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" declare -x PMODULES_DEFAULT_GROUPS='Tools Programming' declare ReleaseStages=':unstable:stable:deprecated:' -declare -x PMODULES_DEFAULT_RELEASES='stable' +declare DefaultUsedReleaseStages='stable' From 25129b57f776942fd18d6b5551f85c5a61fb25cf Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Tue, 25 May 2021 15:37:09 +0200 Subject: [PATCH 03/11] refactored PMODULES_DEFAULT_GROUPS to DefaultGroups --- Pmodules/csh | 2 +- Pmodules/modulecmd.bash.in | 4 ++-- Pmodules/profile.bash.in | 4 ++-- Pmodules/profile.csh.in | 2 +- Pmodules/profile.zsh.in | 4 ++-- Pmodules/zsh | 6 +++--- config/modbuild.conf.in | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Pmodules/csh b/Pmodules/csh index 854152a..5fb9926 100644 --- a/Pmodules/csh +++ b/Pmodules/csh @@ -35,7 +35,7 @@ unset prefix unset postfix setenv MODULEPATH -foreach group ( ${PMODULES_DEFAULT_GROUPS} ) +foreach group ( ${DefaultGroups} ) if ( "${MODULEPATH}" == "" ) then setenv MODULEPATH "${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" else diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 37dc83e..8ab7be5 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -103,7 +103,7 @@ declare g_env_must_be_saved='no' save_env() { [[ $1 == 'no' ]] && return 0 local vars=( Version GroupDepths UsedReleases UseFlags UsedGroups ) - vars+=( PMODULES_DEFAULT_GROUPS ReleaseStages ) + vars+=( DefaultGroups ReleaseStages ) vars+=( DefaultUsedReleaseStages ) local s=$(typeset -p ${vars[@]}) @@ -1363,7 +1363,7 @@ reset_modulepath() { reset_used_groups() { UsedGroups='' local group - for group in ${PMODULES_DEFAULT_GROUPS}; do + for group in ${DefaultGroups}; do std::append_path UsedGroups "${group}" done g_env_must_be_saved='yes' diff --git a/Pmodules/profile.bash.in b/Pmodules/profile.bash.in index 851d5b8..959c245 100644 --- a/Pmodules/profile.bash.in +++ b/Pmodules/profile.bash.in @@ -4,7 +4,7 @@ # in a system wide profile or in a user's profile. # set groups which should be available after initialization -: ${PMODULES_DEFAULT_GROUPS:='Tools Programming'} +: ${DefaultGroups:='Tools Programming'} # set releases which should be available after initialization : ${DefaultUsedReleaseStages:='stable'} @@ -22,7 +22,7 @@ # ${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION} # -export PMODULES_DEFAULT_GROUPS +export DefaultGroups export DefaultUsedReleaseStages export PMODULES_VERSION diff --git a/Pmodules/profile.csh.in b/Pmodules/profile.csh.in index 5baa5c4..79f20e7 100755 --- a/Pmodules/profile.csh.in +++ b/Pmodules/profile.csh.in @@ -1,6 +1,6 @@ #!/bin/tcsh -setenv PMODULES_DEFAULT_GROUPS 'Tools Programming' +setenv DefaultGroups 'Tools Programming' setenv DefaultUsedReleaseStages 'stable' if ( ! $?PMODULES_VERSION ) then setenv PMODULES_VERSION "@PMODULES_VERSION@" diff --git a/Pmodules/profile.zsh.in b/Pmodules/profile.zsh.in index b8bb938..4d36775 100644 --- a/Pmodules/profile.zsh.in +++ b/Pmodules/profile.zsh.in @@ -7,11 +7,11 @@ # ${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION} # -declare -xa PMODULES_DEFAULT_GROUPS +declare -xa DefaultGroups declare -xa DefaultUsedReleaseStages declare -x PMODULES_VERSION -: ${PMODULES_DEFAULT_GROUPS:=(Tools Programming)} +: ${DefaultGroups:=(Tools Programming)} : ${DefaultUsedReleaseStages:=(stable)} : ${PMODULES_VERSION:=@PMODULES_VERSION@} diff --git a/Pmodules/zsh b/Pmodules/zsh index 2fda058..e59c6f8 100644 --- a/Pmodules/zsh +++ b/Pmodules/zsh @@ -70,7 +70,7 @@ declare -x _LMFILES_='' # build initial MODULEPATH declare -x MODULEPATH='' typeset -T MODULEPATH modulepath -for group in ${PMODULES_DEFAULT_GROUPS[@]}; do +for group in ${DefaultGroups[@]}; do dir="${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" modulepath=( "${dir}" ${(m)modulepath:#${dir}} ) done @@ -82,11 +82,11 @@ for r in ${DefaultUsedReleaseStages[@]}; do usedreleases=( "${r}" ${(m)usedreleases:#${r}} ) done -eval $(save_env UsedReleases DefaultUsedReleaseStages PMODULES_DEFAULT_GROUPS ReleaseStages) +eval $(save_env UsedReleases DefaultUsedReleaseStages DefaultGroups ReleaseStages) unset UsedReleases unset DefaultUsedReleaseStages -unset PMODULES_DEFAULT_GROUPS +unset DefaultGroups unset ReleaseStages # initialize MANPATH with output of `man --path` if not set diff --git a/config/modbuild.conf.in b/config/modbuild.conf.in index 5c28cd9..bbf1032 100644 --- a/config/modbuild.conf.in +++ b/config/modbuild.conf.in @@ -12,7 +12,7 @@ declare -x PMODULES_MODULEFILES_DIR='modulefiles' declare -x PMODULES_HOME="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" -declare -x PMODULES_DEFAULT_GROUPS='Tools Programming' +declare -x DefaultGroups='Tools Programming' declare ReleaseStages=':unstable:stable:deprecated:' declare DefaultUsedReleaseStages='stable' From 9b33e1723aff5aa0ed8eecd763f5423dc304228e Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Wed, 26 May 2021 16:42:50 +0200 Subject: [PATCH 04/11] build: tcllib added --- build | 7 +++++++ config/versions.conf | 1 + 2 files changed, 8 insertions(+) diff --git a/build b/build index 5e7febf..481d566 100755 --- a/build +++ b/build @@ -358,6 +358,10 @@ pmodules::compile() { build Tcl fi + if [[ ! -e "${PMODULES_HOME}/lib/tcllib1.20" ]] || [[ ${opt_force} == 'yes' ]]; then + build tcllib + fi + if [[ ! -e "${PMODULES_HOME}/libexec/modulecmd.bin" ]] || [[ ${opt_force} == 'yes' ]]; then build modules fi @@ -493,6 +497,9 @@ pmodules::install() { sed "${sed_cmd}" "${SRC_DIR}/modmanage.bash.in" > "${PMODULES_HOME}/libexec/modmanage.bash" chmod 0755 "${PMODULES_HOME}/libexec/modmanage.bash" + test -e "${PMODULES_ROOT}/${CONFIG_DIR}/Pmodules.conf" || \ + install -m 0644 "${SRC_DIR}/Pmodules.conf" "${PMODULES_ROOT}/${CONFIG_DIR}" + install -m 0644 "${SRC_DIR}/bash" "${PMODULES_HOME}/init" install -m 0644 "${SRC_DIR}/bash_completion" "${PMODULES_HOME}/init" install -m 0644 "${SRC_DIR}/csh" "${PMODULES_HOME}/init" diff --git a/config/versions.conf b/config/versions.conf index 66ce460..670deb3 100644 --- a/config/versions.conf +++ b/config/versions.conf @@ -6,3 +6,4 @@ gettext 0.21 modules 3.2.10.1 Pmodules 1.0.0rc10 Tcl 8.6.10 +tcllib 1.20 From 85c89df9f5ddd12ccfc68eeeb061db2741b65f1b Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Wed, 26 May 2021 16:43:38 +0200 Subject: [PATCH 05/11] initialization of Pmodules environment reviewed - introduce new configuration file ${PMODULES_ROOT}/config/Pmodules.conf - move as much as possible from profile.bash and init/bash to modulecmd - expose less environment variables to the user --- Pmodules/bash | 5 ++ Pmodules/libmodules.tcl | 16 ++++++ Pmodules/modulecmd.bash.in | 104 ++++++++++++++++++++++--------------- Pmodules/profile.bash.in | 25 --------- 4 files changed, 83 insertions(+), 67 deletions(-) diff --git a/Pmodules/bash b/Pmodules/bash index c7e9bf5..5afa1be 100644 --- a/Pmodules/bash +++ b/Pmodules/bash @@ -35,6 +35,11 @@ unset MODULE_VERSION_STACK unset MODULESHOME unset PMODULES_ENV +declare -x PMODULES_MODULEFILES_DIR='modulefiles' +declare -x PMODULES_CONFIG_DIR='config' +declare -x PMODULES_DIR="${PMODULES_HOME}" + + ############################################################################# # implement module comand as shell function # diff --git a/Pmodules/libmodules.tcl b/Pmodules/libmodules.tcl index e94b022..e8776a3 100644 --- a/Pmodules/libmodules.tcl +++ b/Pmodules/libmodules.tcl @@ -22,6 +22,22 @@ if {[info exists env(PMODULES_DEBUG)] && $env(PMODULES_DEBUG)} { debug "loading libmodules" +package require base64 + +proc _pmodules_parse_pmodules_env { } { + debug "enter" + foreach line [split [base64::decode $::env(PMODULES_ENV)] "\n"] { + if { ![regexp -- {.* -[aAx]* (.*)=\((.*)\)} $line -> name value] } { + continue + } + switch $name { + UsedGroups { + set ::UsedGroups $value + } + } + } +} + proc module-addgroup { group } { global env global name diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 8ab7be5..446da1d 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -38,10 +38,6 @@ fi source "${libdir}/libstd.bash" -: ${ReleaseStages:=':unstable:stable:deprecated:'} - -declare -r version='@PMODULES_VERSION@' - if [[ ${PMODULES_PURETCL} == yes ]]; then declare -r modulecmd="${libexecdir}/modulecmd.tcl" else @@ -62,8 +58,10 @@ declare -A Subcommands declare -A Options declare -A Help +declare -r pmodules_config_file="${PMODULES_ROOT}/${PMODULES_CONFIG_DIR}/Pmodules.conf" + Help['version']=" -Pmodules ${version} using Tcl Environment Modules @MODULES_VERSION@ +Pmodules @PMODULES_VERSION@ using Tcl Environment Modules @MODULES_VERSION@ Copyright GNU GPL v2 " @@ -89,6 +87,18 @@ export_env() { printf "${fmt}" "$1" "${!1}" shift done + # :FIXME: UsedGroups can be modified in libmodule.tcl using + # append-path/remove-path! But we keep the state in PMODULES_ENV + # so we don't have to export it. + # + case "${Shell}" in + sh | bash | zsh ) + echo "unset UsedGroups; " + ;; + csh | tcsh ) + echo "unsetenv UsedGroups; " + ;; + esac } # @@ -154,6 +164,42 @@ is_release() { [[ ${ReleaseStages} =~ :$1: ]] } +# +# compute depth of modulefile directory. +# +# Args: +# $1: absolute path of a modulefile directory +# +compute_group_depth () { + local -r dir=$1 + test -d "${dir}" || return 1 + local group=${dir%/*} + local group=${group##*/} + [[ -n "${GroupDepths[${group}]}" ]] && return 0 + local -i depth=$(${find} "${dir}" -depth \( -type f -o -type l \) \ + -printf "%d" -quit 2>/dev/null) + (( depth-=2 )) + # if a group doesn't contain a modulefile, depth is negativ + # :FIXME: better solution? + (( depth < 0 )) && (( depth = 0 )) + GroupDepths[$group]=${depth} + g_env_must_be_saved='yes' +} + +# +# (Re-)Scan available groups in given root and compute group depth's +# +# Args: +# $1: root of modulefile hierarchy +# +scan_groups () { + local -r root="$1" + local moduledir + for moduledir in ${root}/*/${PMODULES_MODULEFILES_DIR}; do + compute_group_depth "${moduledir}" + done +} + # # Check whether argument is a group # @@ -993,42 +1039,6 @@ subcommand_avail() { done } -# -# compute depth of modulefile directory. -# -# Args: -# $1: absolute path of a modulefile directory -# -compute_group_depth () { - local -r dir=$1 - test -d "${dir}" || return 1 - local group=${dir%/*} - local group=${group##*/} - [[ -n "${GroupDepths[${group}]}" ]] && return 0 - local -i depth=$(${find} "${dir}" -depth \( -type f -o -type l \) \ - -printf "%d" -quit 2>/dev/null) - (( depth-=2 )) - # if a group doesn't contain a modulefile, depth is negativ - # :FIXME: better solution? - (( depth < 0 )) && (( depth = 0 )) - GroupDepths[$group]=${depth} - g_env_must_be_saved='yes' -} - -# -# (Re-)Scan available groups in given root and compute group depth's -# -# Args: -# $1: root of modulefile hierarchy -# -scan_groups () { - local -r root="$1" - local moduledir - for moduledir in ${root}/*/${PMODULES_MODULEFILES_DIR}; do - compute_group_depth "${moduledir}" - done -} - ############################################################################## # # use [-a|--append|-p|--prepend] [directory|group|release...] @@ -1397,15 +1407,19 @@ init_manpath() { } pmodules_init() { + source "${pmodules_config_file}" || \ + std::die 3 "Oops: cannot parse config file -- %s\n" \ + "${pmodules_config_file}" + declare -gx LOADEDMODULES='' declare -gx _LMFILES_='' declare -gx UsedGroups='' declare -gx MODULEPATH='' - declare -Ag GroupDepths='()' unset UseFlags declare -Ag UseFlags=() declare -g Version="${PMODULES_VERSION}" + reset_used_groups reset_modulepath reset_used_releases @@ -2274,6 +2288,12 @@ if [[ -n ${PMODULES_ENV} ]]; then declare -g Version="${PMODULES_VERSION}" g_env_must_be_saved='yes' fi + if [[ -v DefaultGroups ]] || [[ -v DefaultUsedReleaseStages ]] || [[ -v ReleaseStages ]]; then + source "${pmodules_config_file}" || \ + std::die 3 "Oops: cannot parse config file -- %s\n" \ + "${pmodules_config_file}" + + fi else pmodules_init fi diff --git a/Pmodules/profile.bash.in b/Pmodules/profile.bash.in index 959c245..f25eee8 100644 --- a/Pmodules/profile.bash.in +++ b/Pmodules/profile.bash.in @@ -3,36 +3,11 @@ # The following settings are system defaults. They can be (re-)defined # in a system wide profile or in a user's profile. -# set groups which should be available after initialization -: ${DefaultGroups:='Tools Programming'} - -# set releases which should be available after initialization -: ${DefaultUsedReleaseStages:='stable'} - # set default version : ${PMODULES_VERSION:=@PMODULES_VERSION@} -############################################################################# -# N O C H A N G E S B E L O W T H I S L I N E ! # -# -# Notes: -# - PMODULES_ROOT is derived from the location of this file. -# - Some for PMODULES_CONFIG_DIR. -# - The Pmodules software must be installed in -# ${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION} -# - -export DefaultGroups -export DefaultUsedReleaseStages -export PMODULES_VERSION - -declare -x PMODULES_MODULEFILES_DIR='modulefiles' -declare -x ReleaseStages=':unstable:stable:deprecated:' - declare -x PMODULES_ROOT=$(cd $(dirname "${BASH_SOURCE}")/.. && pwd) -declare -x PMODULES_CONFIG_DIR=$(basename $(cd $(dirname "${BASH_SOURCE}") && pwd)) declare -x PMODULES_HOME="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" -declare -x PMODULES_DIR="${PMODULES_HOME}" test -r "${PMODULES_HOME}/init/bash" && source "$_" From dfb133cae73e60836a4f440a3ecb140fadcc8ecb Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Wed, 26 May 2021 16:50:10 +0200 Subject: [PATCH 06/11] config/Pmodules.conf added --- Pmodules/Pmodules.conf | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Pmodules/Pmodules.conf diff --git a/Pmodules/Pmodules.conf b/Pmodules/Pmodules.conf new file mode 100644 index 0000000..5f9230c --- /dev/null +++ b/Pmodules/Pmodules.conf @@ -0,0 +1,8 @@ +# set groups which should be available after initialization +DefaultGroups='Tools Programming' + +# define available release stages +ReleaseStages=':unstable:stable:deprecated:' + +# set releases which should be available after initialization +DefaultUsedReleaseStages='stable' From fd6708352c3b847b1b4bffb7410095c2d23ec6ae Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Wed, 26 May 2021 16:50:41 +0200 Subject: [PATCH 07/11] tcllib added --- Tools/tcllib/build | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Tools/tcllib/build diff --git a/Tools/tcllib/build b/Tools/tcllib/build new file mode 100644 index 0000000..ea151ba --- /dev/null +++ b/Tools/tcllib/build @@ -0,0 +1,5 @@ +#!/usr/bin/env modbuild + +pbuild::set_download_url "https://core.tcl-lang.org/tcllib/uv/$P-$V.tar.xz" + + From b40297d1a42f38b8669d106ec709e329e748fc2c Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Wed, 26 May 2021 17:47:26 +0200 Subject: [PATCH 08/11] variable DefaultUsedReleaseStages renamed to DefaultReleaseStages --- Pmodules/Pmodules.conf | 2 +- Pmodules/modulecmd.bash.in | 6 +++--- Pmodules/profile.csh.in | 2 +- Pmodules/profile.zsh.in | 4 ++-- Pmodules/zsh | 6 +++--- config/modbuild.conf.in | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Pmodules/Pmodules.conf b/Pmodules/Pmodules.conf index 5f9230c..fffe8a3 100644 --- a/Pmodules/Pmodules.conf +++ b/Pmodules/Pmodules.conf @@ -5,4 +5,4 @@ DefaultGroups='Tools Programming' ReleaseStages=':unstable:stable:deprecated:' # set releases which should be available after initialization -DefaultUsedReleaseStages='stable' +DefaultReleaseStages='stable' diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 446da1d..713b786 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -114,7 +114,7 @@ save_env() { [[ $1 == 'no' ]] && return 0 local vars=( Version GroupDepths UsedReleases UseFlags UsedGroups ) vars+=( DefaultGroups ReleaseStages ) - vars+=( DefaultUsedReleaseStages ) + vars+=( DefaultReleaseStages ) local s=$(typeset -p ${vars[@]}) declare -g PMODULES_ENV=$( "${base64}" --wrap=0 <<< "$s" ) @@ -1381,7 +1381,7 @@ reset_used_groups() { reset_used_releases() { declare -g UsedReleases='' - for r in ${DefaultUsedReleaseStages//:/ }; do + for r in ${DefaultReleaseStages//:/ }; do std::append_path UsedReleases "${r}" done g_env_must_be_saved='yes' @@ -2288,7 +2288,7 @@ if [[ -n ${PMODULES_ENV} ]]; then declare -g Version="${PMODULES_VERSION}" g_env_must_be_saved='yes' fi - if [[ -v DefaultGroups ]] || [[ -v DefaultUsedReleaseStages ]] || [[ -v ReleaseStages ]]; then + if [[ -v DefaultGroups ]] || [[ -v DefaultReleaseStages ]] || [[ -v ReleaseStages ]]; then source "${pmodules_config_file}" || \ std::die 3 "Oops: cannot parse config file -- %s\n" \ "${pmodules_config_file}" diff --git a/Pmodules/profile.csh.in b/Pmodules/profile.csh.in index 79f20e7..b00013e 100755 --- a/Pmodules/profile.csh.in +++ b/Pmodules/profile.csh.in @@ -1,7 +1,7 @@ #!/bin/tcsh setenv DefaultGroups 'Tools Programming' -setenv DefaultUsedReleaseStages 'stable' +setenv DefaultReleaseStages 'stable' if ( ! $?PMODULES_VERSION ) then setenv PMODULES_VERSION "@PMODULES_VERSION@" endif diff --git a/Pmodules/profile.zsh.in b/Pmodules/profile.zsh.in index 4d36775..8077e79 100644 --- a/Pmodules/profile.zsh.in +++ b/Pmodules/profile.zsh.in @@ -8,11 +8,11 @@ # declare -xa DefaultGroups -declare -xa DefaultUsedReleaseStages +declare -xa DefaultReleaseStages declare -x PMODULES_VERSION : ${DefaultGroups:=(Tools Programming)} -: ${DefaultUsedReleaseStages:=(stable)} +: ${DefaultReleaseStages:=(stable)} : ${PMODULES_VERSION:=@PMODULES_VERSION@} ############################################################################# diff --git a/Pmodules/zsh b/Pmodules/zsh index e59c6f8..f1a0a4c 100644 --- a/Pmodules/zsh +++ b/Pmodules/zsh @@ -78,14 +78,14 @@ done # build initial list of used releases declare -x UsedReleases='' typeset -T UsedReleases usedreleases -for r in ${DefaultUsedReleaseStages[@]}; do +for r in ${DefaultReleaseStages[@]}; do usedreleases=( "${r}" ${(m)usedreleases:#${r}} ) done -eval $(save_env UsedReleases DefaultUsedReleaseStages DefaultGroups ReleaseStages) +eval $(save_env UsedReleases DefaultReleaseStages DefaultGroups ReleaseStages) unset UsedReleases -unset DefaultUsedReleaseStages +unset DefaultReleaseStages unset DefaultGroups unset ReleaseStages diff --git a/config/modbuild.conf.in b/config/modbuild.conf.in index bbf1032..cfce2aa 100644 --- a/config/modbuild.conf.in +++ b/config/modbuild.conf.in @@ -14,5 +14,5 @@ declare -x PMODULES_HOME="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" declare -x DefaultGroups='Tools Programming' declare ReleaseStages=':unstable:stable:deprecated:' -declare DefaultUsedReleaseStages='stable' +declare DefaultReleaseStages='stable' From d5925192522dcdeb4761696903fe22384e320a63 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Wed, 2 Jun 2021 13:56:28 +0200 Subject: [PATCH 09/11] use term release stage instead of release - refactor variables and function names - internal: refactor UseFlags -> UsedFlags and change type to normal array --- Pmodules/modulecmd.bash.in | 259 ++++++++++++++++++------------------- 1 file changed, 129 insertions(+), 130 deletions(-) diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 713b786..a7274da 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -112,9 +112,11 @@ declare g_env_must_be_saved='no' save_env() { [[ $1 == 'no' ]] && return 0 - local vars=( Version GroupDepths UsedReleases UseFlags UsedGroups ) - vars+=( DefaultGroups ReleaseStages ) - vars+=( DefaultReleaseStages ) + local vars=( Version ) + vars+=( UsedReleaseStages UsedFlags UsedGroups ) + vars+=( DefaultGroups DefaultReleaseStages ) + vars+=( ReleaseStages ) + vars+=( GroupDepths ) local s=$(typeset -p ${vars[@]}) declare -g PMODULES_ENV=$( "${base64}" --wrap=0 <<< "$s" ) @@ -129,16 +131,16 @@ _exit() { trap '_exit' EXIT # -# get release of module +# get release stage of module # Note: -# - the release of a modulefile outside ${PMODULES_ROOT} is 'stable' -# - the release of a modulefile inside ${PMODULES_ROOT} without a -# coresponding release file is 'unstable' +# - the release stage of a modulefile outside ${PMODULES_ROOT} is 'stable' +# - the release stage of a modulefile inside ${PMODULES_ROOT} without a +# coresponding file is 'unstable' # # Args: # $1: absolute modulefile name # -get_release() { +get_release_stage() { local "$1" local -r modulefile="$2" @@ -149,10 +151,10 @@ get_release() { fi # we are inside ${PMODULES_ROOT} - local -r releasefile="${modulefile%/*}/.release-${modulefile##*/}" - if [[ -r ${releasefile} ]]; then - # read releasefile, remove empty lines, spaces etc - local -r data=$( < "${releasefile}" ) + local -r rel_stage_file="${modulefile%/*}/.release-${modulefile##*/}" + if [[ -r ${rel_stage_file} ]]; then + # read file, remove empty lines, spaces etc + local -r data=$( < "${rel_stage_file}" ) std::upvar $1 "${data}" else std::upvar $1 'unstable' @@ -160,7 +162,7 @@ get_release() { return 0 } -is_release() { +is_release_stage() { [[ ${ReleaseStages} =~ :$1: ]] } @@ -328,7 +330,7 @@ USAGE: subcommand_load() { local -r subcommand='load' - local release='undef' + local rel_stage='undef' local current_modulefile='' local prefix='' local m='' @@ -361,12 +363,12 @@ subcommand_load() { # # possible return values: # 0: module is loadable - # 1: either not a modulefile or unsused release + # 1: either not a modulefile or unsused release stage # # The following variables in the enclosing function are set: # current_modulefile # prefix - # release + # rel_stage # is_available() { local m=$1 @@ -387,7 +389,7 @@ subcommand_load() { current_modulefile="${array[0]}" prefix="${array[1]}" test -n "${current_modulefile}" || return 1 - get_release release "${current_modulefile}" "${UsedReleases}" + get_release_stage rel_stage "${current_modulefile}" "${UsedReleaseStages}" } # @@ -401,11 +403,11 @@ subcommand_load() { # none output_load_hints() { local output='' - local release='' + local rel_stage='' while read -a line; do - release=${line[1]} - if [[ ! ":${UsedReleases}:" =~ "${release}" ]]; then - output+="module use ${release}; " + rel_stage=${line[1]} + if [[ ! ":${UsedReleaseStages}:" =~ "${rel_stage}" ]]; then + output+="module use ${rel_stage}; " fi local group=${line[2]} if [[ ! ":${UsedGroups}:" =~ ":${group}:" ]] && \ @@ -471,22 +473,22 @@ subcommand_load() { # extendet module name is either # - group:name or - # - group:name:release or - # - release:name or - # - release:group:name or - # - name:release + # - group:name:rel_stage or + # - rel_stage:name or + # - rel_stage:group:name or + # - name:rel_stage IFS=':' local -a toks=($m) unset IFS local group='' - local release='' + local rel_stage='' if is_group "${toks[0]}"; then group=${toks[0]} m=${toks[1]} - release=${toks[2]} - elif is_release "${toks[0]}"; then - release=${toks[0]} + rel_stage=${toks[2]} + elif is_release_stage "${toks[0]}"; then + rel_stage=${toks[0]} if is_group "${toks[1]}"; then group=${toks[1]} m=${toks[2]} @@ -498,9 +500,9 @@ subcommand_load() { m=${toks[0]} if is_group "${toks[1]}"; then group=${toks[1]} - release=${toks[2]} + rel_stage=${toks[2]} else - release=${toks[1]} + rel_stage=${toks[1]} group=${toks[2]} fi fi @@ -520,32 +522,26 @@ subcommand_load() { MODULEPATH+="${PMODULES_MODULEFILES_DIR}" modulepath=( ${MODULEPATH} ) fi - if [[ -n ${release} ]]; then - is_release "${release}" || \ + if [[ -n ${rel_stage} ]]; then + is_release_stage "${rel_stage}" || \ std::die 3 "%s %s: %s -- %s\n" \ "${CMD}" "${subcommand}" \ - "illegal release name" - "${release}" - std::append_path UsedReleases "${release}" + "illegal release stage" + "${rel_stage}" + std::append_path UsedReleaseStages "${rel_stage}" g_env_must_be_saved='yes' fi fi local found='' - for flag in "${!UseFlags[@]}"; do + for flag in "${UsedFlags[@]/#/_}" ''; do # :FIXME: this doesn't work if ${m} is a # modulename without version - if is_available "${m}_${flag}"; then - m+="_${flag}" + if is_available "${m}"; then + m+="${flag}" found=':' break fi done - if [[ ! "${found}" ]]; then - # no use-flags set - if is_available "${m}"; then - found=':' - fi - fi if [[ ! "${found}" ]]; then std::info "%s %s: module unavailable -- %s" \ "${CMD}" 'load' "${m}" @@ -614,10 +610,10 @@ subcommand_load() { local msg=$(printf "%s %s: %s -- %s" \ "${CMD}" 'load' \ - "${release} module has been loaded" \ + "${rel_stage} module has been loaded" \ "${m}") if [[ ${verbosity_lvl} != silent ]] && \ - [[ ${release} != stable ]]; then + [[ ${rel_stage} != stable ]]; then std::info "%s" "${msg}" fi ${logger} -t Pmodules "${msg}" @@ -803,27 +799,27 @@ subcommand_show() { # # get all available modules in given directory. # return list like -# modulename1 release1 modulename2 release2 ... +# modulename_1 rel_stage_1 modulefile_1 modulename_2 rel_stage_2 modulefile_1 ... # get_available_modules() { local var="$1" local -r module="$2" - local -r use_releases="${3:-${UsedReleases}}" + local -r used_rel_stages="${3:-${UsedReleaseStages}}" shift 3 # in the for loop below we use $@ to loop over the directories local -a mods=() - local release - local dir='' + local rel_stage='' + local dir='' for dir in "$@"; do test -d "${dir}" || continue { cd "${dir}" while read mod; do - get_release release "${dir}/${mod}" + get_release_stage rel_stage "${dir}/${mod}" - if [[ :${use_releases}: =~ :${release}: ]]; then - mods+=( "${mod}" ${release} "${dir}/${mod}") + if [[ :${used_rel_stages}: =~ :${rel_stage}: ]]; then + mods+=( "${mod}" ${rel_stage} "${dir}/${mod}") fi done < <(${find} -L * \( -type f -o -type l \) -not -name ".*" -ipath "${module}*") } @@ -836,7 +832,7 @@ get_available_modules() { # avail [-hlt] [...] # Subcommands[avail]='avail' -Options[avail]='-l help -o Hahlmt -l all -l all-releases -l human -l long -l machine -l terse' +Options[avail]='-l help -o Hahlmt -l all -l all-release-stages -l human -l long -l machine -l terse' Help[avail]=" USAGE: module avail [switches] string @@ -850,8 +846,8 @@ USAGE: e.g. a compiler, or with the sub-command 'use'. SWITCHES: - -a|--all||--all-releases - List all available modules independend of the release. + -a|--all||--all-release-stages + List all available modules independend of the release stage. -t|--terse Output in short format. @@ -885,15 +881,16 @@ subcommand_avail() { terse_output() { output_header "$1" - for (( i=0; i<${#mods[@]}; i+=3 )); do + local -i i=0 + for i in ${!mods[@]}; do local mod=${mods[i]} - local release=${mods[i+1]} - case $release in + local rel_stage=${mods[i+1]} + case ${rel_stage} in stable ) out='' ;; * ) - out="${release}" + out="${rel_stage}" ;; esac printf "%-20s\t%s\n" "${mod}" "${out}" 1>&2 @@ -913,13 +910,13 @@ subcommand_avail() { output_header "$1" for (( i=0; i<${#mods[@]}; i+=3 )); do local mod=${mods[i]} - local release=${mods[i+1]} - case $release in + local rel_stage=${mods[i+1]} + case ${rel_stage} in stable ) out='' ;; * ) - out=${release} + out=${rel_stage} ;; esac printf "%-20s\t%s\n" "${mod}" "${out}" 1>&2 @@ -935,13 +932,13 @@ subcommand_avail() { local -i max_length=1 for ((i=0; i<${#mods[@]}; i+=3)); do if [[ ${verbosity_lvl} == 'verbose' ]]; then - local release=${mods[i+1]} - case ${mods[i+1]} in + local rel_stage=${mods[i+1]} + case ${rel_stage} in stable ) mod="${mods[i]}" ;; * ) - mod="${mods[i]}(${release:0:1})" + mod="${mods[i]}(${rel_stage:0:1})" ;; esac else @@ -974,7 +971,7 @@ subcommand_avail() { } local pattern=() local output_function='human_readable_output' - local opt_use_releases="${UsedReleases}" + local opt_use_rel_stages="${UsedReleaseStages}" local -A opt_groups=() local val='' while (($# > 0)); do @@ -982,8 +979,8 @@ subcommand_avail() { -H | --help | -\? ) print_help "${subcommand}" ;; - -a | --all | --all-releases ) - opt_use_releases="${ReleaseStages}" + -a | --all | --all-release-stages ) + opt_use_rel_stages="${ReleaseStages}" ;; -h | --human ) output_function='human_readable_output' @@ -1031,7 +1028,7 @@ subcommand_avail() { get_available_modules \ mods \ "${string}" \ - "${opt_use_releases}" \ + "${opt_use_rel_stages}" \ "${dir}" [[ ${#mods[@]} == 0 ]] && continue ${output_function} "${group}" @@ -1041,17 +1038,17 @@ subcommand_avail() { ############################################################################## # -# use [-a|--append|-p|--prepend] [directory|group|release...] +# use [-a|--append|-p|--prepend] [directory|group|release_stage...] # Subcommands[use]='use' Options[use]='-l help -o Hap -l append -l prepend' Help[use]=" USAGE: - module use [-a|--append|-p|--prepend] [directory|group|release...] + module use [-a|--append|-p|--prepend] [directory|group|release_stage|...] Without arguments this sub-command displays information about - the module search path, used families and releases. You can - use this sub-command to get a list of available families and - releases. + the module search path, used groups and release stages. You can + use this sub-command to get a list of available groups and + releases stages. With a directory as argument, this directory will either be prepended or appended to the module search path. The default @@ -1080,10 +1077,6 @@ subcommand_use() { [[ :${UsedGroups}: =~ :$1: ]] } - release_is_used() { - [[ ":${UsedReleases}:" =~ :$1: ]] - } - print_info() { local f local r @@ -1100,19 +1093,17 @@ subcommand_use() { fi done - std::info "\nUsed releases:" - for r in ${UsedReleases//:/ }; do + std::info "\nUsed releases stages:" + for r in ${UsedReleaseStages//:/ }; do std::info "\t${r}" done - std::info "\nUnused releases:" + std::info "\nUnused release stages:" for r in ${ReleaseStages//:/ }; do - if ! release_is_used $r; then - std::info "\t${r}" - fi + [[ ":${UsedReleaseStages}:" =~ :$r: ]] && std::info "\t${r}" done std::info "\nUsed flags:" - for flag in "${!UseFlags[@]}"; do + for flag in "${UsedFlags[@]}"; do std::info "\t${flag}" done @@ -1133,14 +1124,14 @@ subcommand_use() { use () { local arg=$1 - if is_release "${arg}"; then - # argument is release - std::append_path UsedReleases "${arg}" + if is_release_stage "${arg}"; then + # argument is release stage + std::append_path UsedReleaseStages "${arg}" return fi if [[ "${arg}" =~ "flag=" ]]; then # argument is flag - UseFlags["${arg/flag=}"]=1 + UsedFlags+=( "${arg/flag=}" ) return fi if [[ -z ${GroupDepths[${arg}]} ]] && [[ -d "${PMODULES_ROOT}/${arg}" ]]; then @@ -1221,14 +1212,14 @@ subcommand_use() { ############################################################################## # -# unuse directory|group|release... +# unuse directory|group|release_stage|... # Subcommands[unuse]='unuse' Options[unuse]='-o H -l help' Help[unuse]=' unuse directory|group|release... - Remove the given directory, group or release from the search - path. + Remove the given modulefiles directory, group, release stage, + flag or overlay from the search path. ' subcommand_unuse() { @@ -1236,14 +1227,18 @@ subcommand_unuse() { unuse() { local arg=$1 - if is_release "${arg}"; then - # argument is release - std::remove_path UsedReleases "${arg}" + if is_release_stage "${arg}"; then + # argument is release stage + std::remove_path UsedReleaseStages "${arg}" return fi if [[ "${arg}" =~ "flag=" ]]; then # argument is flag - unset UseFlags["${arg/flag=}"] + local flag="${arg/flag=}" + local i + for i in ${!UsedFlags[@]}; do + [[ ${UsedFlags[i]} == ${flag} ]] && unset UsedFlags[i] + done return fi if [[ -n ${GroupDepths[${arg}]} ]] && @@ -1380,9 +1375,9 @@ reset_used_groups() { } reset_used_releases() { - declare -g UsedReleases='' + declare -g UsedReleaseStages='' for r in ${DefaultReleaseStages//:/ }; do - std::append_path UsedReleases "${r}" + std::append_path UsedReleaseStages "${r}" done g_env_must_be_saved='yes' } @@ -1411,14 +1406,13 @@ pmodules_init() { std::die 3 "Oops: cannot parse config file -- %s\n" \ "${pmodules_config_file}" - declare -gx LOADEDMODULES='' - declare -gx _LMFILES_='' - declare -gx UsedGroups='' - declare -gx MODULEPATH='' - declare -Ag GroupDepths='()' - unset UseFlags - declare -Ag UseFlags=() - declare -g Version="${PMODULES_VERSION}" + declare -gx LOADEDMODULES='' + declare -gx _LMFILES_='' + declare -gx UsedGroups='' + declare -gx MODULEPATH='' + declare -Ag GroupDepths='()' + declare -ag UsedFlags=() + declare -g Version="${PMODULES_VERSION}" reset_used_groups reset_modulepath @@ -1615,7 +1609,7 @@ subcommand_clear() { # Subcommands[search]='search' Options[search]='-o aH -l help -l no-header -l print-modulefiles ' -Options[search]+='-l release: -l with: -l all-releases -l src: -l print-csv ' +Options[search]+='-l release-stage: -l with: -l all-release-stages -l src: -l print-csv ' Options[search]+='-l verbose ' Options[search]+='-l all-deps -l wrap' Help[search]=' @@ -1625,7 +1619,7 @@ USAGE: for modules whose name match the argument. SWITCHES: - -a|--all-releases + -a|--all-release-stages Search within all releases. --all-deps @@ -1634,10 +1628,10 @@ SWITCHES: --no-header Suppress output of a header. - --release=RELEASE - Search for modules within this release. You can specify this - switch multiple times. Without this switch, the used releases - will be searched. + --release-stage=RELEASE_STAGE + Search for modules within this release stage. You can specify + this switch multiple times. Without this switch, the release + stages in use will be searched. --verbose vebose output @@ -1697,7 +1691,7 @@ subcommand_search() { print_header_default() { std::info '' - std::info "${fmt}" "Module" "Release" "Group" "Requires" + std::info "${fmt}" "Module" "Rel.stage" "Group" "Requires" std::info '-%.0s' $(seq 1 ${cols}) } @@ -1736,7 +1730,7 @@ subcommand_search() { print_header_verbose() { std::info '' - std::info "${fmt}" "Module" "Release" "Group" "Dependencies/Modulefile" + std::info "${fmt}" "Module" "Rel.stage" "Group" "Dependencies/Modulefile" std::info '-%.0s' $(seq 1 ${cols}) } @@ -1830,19 +1824,18 @@ subcommand_search() { local modulepath=( ${src_prefix[@]/%//${group}/modulefiles$s} ) # get and print all available modules in $mpath - # with respect to the requested releases - # tmpfile: module/version release group group- - # dependencies... + # with respect to the requested release stage + # tmpfile: module/version rel_stage group dependencies... local mods get_available_modules \ mods \ "${module}" \ - "${opt_use_releases}" \ + "${opt_use_rel_stages}" \ "${modulepath[@]}" \ for (( i=0; i<${#mods[@]}; i+=3 )); do local name=${mods[i]} - local release=${mods[i+1]} + local rel_stage=${mods[i+1]} local modulefile=${mods[i+2]} if (( ${#name} > max_len_modulename)); then @@ -1870,7 +1863,7 @@ subcommand_search() { unset IFS fi - echo ${name} ${release} ${group} ${modulefile} \ + echo ${name} ${rel_stage} ${group} ${modulefile} \ ${deps[@]} >> "${tmpfile}" done done @@ -1896,19 +1889,19 @@ subcommand_search() { opt_print_csv='yes' opt_print_header='no' ;; - --release | --release=* ) + --release-stage | --release-stage=* ) if [[ "$1" == "--release" ]]; then local arg=$2 shift else local arg=${1/--release=} fi - is_release "${arg}" || \ + is_release_stage "${arg}" || \ std::die 1 "%s %s: %s -- %s" \ "${CMD}" 'search' \ - "illegal release name" \ + "illegal release stage" \ "${arg}" - opt_use_releases+="${arg}:" + opt_use_rel_stages+="${arg}:" ;; --with | --with=* ) if [[ "$1" == --with ]]; then @@ -1930,7 +1923,7 @@ subcommand_search() { done ;; -a | --all-releases ) - opt_use_releases="${ReleaseStages}" + opt_use_rel_stages+="${ReleaseStages}" ;; --src ) # :FIXME: do we have to add some sanity checks here? @@ -1955,8 +1948,8 @@ subcommand_search() { src_prefix="${PMODULES_ROOT}" fi - if [[ "${opt_use_releases}" == ":" ]]; then - opt_use_releases=":${UsedReleases}:" + if [[ "${opt_use_rel_stages}" == ":" ]]; then + opt_use_rel_stages=":${UsedReleaseStages}:" fi if [[ ${#modules[@]} == 0 ]]; then @@ -2042,7 +2035,7 @@ subcommand_help() { print_help "${arg}" else # :FIXME: print help of newest *available* module - # (respecting UsedReleases) + # (respecting UsedReleaseStages) "${modulecmd}" "${Shell}" "${subcommand}" "${arg}" fi done @@ -2286,6 +2279,12 @@ if [[ -n ${PMODULES_ENV} ]]; then if [[ -z ${Version} ]] || [[ ${Version} != ${PMODULES_VERSION} ]]; then # the Pmodules version changed! declare -g Version="${PMODULES_VERSION}" + # renamed in version 1.0.0rc10 and type changed from + # associative array to normal array + if [[ -v UseFlags ]]; then + declare -a UsedFlags=( "${!UseFlags[@]}" ) + unset UseFlags + fi g_env_must_be_saved='yes' fi if [[ -v DefaultGroups ]] || [[ -v DefaultReleaseStages ]] || [[ -v ReleaseStages ]]; then From d908a4041c1329c02b4c46b1b44050f82367a2b8 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Wed, 2 Jun 2021 18:21:53 +0200 Subject: [PATCH 10/11] modulecmd: bugfix in listing unused release stages --- Pmodules/modulecmd.bash.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index a7274da..cf18a35 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -1099,7 +1099,7 @@ subcommand_use() { done std::info "\nUnused release stages:" for r in ${ReleaseStages//:/ }; do - [[ ":${UsedReleaseStages}:" =~ :$r: ]] && std::info "\t${r}" + [[ ! ":${UsedReleaseStages}:" =~ :$r: ]] && std::info "\t${r}" done std::info "\nUsed flags:" From b3a6adf9f830657776d809ec60f6f18f7b34c93a Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Wed, 2 Jun 2021 18:23:04 +0200 Subject: [PATCH 11/11] modulecmd: handle changes in PMODULES_ENV for old versions --- Pmodules/modulecmd.bash.in | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index cf18a35..4bf884a 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -2285,6 +2285,25 @@ if [[ -n ${PMODULES_ENV} ]]; then declare -a UsedFlags=( "${!UseFlags[@]}" ) unset UseFlags fi + if [[ ! -v UsedFlags ]]; then + declare -a UsedFlags=() + fi + if [[ -v UsedReleases ]]; then + declare -- UsedReleaseStages="${UsedReleases}" + unset UsedReleases + fi + if [[ -v PMODULES_DEFAULT_GROUPS ]]; then + declare -- DefaultGroups="${PMODULES_DEFAULT_GROUPS}" + unset PMODULES_DEFAULT_GROUPS + fi + if [[ -v PMODULES_DEFINED_RELEASES ]]; then + declare -- ReleaseStages="${PMODULES_DEFINED_RELEASES}" + unset PMODULES_DEFINED_RELEASES + fi + if [[ -v PMODULES_DEFAULT_RELEASES ]]; then + declare -- DefaultReleaseStages="${PMODULES_DEFAULT_RELEASES}" + unset PMODULES_DEFAULT_RELEASES + fi g_env_must_be_saved='yes' fi if [[ -v DefaultGroups ]] || [[ -v DefaultReleaseStages ]] || [[ -v ReleaseStages ]]; then