mirror of
https://github.com/Pmodules/Pmodules.git
synced 2026-06-29 02:39:39 +02:00
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:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user