improved wording for not finding file
[feisty_meow.git] / scripts / core / functions.sh
index fc5ce4ebc677daf6270acb850cda42688c803eaf..a58e818fd5000bee4172a7fcf0f955e8d76d0656 100644 (file)
@@ -40,15 +40,25 @@ if [ -z "$skip_all" ]; then
     cd "$1"
   }
 
+  # returns true if the variable is an array.
   function is_array() {
     [[ "$(declare -p $1)" =~ "declare -a" ]]
   }
 
+  # returns true if the name provided is a defined alias.
   function is_alias() {
     alias $1 &>/dev/null
     return $?
   }
 
+  # makes the status of pipe number N (passed as first parameter) into the
+  # main return value (i.e., the value for $?).  this is super handy to avoid
+  # repeating the awkward looking code below in multiple places.
+  function promote_pipe_return()
+  {
+    ( exit ${PIPESTATUS[$1]} )
+  }
+
   ##############
 
   # displays the value of a variable in bash friendly format.
@@ -144,7 +154,7 @@ if [ -z "$skip_all" ]; then
   function exit_on_error()
   {
     if [ $? -ne 0 ]; then
-      echo -e "\n\naction failed: $*\n\n*** Exiting script..."
+      echo -e "\n\nan important action failed and this script will stop:\n\n$*\n\n*** Exiting script..."
       error_sound
       exit 1
     fi
@@ -154,13 +164,21 @@ if [ -z "$skip_all" ]; then
   function continue_on_error()
   {
     if [ $? -ne 0 ]; then
-      echo -e "\n\nerror occurred: $*\n\n=> Continuing script..."
+      echo -e "\n\na problem occurred, but we can continue:\n\n$*\n\n=> Continuing script..."
       error_sound
     fi
   }
 
   ##############
 
+  # accepts any number of arguments and outputs them to the feisty meow event log.
+  function log_feisty_meow_event()
+  {
+    echo -e "$(date_stringer) -- ${USER}@$(hostname): $*" >> "$FEISTY_MEOW_EVENT_LOG"
+  }
+
+  ##############
+
   # wraps secure shell with some parameters we like, most importantly to enable X forwarding.
   function ssh()
   {
@@ -169,6 +187,9 @@ if [ -z "$skip_all" ]; then
     # version for the other side (just 'linux'); we don't want the remote side still
     # thinking it's running xterm.
     save_terminal_title
+    if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
+      echo TERM saved is: $PRIOR_TERMINAL_TITLE
+    fi
 #hmmm: why were we doing this?  it scorches the user's logged in session, leaving it without proper terminal handling.
 #    # we save the value of TERM; we don't want to leave the user's terminal
 #    # brain dead once we come back from this function.
@@ -177,7 +198,13 @@ if [ -z "$skip_all" ]; then
     /usr/bin/ssh -X -C "${args[@]}"
 #    # restore the terminal variable also.
 #    TERM="$oldterm"
+    if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
+      echo TERM before restore, will use prior title of: $PRIOR_TERMINAL_TITLE
+    fi
     restore_terminal_title
+    if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
+      echo TERM title restored to prior value
+    fi
   }
 
   ##############
@@ -452,8 +479,7 @@ if [ -z "$skip_all" ]; then
     unalias CORE_ALIASES_LOADED &>/dev/null
     unset -f function_sentinel 
     # reload feisty meow environment in current shell.
-    echo "reloading the feisty meow scripts."
-    echo
+    log_feisty_meow_event "reloading the feisty meow scripts for $USER in current shell."
     source "$FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh"
     # run nechung oracle to give user a new fortune.
     nechung
@@ -466,25 +492,39 @@ if [ -z "$skip_all" ]; then
   {
     local custom_user="$1"; shift
     if [ -z "$custom_user" ]; then
-      # use our default example user if there was no name provided.
-      custom_user=$(logname)
+      # default to login name if there was no name provided.
+      custom_user="$(logname)"
+        # we do intend to use logname here to get the login name and to ignore
+        # if the user has sudo root access; we don't want to provide a custom
+        # profile for root.
     fi
 
     save_terminal_title
 
     if [ ! -d "$FEISTY_MEOW_SCRIPTS/customize/$custom_user" ]; then
-      echo "The customization folder for '$custom_user' would be:"
-      echo "  $FEISTY_MEOW_SCRIPTS/customize/$custom_user"
-      echo "but that folder does not exist.  Skipping recustomization."
+      echo -e "the customization folder for '$custom_user' is missing:
+
+    $FEISTY_MEOW_SCRIPTS/customize/$custom_user
+
+we will skip recustomization, but these other customizations are available:
+"
+      # a little tr and sed magic to fix the carriage returns into commas.
+      local line="$(find $FEISTY_MEOW_SCRIPTS/customize -mindepth 1 -maxdepth 1 -type d -exec basename {} ';' | tr '\n' '&' | sed 's/&/, /g' | sed -e 's/, $//')"
+        # make the line feeds and carriage returns manageable with tr.
+        # convert the ampersand, our weird replacement for EOL, with a comma + space in sed.
+        # last touch with sed removes the last comma.
+      echo "    $line"
       return 1
     fi
 
     # prevent permission foul-ups.
-#hmmm: save error output here instead of muting it.
-#hmmm: better yet actually, just don't complain on freaking cygwin, since that's where this happens
-    chown -R "$(logname):$(logname)" \
+    my_user="$USER"
+      # here we definitely want the effective user name (in USER), since
+      # we don't want, say, fred (as logname) to own all of root's loading
+      # dock stuff.
+    chown -R "$my_user:$my_user" \
         "$FEISTY_MEOW_LOADING_DOCK"/* "$FEISTY_MEOW_GENERATED_STORE"/* 2>/dev/null
-    continue_on_error "chowning to $(logname) didn't happen."
+    continue_on_error "chowning feisty meow generated directories to $my_user"
 
     regenerate >/dev/null
     pushd "$FEISTY_MEOW_LOADING_DOCK/custom" &>/dev/null
@@ -492,37 +532,35 @@ if [ -z "$skip_all" ]; then
 
     local fail_message="\n
 are the perl dependencies installed?  if you're on ubuntu or debian, try this:\n
-    $(grep "apt-get.*perl" $FEISTY_MEOW_APEX/readme.txt)\n
+    $(grep "apt.*perl" $FEISTY_MEOW_APEX/readme.txt)\n
 or if you're on cygwin, then try this (if apt-cyg is available):\n
     $(grep "apt-cyg.*perl" $FEISTY_MEOW_APEX/readme.txt)\n";
 
     #echo "the incongruous files list is: $incongruous_files"
     # disallow a single character result, since we get "*" as result when nothing exists yet.
     if [ ${#incongruous_files} -ge 2 ]; then
-      echo "cleaning unknown older overrides..."
+      log_feisty_meow_event "cleaning unknown older overrides..."
       perl "$FEISTY_MEOW_SCRIPTS/files/safedel.pl" $incongruous_files
       continue_on_error "running safedel.  $fail_message" 
-      echo
     fi
     popd &>/dev/null
-    echo "copying custom overrides for $custom_user"
+    log_feisty_meow_event "copying custom overrides for $custom_user"
     mkdir -p "$FEISTY_MEOW_LOADING_DOCK/custom" 2>/dev/null
     perl "$FEISTY_MEOW_SCRIPTS/text/cpdiff.pl" "$FEISTY_MEOW_SCRIPTS/customize/$custom_user" "$FEISTY_MEOW_LOADING_DOCK/custom"
     continue_on_error "running cpdiff.  $fail_message"
 
     if [ -d "$FEISTY_MEOW_SCRIPTS/customize/$custom_user/scripts" ]; then
-      echo "copying custom scripts for $custom_user"
+      log_feisty_meow_event "copying custom scripts for $custom_user"
+#hmmm: could save output to show if an error occurs.
       rsync -avz "$FEISTY_MEOW_SCRIPTS/customize/$custom_user/scripts" "$FEISTY_MEOW_LOADING_DOCK/custom/" &>/dev/null
       continue_on_error "copying customization scripts"
-#hmmm: could save output to show if an error occurs.
     fi
-    echo
     regenerate
 
     # prevent permission foul-ups, again.
-    chown -R "$(logname):$(logname)" \
+    chown -R "$my_user:$my_user" \
         "$FEISTY_MEOW_LOADING_DOCK" "$FEISTY_MEOW_GENERATED_STORE" 2>/dev/null
-    continue_on_error "chowning to $(logname) didn't happen."
+    continue_on_error "once more chowning feisty meow generated directories to $my_user"
 
     restore_terminal_title
   }
@@ -552,10 +590,9 @@ or if you're on cygwin, then try this (if apt-cyg is available):\n
     echo $(which $to_find)
   }
 
-#hmmm: improve this by not adding the link
-# if already there, or if the drive is not valid.
   function add_cygwin_drive_mounts() {
     for i in c d e f g h q z ; do
+#hmmm: improve this by not adding the link if already there, or if the drive is not valid.
       ln -s /cygdrive/$i $i
     done
   }
@@ -680,7 +717,7 @@ or if you're on cygwin, then try this (if apt-cyg is available):\n
     while [ $# -gt 0 ]; do
       arg="$1"; shift
       if [ ! -f "$arg" -a ! -d "$arg" ]; then
-        echo "failure to find a file or directory named '$arg'."
+        echo "=> did not find a file or directory named '$arg'."
         continue
       fi