X-Git-Url: https://iankelling.org/git/?p=buildscripts;a=blobdiff_plain;f=go;h=547a1345d968e48bfec6b2820c97989058247271;hp=9175d0cd00c5496e9cad49abb2fcfdf11efab699;hb=HEAD;hpb=c426f5dc07b0a086a3163697db3abb516955566c diff --git a/go b/go index 9175d0c..354b92e 100755 --- a/go +++ b/go @@ -1,51 +1,123 @@ #!/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