generate-cmds.sh: export all commands to command-list.h
[gitweb.git] / generate-cmdlist.sh
index eeea4b67ea7f1ccee1770c18a36d018b5f3b32b0..870d3b626a536fca3c50b4ee7e1b31c47ae7e076 100755 (executable)
@@ -1,13 +1,82 @@
 #!/bin/sh
 
+die () {
+       echo "$@" >&2
+       exit 1
+}
+
+command_list () {
+       sed '1,/^### command list/d;/^#/d' "$1"
+}
+
+get_categories () {
+       tr ' ' '\n'|
+       grep -v '^$' |
+       sort |
+       uniq
+}
+
+category_list () {
+       command_list "$1" |
+       cut -c 40- |
+       get_categories
+}
+
+get_synopsis () {
+       sed -n '
+               /^NAME/,/'"$1"'/H
+               ${
+                       x
+                       s/.*'"$1"' - \(.*\)/N_("\1")/
+                       p
+               }' "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?"
+}
+
+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 "};"
+}
+
 echo "/* Automatically generated by generate-cmdlist.sh */
 struct cmdname_help {
-       char name[16];
-       char help[80];
-       unsigned char group;
+       const char *name;
+       const char *help;
+       uint32_t group;
 };
+"
+if test -z "$2"
+then
+       define_categories "$1"
+       echo
+       print_command_list "$1"
+       exit 0
+fi
 
-static const char *common_cmd_groups[] = {"
+echo "static const char *common_cmd_groups[] = {"
 
 grps=grps$$.tmp
 match=match$$.tmp
@@ -39,12 +108,6 @@ sort |
 while read cmd tags
 do
        tag=$(echo "$tags" | sed "$substnum; s/[^0-9]//g")
-       sed -n '
-               /^NAME/,/git-'"$cmd"'/H
-               ${
-                       x
-                       s/.*git-'"$cmd"' - \(.*\)/      {"'"$cmd"'", N_("\1"), '$tag'},/
-                       p
-               }' "Documentation/git-$cmd.txt"
+       echo "  {\"$cmd\", $(get_synopsis git-$cmd), $tag},"
 done
 echo "};"