Last active
February 14, 2024 09:55
-
-
Save RJHsiao/d4ee0ff671e76b02d9e5706294d3597c to your computer and use it in GitHub Desktop.
Brew-Cask-Upgrade: Check and upgrade your app installed from caskroom automatically.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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 |
v1.1.1: Use brew upgrade --cask
to instead brew cask upgrade
.
v1.1.2: Use brew info --cask
& brew cat --cask
to instead brew cask info
& brew cask cat
.
v1.1.3:
- Bug fixed: Cannot get cask info when one cask exists in multiple taps.
- Fix syntax warning
v1.1.4: A little bug fixed
v1.1.5: bug fixed
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
v1.1.0: Use
brew cask upgrade
to insteadbrew cask install --force
.