Skip to content

Commit

Permalink
brl-apply: more fixes for envvar break-up handling
Browse files Browse the repository at this point in the history
- Prioritize prefix over inherited
- Cleaner de-dup logic
- Avoid empty envvar items
  • Loading branch information
paradigm committed Aug 14, 2020
1 parent 99f0dba commit fc27745
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 94 deletions.
4 changes: 2 additions & 2 deletions src/slash-bedrock/etc/bedrock.conf
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ zsh/zshenv = /bedrock/share/zsh/include-bedrock
# A list of directories searched by various programs to find executables.
#
PREFIX:PATH = /bedrock/cross/pin/bin:/bedrock/bin
INFIX:PATH = /usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin:/usr/bin:/usr/sbin:/bin:/sbin
INFIX:PATH = /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
SUFFIX:PATH = /bedrock/cross/bin

#
Expand All @@ -280,7 +280,7 @@ SUFFIX:MANPATH = /bedrock/cross/man
# A list of directories searched by the info executable to find documentation.
#
PREFIX:INFOPATH = /bedrock/cross/pin/info:/bedrock/share/info
INFIX:INFOPATH = /usr/local/share/info:/usr/share/info:/bedrock/cross/info
INFIX:INFOPATH = /usr/local/share/info:/usr/share/info
SUFFIX:INFOPATH = /bedrock/cross/info

#
Expand Down
157 changes: 65 additions & 92 deletions src/slash-bedrock/libexec/brl-apply
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ fi
# Set up /etc/localtime
ln -fns "/bedrock/cross/zoneinfo/$(cfg_value "locale" "timezone")" /bedrock/run/localtime

# TODO: un-generalize if not needed after only-add-when-needed changes
cfg_envvar() {
# Retain backwards compatibility with non-prefix/infix/suffix config
# system.
Expand All @@ -142,130 +141,104 @@ XDG_DATA_DIRS=$(cfg_envvar "XDG_DATA_DIRS")
TERMINFO_DIRS=$(cfg_envvar "TERMINFO_DIRS")
EOF

PREFIX_PATH="$(cfg_value "env-vars" "PREFIX:PATH"):$(cfg_value "env-vars" "PATH")"
SUFFIX_PATH="$(cfg_value "env-vars" "INFIX:PATH"):$(cfg_value "env-vars" "SUFFIX:PATH")"
PREFIX_MANPATH="$(cfg_value "env-vars" "PREFIX:MANPATH"):$(cfg_value "env-vars" "MANPATH")"
SUFFIX_MANPATH="$(cfg_value "env-vars" "INFIX:MANPATH"):$(cfg_value "env-vars" "SUFFIX:MANPATH")"
PREFIX_INFOPATH="$(cfg_value "env-vars" "PREFIX:INFOPATH"):$(cfg_value "env-vars" "INFOPATH")"
SUFFIX_INFOPATH="$(cfg_value "env-vars" "INFIX:INFOPATH"):$(cfg_value "env-vars" "SUFFIX:INFOPATH")"
PREFIX_XDG_DATA_DIRS="$(cfg_value "env-vars" "PREFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "XDG_DATA_DIRS")"
SUFFIX_XDG_DATA_DIRS="$(cfg_value "env-vars" "INFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "SUFFIX:XDG_DATA_DIRS")"
PREFIX_TERMINFO_DIRS="$(cfg_value "env-vars" "PREFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "TERMINFO_DIRS")"
SUFFIX_TERMINFO_DIRS="$(cfg_value "env-vars" "INFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "SUFFIX:TERMINFO_DIRS")"
PREFIX_fpath="$(cfg_value "env-vars" "PREFIX:fpath"):$(cfg_value "env-vars" "fpath")"
SUFFIX_fpath="$(cfg_value "env-vars" "INFIX:fpath"):$(cfg_value "env-vars" "SUFFIX:fpath")"

# Setup /etc/profile
cat <<EOF >/bedrock/run/profile
[ -n "\${BEDROCK_RESTRICT:-}" ] && return

for s in \$(/bedrock/bin/brl list); do
(ls /bedrock/strata/\${s}/etc/profile.d/*.sh) >/dev/null 2>&1 || continue
for f in /bedrock/strata/\${s}/etc/profile.d/*.sh; do
. \${f} >/dev/null 2>&1 || true
done
done

br_pop_envvar() {
orig="\${1}"
prefix="\${2}"
suffix="\${3}"
for d in \$(echo "\${prefix}" | sed 's/:/ /g'); do
case ":\${orig}:" in
*":\${d}:"*) ;;
*) printf "%s" "\${d}:" ;;
esac
done
printf "\${orig}"
for d in \$(echo "\${suffix}" | sed 's/:/ /g'); do
case ":\${orig}:" in
*":\${d}:"*) ;;
*) printf "%s" ":\${d}" ;;
br_dedup_envvar() {
envvar=""
IFS=":"
[ -n "\${ZSH_VERSION:-}" ] && setopt sh_word_split
for i in \${@}; do
case ":\${envvar}:" in
*":\${i}:"*) ;;
*) envvar="\${envvar}:\${i}";;
esac
done
echo "\${envvar}" | sed -e 's/::*/:/g' -e 's/^://' -e 's/:$//'
}

