+ # 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
+
+ save_terminal_title
+
+ if [ ! -d "$FEISTY_MEOW_APEX/customize/$user" ]; then
+ echo "The customization folder provided for $user should be:"
+ echo " '$FEISTY_MEOW_APEX/customize/$user'"
+ echo "but that folder does not exist. Skipping customization."
+ return 1
+ fi
+ regenerate >/dev/null
+ pushd "$FEISTY_MEOW_LOADING_DOCK/custom" &>/dev/null
+ incongruous_files="$(bash "$FEISTY_MEOW_SCRIPTS/files/list_non_dupes.sh" "$FEISTY_MEOW_APEX/customize/$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/customize/$user" "$FEISTY_MEOW_LOADING_DOCK/custom"
+ if [ -d "$FEISTY_MEOW_APEX/customize/$user/scripts" ]; then
+ echo "copying custom scripts for $user"
+ \cp -R "$FEISTY_MEOW_APEX/customize/$user/scripts" "$FEISTY_MEOW_LOADING_DOCK/custom/"
+ fi
+ echo
+ regenerate
+
+ restore_terminal_title
+ }
+
+ # 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)
+ }
+
+#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
+ 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
+ fi
+ sed -i -e "s%$pattern%$replacement%g" "$file"
+ }
+
+ # similar to replace_pattern_in_file, but also will add the new value
+ # when the old one did not already exist in the file.
+ function replace_if_exists_or_add()
+ {
+ local file="$1"; shift
+ local phrase="$1"; shift
+ local replacement="$1"; shift
+ if [ -z "$file" -o ! -f "$file" -o -z "$phrase" -o -z "$replacement" ]; then
+ echo "replace_if_exists_or_add: needs a filename, a phrase to replace, and the"
+ echo "text to replace that phrase with."
+ return 1
+ fi
+ grep "$phrase" "$file" >/dev/null
+ # replace if the phrase is there, otherwise add it.
+ if [ $? -eq 0 ]; then
+ replace_pattern_in_file "$file" "$phrase" "$replacement"
+ else
+ # this had better be the complete line.
+ echo "$replacement" >>"$file"
+ fi
+ }
+
+ ############################
+
+ # finds a variable (first parameter) in a particular property file
+ # (second parameter). the expected format for the file is:
+ # varX=valueX
+ function seek_variable()
+ {
+ local find_var="$1"; shift
+ local file="$1"; shift
+ if [ -z "$find_var" -o -z "$file" -o ! -f "$file" ]; then
+ echo -e "seek_variable: needs two parameters, firstly a variable name, and\nsecondly a file where the variable's value will be sought." 1>&2
+ return 1
+ fi
+
+ while read line; do
+ if [ ${#line} -eq 0 ]; then continue; fi
+ # split the line into the variable name and value.
+ IFS='=' read -a assignment <<< "$line"
+ local var="${assignment[0]}"
+ local value="${assignment[1]}"
+ if [ "${value:0:1}" == '"' ]; then
+ # assume the entry was in quotes and remove them.
+ value="${value:1:$((${#value} - 2))}"
+ fi
+ if [ "$find_var" == "$var" ]; then
+ echo "$value"
+ fi
+ done < "$file"
+ }
+
+ # finds a variable (first parameter) in a particular XML format file
+ # (second parameter). the expected format for the file is:
+ # ... name="varX" value="valueX" ...
+ function seek_variable_in_xml()
+ {
+ local find_var="$1"; shift
+ local file="$1"; shift
+ if [ -z "$find_var" -o -z "$file" -o ! -f "$file" ]; then
+ echo "seek_variable_in_xml: needs two parameters, firstly a variable name, and"
+ echo "secondly an XML file where the variable's value will be sought."
+ return 1
+ fi
+
+ while read line; do
+ if [ ${#line} -eq 0 ]; then continue; fi
+ # process the line to make it more conventional looking.
+ line="$(echo "$line" | sed -e 's/.*name="\([^"]*\)" value="\([^"]*\)"/\1=\2/')"
+ # split the line into the variable name and value.
+ IFS='=' read -a assignment <<< "$line"
+ local var="${assignment[0]}"
+ local value="${assignment[1]}"
+ if [ "${value:0:1}" == '"' ]; then
+ # assume the entry was in quotes and remove them.
+ value="${value:1:$((${#value} - 2))}"
+ fi
+ if [ "$find_var" == "$var" ]; then
+ echo "$value"
+ fi
+ done < "$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
+ if [ $? -ne 0 ]; then echo failed to enter dir--quitting.; fi
+ rm -rf $* &>/dev/null
+ if [ $? -ne 0 ]; then echo received a failure code when removing.; fi