Skip to content

Commit fc27745

Browse files
committed
brl-apply: more fixes for envvar break-up handling
- Prioritize prefix over inherited - Cleaner de-dup logic - Avoid empty envvar items
1 parent 99f0dba commit fc27745

File tree

2 files changed

+67
-94
lines changed

2 files changed

+67
-94
lines changed

src/slash-bedrock/etc/bedrock.conf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ zsh/zshenv = /bedrock/share/zsh/include-bedrock
266266
# A list of directories searched by various programs to find executables.
267267
#
268268
PREFIX:PATH = /bedrock/cross/pin/bin:/bedrock/bin
269-
INFIX:PATH = /usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin:/usr/bin:/usr/sbin:/bin:/sbin
269+
INFIX:PATH = /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
270270
SUFFIX:PATH = /bedrock/cross/bin
271271

272272
#
@@ -280,7 +280,7 @@ SUFFIX:MANPATH = /bedrock/cross/man
280280
# A list of directories searched by the info executable to find documentation.
281281
#
282282
PREFIX:INFOPATH = /bedrock/cross/pin/info:/bedrock/share/info
283-
INFIX:INFOPATH = /usr/local/share/info:/usr/share/info:/bedrock/cross/info
283+
INFIX:INFOPATH = /usr/local/share/info:/usr/share/info
284284
SUFFIX:INFOPATH = /bedrock/cross/info
285285

286286
#

src/slash-bedrock/libexec/brl-apply

Lines changed: 65 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ fi
116116
# Set up /etc/localtime
117117
ln -fns "/bedrock/cross/zoneinfo/$(cfg_value "locale" "timezone")" /bedrock/run/localtime
118118

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

144+
PREFIX_PATH="$(cfg_value "env-vars" "PREFIX:PATH"):$(cfg_value "env-vars" "PATH")"
145+
SUFFIX_PATH="$(cfg_value "env-vars" "INFIX:PATH"):$(cfg_value "env-vars" "SUFFIX:PATH")"
146+
PREFIX_MANPATH="$(cfg_value "env-vars" "PREFIX:MANPATH"):$(cfg_value "env-vars" "MANPATH")"
147+
SUFFIX_MANPATH="$(cfg_value "env-vars" "INFIX:MANPATH"):$(cfg_value "env-vars" "SUFFIX:MANPATH")"
148+
PREFIX_INFOPATH="$(cfg_value "env-vars" "PREFIX:INFOPATH"):$(cfg_value "env-vars" "INFOPATH")"
149+
SUFFIX_INFOPATH="$(cfg_value "env-vars" "INFIX:INFOPATH"):$(cfg_value "env-vars" "SUFFIX:INFOPATH")"
150+
PREFIX_XDG_DATA_DIRS="$(cfg_value "env-vars" "PREFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "XDG_DATA_DIRS")"
151+
SUFFIX_XDG_DATA_DIRS="$(cfg_value "env-vars" "INFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "SUFFIX:XDG_DATA_DIRS")"
152+
PREFIX_TERMINFO_DIRS="$(cfg_value "env-vars" "PREFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "TERMINFO_DIRS")"
153+
SUFFIX_TERMINFO_DIRS="$(cfg_value "env-vars" "INFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "SUFFIX:TERMINFO_DIRS")"
154+
PREFIX_fpath="$(cfg_value "env-vars" "PREFIX:fpath"):$(cfg_value "env-vars" "fpath")"
155+
SUFFIX_fpath="$(cfg_value "env-vars" "INFIX:fpath"):$(cfg_value "env-vars" "SUFFIX:fpath")"
156+
145157
# Setup /etc/profile
146158
cat <<EOF >/bedrock/run/profile
147159
[ -n "\${BEDROCK_RESTRICT:-}" ] && return
148160

149-
for s in \$(/bedrock/bin/brl list); do
150-
(ls /bedrock/strata/\${s}/etc/profile.d/*.sh) >/dev/null 2>&1 || continue
151-
for f in /bedrock/strata/\${s}/etc/profile.d/*.sh; do
152-
. \${f} >/dev/null 2>&1 || true
153-
done
154-
done
155-
156-
br_pop_envvar() {
157-
orig="\${1}"
158-
prefix="\${2}"
159-
suffix="\${3}"
160-
for d in \$(echo "\${prefix}" | sed 's/:/ /g'); do
161-
case ":\${orig}:" in
162-
*":\${d}:"*) ;;
163-
*) printf "%s" "\${d}:" ;;
164-
esac
165-
done
166-
printf "\${orig}"
167-
for d in \$(echo "\${suffix}" | sed 's/:/ /g'); do
168-
case ":\${orig}:" in
169-
*":\${d}:"*) ;;
170-
*) printf "%s" ":\${d}" ;;
161+
br_dedup_envvar() {
162+
envvar=""
163+
IFS=":"
164+
[ -n "\${ZSH_VERSION:-}" ] && setopt sh_word_split
165+
for i in \${@}; do
166+
case ":\${envvar}:" in
167+
*":\${i}:"*) ;;
168+
*) envvar="\${envvar}:\${i}";;
171169
esac
172170
done
171+
echo "\${envvar}" | sed -e 's/::*/:/g' -e 's/^://' -e 's/:$//'
173172
}
174173

174+
for s in \$(/bedrock/bin/brl list); do
175+
[ -r "/bedrock/strata/\${s}/etc/profile" ] || continue
176+
out="\$(/bedrock/bin/strat -r "\${s}" /bin/sh -c '. /etc/profile ; env')"
177+
PATH="\$(br_dedup_envvar "\${PATH}:\$(echo "\${out}" | awk -F= '/^PATH=/{sub(/^PATH=/,"");print;exit}')")"
178+
MANPATH="\$(br_dedup_envvar "\${MANPATH}:\$(echo "\${out}" | awk -F= '/^MANPATH=/{sub(/^MANPATH=/,"");print;exit}')")"
179+
INFOPATH="\$(br_dedup_envvar "\${INFOPATH}:\$(echo "\${out}" | awk -F= '/^INFOPATH=/{sub(/^INFOPATH=/,"");print;exit}')")"
180+
XDG_DATA_DIRS="\$(br_dedup_envvar "\${XDG_DATA_DIRS}:\$(echo "\${out}" | awk -F= '/^XDG_DATA_DIRS=/{sub(/^XDG_DATA_DIRS=/,"");print;exit}')")"
181+
TERMINFO_DIRS="\$(br_dedup_envvar "\${TERMINFO_DIRS}:\$(echo "\${out}" | awk -F= '/^TERMINFO_DIRS=/{sub(/^TERMINFO_DIRS=/,"");print;exit}')")"
182+
done
183+
175184
unset TZ
176185
export LANG="$(cfg_value "locale" "LANG")"
177-
br_prefix="$(cfg_value "env-vars" "PREFIX:PATH"):$(cfg_value "env-vars" "PATH")"
178-
br_suffix="$(cfg_value "env-vars" "INFIX:PATH"):$(cfg_value "env-vars" "SUFFIX:PATH")"
179-
export PATH="\$(br_pop_envvar "\${PATH}" "\${br_prefix}" "\${br_suffix}")"
180-
br_prefix="$(cfg_value "env-vars" "PREFIX:MANPATH"):$(cfg_value "env-vars" "MANPATH")"
181-
br_suffix="$(cfg_value "env-vars" "INFIX:MANPATH"):$(cfg_value "env-vars" "SUFFIX:MANPATH")"
182-
export MANPATH="\$(br_pop_envvar "\${MANPATH}" "\${br_prefix}" "\${br_suffix}")"
183-
br_prefix="$(cfg_value "env-vars" "PREFIX:INFOPATH"):$(cfg_value "env-vars" "INFOPATH")"
184-
br_suffix="$(cfg_value "env-vars" "INFIX:INFOPATH"):$(cfg_value "env-vars" "SUFFIX:INFOPATH")"
185-
export INFOPATH="\$(br_pop_envvar "\${INFOPATH}" "\${br_prefix}" "\${br_suffix}")"
186-
br_prefix="$(cfg_value "env-vars" "PREFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "XDG_DATA_DIRS")"
187-
br_suffix="$(cfg_value "env-vars" "INFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "SUFFIX:XDG_DATA_DIRS")"
188-
export XDG_DATA_DIRS="\$(br_pop_envvar "\${XDG_DATA_DIRS}" "\${br_prefix}" "\${br_suffix}")"
189-
br_prefix="$(cfg_value "env-vars" "PREFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "TERMINFO_DIRS")"
190-
br_suffix="$(cfg_value "env-vars" "INFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "SUFFIX:TERMINFO_DIRS")"
191-
export TERMINFO_DIRS="\$(br_pop_envvar "\${TERMINFO_DIRS}" "\${br_prefix}" "\${br_suffix}")"
192-
193-
unset br_prefix
194-
unset br_suffix
195-
unset -f br_pop_envvar
186+
export PATH="\$(br_dedup_envvar "${PREFIX_PATH}:\${PATH}:${SUFFIX_PATH}")"
187+
export MANPATH="\$(br_dedup_envvar "${PREFIX_MANPATH}:\${MANPATH}:${SUFFIX_MANPATH}")"
188+
export INFOPATH="\$(br_dedup_envvar "${PREFIX_INFOPATH}:\${INFOPATH}:${SUFFIX_INFOPATH}")"
189+
export XDG_DATA_DIRS="\$(br_dedup_envvar "${PREFIX_XDG_DATA_DIRS}:\${XDG_DATA_DIRS}:${SUFFIX_XDG_DATA_DIRS}")"
190+
export TERMINFO_DIRS="\$(br_dedup_envvar "${PREFIX_TERMINFO_DIRS}:\${TERMINFO_DIRS}:${SUFFIX_TERMINFO_DIRS}")"
191+
192+
unset -f br_dedup_envvar
196193
EOF
197194

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

202-
. /etc/profile
199+
[[ -o login ]] && . /etc/profile
203200

