#!/bin/bash # Init pushd . > /dev/null cd "$(dirname "$0")/.." mkdir install_cache >/dev/null 2>&1 cd install_cache || exit 1 TMP_DIR="$(mktemp -d 2>/dev/null || mktemp -d -t 'wktmp')" # Functions ## code heavily borrowed from macapps.link getApp() { if [ -f "$1" ]; then echo $'\360\237\214\200 - ['$2'] Copying app...' cp -n "$1" "$2" else echo $'\360\237\214\200 - ['$2'] Downloading app...' curl "$1" -L -R -f -s -o "$2" -z "$2" fi } versionChecker() { local v1=$1 local v2=$2 while [ `echo $v1 | egrep -c [^0123456789.]` -gt 0 ]; do char=`echo $v1 | sed 's/.*\([^0123456789.]\).*/\1/'` char_dec=`echo -n "$char" | od -b | head -1 | awk {'print $2'}` v1=`echo $v1 | sed "s/$char/.$char_dec/g"` done while [ `echo $v2 | egrep -c [^0123456789.]` -gt 0 ]; do char=`echo $v2 | sed 's/.*\([^0123456789.]\).*/\1/'` char_dec=`echo -n "$char" | od -b | head -1 | awk {'print $2'}` v2=`echo $v2 | sed "s/$char/.$char_dec/g"` done v1=`echo $v1 | sed 's/\.\./.0/g'` v2=`echo $v2 | sed 's/\.\./.0/g'` checkVersion "$v1" "$v2" } checkVersion() { [ "$1" == "$2" ] && return 1 v1f=`echo $1 | cut -d "." -f -1` v1b=`echo $1 | cut -d "." -f 2-` v2f=`echo $2 | cut -d "." -f -1` v2b=`echo $2 | cut -d "." -f 2-` if [[ "$v1f" != "$1" ]] || [[ "$v2f" != "$2" ]]; then [[ "$v1f" -gt "$v2f" ]] && return 1 [[ "$v1f" -lt "$v2f" ]] && return 0 [[ "$v1f" == "$1" ]] || [[ -z "$v1b" ]] && v1b=0 [[ "$v2f" == "$2" ]] || [[ -z "$v2b" ]] && v2b=0 checkVersion "$v1b" "$v2b" return $? else [ "$1" -gt "$2" ] && return 1 || return 0 fi } appStatus() { if [ ! -d "/Applications/$1" ]; then echo "uninstalled" else if [[ $5 == "build" ]]; then BUNDLE="CFBundleVersion" else BUNDLE="CFBundleShortVersionString" fi INSTALLED=`/usr/libexec/plistbuddy -c Print:$BUNDLE: "/Applications/$1/Contents/Info.plist"` if [ $4 == "dmg" ]; then COMPARETO=`/usr/libexec/plistbuddy -c Print:$BUNDLE: "/Volumes/$2/$1/Contents/Info.plist"` elif [[ $4 == "zip" || $4 == "tar" ]]; then COMPARETO=`/usr/libexec/plistbuddy -c Print:$BUNDLE: "$3$1/Contents/Info.plist"` fi checkVersion "$INSTALLED" "$COMPARETO" UPDATED=$? if [[ $UPDATED == 1 ]]; then echo "updated" else echo "outdated" fi fi } installApp() { getApp "$4" "$2.$1" cp "$2.$1" "$TMP_DIR/" pushd "$TMP_DIR" >/dev/null if [ $1 == "dmg" ]; then yes | hdiutil mount -nobrowse "$2.dmg" -mountpoint "/Volumes/$2" > /dev/null install_status="$(appStatus "$3" "$2" "" "dmg" "$7")" if [[ "$install_status" == "updated" ]]; then echo $'\342\235\214 - ['$2'] Skipped because it was already up to date!' elif [[ "$install_status" == "outdated" && $6 != "noupdate" ]]; then ditto "/Volumes/$2/$3" "/Applications/$3" echo $'\360\237\214\216 - ['$2'] Successfully updated!' elif [[ "$install_status" == "outdated" && $6 == "noupdate" ]]; then echo $'\342\235\214 - ['$2'] This app cant be updated!' elif [[ "$install_status" == "uninstalled" ]]; then cp -R "/Volumes/$2/$3" /Applications echo $'\360\237\221\215 - ['$2'] Succesfully installed!' fi hdiutil unmount "/Volumes/$2" > /dev/null elif [ $1 == "zip" ]; then unzip -qq "$2.zip" install_status="$(appStatus "$3" "" "$5" "zip" "$7")" if [[ "$install_status" == "updated" ]]; then echo $'\342\235\214 - ['$2'] Skipped because it was already up to date!' elif [[ "$install_status" == "outdated" && $6 != "noupdate" ]]; then ditto "$5$3" "/Applications/$3" echo $'\360\237\214\216 - ['$2'] Successfully updated!' elif [[ "$install_status" == "outdated" && $6 == "noupdate" ]]; then echo $'\342\235\214 - ['$2'] This app cant be updated!' elif [[ "$install_status" == "uninstalled" ]]; then mv "$5$3" /Applications echo $'\360\237\221\215 - ['$2'] Succesfully installed!' fi rm -rf "$2.zip" && rm -rf "$5" && rm -rf "$3" elif [[ $1 == "tar" || $1 == "tbz" || $1 == "tgz" || $1 == "txz" ]]; then tar -zxf "$2.$1" > /dev/null; install_status="$(appStatus "$3" "" "$5" "tar" "$7")" if [[ "$install_status" == "updated" ]]; then echo $'\342\235\214 - ['$2'] Skipped because it was already up to date!' elif [[ "$install_status" == "outdated" && $6 != "noupdate" ]]; then ditto "$3" "/Applications/$3" echo $'\360\237\214\216 - ['$2'] Successfully updated!' elif [[ "$install_status" == "outdated" && $6 == "noupdate" ]]; then echo $'\342\235\214 - ['$2'] This app cant be updated!' elif [[ "$install_status" == "uninstalled" ]]; then mv "$5$3" /Applications echo $'\360\237\221\215 - ['$2'] Succesfully installed!' fi rm -rf "$2.$1" && rm -rf "$3" fi popd > /dev/null } # Install App installApp "$@" # Done rm -R "$TMP_DIR"