Skip to content

Instantly share code, notes, and snippets.

@yumauri
Last active March 19, 2024 02:38
Show Gist options
  • Save yumauri/1915426eff7c07990fbc802376db8f30 to your computer and use it in GitHub Desktop.
Save yumauri/1915426eff7c07990fbc802376db8f30 to your computer and use it in GitHub Desktop.
#!/bin/sh
CASKNAME="$1"
CASKROOM=$(brew --caskroom)
CASKDIR="$CASKROOM/$CASKNAME"
DATE=$(date +"%Y%m%d%H%M%S.000")
BACKUPDIR="$CASKDIR/.backup"
BLACK='\033[30m'
RED='\033[31m'
BLUE='\033[34m'
NC='\033[0m'
#
# show usage
#
if [ "$1" = "" ]; then
echo "USAGE:\n\t$0 caskname"
exit
fi
if ! [ -x "$(command -v jq)" ]; then
echo "${RED}Error:${NC} This script requires ${BLUE}jq${NC} to work, install it using ${BLUE}brew install jq${NC}"
exit
fi
#
# show warning
#
echo "${RED}WARNING!${NC}"
echo "${RED}This script aimed to update cask version without reinstalling cask.${NC}"
echo "${RED}There is no official way to do it, so, use this script on your risk!${NC}"
echo "${RED}You will get no support for issues that arise from using this script!${NC}"
echo; echo "${BLACK}See\thttps://github.com/Homebrew/homebrew-cask/issues/88440\n\thttps://stackoverflow.com/questions/63651114/update-homebrew-casks-versions${NC}"
echo; read -n 1 -s -r -p "Press any key to proceed or Ctrl+C to abort..."; echo
set -x
#
# check outdated
#
{ echo; echo "${BLACK}Check if cask ${RED}$CASKNAME${BLACK} requires updates${NC}"; } 2> /dev/null
if [ "$(brew outdated --cask --greedy $CASKNAME)" = "" ]; then
{ echo "${RED}Looks like cask ${BLACK}$CASKNAME${RED} either not exists, or not needed to update${NC}"; } 2> /dev/null
exit
fi
{ echo; echo "${BLACK}Get versions${NC}"; } 2> /dev/null
INSTALLED=$(brew outdated --cask --greedy --json=v2 $CASKNAME | jq -r '.casks[0].installed_versions[0]')
CURRENT=$(brew outdated --cask --greedy --json=v2 $CASKNAME | jq -r '.casks[0].current_version')
if [ "$INSTALLED" = "latest" ]; then
{ echo "${RED}Looks like cask ${BLACK}$CASKNAME${RED} has ${BLUE}latest${RED} version, ignore such casks${NC}"; } 2> /dev/null
exit
fi
#
# backup current cask
#
{ echo; echo "${BLACK}Check/create backup directory ${RED}$BACKUPDIR${NC}"; } 2> /dev/null
[[ ! -e "$BACKUPDIR" ]] && mkdir "$BACKUPDIR"
{ echo; echo "${BLACK}Creating backup directory ${RED}$BACKUPDIR/$DATE${NC}"; } 2> /dev/null
mkdir -p "$BACKUPDIR/$DATE"
{ echo; echo "${BLACK}Backing up current cask files${NC}"; } 2> /dev/null
cp -R "$CASKDIR/.metadata" "$BACKUPDIR/$DATE"
cp -R "$CASKDIR/$INSTALLED" "$BACKUPDIR/$DATE"
#
# rename installed cask version to current
#
{ echo; echo "${BLACK}Rename ${BLUE}$INSTALLED${BLACK} with ${BLUE}$CURRENT${NC}"; } 2> /dev/null
mv "$CASKDIR/$INSTALLED" "$CASKDIR/$CURRENT"
mv "$CASKDIR/.metadata/$INSTALLED" "$CASKDIR/.metadata/$CURRENT"
for install_date in $(ls -1 "$CASKDIR/.metadata/$CURRENT" | head -1); do
mv "$CASKDIR/.metadata/$CURRENT/$install_date" "$CASKDIR/.metadata/$CURRENT/$DATE"
done
#
# replace cask script
#
{ echo; echo "${BLACK}Replace cask script with latest version${NC}"; } 2> /dev/null
brew cat --cask $CASKNAME > "$CASKDIR/.metadata/$CURRENT/$DATE/Casks/$CASKNAME.rb"
#
# Before update
#
$ tree -a $(brew --caskroom)/telegram
/usr/local/Caskroom/telegram
├── .metadata
│   ├── 6.3.203623
│   │   └── 20200728065951.983
│   │   └── Casks
│   │   └── telegram.rb
│   └── config.json
└── 6.3.203623
└── Telegram.app -> /Applications/Telegram.app
6 directories, 2 files
#
# Update
#
$ ./brew_cask_version_update.sh telegram
Check if cask telegram requires updates
++ brew cask outdated --greedy telegram
+ '[' telegram = '' ']'
Get versions
++ brew cask outdated --greedy --json telegram
++ jq -r '.[0].installed_versions'
+ INSTALLED=6.3.203623
++ brew cask outdated --greedy --json telegram
++ jq -r '.[0].current_version'
+ CURRENT=7.0.1,204835
Check/create backup directory /usr/local/Caskroom/telegram/.backup
+ [[ ! -e /usr/local/Caskroom/telegram/.backup ]]
+ mkdir /usr/local/Caskroom/telegram/.backup
Creating backup directory /usr/local/Caskroom/telegram/.backup/20200831195308.000
+ mkdir -p /usr/local/Caskroom/telegram/.backup/20200831195308.000
Backing up current cask files
+ cp -R /usr/local/Caskroom/telegram/.metadata /usr/local/Caskroom/telegram/.backup/20200831195308.000
+ cp -R /usr/local/Caskroom/telegram/6.3.203623 /usr/local/Caskroom/telegram/.backup/20200831195308.000
Rename 6.3.203623 with 7.0.1,204835
+ mv /usr/local/Caskroom/telegram/6.3.203623 /usr/local/Caskroom/telegram/7.0.1,204835
+ mv /usr/local/Caskroom/telegram/.metadata/6.3.203623 /usr/local/Caskroom/telegram/.metadata/7.0.1,204835
++ ls -1 /usr/local/Caskroom/telegram/.metadata/7.0.1,204835
++ head -1
+ for install_date in '$(ls -1 "$CASKDIR/.metadata/$CURRENT" | head -1)'
+ mv /usr/local/Caskroom/telegram/.metadata/7.0.1,204835/20200728065951.983 /usr/local/Caskroom/telegram/.metadata/7.0.1,204835/20200831195308.000
Replace cask script with latest version
+ brew cask cat telegram
#
# After update
#
$ tree -a $(brew --caskroom)/telegram
/usr/local/Caskroom/telegram
├── .backup
│   └── 20200831195308.000
│   ├── .metadata
│   │   ├── 6.3.203623
│   │   │   └── 20200728065951.983
│   │   │   └── Casks
│   │   │   └── telegram.rb
│   │   └── config.json
│   └── 6.3.203623
│   └── Telegram.app -> /Applications/Telegram.app
├── .metadata
│   ├── 7.0.1,204835
│   │   └── 20200831195308.000
│   │   └── Casks
│   │   └── telegram.rb
│   └── config.json
└── 7.0.1,204835
└── Telegram.app -> /Applications/Telegram.app
14 directories, 4 files
@jagdishadusumalli
Copy link

Updated parsing installed version for recent homebrew version. Also, you need to tap casks now, for brew cat --cask ... command to work: brew tap homebrew/cask

i just used the script again on a new system and didn't had to tap the homebrew/cask...it worked without that

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