Skip to content

Instantly share code, notes, and snippets.

@RJHsiao
Last active February 14, 2024 09:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RJHsiao/d4ee0ff671e76b02d9e5706294d3597c to your computer and use it in GitHub Desktop.
Save RJHsiao/d4ee0ff671e76b02d9e5706294d3597c to your computer and use it in GitHub Desktop.
Brew-Cask-Upgrade: Check and upgrade your app installed from caskroom automatically.
#! /usr/bin/env bash
# brew-cask-upgrade.sh: "Brew-Cask-Upgrade"
# Author: RJ Hsiao <rj-at-rjhsiao.me>
# Url: https://gist.github.com/RJHsiao/d4ee0ff671e76b02d9e5706294d3597c
# License: GPLv3
# Usage: sh brew-cask-upgrade.sh [options]
readonly NAME="Brew-Cask-Upgrade"
readonly VERSION="1.1.5"
readonly URL="https://gist.github.com/RJHsiao/d4ee0ff671e76b02d9e5706294d3597c"
BASENAME=$(basename "$0")
readonly BASENAME
readonly USAGE="$NAME $VERSION
$NAME is a script to help you check casks info you installed and
upgrade if new version detected. This script will run \`brew update\` first
to fetch newset cask info from GitHub, and ask to run\`brew upgrade\` if
upgradeable brew formulae exist.
Usage:
$BASENAME [OPTION]...
Options:
-y, --yes Upgrade without asking
-h, --help Show this help
-v, --version Show version info
-V, --verbose Show verbose info
Bug report and feedback, please check GitHub Gist:
$URL
"
AUTO_YES=false
SHOW_VERSION=false
SHOW_VERBOSE=false
SHOW_USAGE=false
while [[ $# -gt 0 ]]; do
key=$1
case $key in
-y|--yes)
AUTO_YES=true
;;
-v|--version)
SHOW_VERSION=true
;;
-V|--verbose)
SHOW_VERBOSE=true
;;
-h|--help)
SHOW_USAGE=true
;;
*)
echo "$USAGE"
echo "Unknown option: $key"
exit 1
;;
esac
shift
done
[[ "$SHOW_USAGE" = "true" ]] && echo "$USAGE" && exit 0
[[ "$SHOW_VERSION" = "true" ]] && echo "$NAME $VERSION" && exit 0
UPGRADE_CASKS=""
AUTO_UPDATE_CASKS=""
SELF_CHECK_CASKS=""
DEPRECATED_CASKS=""
CASKROOM="$(brew --prefix)/Caskroom"
for BREW_CASK_OPT in $HOMEBREW_CASK_OPTS; do
if [[ "$BREW_CASK_OPT" =~ --caskroom=* ]]; then
CASKROOM="${BREW_CASK_OPT#*=}"
break
fi
done
echo "Caskroom path: $CASKROOM"
echo "run \`brew update\`"
if ! brew update; then
echo -e "\033[0;31mError: Cannot update cask info from repository.\033[0m"
exit 1
fi
echo "run \`brew outdated\`"
BREW_OUTDATED=$(brew outdated --verbose)
[ -n "$BREW_OUTDATED" ] && echo "$BREW_OUTDATED"
if [ -n "$BREW_OUTDATED" ]; then
if [[ "$AUTO_YES" = "true" ]]; then
ans='Y'
else
read -r -n 1 -p "Upgradeable brew formulae exist. Do you want to upgrade now (y/N)? " ans
echo
fi
if [[ $ans = [Yy] ]]; then
echo "run \`brew upgrade\`"
brew upgrade
else
echo "Passed."
fi
else
echo "No upgradeable brew formulae exist."
fi
CASK_LIST=$(brew list --cask --full-name)
while read -r cask; do
[[ "$SHOW_VERBOSE" = "true" ]] && echo "Checking cask info: $cask"
if [ "${cask:${#cask}-3}" = '(!)' ]; then
[[ "$SHOW_VERBOSE" = "true" ]] && echo "Deprecated cask detected: ${cask::${#cask}-4}"
if [ -z "$DEPRECATED_CASKS" ]; then
DEPRECATED_CASKS="${cask::${#cask}-4}"
else
DEPRECATED_CASKS="$DEPRECATED_CASKS ${cask::${#cask}-4}"
fi
continue
fi
cask_info=$(brew info --cask "$cask")
if [ -z "$cask_info" ]; then
echo -en '\033[0;33m'
echo "Warning: Cannot get cask info: $cask, please check"
echo " https://github.com/caskroom/homebrew-cask/search?q=$cask"
echo -e "to get more info.\033[0m"
continue
fi
cask_ver=$(echo "$cask_info" | awk 'FNR == 1 {print $3}')
if [ -z "$cask_ver" ]; then
echo -en '\033[0;33m'
echo " Cannot get cask info: $cask"
echo -en "\033[0m"
continue
fi
if [ "$cask_ver" = "latest" ]; then
if brew cat --cask "$cask" | grep -F 'auto_updates true' > /dev/null; then
[[ "$SHOW_VERBOSE" = "true" ]] && echo " Cask \"$cask\" will update automatically."
if [ -z "$AUTO_UPDATE_CASKS" ]; then
AUTO_UPDATE_CASKS="$cask"
else
AUTO_UPDATE_CASKS="$AUTO_UPDATE_CASKS $cask"
fi
continue
fi
if [ -z "$SELF_CHECK_CASKS" ]; then
SELF_CHECK_CASKS="$cask"
else
SELF_CHECK_CASKS="$SELF_CHECK_CASKS $cask"
fi
continue
fi
IFS='/' read -ra cask_hierarchy_array <<< "$cask"
cask_name="${cask_hierarchy_array[${#cask_hierarchy_array[@]}-1]}"
if [ ! -d "$CASKROOM/$cask_name/$cask_ver" ]; then
echo " New version detected: $cask -> $cask_ver"
if [ -z "$UPGRADE_CASKS" ]; then
UPGRADE_CASKS="$cask"
else
UPGRADE_CASKS="$UPGRADE_CASKS $cask"
fi
fi
done <<< "$CASK_LIST"
echo "========================================================================"
if [ -n "$UPGRADE_CASKS" ]; then
echo "Need upgrade: "
echo "$UPGRADE_CASKS"
if [[ "$AUTO_YES" = "true" ]]; then
ans=Y
else
read -r -n 1 -p "Do you want to upgrade now (y/N)? " ans
echo
fi
if [[ $ans = [Yy] ]]; then
echo "brew upgrade --cask $UPGRADE_CASKS"
brew upgrade --cask $UPGRADE_CASKS
else
echo "Aboved."
fi
else
echo "No upgradeable cask detected."
fi
if [ -n "$DEPRECATED_CASKS" ]; then
echo "========================================================================"
echo "Deprecated cask detected: "
echo "$DEPRECATED_CASKS"
fi
if [ -n "$AUTO_UPDATE_CASKS" ]; then
echo "========================================================================"
echo "These cask(s) will check update automatically when start running: "
echo "$AUTO_UPDATE_CASKS"
fi
if [ -n "$SELF_CHECK_CASKS" ]; then
echo "========================================================================"
echo 'Need to check by yourself (version="latest"):'
echo "$SELF_CHECK_CASKS"
fi
echo "Brew Cask Upgrade Complete."
exit 0
@RJHsiao
Copy link
Author

RJHsiao commented Apr 17, 2018

v1.1.0: Use brew cask upgrade to instead brew cask install --force.

@RJHsiao
Copy link
Author

RJHsiao commented Oct 21, 2020

v1.1.1: Use brew upgrade --cask to instead brew cask upgrade.

@RJHsiao
Copy link
Author

RJHsiao commented Nov 27, 2020

v1.1.2: Use brew info --cask & brew cat --cask to instead brew cask info & brew cask cat.

@RJHsiao
Copy link
Author

RJHsiao commented Jul 12, 2021

v1.1.3:

  • Bug fixed: Cannot get cask info when one cask exists in multiple taps.
  • Fix syntax warning

@RJHsiao
Copy link
Author

RJHsiao commented Jul 31, 2021

v1.1.4: A little bug fixed

@RJHsiao
Copy link
Author

RJHsiao commented Feb 14, 2024

v1.1.5: bug fixed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment