#!/bin/bash
# Copyright (c) Tailscale Inc & AUTHORS
# SPDX-License-Identifier: BSD-3-Clause

set -eo pipefail

if [[ "${CI:-}" == "true" && "${NOBASHDEBUG:-}" != "true" ]]; then
    set -x
fi

tsandroid=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )/.." &> /dev/null && pwd )

# Allow TOOLCHAINDIR to be overridden, as a special case for the fdroid build
if [[ -z "${TOOLCHAINDIR}" ]]; then
    toolchain="$HOME/.cache/tailscale-go"

    if [[ -d "$toolchain" ]]; then
        # A toolchain exists, but is it recent enough to compile gocross? If not,
        # wipe it out so that the next if block fetches a usable one.
        want_go_minor=$(grep -E '^go ' "go.mod" | cut -f2 -d'.')
        have_go_minor=""
        if [[ -f "$toolchain/VERSION" ]]; then
            have_go_minor=$(head -1 "$toolchain/VERSION" | cut -f2 -d'.')
        fi
        # Shortly before stable releases, we run release candidate
        # toolchains, which have a non-numeric suffix on the version
        # number. Remove the rc qualifier, we just care about the minor
        # version.
        have_go_minor="${have_go_minor%rc*}"
        if [[ -z "$have_go_minor" || "$have_go_minor" -lt "$want_go_minor" ]]; then
            rm -rf "$toolchain" "$toolchain.extracted"
        fi
    fi

    REV="$(<${tsandroid}/go.toolchain.rev)"
    EREV=""
    [[ -f ${toolchain}.extracted ]] && EREV="$(<${toolchain}.extracted)"

    if [[ ! -d "$toolchain" || "$EREV" != "$REV" ]]; then
        mkdir -p "$HOME/.cache"

        case "$REV" in
        /*)
            toolchain="$REV"
            ;;
        *)
            # This works for linux and darwin, which is sufficient
            # (we do not build tailscale-go for other targets).
            HOST_OS=$(uname -s | tr A-Z a-z)
            HOST_ARCH="$(uname -m)"
            if [[ "$HOST_ARCH" == "aarch64" ]]; then
                # Go uses the name "arm64".
                HOST_ARCH="arm64"
            elif [[ "$HOST_ARCH" == "x86_64" ]]; then
                # Go uses the name "amd64".
                HOST_ARCH="amd64"
            fi

            rm -rf "$toolchain" "$toolchain.extracted"
            curl -f -L -o "$toolchain.tar.gz" "https://github.com/tailscale/go/releases/download/build-${REV}/${HOST_OS}-${HOST_ARCH}.tar.gz"
            mkdir -p "$toolchain"
            (cd "$toolchain" && tar --strip-components=1 -xf "$toolchain.tar.gz")
            echo "$REV" >"$toolchain.extracted"
            rm -f "$toolchain.tar.gz"
            ;;
        esac
    fi
else
    # fdroid supplies its own toolchain, rather than using ours.
    toolchain="${TOOLCHAINDIR}"
fi

exec "${toolchain}/bin/go" "$@"
