better naming... bootstrap_shells => reconfigure_feisty_meow and bootstrap_build...
[feisty_meow.git] / scripts / core / functions.sh
index f6c4a714c852282fde76e4d860ba3f146f0ffb71..09d8836a898094f326e19354b31041f28749094e 100644 (file)
@@ -78,6 +78,17 @@ if [ -z "$skip_all" ]; then
     IFS="$HOLDIFS"
   }
 
+  # sets the variable in parameter 1 to the value in parameter 2, but only if
+  # that variable was undefined.
+  function set_var_if_undefined()
+  {
+    local var_name="$1"; shift
+    local var_value="$1"; shift
+    if [ -z "${!var_name}" ]; then
+      eval export $var_name="$var_value"
+    fi
+  }
+
   function success_sound()
   {
     if [ ! -z "$CLAM_FINISH_SOUND" ]; then
@@ -281,10 +292,12 @@ if [ -z "$skip_all" ]; then
     fi
   }
   
-  # switches from an X:/ form to an /X/path form.
+  # switches from an X:/ form to a /cygdrive/X/path form.  this is only useful
+  # for the cygwin environment currently.
   function dos_to_unix_path() {
     # we always remove dos slashes in favor of forward slashes.
-    echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\([a-zA-Z]\):\/\(.*\)/\/\1\/\2/'
+#old:    echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\([a-zA-Z]\):\/\(.*\)/\/\1\/\2/'
+         echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\([a-zA-Z]\):\/\(.*\)/\/cygdrive\/\1\/\2/'
   }
 
   # returns a successful value (0) if this system is debian or ubuntu.
@@ -354,7 +367,7 @@ if [ -z "$skip_all" ]; then
     if [ -z "$wheres_nechung" ]; then
       echo "The nechung oracle program cannot be found.  You may want to consider"
       echo "rebuilding the feisty meow applications with this command:"
-      echo "bash $FEISTY_MEOW_SCRIPTS/generator/bootstrap_build.sh"
+      echo "bash $FEISTY_MEOW_SCRIPTS/generator/produce_feisty_meow.sh"
     else
       $wheres_nechung
     fi
