#!/usr/bin/env bash

# Format js/src/doc documentation in SOURCEDIR, place formatted files in OUTPUTDIR,
# and post all changed pages to MDN using KEYID and SECRET to identify the poster.
# See js/src/doc/README.md for general usage information.
#
# Usage:
#
#   ./publish.sh SOURCEDIR OUTPUTDIR KEYID SECRET
#
# Pages are tagged with the current Mercurial parent changeset ID.

set -eu

progname=$(basename $0)
doc=$(cd $(dirname $0); pwd)
lib=$doc/lib

sourcedir=$1
outputdir=$2
keyid=$3
secret=$4

$doc/format.sh --mdn "$sourcedir" "$outputdir"

config=$sourcedir/config.sh

watermark=$lib/extract-watermark.sh

# Fetch a URL, with caching disabled.
fetch() {
    curl --silent -XGET "$1"                                    \
         -H"Cache-Control: no-cache, no-store, must-revalidate" \
         -H"Pragma: no-cache"                                   \
         -H"Expires: 0"
}

source $lib/dummy-config.sh

markdown() {
    INPUT_FILE=$1
    URL=$BASE_URL$2

    local formatted_file=$outputdir/${INPUT_FILE/md/html}

    # Extract the watermark from the formatted file.
    local local_watermark=$("$watermark" < "$formatted_file")

    # Get the existing page, and extract its watermark, if any.
    local public_watermark=$(fetch "$URL?raw" | "$watermark")

    if [ "$local_watermark" != "$public_watermark" ]; then
        echo "$progname: Updating: $URL" >&2
        local status
        status=$(curl --silent -X PUT -H"Content-Type: text/html" --upload-file "$formatted_file" -u "$keyid:$secret" "$URL")
        case "$status" in
            CREATED | RESET)
                ;;
            *)
                echo "$progname: Error posting $URL, from $config: $status" >&2
                exit 1
                ;;
        esac
    else
        echo "$progname: Unchanged: $URL" >&2
    fi
}

# MDN can't currently update attached resources. But we can verify that the current
# published versions match what we have.
resource() {
    local label=$1
    local file=$sourcedir/$2
    local url=$3

    if cmp "$file" <(fetch "$url") > /dev/null; then
        echo "$progname: Unchanged: $url" >&2
    else
        echo "$progname: Warning: resource out of date: $url" >&2
    fi
}

source $config