204-
br_pop_envvar() {
205-
orig="\${1}"
206-
prefix="\${2}"
207-
suffix="\${3}"
208-
for d in \$(echo "\${prefix}" | sed 's/:/ /g'); do
209-
if ! [[ ":\${orig}:" == *":\${d}:"* ]]; then
210-
printf "%s" "\${d}:"
211-
fi
212-
done
213-
printf "\${orig}"
214-
for d in \$(echo "\${suffix}" | sed 's/:/ /g'); do
215-
if ! [[ ":\${orig}:" == *":\${d}:"* ]]; then
216-
printf "%s" ":\${d}"
217-
fi
201+
br_dedup_envvar() {
202+
envvar=""
203+
IFS=":"
204+
[ -n "\${ZSH_VERSION:-}" ] && setopt sh_word_split
205+
for i in \${@}; do
206+
case ":\${envvar}:" in
207+
*":\${i}:"*) ;;
208+
*) envvar="\${envvar}:\${i}";;
209+
esac
218210
done
211+
echo "\${envvar}" | sed -e 's/::*/:/g' -e 's/^://' -e 's/:$//'
219212
}
220213

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

225-
unset -f br_pop_envvar
216+
unset -f br_dedup_envvar
226217
EOF
227218

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

232-
function br_pop_envvar
233-
set -l orig (string split ":" \$argv[1])
234-
set -l prefix (string split ":" \$argv[2])
235-
set -l suffix (string split ":" \$argv[3])
236-
set -l list
237-
for d in \$prefix
238-
if not contains \$d \$orig; and [ -n "\$d" ]
239-
set -a list \$d
240-
end
241-
end
242-
set -a list \$orig
243-
for d in \$suffix
244-
if not contains \$d \$orig; [ -n "\$d" ]
245-
set -a list \$d
223+
function br_dedup_envvar
224+
set -l out
225+
for i in (string split ":" \$argv[1])
226+
if not contains \$i \$out; and [ -n "\$i" ]
227+
set -a out \$i
246228
end
247229
end
248-
string split ' ' \$list
230+
string split ' ' \$out
249231
end
250232

251233
set -e TZ
252234
set LANG $(cfg_value "locale" "LANG")
253-
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:PATH"):$(cfg_value "env-vars" "PATH")"
254-
set -l br_suffix "$(cfg_value "env-vars" "INFIX:PATH"):$(cfg_value "env-vars" "SUFFIX:PATH")"
255-
set -x PATH (br_pop_envvar "\$PATH" "\$br_prefix" "\$br_suffix")
256-
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:MANPATH"):$(cfg_value "env-vars" "MANPATH")"
257-
set -l br_suffix "$(cfg_value "env-vars" "INFIX:MANPATH"):$(cfg_value "env-vars" "SUFFIX:MANPATH")"
258-
set -x MANPATH (br_pop_envvar "\$MANPATH" "\$br_prefix" "\$br_suffix")
259-
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:INFOPATH"):$(cfg_value "env-vars" "INFOPATH")"
260-
set -l br_suffix "$(cfg_value "env-vars" "INFIX:INFOPATH"):$(cfg_value "env-vars" "SUFFIX:INFOPATH")"
261-
set -x INFOPATH (br_pop_envvar "\$INFOPATH" "\$br_prefix" "\$br_suffix")
262-
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "XDG_DATA_DIRS")"
263-
set -l br_suffix "$(cfg_value "env-vars" "INFIX:XDG_DATA_DIRS"):$(cfg_value "env-vars" "SUFFIX:XDG_DATA_DIRS")"
264-
set -x XDG_DATA_DIRS (br_pop_envvar "\$XDG_DATA_DIRS" "\$br_prefix" "\$br_suffix")
265-
set -l br_prefix "$(cfg_value "env-vars" "PREFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "TERMINFO_DIRS")"
266-
set -l br_suffix "$(cfg_value "env-vars" "INFIX:TERMINFO_DIRS"):$(cfg_value "env-vars" "SUFFIX:TERMINFO_DIRS")"
267-
set -x TERMINFO_DIRS (br_pop_envvar "\$TERMINFO_DIRS" "\$br_prefix" "\$br_suffix")
268-
functions -e br_pop_envvar
235+
set -x PATH (br_dedup_envvar "${PREFIX_PATH}:\$PATH:${SUFFIX_PATH}")
236+
set -x MANPATH (br_dedup_envvar "${PREFIX_MANPATH}:\$MANPATH:${SUFFIX_MANPATH}")
237+
set -x INFOPATH (br_dedup_envvar "${PREFIX_INFOPATH}:\$INFOPATH:${SUFFIX_INFOPATH}")
238+
set -x XDG_DATA_DIRS (br_dedup_envvar "${PREFIX_XDG_DATA_DIRS}:\$XDG_DATA_DIRS:${SUFFIX_XDG_DATA_DIRS}")
239+
set -x TERMINFO_DIRS (br_dedup_envvar "${PREFIX_TERMINFO_DIRS}}:\$TERMINFO_DIRS:${SUFFIX_TERMINFO_DIRS}")
240+
241+
functions -e br_dedup_envvar
269242
EOF
270243

271244
# Setup /etc/sudoers configuration

0 commit comments

Comments
 (0)