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,130 +141,104 @@ 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
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+
175184unset TZ
176185export 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
196193EOF
197194
198195# Setup /etc/zsh/zprofile, /etc/zprofile
199196cat <<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
226217EOF
227218
228219# Setup /etc/fish/conf.d/ configuration
229220cat <<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
249231end
250232
251233set -e TZ
252234set 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
269242EOF
270243
271244# Setup /etc/sudoers configuration
0 commit comments