#!/usr/bin/env bash
set -e
USAGE="Update links to docs.rs in a tokio crate

USAGE:
    $(basename "$0") [OPTIONS] [CRATE] [VERSION]

OPTIONS:
    -d, --dry-run       Perform a dry run (do not modify any file)
    -h, --help          Show this help text and exit"

err() {
    echo -e "\e[31m\e[1merror:\e[0m $@" 1>&2;
}

status() {
    WIDTH=12
    printf "\e[32m\e[1m%${WIDTH}s\e[0m %s\n" "$1" "$2"
}

c1grep() { grep "$@" || test $? = 1; }

update_versions_in_doc() {
    # Print what is being/would be done
    if [ -n "$DRY_RUN" ]; then
        local MSG="Would change:"
    else
        local MSG="Updating:"
    fi
    git grep -lr "docs.rs/$CRATE/" \
        | xargs sed --quiet \
            -E "s|docs.rs/$CRATE/[0-9.]+|docs.rs/$CRATE/$VERSION|gp" \
        | sed -e "s/^/$MSG /"

    # Apply changes if not in dry run
    if [ -z "$DRY_RUN" ]; then
        git grep -lr "docs.rs/$CRATE/" \
            | xargs sed -i \
                -E "s|docs.rs/$CRATE/[0-9.]+|docs.rs/$CRATE/$VERSION|g"
    fi
}

update() {
    update_versions_in_doc
}

show_outdated() {
    OUTDATED=$(git grep -rn "docs.rs/$CRATE/" \
        | c1grep -v "$VERSION" \
        | sed -e 's/^/ - /')
    if [[ -n "$OUTDATED" ]]; then
        echo "Found the following links to docs.rs with an outdated version:"
        echo "$OUTDATED"
        echo
    else
        echo "Nothing to do."
        exit 1
    fi
}

while [[ $# -gt 0 ]]
do

case "$1" in
    -h|--help)
    echo "$USAGE"
    exit 0
    ;;
    -d|--dry-run)
    DRY_RUN="--dry-run"
    shift
    ;;
    -*)
    err "unknown flag \"$1\""
    echo "$USAGE"
    exit 1
    ;;
    *) # crate or version
    if [ -z "$CRATE" ]; then
        CRATE="$1"
    elif [ -z "$VERSION" ]; then
        VERSION="$1"
    else
        err "unknown positional argument \"$1\""
        echo "$USAGE"
        exit 1
    fi
    shift
    ;;
esac
done
# set -- "${POSITIONAL[@]}"

if [ -z "$VERSION" ]; then
    err "no version specified!"
    HELP=1
fi

if [ -n "$CRATE" ]; then
    TAG="$CRATE-$VERSION"
else
    err "no crate specified!"
    HELP=1
fi

if [ -n "$HELP" ]; then
    echo "$USAGE"
    exit 1
fi

if [ -d "$CRATE" ]; then
    # Does not cd in order to update everywhere
    show_outdated && update
else
    err "no such crate \"$CRATE\""
    exit 1
fi

