From 10ffe41db1c540c1635a94df198f1fac7e71ce7c Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Fri, 14 Mar 2025 16:57:40 +0100 Subject: [PATCH] modulecmd: use/unuse group while loading an overlay --- Pmodules/libpmodules.bash.in | 9 +++++---- Pmodules/modulecmd.bash.in | 37 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/Pmodules/libpmodules.bash.in b/Pmodules/libpmodules.bash.in index 20c3b86..6f52d23 100644 --- a/Pmodules/libpmodules.bash.in +++ b/Pmodules/libpmodules.bash.in @@ -114,6 +114,7 @@ declare -A OverlayConfigKeys=( ['default_relstage']='unstable' ['layout']='Pmodules' ['has_additional_modulepaths']='false' + ['groups']='' ) declare -A OverlayPathConfigKeys=( @@ -382,13 +383,13 @@ pm::read_config(){ esac OverlayInfo[${ol_name}:${key}]="${value}" ;; - conflicts | excludes ) + conflicts | excludes | groups) yml::get_seq value yaml_input "${node}.${key}" '!!seq' local -a tmp_array=() readarray -t tmp_array <<<${value} - local excludes='' - printf -v excludes "%s:" "${tmp_array[@]}" - OverlayInfo[${ol_name}:${key}]=$(${envsubst} <<<"${excludes%:}" ) + local -- tmp_str='' + printf -v tmp_str "%s:" "${tmp_array[@]}" + OverlayInfo[${ol_name}:${key}]=$(${envsubst} <<<"${tmp_str%:}" ) ;; path_config ) yml::get_value value yaml_input "${node}.${key}" '!!seq' diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index ec64203..bff68c9 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -1899,6 +1899,26 @@ subcommand_use() { MaskedGroups[${group}]="${ol_name}:${MaskedGroups[${group}]}" done fi + if [[ -n "${OverlayInfo[${ol_name}:groups]}" ]]; then + local -- grp_changes=':' + local -a groups=() + IFS=':' read -r -a groups <<< "${OverlayInfo[${ol_name}:groups]}" + local -- group='' + for group in "${groups[@]}"; do + if [[ "${group:0:1}" == '~' ]]; then + if [[ ":${UsedGroups}:" == *:${group:1}:* ]]; then + subcommand_unuse "${group:1}" + grp_changes+="${group}:" + fi + else + if [[ ":${UsedGroups}:" != *:${group}:* ]]; then + use_group "${group}" + grp_changes+="${group}:" + fi + fi + done + OverlayInfo[${ol_name}:grp_changes]="${grp_changes:0: -1}" + fi scan_groups "${ol_name}" for group in ${UsedGroups//:/ }; do local dir="${OverlayInfo[${ol_name}:modulefiles_root]}/" @@ -2102,6 +2122,23 @@ subcommand_unuse() { std::prepend_path MODULEPATH "${dir}" done fi + if [[ -n "${OverlayInfo[${ol_name}:groups]}" ]]; then + local -a groups=() + IFS=':' read -r -a groups <<< "${OverlayInfo[${ol_name}:grp_changes]}" + local -- group='' + for group in "${groups[@]}"; do + if [[ "${group:0:1}" == '~' ]]; then + if [[ ":${UsedGroups}:" != *:${group:1}:* ]]; then + subcommand_use "${group:1}" + fi + else + if [[ ":${UsedGroups}:" == *:${group}:* ]]; then + unuse_group "${group}" + fi + fi + done + OverlayInfo[${ol_name}:grp_changes]=':' + fi # rebuild exclude list. # Note: