man 1.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
#!/bin/bash
# Usage: script/man [<COMMAND>]
#
# Generate individual man pages from inline help text of hub commands.
set -e

extensions="
  am
  apply
  checkout
  cherry-pick
  clone
  fetch
  init
  merge
  push
  remote
  submodule
"

commands="
  alias
  browse
  ci-status
  compare
  create
  fork
  pull-request
"

AWK="$(type -p gawk awk | head -1)"

hub_help() {
  bin/hub help "hub-$1" --plain-text | sed $'s/\t/  /g'
}

para() {
  "$AWK" -v wants=$2 "
    BEGIN { para=1 }
    /^\$/ { para++ }
    { if (para $1 wants) print \$0 }
  "
}

trim() {
  sed 's/^ \{1,\}//; s/ \{1,\}$//'
}

format_shortdesc() {
  tr $'\n' " " | trim
}

format_synopsis() {
  local cmd subcmd rest
  sed 's/^Usage://' | while read -r cmd subcmd rest; do
    printf '`%s %s` %s  \n' "$cmd" "$subcmd" "$rest"
  done
}

format_rest() {
  "$AWK" '
    /^#/ {
      title=toupper(substr($0, length($1) + 2, length($0)))
      sub(/:$/, "", title)
      options=title == "OPTIONS"
      print $1, title
      next
    }
    options && /^  [^ ]/ {
      printf "  * %s:\n", substr($0, 3, length($0))
      next
    }
    { print $0 }
  '
}

generate() {
  local cmd="$1"
  local ronn="man/hub-${cmd}.1.ronn"
  local text="$(hub_help "$cmd")"
  [ -n "$text" ] || continue

  { echo "hub-${cmd}(1) -- $(para == 2 <<<"$text" | format_shortdesc)"
    echo "==="
    echo
    echo "## SYNOPSIS"
    echo
    para == 1 <<<"$text" | format_synopsis
    echo
    para '>=' 3 <<<"$text" | format_rest
  } > "$ronn"

  bin/ronn --roff --organization=GITHUB --manual="Hub Manual" "$ronn" >/dev/null
}

script/build

case "$1" in
* )
  for cmd in ${1:-$commands $extensions}; do
    generate "$cmd"
  done
  ;;
esac