#!/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