#!/bin/bash list_versions() { echo "installed versions:" for i in "$HOME"/.go/go1*; do basename "$i"; done echo "" } install_version() { check_valid $1 if [[ $valid != 'true' ]]; then echo "invalid version $1" echo "using $(go version)" exit 1 fi fname="$HOME/.go/downloads/$1.$goos-$goarch.tar.gz" if [[ ! -f $fname ]]; then curl -Lo $fname https://dl.google.com/go/$1.$goos-$goarch.tar.gz fi cd $HOME/.go/downloads tar -zxf $1.$goos-$goarch.tar.gz mv go/ ../$1 check_exists $1 link_version $1 } link_version() { if [[ $exists == 'true' ]]; then ln -sfn $HOME/.go/$1 $HOME/.go/go fi } check_valid() { if [[ $1 =~ go1\.[0-9]{1,2}\.[0-9]{1,2} ]]; then valid='true' fi } check_exists() { if [[ -d $HOME/.go/$1 ]]; then exists='true' fi } remove_version() { check_exists $1 if [[ $exists == 'true' ]]; then if [[ $current_link == $1 ]]; then echo "cannot remove version $1 because it is currently in use" else rm -rf $HOME/.go/$1 echo "removed version $1" fi else echo "version $1 not installed" fi } prompt_install() { echo "$1 not found in $HOME/.go" list_versions check_valid $1 if [[ $valid == 'true' ]]; then echo "attempt to download and install? [y/n]" read input if [[ $input == 'y' ]]; then install_version $1 fi else echo "invalid version $1" echo "using $(go version)" exit 1 fi } mkdir -p "$HOME/.go/downloads" current_link=$(basename $(readlink $HOME/.go/go)) uname_m=$(uname -m) goarch='amd64' if [[ $uname_m == 'arm64' || $uname_m == 'aarch64' ]]; then goarch='arm64' fi goos='linux' if [[ $(uname) == 'Darwin' ]]; then goos='darwin' fi valid='false' exists='false' check_exists $1 if [[ $1 == '' ]]; then list_versions elif [[ $1 == 'list' ]]; then list_versions elif [[ $1 == 'remove' ]]; then remove_version $2 elif [[ $1 == 'uninstall' ]]; then remove_version $2 elif [[ $1 == 'install' ]]; then install_version $2 elif [[ $1 == 'use' ]]; then check_exists $2 if [[ $exists == true ]]; then link_version $2 else prompt_install $2 fi elif [[ $exists == 'true' ]]; then link_version $1 else prompt_install $1 fi echo "using $(go version)"