generate-cmdlist.shon commit fetch: only run 'gc' once when fetching multiple remotes (c3d6b70)
   1#!/bin/sh
   2
   3die () {
   4        echo "$@" >&2
   5        exit 1
   6}
   7
   8command_list () {
   9        eval "grep -ve '^#' $exclude_programs" <"$1"
  10}
  11
  12get_categories () {
  13        tr ' ' '\n'|
  14        grep -v '^$' |
  15        sort |
  16        uniq
  17}
  18
  19category_list () {
  20        command_list "$1" |
  21        cut -c 40- |
  22        get_categories
  23}
  24
  25get_synopsis () {
  26        sed -n '
  27                /^NAME/,/'"$1"'/H
  28                ${
  29                        x
  30                        s/.*'"$1"' - \(.*\)/N_("\1")/
  31                        p
  32                }' "Documentation/$1.txt"
  33}
  34
  35define_categories () {
  36        echo
  37        echo "/* Command categories */"
  38        bit=0
  39        category_list "$1" |
  40        while read cat
  41        do
  42                echo "#define CAT_$cat (1UL << $bit)"
  43                bit=$(($bit+1))
  44        done
  45        test "$bit" -gt 32 && die "Urgh.. too many categories?"
  46}
  47
  48define_category_names () {
  49        echo
  50        echo "/* Category names */"
  51        echo "static const char *category_names[] = {"
  52        bit=0
  53        category_list "$1" |
  54        while read cat
  55        do
  56                echo "  \"$cat\", /* (1UL << $bit) */"
  57                bit=$(($bit+1))
  58        done
  59        echo "  NULL"
  60        echo "};"
  61}
  62
  63print_command_list () {
  64        echo "static struct cmdname_help command_list[] = {"
  65
  66        command_list "$1" |
  67        while read cmd rest
  68        do
  69                printf "        { \"$cmd\", $(get_synopsis $cmd), 0"
  70                for cat in $(echo "$rest" | get_categories)
  71                do
  72                        printf " | CAT_$cat"
  73                done
  74                echo " },"
  75        done
  76        echo "};"
  77}
  78
  79print_config_list () {
  80        cat <<EOF
  81static const char *config_name_list[] = {
  82EOF
  83        grep -h '^[a-zA-Z].*\..*::$' Documentation/*config.txt Documentation/config/*.txt |
  84        sed '/deprecated/d; s/::$//; s/,  */\n/g' |
  85        sort |
  86        while read line
  87        do
  88                echo "  \"$line\","
  89        done
  90        cat <<EOF
  91        NULL,
  92};
  93EOF
  94}
  95
  96exclude_programs=
  97while test "--exclude-program" = "$1"
  98do
  99        shift
 100        exclude_programs="$exclude_programs -e \"^$1 \""
 101        shift
 102done
 103
 104echo "/* Automatically generated by generate-cmdlist.sh */
 105struct cmdname_help {
 106        const char *name;
 107        const char *help;
 108        uint32_t category;
 109};
 110"
 111define_categories "$1"
 112echo
 113define_category_names "$1"
 114echo
 115print_command_list "$1"
 116echo
 117print_config_list