Merge branch 'js/test-git-installed'
[gitweb.git] / generate-cmdlist.sh
index eeea4b67ea7f1ccee1770c18a36d018b5f3b32b0..709d67405bba65f0b1d5468fe58a92fa41c30398 100755 (executable)
 #!/bin/sh
 
-echo "/* Automatically generated by generate-cmdlist.sh */
-struct cmdname_help {
-       char name[16];
-       char help[80];
-       unsigned char group;
-};
+die () {
+       echo "$@" >&2
+       exit 1
+}
+
+command_list () {
+       grep -v '^#' "$1"
+}
 
-static const char *common_cmd_groups[] = {"
-
-grps=grps$$.tmp
-match=match$$.tmp
-trap "rm -f '$grps' '$match'" 0 1 2 3 15
-
-sed -n '
-       1,/^### common groups/b
-       /^### command list/q
-       /^#/b
-       /^[     ]*$/b
-       h;s/^[^         ][^     ]*[     ][      ]*\(.*\)/       N_("\1"),/p
-       g;s/^\([^       ][^     ]*\)[   ].*/\1/w '$grps'
-       ' "$1"
-printf '};\n\n'
-
-n=0
-substnum=
-while read grp
-do
-       echo "^git-..*[         ]$grp"
-       substnum="$substnum${substnum:+;}s/[    ]$grp/$n/"
-       n=$(($n+1))
-done <"$grps" >"$match"
-
-printf 'static struct cmdname_help common_cmds[] = {\n'
-grep -f "$match" "$1" |
-sed 's/^git-//' |
-sort |
-while read cmd tags
-do
-       tag=$(echo "$tags" | sed "$substnum; s/[^0-9]//g")
+get_categories () {
+       tr ' ' '\n'|
+       grep -v '^$' |
+       sort |
+       uniq
+}
+
+category_list () {
+       command_list "$1" |
+       cut -c 40- |
+       get_categories
+}
+
+get_synopsis () {
        sed -n '
-               /^NAME/,/git-'"$cmd"'/H
+               /^NAME/,/'"$1"'/H
                ${
                        x
-                       s/.*git-'"$cmd"' - \(.*\)/      {"'"$cmd"'", N_("\1"), '$tag'},/
+                       s/.*'"$1"' - \(.*\)/N_("\1")/
                        p
-               }' "Documentation/git-$cmd.txt"
-done
-echo "};"
+               }' "Documentation/$1.txt"
+}
+
+define_categories () {
+       echo
+       echo "/* Command categories */"
+       bit=0
+       category_list "$1" |
+       while read cat
+       do
+               echo "#define CAT_$cat (1UL << $bit)"
+               bit=$(($bit+1))
+       done
+       test "$bit" -gt 32 && die "Urgh.. too many categories?"
+}
+
+define_category_names () {
+       echo
+       echo "/* Category names */"
+       echo "static const char *category_names[] = {"
+       bit=0
+       category_list "$1" |
+       while read cat
+       do
+               echo "  \"$cat\", /* (1UL << $bit) */"
+               bit=$(($bit+1))
+       done
+       echo "  NULL"
+       echo "};"
+}
+
+print_command_list () {
+       echo "static struct cmdname_help command_list[] = {"
+
+       command_list "$1" |
+       while read cmd rest
+       do
+               printf "        { \"$cmd\", $(get_synopsis $cmd), 0"
+               for cat in $(echo "$rest" | get_categories)
+               do
+                       printf " | CAT_$cat"
+               done
+               echo " },"
+       done
+       echo "};"
+}
+
+print_config_list () {
+       cat <<EOF
+static const char *config_name_list[] = {
+EOF
+       grep -h '^[a-zA-Z].*\..*::$' Documentation/*config.txt Documentation/config/*.txt |
+       sed '/deprecated/d; s/::$//; s/,  */\n/g' |
+       sort |
+       while read line
+       do
+               echo "  \"$line\","
+       done
+       cat <<EOF
+       NULL,
+};
+EOF
+}
+
+echo "/* Automatically generated by generate-cmdlist.sh */
+struct cmdname_help {
+       const char *name;
+       const char *help;
+       uint32_t category;
+};
+"
+define_categories "$1"
+echo
+define_category_names "$1"
+echo
+print_command_list "$1"
+echo
+print_config_list