Skip to content

Commit 4099fe1

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 4099fe1

File tree

2 files changed

+59
-88
lines changed

2 files changed

+59
-88
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: 57 additions & 86 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,57 +141,53 @@ 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

149161
for s in \$(/bedrock/bin/brl list); do
150-
(ls /bedrock/strata/\${s}/etc/profile.d/*.sh) >/dev/null 2>&1 || continue
162+
{ls /bedrock/strata/\${s}/etc/profile.d/*.sh} >/dev/null 2>&1 || continue
151163
for f in /bedrock/strata/\${s}/etc/profile.d/*.sh; do
152-
. \${f} >/dev/null 2>&1 || true
164+
# busybox "|| true" insufficiently robust, abuse no pipefail
165+
. \${f} >/dev/null 2>&1 | true
153166
done
154167
done
155168

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}" ;;
169+
br_dedup_envvar() {
170+
envvar=""
171+
IFS=":"
172+
[ -n "\${ZSH_VERSION:-}" ] && setopt sh_word_split
173+
for i in \${@}; do
174+
case ":\${envvar}:" in
175+
*":\${i}:"*) ;;
176+
*) envvar="\${envvar}:\${i}";;
171177
esac
172178
done
179+
echo "\${envvar}" | sed -e 's/::*/:/g' -e 's/^://' -e 's/:$//'
173180
}
174181

175182
unset TZ
176183
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
184+
export PATH="\$(br_dedup_envvar "${PREFIX_PATH}:\${PATH}:${SUFFIX_PATH}")"
185+
export MANPATH="\$(br_dedup_envvar "${PREFIX_MANPATH}:\${MANPATH}:${SUFFIX_MANPATH}")"
186+
export INFOPATH="\$(br_dedup_envvar "${PREFIX_INFOPATH}:\${INFOPATH}:${SUFFIX_INFOPATH}")"
187+
export XDG_DATA_DIRS="\$(br_dedup_envvar "${PREFIX_XDG_DATA_DIRS}:\${XDG_DATA_DIRS}:${SUFFIX_XDG_DATA_DIRS}")"
188+
export TERMINFO_DIRS="\$(br_dedup_envvar "${PREFIX_TERMINFO_DIRS}:\${TERMINFO_DIRS}:${SUFFIX_TERMINFO_DIRS}")"
189+
190+
unset -f br_dedup_envvar
196191
EOF
197192

198193
# Setup /etc/zsh/zprofile, /etc/zprofile
@@ -201,71 +196,47 @@ cat <<EOF >/bedrock/run/zprofile
201196

202197
. /etc/profile
203198

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
199+
br_dedup_envvar() {
200+
envvar=""
201+
IFS=":"
202+
[ -n "\${ZSH_VERSION:-}" ] && setopt sh_word_split
203+
for i in \${@}; do
204+
case ":\${envvar}:" in
205+
*":\${i}:"*) ;;
206+
*) envvar="\${envvar}:\${i}";;
207+
esac
218208
done
209+
echo "\${envvar}" | sed -e 's/::*/:/g' -e 's/^://' -e 's/:$//'
219210
}
220211

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'))
212+
export fpath=(\$(br_dedup_envvar "${PREFIX_fpath}:\${fpath}:${SUFFIX_fpath}" | sed 's/:/ /g'))
224213

225-
unset -f br_pop_envvar
214+
unset -f br_dedup_envvar
226215
EOF
227216

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

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
221+
function br_dedup_envvar
222+
set -l out
223+
for i in (string split ":" \$argv[1])
224+
if not contains \$i \$out; and [ -n "\$i" ]
225+
set -a out \$i
240226
end
241227
end
242-
set -a list \$orig
243-
for d in \$suffix
244-
if not contains \$d \$orig; [ -n "\$d" ]
245-
set -a list \$d
246-
end
247-
end
248-
string split ' ' \$list
228+
string split ' ' \$out
249229
end
250230

251231
set -e TZ
252232
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
233+
set -x PATH (br_dedup_envvar "${PREFIX_PATH}:\$PATH:${SUFFIX_PATH}")
234+
set -x MANPATH (br_dedup_envvar "${PREFIX_MANPATH}:\$MANPATH:${SUFFIX_MANPATH}")
235+
set -x INFOPATH (br_dedup_envvar "${PREFIX_INFOPATH}:\$INFOPATH:${SUFFIX_INFOPATH}")
236+
set -x XDG_DATA_DIRS (br_dedup_envvar "${PREFIX_XDG_DATA_DIRS}:\$XDG_DATA_DIRS:${SUFFIX_XDG_DATA_DIRS}")
237+
set -x TERMINFO_DIRS (br_dedup_envvar "${PREFIX_TERMINFO_DIRS}}:\$TERMINFO_DIRS:${SUFFIX_TERMINFO_DIRS}")
238+
239+
functions -e br_dedup_envvar
269240
EOF
270241

271242
# Setup /etc/sudoers configuration

0 commit comments

Comments
 (0)