+ $wheres_nechung
+ fi
+ }
+
+ # recreates all the generated files that the feisty meow scripts use.
+ function regenerate() {
+ # do the bootstrapping process again.
+ echo "regenerating feisty meow script environment."
+ 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_LOADING_DOCK NECHUNG NETHACKOPTIONS
+ unset -f function_sentinel
+ # reload feisty meow environment in current shell.
+ source $FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh
+ # run nechung oracle to give user a new fortune.
+ nechung
+ }
+
+ # generates a random password where the first parameter is the number of characters
+ # in the password (default 20) and the second parameter specifies whether to use
+ # special characters (1) or not (0).
+ # found function at http://legroom.net/2010/05/06/bash-random-password-generator
+ function random_password()
+ {
+ [ "$2" == "0" ] && CHAR="[:alnum:]" || CHAR="[:graph:]"
+ cat /dev/urandom | tr -cd "$CHAR" | head -c ${1:-32}
+ echo
+ }
+
+ # a wrapper for the which command that finds items on the path. some OSes
+ # do not provide which, so we want to not be spewing errors when that
+ # happens.
+ function whichable()
+ {
+ to_find="$1"; shift
+ which which &>/dev/null
+ if [ $? -ne 0 ]; then
+ # there is no which command here. we produce nothing due to this.
+ echo
+ fi
+ echo $(which $to_find)
+ }
+
+ # copies a set of custom scripts into the proper location for feisty meow
+ # to merge their functions and aliases with the standard set.
+ function recustomize()
+ {
+ user="$1"; shift
+ if [ -z "$user" ]; then
+ # use our default example user if there was no name provided.
+ user=fred
+ fi
+ if [ ! -d "$FEISTY_MEOW_APEX/customizing/$user" ]; then
+ echo "The customization folder provided for $user should be:"
+ echo " '$FEISTY_MEOW_APEX/customizing/$user'"
+ echo "but that folder does not exist. Skipping customization."
+ return 1
+ fi
+ regenerate >/dev/null
+ 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 -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_APEX/customizing/$user/scripts" "$FEISTY_MEOW_LOADING_DOCK/custom/"
+ fi
+ echo
+ regenerate
+ }
+
+#uhhh, this does what now?
+ function add_cygwin_drive_mounts() {
+ for i in c d e f g h q z ; do
+ ln -s /cygdrive/$i $i
+ done
+ }
+
+ # takes a file to modify, and then it will replace any occurrences of the
+ # pattern provided as the second parameter with the text in the third
+ # parameter.
+ function replace_pattern_in_file()
+ {
+ local file="$1"; shift
+ local pattern="$1"; shift
+ local replacement="$1"; shift
+ if [ -z "$file" -o -z "$pattern" -o -z "$replacement" ]; then
+ echo "replace_pattern_in_file: needs a filename, a pattern to replace, and the"
+ echo "text to replace that pattern with."
+ return 1