@@ -364,14 +377,14 @@ if [ -z "$skip_all" ]; then
   function regenerate() {
     # do the bootstrapping process again.
     echo "regenerating feisty meow script environment."
-    bash $FEISTY_MEOW_SCRIPTS/core/bootstrap_shells.sh
+    bash $FEISTY_MEOW_SCRIPTS/core/reconfigure_feisty_meow.sh
     echo
     # force a full reload by turning off sentinel variable and alias.
     # the nethack one is used by fred's customizations.
     # interesting note perhaps: found that the NETHACKOPTIONS variable was
     # not being unset correctly when preceded by an alias.  split them up
     # like they are now due to that bug.
-    unset -v CORE_ALIASES_LOADED FEISTY_MEOW_GENERATED NECHUNG NETHACKOPTIONS 
+    unset -v CORE_ALIASES_LOADED FEISTY_MEOW_LOADING_DOCK NECHUNG NETHACKOPTIONS 
     unset -f function_sentinel 
     # reload feisty meow environment in current shell.
     source $FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh
@@ -413,27 +426,30 @@ if [ -z "$skip_all" ]; then
       # use our default example user if there was no name provided.
       user=fred
     fi
-    if [ ! -d "$FEISTY_MEOW_DIR/customizing/$user" ]; then
+    if [ ! -d "$FEISTY_MEOW_APEX/customizing/$user" ]; then
       echo "The customization folder provided for $user should be:"
-      echo "  '$FEISTY_MEOW_DIR/customizing/$user'"
+      echo "  '$FEISTY_MEOW_APEX/customizing/$user'"
       echo "but that folder does not exist.  Skipping customization."
       return 1
     fi
     regenerate >/dev/null
-    pushd "$FEISTY_MEOW_GENERATED/custom" &>/dev/null
-    local incongruous_files="$(bash "$FEISTY_MEOW_SCRIPTS/files/list_non_dupes.sh" "$FEISTY_MEOW_DIR/customizing/$user" "$FEISTY_MEOW_GENERATED/custom")"
-    if [ ${#incongruous_files} -ge 1 ]; then
+    pushd "$FEISTY_MEOW_LOADING_DOCK/custom" &>/dev/null
+    local incongruous_files="$(bash "$FEISTY_MEOW_SCRIPTS/files/list_non_dupes.sh" "$FEISTY_MEOW_APEX/customizing/$user" "$FEISTY_MEOW_LOADING_DOCK/custom")"
+
+#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..."
       perl "$FEISTY_MEOW_SCRIPTS/files/safedel.pl" $incongruous_files
       echo
     fi
     popd &>/dev/null
     echo "copying custom overrides for $user"
-    mkdir "$FEISTY_MEOW_GENERATED/custom" 2>/dev/null
-    perl "$FEISTY_MEOW_SCRIPTS/text/cpdiff.pl" "$FEISTY_MEOW_DIR/customizing/$user" "$FEISTY_MEOW_GENERATED/custom"
-    if [ -d "$FEISTY_MEOW_DIR/customizing/$user/scripts" ]; then
+    mkdir -p "$FEISTY_MEOW_LOADING_DOCK/custom" 2>/dev/null
+    perl "$FEISTY_MEOW_SCRIPTS/text/cpdiff.pl" "$FEISTY_MEOW_APEX/customizing/$user" "$FEISTY_MEOW_LOADING_DOCK/custom"
+    if [ -d "$FEISTY_MEOW_APEX/customizing/$user/scripts" ]; then
       echo "copying custom scripts for $user"
-      \cp -R "$FEISTY_MEOW_DIR/customizing/$user/scripts" "$FEISTY_MEOW_GENERATED/custom/"
+      \cp -R "$FEISTY_MEOW_APEX/customizing/$user/scripts" "$FEISTY_MEOW_LOADING_DOCK/custom/"
     fi
     echo
     regenerate
@@ -462,6 +478,16 @@ if [ -z "$skip_all" ]; then
     sed -i -e "s%$pattern%$replacement%g" "$file"
   }
 
+  # goes to a particular directory passed as parameter 1, and then removes all
+  # the parameters after that from that directory.
+  function push_whack_pop()
+  {
+    local dir="$1"; shift
+    pushd "$dir" &>/dev/null
+    rm -rf $* &>/dev/null
+    popd &>/dev/null
+  }
+
   function spacem()
   {
     while [ $# -gt 0 ]; do
@@ -470,23 +496,38 @@ if [ -z "$skip_all" ]; then
         echo "failure to find a file or directory named '$arg'."
         continue
       fi
+
+      # first we will capture the output of the character replacement operation for reporting.
+      # this is done first since some filenames can't be properly renamed in perl (e.g. if they
+      # have pipe characters apparently).
+      intermediate_name="$(bash "$FEISTY_MEOW_SCRIPTS/files/replace_spaces_with_underscores.sh" "$arg")"
+      local saw_intermediate_result=0
+      if [ -z "$intermediate_name" ]; then
+        # make sure we report something, if there are no further name changes.
+        intermediate_name="'$arg'"
+      else 
+        # now zap the first part of the name off (since original name isn't needed).
+        intermediate_name="$(echo $intermediate_name | sed -e 's/.*=> //')"
+        saw_intermediate_result=1
+      fi
+
       # first we rename the file to be lower case.
-      perl $FEISTY_MEOW_SCRIPTS/files/renlower.pl "$arg" &>/dev/null
-      # oops, now the name is all lower-case.  we need to make the
-      # same adjustment.
-      arg2="$(echo "$arg" | tr A-Z a-z)"
-      # we definitely wanted to adjust the case first, rather than doing all
-      # the wacky stuff this script does to the filename...  we will capture
-      # the output of the replace operaton for reporting.
-      final_name="$(bash "$FEISTY_MEOW_SCRIPTS/files/replace_spaces_with_underscores.sh" "$arg2")"
+      actual_file="$(echo $intermediate_name | sed -e "s/'\([^']*\)'/\1/")"
+      final_name="$(perl $FEISTY_MEOW_SCRIPTS/files/renlower.pl "$actual_file")"
+      local saw_final_result=0
       if [ -z "$final_name" ]; then
-        # make sure we report something, if there are no further name changes.
-        final_name="$arg2"
+        final_name="$intermediate_name"
+      else
+        final_name="$(echo $final_name | sed -e 's/.*=> //')"
+        saw_final_result=1
+      fi
+#echo intermed=$saw_intermediate_result 
+#echo final=$saw_final_result 
+
+      if [[ $saw_intermediate_result != 0 || $saw_final_result != 0 ]]; then
+        # printout the combined operation results.
+        echo "'$arg' => $final_name"
       fi
-      # now zap the intermediate part of the name off.
-      final_name="$(echo $final_name | sed -e 's/.*=> //')"
-      # printout the combined operation results.
-      echo "'$arg' => $final_name"
     done
   }
 
@@ -537,6 +578,27 @@ return 0
   function function_sentinel() { return 0; }
   
   if [ ! -z "$SHELL_DEBUG" ]; then echo "feisty meow function definitions done."; fi
-  
+
+  ##############
+
+  # test code for set_var_if_undefined.
+  run_test=0
+  if [ $run_test != 0 ]; then
+    echo running tests on set_var_if_undefined.
+    flagrant=petunia
+    set_var_if_undefined flagrant forknordle
+    check_result "testing if defined variable would be whacked"
+    if [ $flagrant != petunia ]; then
+      echo set_var_if_undefined failed to leave the test variable alone
+      exit 1
+    fi
+    unset bobblehead_stomper
+    set_var_if_undefined bobblehead_stomper endurance
+    if [ $bobblehead_stomper != endurance ]; then
+      echo set_var_if_undefined failed to set a variable that was not defined yet
+      exit 1
+    fi
+  fi
+
 fi