Tidy up Show_Encoding().
[profile.git] / .bash_profile
index 5b49345..6fe0759 100644 (file)
@@ -1,24 +1,91 @@
-if $(tty -s) || [ "${0:0:1}" = "-" ]; then
+if [ -t 0 -o "${0:0:1}" = "-" -o "$1" = "force" ]; then
   # 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
   # Turn it off to set case-sensitive matching
   LC_ALL=C
 
-  # Source all scripts.
-  for i in ~/.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
+  sorted=$(echo "$deps" | tsort)
+  if [ -n "$sorted" ]; then
+    deps="$sorted"
+    unset sorted
+  fi
+  deps="$required
+$deps"
+
+  # 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 lc_all nocg
-  __ps1
+  unset i j k d n dep deps profile_d path required unsorted sourced
+  unset lc_all nullglob nocg
+
+  # Don't inherit failure from the last script.
+  true
 fi