116116# Set up /etc/localtime
117117ln -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
120119cfg_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")
142141TERMINFO_DIRS=$(cfg_envvar "TERMINFO_DIRS")
143142EOF
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
146158cat <<EOF >/bedrock/run/profile
147159[ -n "\${BEDROCK_RESTRICT:-}" ] && return
148160
149161for 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
154167done
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
175182unset TZ
176183export 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
196191EOF
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
226215EOF
227216
228217# Setup /etc/fish/conf.d/ configuration
229218cat <<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
249229end
250230
251231set -e TZ
252232set 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
269240EOF
270241
271242# Setup /etc/sudoers configuration
0 commit comments