#!/bin/sh set -eu D="${XDG_DATA_HOME:-$HOME/.local/share}/doc/rfc" PROMPT_DB="$( cat <<-EOF RFC directory does not exist: $D/ Do you want to download the files to create it? EOF )" usage() { cat <<-'EOF' Usage: rfc [-w] RFC_NUMBER rfc -u rfc -h EOF } help() { cat <<-'EOF' Options: -w show the path to the RFC file instead of displaying its contents -u update the local RFC database -h, --help show this message RFC_NUMBER the RFC id number Lookup the given RFC in $XDG_DATA_HOME/doc/rfc/ (defaults to ~/.local/share), and feed it into the $PAGER, akin to doing: $ $PAGER $XDG_DATA_HOME/doc/rfc/rfc$RFC_NUMBER.txt If the $XDG_DATA_HOME/doc/rfc/ directory doesn't exist, it gets created it by downloading the latest RFC files and placing all .txt files there. Examples: Show RFC 1234 in $PAGER: $ rfc 1234 Print path to RFC 2222: $ rfc 2222 Download the latest RFCs: $ rfc -u EOF } view() { if [ -t 1 ]; then ${PAGER:-cat} else cat fi } update() { rsync -avzP --delete ftp.rfc-editor.org::rfcs-text-only "$D" STATUS=$? if [ "$STATUS" != 0 ]; then exit "$STATUS" fi } check_local_db() { if [ ! -e "$D" ]; then if prompt "$PROMPT_DB"; then update else echo 'No local RFC database to operate on.' >&2 exit 1 fi fi } for flag in "$@"; do case "$flag" in (--) break ;; (--help) usage help exit ;; (*) ;; esac done while getopts 'wuh' flag; do case "$flag" in (w) WHERE=true ;; (u) UPDATE=true ;; (h) usage help exit ;; (*) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) RFC_NUMBER="${1:-}" F="$D/rfc${RFC_NUMBER}.txt" check_local_db if [ "${UPDATE:-}" = true ]; then update exit fi eval "$(assert-arg -- "$RFC_NUMBER" 'RFC_NUMBER')" if [ ! -e "$F" ]; then printf 'Given RFC_NUMBER "%s" does not exist at:\n%s\n' \ "$RFC_NUMBER" "$F" >&2 exit 2 fi if [ "${WHERE:-}" = true ]; then printf '%s\n' "$F" exit else view < "$F" exit fi