# Turn it off to set case-sensitive matching
LC_ALL=C
- # Source all scripts.
- for i in ${PROFILE_HOME:-~}/.profile.d/*.bashrc; do . "$i"; done; unset i
+ # Force these to come before everything else.
+ required="OS.bashrc
+PATH.bashrc
+BECOME.bashrc"
+
+ # Remember PATH so we can mangle it to find tsort and sed.
+ path="$PATH"
+ PATH=/usr/bin:/bin:/usr/ccs/bin
+
+ # Sort all scripts by dependencies.
+ profile_d=${PROFILE_HOME:-~}/.profile.d
+ deps=
+ unsorted=
+ for i in $profile_d/*.bashrc; do
+ dep=$(sed -n 's/^##*[ ]*profile-required:[ ]*//p' "$i")
+ i="${i##$profile_d/}"
+ if [ -n "$dep" ]; then
+ for d in $dep; do
+ deps="$deps
+$d $i"
+ done
+ else
+ unsorted="$unsorted
+$i"
+ fi
+ done
+
+ deps="$deps$unsorted"
+
+ # Avoid odd number of tokens for tsort.
+ n=$(echo "$deps" | wc -w)
+ if [ $((n%2)) = 1 ]; then
+ deps="$deps
+${deps##*
+}"
+ fi
+ deps=$(echo "$deps" | tsort)
+ deps="$required
+$deps"
+
+ # Restore PATH.
+ PATH="$path"
+
+ # Source them all in the right order.
+ sourced=
+ for i in $deps; do
+ [ -e "$profile_d/$i" ] || continue
+ [ "${sourced/ $i /}" = "$sourced" ] || continue
+ . "$profile_d/$i"
+ sourced="$sourced $i "
+ done
# Maybe turn nocaseglob back on.
[ $nocg = 0 ] && shopt -s nocaseglob
# Reset LC_ALL.
LC_ALL=$lc_all
+ unset i d n dep deps profile_d path required unsorted sourced
unset lc_all nocg
+
+ # Don't inherit failure from the last script.
+ true
fi