aboutsummaryrefslogtreecommitdiff
path: root/bin/rfc
diff options
context:
space:
mode:
Diffstat (limited to 'bin/rfc')
-rwxr-xr-xbin/rfc150
1 files changed, 150 insertions, 0 deletions
diff --git a/bin/rfc b/bin/rfc
new file mode 100755
index 0000000..9c71ebc
--- /dev/null
+++ b/bin/rfc
@@ -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