for s in \$(/bedrock/bin/brl list); do
[ -r "/bedrock/strata/\${s}/etc/profile" ] || continue
out="\$(/bedrock/bin/strat -r "\${s}" /bin/sh -c '. /etc/profile ; env')"
PATH="\$(br_dedup_envvar "\${PATH}:\$(echo "\${out}" | awk -F= '/^PATH=/{sub(/^PATH=/,"");print;exit}')")"
MANPATH="\$(br_dedup_envvar "\${MANPATH}:\$(echo "\${out}" | awk -F= '/^MANPATH=/{sub(/^MANPATH=/,"");print;exit}')")"
INFOPATH="\$(br_dedup_envvar "\${INFOPATH}:\$(echo "\${out}" | awk -F= '/^INFOPATH=/{sub(/^INFOPATH=/,"");print;exit}')")"
XDG_DATA_DIRS="\$(br_dedup_envvar "\${XDG_DATA_DIRS}:\$(echo "\${out}" | awk -F= '/^XDG_DATA_DIRS=/{sub(/^XDG_DATA_DIRS=/,"");print;exit}')")"
TERMINFO_DIRS="\$(br_dedup_envvar "\${TERMINFO_DIRS}:\$(echo "\${out}" | awk -F= '/^TERMINFO_DIRS=/{sub(/^TERMINFO_DIRS=/,"");print;exit}')")"
done

unset TZ
export LANG="$(cfg_value "locale" "LANG")"
br_prefix="$(cfg_value "env-vars" "PREFIX:PATH"):$(cfg_value "env-vars" "PATH")"
br_suffix="$(cfg_value "env-vars" "INFIX:PATH"):$(cfg_value "env-vars" "SUFFIX:PATH")"
export PATH="\$(br_pop_envvar "\${PATH}" "\${br_prefix}" "\${br_suffix}")"
br_prefix="$(cfg_value "env-vars" "PREFIX:MANPATH"):$(cfg_value "env-vars" "MANPATH")"
br_suffix="$(cfg_value "env-vars" "INFIX:MANPATH"):$(cfg_value "env-vars" "SUFFIX:MANPATH")"
export MANPATH="\$(br_pop_envvar "\${MANPATH}" "\${br_prefix}" "\${br_suffix}")"
br_prefix="$(cfg_value "env-vars" "PREFIX:INFOPATH"):$(cfg_value "env-vars" "INFOPATH")"
br_suffix="$(cfg_value "env-vars" "INFIX:INFOPATH"):$(cfg_value "env-vars" "SUFFIX:INFOPATH")"
export INFOPATH="\$(br_pop_envvar "\${INFOPATH}" "\${br_prefix}" "\${br_suffix}")"
br_prefix="$(cfg_value "env-vars" "PREFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "XDG_DATA_DIRS")"
br_suffix="$(cfg_value "env-vars" "INFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "SUFFIX:XDG_DATA_DIRS")"
export XDG_DATA_DIRS="\$(br_pop_envvar "\${XDG_DATA_DIRS}" "\${br_prefix}" "\${br_suffix}")"
br_prefix="$(cfg_value "env-vars" "PREFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "TERMINFO_DIRS")"
br_suffix="$(cfg_value "env-vars" "INFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "SUFFIX:TERMINFO_DIRS")"
export TERMINFO_DIRS="\$(br_pop_envvar "\${TERMINFO_DIRS}" "\${br_prefix}" "\${br_suffix}")"

unset br_prefix
unset br_suffix
unset -f br_pop_envvar
export PATH="\$(br_dedup_envvar "${PREFIX_PATH}:\${PATH}:${SUFFIX_PATH}")"
export MANPATH="\$(br_dedup_envvar "${PREFIX_MANPATH}:\${MANPATH}:${SUFFIX_MANPATH}")"
export INFOPATH="\$(br_dedup_envvar "${PREFIX_INFOPATH}:\${INFOPATH}:${SUFFIX_INFOPATH}")"
export XDG_DATA_DIRS="\$(br_dedup_envvar "${PREFIX_XDG_DATA_DIRS}:\${XDG_DATA_DIRS}:${SUFFIX_XDG_DATA_DIRS}")"
export TERMINFO_DIRS="\$(br_dedup_envvar "${PREFIX_TERMINFO_DIRS}:\${TERMINFO_DIRS}:${SUFFIX_TERMINFO_DIRS}")"

unset -f br_dedup_envvar
EOF

# Setup /etc/zsh/zprofile, /etc/zprofile
cat <<EOF >/bedrock/run/zprofile
[ -n "\${BEDROCK_RESTRICT:-}" ] && return

. /etc/profile
[[ -o login ]] && . /etc/profile

