The sixteenth batch
[git/gitster.git] / generate-cmdlist.sh
blob0ed39c4c5dabcdd1bf3fe23d4fd2a978e7b083b4
1 #!/bin/sh
3 die () {
4 echo "$@" >&2
5 exit 1
8 command_list () {
9 while read cmd rest
11 case "$cmd" in
12 "#"* | '')
13 # Ignore comments and allow empty lines
14 continue
17 case "$exclude_programs" in
18 *":$cmd:"*)
21 echo "$cmd $rest"
23 esac
24 esac
25 done <"$1"
28 category_list () {
29 echo "$1" |
30 cut -d' ' -f2- |
31 tr ' ' '\012' |
32 grep -v '^$' |
33 LC_ALL=C sort -u
36 define_categories () {
37 echo
38 echo "/* Command categories */"
39 bit=0
40 echo "$1" |
41 while read cat
43 echo "#define CAT_$cat (1UL << $bit)"
44 bit=$(($bit+1))
45 done
46 test "$bit" -gt 32 && die "Urgh.. too many categories?"
49 define_category_names () {
50 echo
51 echo "/* Category names */"
52 echo "static const char *category_names[] = {"
53 bit=0
54 echo "$1" |
55 while read cat
57 echo " \"$cat\", /* (1UL << $bit) */"
58 bit=$(($bit+1))
59 done
60 echo " NULL"
61 echo "};"
64 print_command_list () {
65 echo "static struct cmdname_help command_list[] = {"
67 echo "$2" |
68 while read cmd rest
70 synopsis=
71 while read line
73 case "$line" in
74 "$cmd - "*)
75 synopsis=${line#$cmd - }
76 break
78 esac
79 done <"$1/Documentation/$cmd.adoc"
81 printf '\t{ "%s", N_("%s"), 0' "$cmd" "$synopsis"
82 printf " | CAT_%s" $rest
83 echo " },"
84 done
85 echo "};"
88 exclude_programs=:
89 while test "--exclude-program" = "$1"
91 shift
92 exclude_programs="$exclude_programs$1:"
93 shift
94 done
96 if test "$#" -ne 2
97 then
98 die "USAGE: $0 <SOURCE_DIR> <OUTPUT>"
101 SOURCE_DIR="$1"
102 OUTPUT="$2"
105 commands="$(command_list "$SOURCE_DIR"/command-list.txt)"
106 categories="$(category_list "$commands")"
108 echo "/* Automatically generated by generate-cmdlist.sh */
109 struct cmdname_help {
110 const char *name;
111 const char *help;
112 uint32_t category;
115 define_categories "$categories"
116 echo
117 define_category_names "$categories"
118 echo
119 print_command_list "$SOURCE_DIR" "$commands"
120 } >"$OUTPUT"