diff options
Diffstat (limited to 'bin/rfc')
-rwxr-xr-x | bin/rfc | 150 |
1 files changed, 150 insertions, 0 deletions
@@ -0,0 +1,150 @@ +#!/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 + + 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 |