-for i in ~/.profile.d/*.bashrc; do . $i; done
-__ps1
+if [ -t 0 -o "${0:0:1}" = "-" -o "$1" = "force" ]; then
+ # Set up PROFILE_HOME if called outside HOME.
+ if [ -z "$PROFILE_HOME" ]; then
+ # BASH_SOURCE isn't available prior to bash 3.
+ profile_home=${BASH_SOURCE%/*}
+ [ -n "$profile_home" -a -d "$profile_home" -a ! "${profile_home:0:1}" = "/" ] && profile_home=$(readlink -f "$profile_home" 2>/dev/null)
+ [ "$profile_home" = "$BASH_SOURCE" ] && profile_home=$PWD
+ [ "$profile_home" = "$HOME" ] || PROFILE_HOME=$profile_home
+ PROFILE_RC="$profile_home/.bash_profile"
+ unset profile_home
+ fi
-unset XMODIFIERS #:-(
-export SSHTERM="urxvt"
-export SSHTERM_TITLE="-title"
-export SSHTERM_EXEC="-e"
+ # Remember if nocaseglob was on.
+ shopt -q nocaseglob
+ nocg=$?
+ # Turn it off so we source stuff in the right order.
+ shopt -u nocaseglob
+ # Remember if nullglob was on.
+ shopt -q nullglob
+ nullglob=$?
+ # Turn it on so we can look in subdirectories.
+ shopt -s nullglob
-if [ "$OSTYPE" = "cygwin" ]; then
- shopt -s nocaseglob
-fi
+ # Remember LC_ALL.
+ lc_all=$LC_ALL
+ # Turn it off to set case-sensitive matching
+ LC_ALL=C
-#[ "$TERM" = "xterm-color" ] && export TERM=xterm-xfree86
-export PATH=~/bin:"$PATH"
+ # Force these to come before everything else.
+ required="OS.bashrc
+PATH.bashrc
+BECOME.bashrc"
-function upload() {
- if [ $# = 0 ]; then
- echo usage: upload file [file...]
- return 100
- fi
- pwd=$PWD/
- pwd=${pwd##/home/iain/www/}
- if echo $pwd | grep -q ^/; then
- echo not rooted under /home/iain/www
- unset pwd
- return 111
- fi
-# scp ${1+"$@"} 64.176.170.109:/home/iain/$pwd
- lftp -c "open web1.viagold.net; cd $pwd; mput $@"
- unset pwd
-}
-
-function download() {
- if [ $# = 0 ]; then
- echo usage: download file [file...]
- return 100
+ # 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
- pwd=$PWD/
- pwd=${pwd##/home/iain/www/}
- if echo $pwd | grep -q ^/; then
- echo not rooted under /home/iain/www
- unset pwd
- return 111
+ sorted=$(echo "$deps" | tsort)
+ if [ -n "$sorted" ]; then
+ deps="$sorted"
+ unset sorted
fi
-# scp ${1+"$@"} 64.176.170.109:/home/iain/$pwd
- lftp -c "open web1.viagold.net; cd $pwd; mget $@"
- unset pwd
-}
-alias debug='valgrind --leak-check=yes --show-reachable=yes --num-callers=5 --verbose'
+ deps="$required
+$deps"
-eval `dircolors -b`
+ # Restore PATH.
+ PATH="$path"
+
+ # Source them all in the right order.
+ sourced=
+ for i in $deps; do
+ for j in $PROFILE_D/{,*/}$i; do
+ [ -e "$j" ] || continue
+ k="${j##$PROFILE_D/}"
+ [ "${sourced/ $k /}" = "$sourced" ] || continue
+ . "$j"
+ sourced="$sourced $k "
+ break
+ done
+ done
+
+ # Maybe turn nocaseglob back on.
+ [ $nocg = 0 ] && shopt -s nocaseglob
+ # Maybe turn nullglob back off.
+ [ $nullglob = 0 ] || shopt -u nullglob
+
+ # Reset LC_ALL.
+ LC_ALL=$lc_all
+
+ unset i j k d n dep deps path required unsorted sourced
+ unset lc_all nullglob nocg
+
+ # Don't inherit failure from the last script.
+ true
+fi