Skip to content

Instantly share code, notes, and snippets.

@yumauri
Last active March 19, 2024 02:38
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • 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

Hi @yumauri, the script seems to fail on macosx v11.2.3 with homebrew v3.0.10

➜ brew outdated --cask --greedy transmission
transmission (2.94) != 3.00

~/Downloads
➜ sudo sh brew_cask_version_update.sh transmission
WARNING!
This script aimed to update cask version without reinstalling cask.
There is no official way to do it, so, use this script on your risk!
You will get no support for issues that arise from using this script!

See Homebrew/homebrew-cask#88440
https://stackoverflow.com/questions/63651114/update-homebrew-casks-versions

Press any key to proceed or Ctrl+C to abort...

Check if cask transmission requires updates
++ brew outdated --cask --greedy transmission
Error: Running Homebrew as root is extremely dangerous and no longer supported.
As Homebrew does not drop privileges on installation you would be giving all
build scripts full access to your system.

  • '[' '' = '' ']'
    Looks like cask transmission either not exists, or not needed to update
  • exit

@yumauri
Copy link
Author

yumauri commented Apr 1, 2021

@jagdishadusumalli hm, why do you run it under sudo?

@jagdishadusumalli
Copy link

@jagdishadusumalli hm, why do you run it under sudo?

ah..yes that was the issue..sorry for the trouble

@yumauri
Copy link
Author

yumauri commented Jul 11, 2023

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

@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