modulecmd.bash.in: exclude list of modules using an overlay

In the overlay configuration a list of module names can be given to be
excluded from the available modules. The modules in this list are not
exposed to the user.
This commit is contained in:
2023-07-04 13:39:36 +02:00
parent 0eec056778
commit 56962f7b7f
2 changed files with 45 additions and 3 deletions
+15 -1
View File
@@ -143,6 +143,14 @@ pm::read_config(){
"${fnames[@]}" 2>/dev/null) || return 1
echo "${_tmp}" | envsubst
}
_get_excludes(){
local -n fnames="$1"
local -- _ol="$2"
${yq} -Ne eval-all ". as \$item ireduce ({}; . *+ \$item) |.Overlays.${_ol}.excludes[]" \
"${fnames[@]}" 2>/dev/null
}
_get_type(){
local -n fnames="$1"
local -- _ol="$2"
@@ -177,6 +185,7 @@ pm::read_config(){
local install_root=''
local modulefiles_root=''
local type=''
local excludes=()
for ol in "${Overlays[@]}"; do
# install_root
install_root=$(_get_install_root config_files "${ol}") || \
@@ -210,8 +219,13 @@ pm::read_config(){
esac
OverlayInfo[${ol}:type]="${type}"
# excludes
excludes=$(_get_excludes config_files "${ol}") || \
excludes=()
OverlayInfo[${ol}:excludes]=$(_join_array ':' "${excludes[@]}")
# mark as unused
OverlayInfo[${ol}:used]='no'
unset type modulefiles_root install_root
done
}
+30 -2
View File
@@ -62,6 +62,7 @@ declare -- SysCollectionsDir='/opt/psi/collections'
declare -- TmpDir="/opt/psi/var/tmp/${USER}"
declare -- DistfilesDir="/opt/psi/var/distfiles"
declare -A OverlayExcludes
export_env() {
case "${Shell}" in
@@ -131,6 +132,7 @@ save_env() {
vars+=( GroupDepths )
vars+=( Overlays )
vars+=( UsedOverlays )
vars+=( OverlayExcludes )
vars+=( OverlayInfo Dir2OverlayMap)
local s=$(typeset -p ${vars[@]})
@@ -1017,6 +1019,8 @@ get_available_modules() {
# its sub-directories
local mod='' # module_name/module_version
while read mod; do
local name="${mod%/*}"
[[ -v OverlayExcludes[${name}] ]] && continue
local add='no'
if [[ -n "${ol}" ]]; then
# module is in an overlay
@@ -1025,8 +1029,8 @@ get_available_modules() {
# - first time found by name only
# - in same overlay as first found
# - new version and not hidden by overlay
local name="${mod%/*}"
if [[ ! -v modulenames[${name}] ]]; then
# new entry
if [[ "${OverlayInfo[${ol}:type]}" == "${ol_hiding}" ]]; then
modulenames[${name}]="${ol}"
else
@@ -1556,7 +1560,15 @@ subcommand_use() {
UsedOverlays=( "${ol_name}" "${UsedOverlays[@]}" )
OverlayInfo[${ol_name}:used]='yes'
export_env UsedOverlays
local excludes=()
local item
IFS=':' read -r -a excludes <<< "${OverlayInfo[${ol_name}:excludes]}"
for item in "${excludes[@]}"; do
OverlayExcludes[${item}]=1
done
export_env UsedOverlays
g_env_must_be_saved='yes'
scan_groups "${UsedOverlays[@]}"
}
@@ -1711,6 +1723,22 @@ subcommand_unuse() {
OverlayInfo[${ol_name}:used]='no'
UsedOverlays=( "${UsedOverlays[@]:1}")
# rebuild exclude list.
# Note:
# A module might be excluded in multiple overlays. So, we cannot
# just remove the excludes from the overlay to unuse.
local excludes=()
OverlayExcludes=()
local ol
local item
for ol in "${UsedOverlays}"; do
IFS=':' read -r -a excludes <<< "${OverlayInfo[${ol}:excludes]}"
for item in "${excludes[@]}"; do
OverlayExcludes[${item}]=1
done
done
g_env_must_be_saved='yes'
export_env UsedOverlays
local dir