#!/bin/bash
#
# docs/version-check - cross-check that doc pages link to latest version
#
# As of 2022-11-10 this is only useful for Windows, but I think it'd be
# nice to be able to auto-update more pages with up-to-date links. If
# we do that, there are some exe assumptions that need to be cleaned up.
#
ME=$(basename $0)

URLBASE="https://github.com/containers/podman"

docfiles=(
    docs/tutorials/mac_win_client.md
    docs/tutorials/podman-for-windows.md
)

set -eo pipefail

function warn() {
    echo "$ME: $*" >&2
}

# Setup check: exit gracefully unless we're in the desired environment
if [[ -n "$CIRRUS_PR" ]]; then
    warn "we don't run on PRs"
    exit 0
fi

if [[ -n "$CIRRUS_CRON" ]]; then
    if [[ "$CIRRUS_CRON" != "nightly" ]]; then
        warn "Only meaningful when CIRRUS_CRON=nightly (it is '$CIRRUS_CRON')"
        exit 0
    fi
fi

# No sense running on release branches
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [[ "$current_branch" != "main" ]]; then
    warn "only meaningful on 'main' (current branch is '$current_branch')"
    if [[ ! -t 0 ]]; then
        exit 0
    fi
fi

# Okay. Fetch the highest-sorting tag. THIS MAY NOT BE THE SAME AS THE NEWEST!
LATEST=$(git ls-remote --tags --refs --sort="v:refname" "${URLBASE}.git" \
             | sed 's/.*\///' \
             | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' \
             | tail -n1)

echo LATEST=$LATEST

# The "#v" thing strips leading "v", because filename is numbers only
exe="${URLBASE}/releases/download/${LATEST}/podman-${LATEST#v}-setup.exe"

# EXE must exist. The convoluted {}||: is to handle errors gracefully
rc=
{
    found=$(curl --head --silent -o /dev/null --write-out '%{http_code}' $exe)
    rc=$?
} || :

if [[ $rc -ne 0 ]]; then
    warn "FATAL: curl failed, rc=$rc, on $exe"
    exit 1
fi

if [[ $found = 404 ]]; then
    warn "FATAL: Windows EXE missing: $exe"
    exit 1
fi

# Expect 200 or 3xx; anything else is an error
if [[ ! $found =~ ^[23] ]]; then
    warn "FATAL: Windows EXE: HTTP code $found on $exe"
    exit 1
fi

# Cross-check all doc files for an up-to-date "latest version is" line.
fail=0
as_of='^As of .* the latest version is'
for md in ${docfiles[*]}; do
    as_of_match=$(grep -E "$as_of" $md)
    if [[ -z "$as_of_match" ]]; then
        warn "$md does not have an 'As of ... the latest version is' line"
        fail=1
        continue
    fi

    md_latest=$(sed -ne 's;^.* version is \[\(.*\)\](.*;\1;' <<<"$as_of_match")
    if [[ -n "$md_latest" ]]; then
        warn "$md: No version found in '$as_of_match'"
        fail=1
        continue
    fi

    if [[ "$md_latest" != "$LATEST" ]]; then
        warn "$md: needs updating."
        # Running interactively? Do it.
        if [[ -t 0 ]]; then
            today=$(date --iso-8601=date)
            sed -i "s;$as_of.*\$;As of $today the latest version is \[$LATEST\]\($exe\).;" $md
        else
            warn "Please run this script in an interactive shell, and I'll fix it."
            fail=1
        fi
    fi
done

if [[ $fail -ne 0 ]] && [[ -t 0 ]]; then
    git status --untracked=no
fi

exit $fail
