Handle the case where $HOME has a trailing slash.
[profile.git] / .bash_profile
index b10aba7..5170519 100644 (file)
@@ -1,9 +1,25 @@
-if tty -s || [ "${0:0:1}" = "-" -o "$1" = "force" ]; then
+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
+
   # 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
 
   # Remember LC_ALL.
   lc_all=$LC_ALL
@@ -20,12 +36,12 @@ BECOME.bashrc"
   PATH=/usr/bin:/bin:/usr/ccs/bin
 
   # Sort all scripts by dependencies.
-  profile_d=${PROFILE_HOME:-~}/.profile.d
+  PROFILE_D=${PROFILE_HOME:-~}/.profile.d
   deps=
   unsorted=
-  for i in $profile_d/*.bashrc; do
+  for i in $PROFILE_D/{*/,}*.bashrc; do
     dep=$(sed -n 's/^##*[      ]*profile-required:[    ]*//p' "$i")
-    i="${i##$profile_d/}"
+    i="${i##$PROFILE_D/}"
     if [ -n "$dep" ]; then
       for d in $dep; do
         deps="$deps
@@ -60,20 +76,26 @@ $deps"
   # 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 "
+    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 d n dep deps profile_d path required unsorted sourced
-  unset lc_all nocg
+  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