br_pop_envvar() {
orig="\${1}"
prefix="\${2}"
suffix="\${3}"
for d in \$(echo "\${prefix}" | sed 's/:/ /g'); do
if ! [[ ":\${orig}:" == *":\${d}:"* ]]; then
printf "%s" "\${d}:"
fi
done
printf "\${orig}"
for d in \$(echo "\${suffix}" | sed 's/:/ /g'); do
if ! [[ ":\${orig}:" == *":\${d}:"* ]]; then
printf "%s" ":\${d}"
fi
br_dedup_envvar() {
envvar=""
IFS=":"
[ -n "\${ZSH_VERSION:-}" ] && setopt sh_word_split
for i in \${@}; do
case ":\${envvar}:" in
*":\${i}:"*) ;;
*) envvar="\${envvar}:\${i}";;
esac
done
echo "\${envvar}" | sed -e 's/::*/:/g' -e 's/^://' -e 's/:$//'
}

local br_prefix="$(cfg_value "env-vars" "PREFIX:fpath"):$(cfg_value "env-vars" "fpath")"
local br_suffix="$(cfg_value "env-vars" "INFIX:fpath"):$(cfg_value "env-vars" "SUFFIX:fpath")"
export fpath=(\$(br_pop_envvar "\${fpath}" "\${br_prefix}" "\${br_suffix}" | sed 's/:/ /g'))
export fpath=(\$(br_dedup_envvar "${PREFIX_fpath}:\${fpath}:${SUFFIX_fpath}" | sed 's/:/ /g'))

unset -f br_pop_envvar
unset -f br_dedup_envvar
EOF

# Setup /etc/fish/conf.d/ configuration
cat <<EOF >/bedrock/run/fprofile
[ -n "\$BEDROCK_RESTRICT" ]; and exit 0

function br_pop_envvar
set -l orig (string split ":" \$argv[1])
set -l prefix (string split ":" \$argv[2])
set -l suffix (string split ":" \$argv[3])
set -l list
for d in \$prefix
if not contains \$d \$orig; and [ -n "\$d" ]
set -a list \$d
end
end
set -a list \$orig
for d in \$suffix
if not contains \$d \$orig; [ -n "\$d" ]
set -a list \$d
function br_dedup_envvar
set -l out
for i in (string split ":" \$argv[1])
if not contains \$i \$out; and [ -n "\$i" ]
set -a out \$i
end
end
string split ' ' \$list
string split ' ' \$out
end

set -e TZ
set LANG $(cfg_value "locale" "LANG")
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:PATH"):$(cfg_value "env-vars" "PATH")"
set -l br_suffix "$(cfg_value "env-vars" "INFIX:PATH"):$(cfg_value "env-vars" "SUFFIX:PATH")"
set -x PATH (br_pop_envvar "\$PATH" "\$br_prefix" "\$br_suffix")
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:MANPATH"):$(cfg_value "env-vars" "MANPATH")"
set -l br_suffix "$(cfg_value "env-vars" "INFIX:MANPATH"):$(cfg_value "env-vars" "SUFFIX:MANPATH")"
set -x MANPATH (br_pop_envvar "\$MANPATH" "\$br_prefix" "\$br_suffix")
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:INFOPATH"):$(cfg_value "env-vars" "INFOPATH")"
set -l br_suffix "$(cfg_value "env-vars" "INFIX:INFOPATH"):$(cfg_value "env-vars" "SUFFIX:INFOPATH")"
set -x INFOPATH (br_pop_envvar "\$INFOPATH" "\$br_prefix" "\$br_suffix")
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "XDG_DATA_DIRS")"
set -l br_suffix "$(cfg_value "env-vars" "INFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "SUFFIX:XDG_DATA_DIRS")"
set -x XDG_DATA_DIRS (br_pop_envvar "\$XDG_DATA_DIRS" "\$br_prefix" "\$br_suffix")
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "TERMINFO_DIRS")"
set -l br_suffix "$(cfg_value "env-vars" "INFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "SUFFIX:TERMINFO_DIRS")"
set -x TERMINFO_DIRS (br_pop_envvar "\$TERMINFO_DIRS" "\$br_prefix" "\$br_suffix")
functions -e br_pop_envvar
set -x PATH (br_dedup_envvar "${PREFIX_PATH}:\$PATH:${SUFFIX_PATH}")
set -x MANPATH (br_dedup_envvar "${PREFIX_MANPATH}:\$MANPATH:${SUFFIX_MANPATH}")
set -x INFOPATH (br_dedup_envvar "${PREFIX_INFOPATH}:\$INFOPATH:${SUFFIX_INFOPATH}")
set -x XDG_DATA_DIRS (br_dedup_envvar "${PREFIX_XDG_DATA_DIRS}:\$XDG_DATA_DIRS:${SUFFIX_XDG_DATA_DIRS}")
set -x TERMINFO_DIRS (br_dedup_envvar "${PREFIX_TERMINFO_DIRS}}:\$TERMINFO_DIRS:${SUFFIX_TERMINFO_DIRS}")

functions -e br_dedup_envvar
EOF

# Setup /etc/sudoers configuration
Expand Down

0 comments on commit fc27745

Please sign in to comment.