Created setup script for easy install/removal of theme
authorKevin Hill <kevinkhill@gmail.com>
Sat, 3 Aug 2013 16:05:16 +0000 (09:05 -0700)
committerKevin Hill <kevinkhill@gmail.com>
Sat, 3 Aug 2013 16:05:16 +0000 (09:05 -0700)
setup [new file with mode: 0755]

diff --git a/setup b/setup
new file mode 100755 (executable)
index 0000000..8942840
--- /dev/null
+++ b/setup
@@ -0,0 +1,473 @@
+#!/bin/bash
+
+##########################################################
+#   Configuration
+##########################################################
+#
+# Here you can set the default installation directory
+# 
+DEFAULT_TARGET="/usr/share/gitweb"
+
+
+
+
+##########################################################
+#   Functions
+##########################################################
+#
+# (no need to modify, unless you want to)
+#
+install()
+{
+       set_target
+       set_cmd_args
+       
+       if [[ $(check_for_symlinks) == $TRUE && $(check_for_backups) == $TRUE ]]
+       then
+               log ""
+               log "[ERROR]  - Symlinks and backups found in target, nothing to do."
+               log "[ERROR]  - (Is the theme already installed?)"
+               exit 1
+       else
+
+#Backing up
+               if [[ $INTERACTIVE == $TRUE ]]
+               then
+                       log ""
+                       if [[ $(confirm "Backing up original files, continue?") == $FALSE ]]
+                       then
+                               echo ""
+                               exit 1
+                       else
+                               echo ""
+                       fi
+               fi
+
+               if [[ $(check_for_backups) == $TRUE ]]
+               then
+                       log "[NOTICE] - Backups present, skipping..."
+               else
+                       log ""
+                       log "Backing up..."
+                       log ""
+                       for FILE in "${THEME_FILES[@]}"
+                       do
+                               if [[ -e "$TARGET/$FILE.bak" ]]
+                               then
+                                       log "Skipping $FILE.bak, file exists..."
+                               else
+                                       mv $MV_ARGS "$TARGET/$FILE" "$TARGET/$FILE.bak"
+                               fi
+                       done
+                       log ""
+                       log "...done"
+               fi
+
+#Symlinking
+               if [[ $INTERACTIVE == $TRUE ]]
+               then
+                       log ""
+                       if [[ $(confirm "Linking theme files, continue?") == $FALSE ]]
+                       then
+                               echo ""
+                               exit 1
+                       else
+                               echo ""
+                       fi
+               fi
+
+               if [[ $(check_for_symlinks) == $TRUE ]]
+               then
+                       log "[NOTICE] - Symlinks present, skipping..."
+               else
+                       log ""
+                       log "Linking..."
+                       log ""
+                       for FILE in "${THEME_FILES[@]}"
+                       do
+                               if [[ -h "$TARGET/$FILE" ]]
+                               then
+                                       log "Skipping $FILE, symlink exists..."
+                               else
+                                       ln $LN_ARGS "$THEME/$FILE" "$TARGET/$FILE"
+                               fi
+                       done
+                       log ""
+                       log "...done"
+               fi
+       fi
+       
+       log ""
+       log "[NOTICE] - Installation complete!"
+}
+
+remove()
+{
+       set_target
+       set_cmd_args
+       
+       if [[ $(check_for_symlinks "missing") == $TRUE && $(check_for_backups "missing") == $TRUE ]]
+       then
+               log ""
+               log "[ERROR]  - No symlinks or backups found in target, Nothing to do."
+               log "[ERROR]  - (Is the theme already removed?)"
+               exit 1
+       else
+       
+#Deleting
+               if [[ $INTERACTIVE == $TRUE ]]
+               then
+                       log ""
+                       if [[ $(confirm "Deleting symlinks, continue?") == $FALSE ]]
+                       then
+                               echo ""
+                               exit 1
+                       else
+                               echo ""
+                       fi
+               fi
+
+               if [[ $(check_for_symlinks) == $TRUE ]]
+               then
+                       log ""
+                       log "Deleting symlinks..."
+                       log ""
+                       for FILE in "${THEME_FILES[@]}"
+                       do
+                               if [[ -h "$TARGET/$FILE" ]]
+                               then
+                                       rm $RM_ARGS "$TARGET/$FILE"
+                               else
+                                       log "Skipping $FILE, not found..."
+                               fi
+                       done
+                       log ""
+                       log "...done"
+               else
+                       log "[NOTICE] - Symlinks not found, skipping..."
+               fi
+               
+#Restoring
+               if [[ $INTERACTIVE == $TRUE ]]
+               then
+                       log ""
+                       if [[ $(confirm "Restoring original files, continue?") == $FALSE ]]
+                       then
+                               echo ""
+                               exit 1
+                       else
+                               echo ""
+                       fi
+               fi
+               
+               if [[ $(check_for_backups) == $TRUE ]]
+               then
+                       log ""
+                       log "Restoring..."
+                       log ""
+                       for FILE in "${THEME_FILES[@]}"
+                       do
+                               if [[ -e "$TARGET/$FILE.bak" ]]
+                               then
+                                       mv $MV_ARGS "$TARGET/$FILE.bak" "$TARGET/$FILE"
+                               else
+                                       log "Skipping $FILE.bak, not found..."
+                               fi
+                       done
+                       log ""
+                       log "...done"
+               else
+                       log "[NOTICE] - Backups not found, skipping..."
+               fi
+       fi
+       
+       log ""
+       log "[NOTICE] - Removal complete!"
+}
+
+set_target()
+{
+       if [[ $TARGET && $(check_for_static $TARGET) == $TRUE ]]
+       then
+               log "[NOTICE] - Using specified target path: '$TARGET'"
+               
+               if [[ $INTERACTIVE == $TRUE ]]; then
+                       if [[ $(confirm "Is this correct?") == $FALSE ]]; then
+                               echo ""
+                               exit 1
+                       else
+                               echo ""
+                       fi
+               fi
+
+               TARGET="$TARGET/static"
+       else
+               if [[ $(check_for_static $DEFAULT_TARGET) == $TRUE ]]
+               then
+                       log "[NOTICE] - Target not set, using default path: '$DEFAULT_TARGET'"
+                       
+                       if [[ $INTERACTIVE  == $TRUE ]]
+                       then
+                               log ""
+                               if [[ $(confirm "Is this ok?") == $FALSE ]]
+                               then
+                                       echo ""
+                                       exit 1
+                               else
+                                       echo ""
+                               fi
+                       fi
+
+                       TARGET="$DEFAULT_TARGET/static"
+               else
+                       log ""
+                       log "[ERROR]  - Couldn't find folder 'static/' in the target path: '$TARGET'"
+                       log "[ERROR]  - (Are you sure this folder contains gitweb?)"
+                       exit 1
+               fi
+       fi
+}
+
+set_cmd_args()
+{
+       MV_ARGS=""
+       LN_ARGS=""
+       RM_ARGS=""
+
+       if [[ $VERBOSE == $TRUE ]];
+       then
+               MV_ARGS="-v"
+               LN_ARGS="-v -s"
+               RM_ARGS="-v"
+       fi
+       
+       if [[ $INTERACTIVE == $TRUE ]];
+       then
+               MV_ARGS="-i"
+               LN_ARGS="-i -s"
+               RM_ARGS="-i"
+       fi
+       
+       if [[ $INTERACTIVE == $TRUE && $VERBOSE == $TRUE ]];
+       then
+               MV_ARGS="-i -v"
+               LN_ARGS="-i -v -s"
+               RM_ARGS="-i -v"
+       fi
+}
+
+check_for_static()
+{
+       local RETURN=$FALSE
+       
+       if [[ -d "$1/static" ]]
+       then
+               RETURN=$TRUE
+       fi
+       
+       echo $RETURN
+}
+
+#If all present, true
+#If passed "missing", and all missing, true
+check_for_symlinks()
+{
+       local RETURN=$TRUE
+
+       if [[ $1 == "missing" ]]
+       then
+               local COUNT=0
+       
+               for FILE in "${THEME_FILES[@]}"
+               do
+                       if [[ ! -h "$TARGET/$FILE" ]]
+                       then
+                               COUNT=$(expr $COUNT + 1)
+                       fi
+               done
+               
+               if [[ $COUNT == "${THEME_FILES[@]}" ]]
+               then
+                       RETURN=$TRUE
+               else
+                       RETURN=$FALSE
+               fi
+       else
+               for FILE in "${THEME_FILES[@]}"
+               do
+                       if [[ ! -h "$TARGET/$FILE" ]]
+                       then
+                               RETURN=$FALSE
+                       fi
+               done
+       fi
+       
+       echo $RETURN
+}
+
+#If all present, true
+#If passed "missing", and all missing, true
+check_for_backups()
+{
+       local RETURN=$TRUE
+       
+       if [[ $1 == "missing" ]]
+       then
+               local COUNT=0
+       
+               for FILE in "${THEME_FILES[@]}"
+               do
+                       if [[ ! -e "$TARGET/$FILE.bak" ]]
+                       then
+                               COUNT=$(expr $COUNT + 1)
+                       fi
+               done
+               
+               if [[ $COUNT == "${THEME_FILES[@]}" ]]
+               then
+                       RETURN=$TRUE
+               else
+                       RETURN=$FALSE
+               fi
+       else
+               for FILE in "${THEME_FILES[@]}"
+               do
+                       if [[ ! -e "$TARGET/$FILE.bak" ]]
+                       then
+                               RETURN=$FALSE
+                       fi
+               done
+       fi
+
+       echo $RETURN
+}
+
+confirm()
+{
+       read -n 1 -p "$0: $1 [y] | [n] : " REPLY
+       
+       case $REPLY in
+               y|Y)
+                       echo $TRUE
+               ;;
+               n|N)
+                       echo $FALSE
+               ;;
+               *)
+                       echo "$0: [ERROR] - You must answer [y] | [n]"
+                       confirm "$1"
+               ;;
+       esac
+}
+
+log()
+{
+       if [[ $VERBOSE == $TRUE ]]
+       then
+               echo "$0: $1"
+       fi
+}
+
+usage()
+{
+cat << EOF
+Usage: $0 [-v|-i] [-t <TARGET>|--target <TARGET>] [--install|--remove|--repair]
+Or: $0 [-V|-h|--version|--help] 
+
+This script will create symlinks to your gitweb install for themeing.
+The default location is '/usr/share/gitweb' unless set via -t or --target. 
+
+OPTIONS:
+  -v, --verbose       Verbose output
+  -i, --interactive   Pauses for confirmation at each step
+  -t, --target        Where to create the symlinks, gitweb installation path
+  -h, --help          Shows this usage message
+  -V, --version       Displays version information
+  --install           Adds '.bak' to original files and creates symlinks to theme files
+  --remove            Deletes themed symlinks and restores the original files.
+  --repair            Removes all theme files, then reinstalls
+EOF
+}
+
+
+
+##########################################################
+#   Let's Go!
+##########################################################
+#
+PROG_NAME=$0
+PROG_VERSION="0.9.0"
+AUTHOR="Kevin Hill <http://github.com/kevinkhill>"
+
+readonly TRUE=0
+readonly FALSE=1
+
+TARGET=
+THEME=$(pwd)
+INTERACTIVE=$FALSE
+VERBOSE=$FALSE
+
+THEME_FILES=( "gitweb.css" "gitweb.js" "git-favicon.png" "git-logo.png" )
+
+SHORT_OPTS="Vhvit:"
+LONG_OPTS="version,help,verbose,interactive,target:,install,remove,repair"
+OPTS=$(getopt -o "$SHORT_OPTS" -l "$LONG_OPTS" --name "$0" -- "$@")
+
+if [ $? != 0 ]; then
+    exit 1
+fi
+
+eval set -- "$OPTS"
+unset OPTS
+
+if [ $# -eq 0 ]; then
+       echo "$0: [ERROR] - no options specified" >&2
+       usage
+fi
+
+while [ $# -gt 0 ]; do
+       case $1 in
+               -h|--help|-\?)
+                       usage
+                       exit 0
+               ;;
+               -v|--verbose)
+                       VERBOSE=$TRUE
+               ;;
+               -i|--interactive)
+                       INTERACTIVE=$TRUE
+               ;;
+               -t|--target)
+                       TARGET=$2
+                       shift
+               ;;
+               -V|--version)
+                       echo "Gitweb Theme Installer Script - v$PROG_VERSION"
+                       echo " Author: $AUTHOR"
+               ;; 
+               --install)
+                       install
+               ;;
+               --remove)
+                       remove
+               ;;
+               --repair)
+                       remove
+                       install
+               ;;
+               --)
+                       shift
+                       break
+               ;;
+               -*)
+                       echo "$0: [ERROR] - unrecognized option $1" >&2
+                       shift
+               ;;
+               *)
+                       break
+               ;;
+       esac
+       shift
+done
+
+exit 0