#!/bin/bash
-# Copyright (C) 2019 Ian Kelling
-# SPDX-License-Identifier: AGPL-3.0-or-later
+# 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 /a/bin/errhandle/err
+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
-m git fetch
-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
+
+up=true
+install=false
+
+if ! $force; then
+ yesterday=$(( $(date +%s) - 60*60*24 ))
+ fetch_mtime=$(stat -c %Y FETCH_HEAD)
+ if [[ ! $fetch_mtime ]]; then
+ err failed to get output from stat -c %Y FETCH_HEAD
+ exit 1
+ fi
+ # no need to check for updates on go more than once a day
+ if (( fetch_mtime > 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
- m wget -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]}
+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
-new_timestamp=$(stat -c %Y $f)
-if [[ $timestamp != $new_timestamp || ! -e /usr/local/go/bin/go ]]; then
+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
-shopt -s nullglob
for x in go*.tar.gz; do
if [[ $x == $f ]]; then continue; fi
rm -fv $x
done
-
-go get -u mvdan.cc/fdroidcl