#!/bin/sh
set -eu

script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
repo_dir=$(dirname "$script_dir")
source_dir=${MOUSE_SOURCE_DIR:-"$repo_dir/sources"}
lock_file="$repo_dir/sources.lock"

mkdir -p "$source_dir"

while read -r expected url filename; do
    case "$expected" in
        ""|\#*) continue ;;
    esac

    destination="$source_dir/$filename"
    if [ ! -f "$destination" ]; then
        temporary="$destination.part"
        printf '%s\n' "fetching $filename"
        curl \
            --fail \
            --location \
            --proto '=https' \
            --tlsv1.2 \
            --connect-timeout 20 \
            --retry 4 \
            --retry-all-errors \
            "$url" \
            -o "$temporary"
        mv "$temporary" "$destination"
    fi

    if command -v sha256sum >/dev/null 2>&1; then
        actual=$(sha256sum "$destination" | awk '{print $1}')
    else
        actual=$(shasum -a 256 "$destination" | awk '{print $1}')
    fi
    if [ "$actual" != "$expected" ]; then
        printf '%s\n' "checksum mismatch: $filename" >&2
        printf '%s\n' "expected: $expected" >&2
        printf '%s\n' "actual:   $actual" >&2
        exit 1
    fi
done <"$lock_file"
