#!/bin/bash # I, Ian Kelling, follow the GNU license recommendations at # https://www.gnu.org/licenses/license-recommendations.en.html. They # recommend that small programs, < 300 lines, be licensed under the # Apache License 2.0. This file contains or is part of one or more small # programs. If a small program grows beyond 300 lines, I plan to switch # its license to GPL. # Copyright 2024 Ian Kelling # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # usage: no args, run to install latest go. if [ -z "$BASH_VERSION" ]; then echo "error: shell is not bash" >&2; exit 1; fi shopt -s inherit_errexit 2>/dev/null ||: # ignore fail in bash < 4.4 source /usr/local/lib/bash-bear force=false case $1 in -f) force=true ;; esac m() { printf "$pre %s\n" "$*"; "$@"; } e() { printf "$pre %s\n" "$*"; } err() { echo "[$(date +'%Y-%m-%d %H:%M:%S%z')]: $0: $*" >&2; } if [[ ! -d /a/opt/go.git ]]; then mkdir -p /a/opt cd /a/opt git clone --bare https://go.googlesource.com/go fi m cd /a/opt/go.git up=true install=false if ! $force; then yesterday=$(( $(date +%s) - 60*60*24 )) # no need to check for updates on go more than once a day if (( $(stat -c %Y FETCH_HEAD) > yesterday )); then up=false fi # update will get overwritten if we dont do it on central host. if [[ -e /a/bin/bash_unpublished/source-state ]]; then source /a/bin/bash_unpublished/source-state if [[ $HOSTNAME != "$HOST2" ]]; then up=false fi fi fi shopt -s nullglob f=$( for f in go*.tar.gz; do echo $f done | sort -Vr | head -n1 ) if [[ ! $f ]]; then up=true fi if $up; then m git fetch --tags mkdir -p ~/.local touch ~/.local/gofetch vers=($(git tag | sort -Vr | grep -E '^go[0-9.]+$' | head)) ver=${vers[0]} dl() { arch=$(dpkg --print-architecture) f=${ver}.linux-${arch}.tar.gz if [[ -e $f ]]; then timestamp=$(stat -c %Y $f) else timestamp=0 fi m wget -nv -N https://dl.google.com/go/$f || ret=$? } dl # 8 is return code for 404. for a new release, they might not have a binary out yet if [[ $ret == 8 ]]; then ver=${vers[1]} dl fi new_timestamp=$(stat -c %Y $f) if [[ $timestamp != $new_timestamp ]]; then install=true fi fi if $install || [[ ! -e /usr/local/go/bin/go ]]; then m sudo rm -rf /usr/local/go m sudo tar -C /usr/local -xzf $f fi for x in go*.tar.gz; do if [[ $x == $f ]]; then continue; fi rm -fv $x done