Skip to content

Commit d1305bd

Browse files
committed
Merge branch 'ab/generate-command-list'
Build optimization. * ab/generate-command-list: generate-cmdlist.sh: don't parse command-list.txt thrice generate-cmdlist.sh: replace "grep' invocation with a shell version generate-cmdlist.sh: do not shell out to "sed" generate-cmdlist.sh: stop sorting category lines generate-cmdlist.sh: replace for loop by printf's auto-repeat feature generate-cmdlist.sh: run "grep | sort", not "sort | grep" generate-cmdlist.sh: don't call get_categories() from category_list() generate-cmdlist.sh: spawn fewer processes generate-cmdlist.sh: trivial whitespace change command-list.txt: sort with "LC_ALL=C sort"
2 parents 03194a1 + 1cecd06 commit d1305bd

File tree

2 files changed

+56
-44
lines changed

2 files changed

+56
-44
lines changed

command-list.txt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
# specified here, which can only have "guide" attribute and nothing
4444
# else.
4545
#
46-
### command list (do not change this line, also do not change alignment)
46+
### command list (do not change this line)
4747
# command name category [category] [category]
4848
git-add mainporcelain worktree
4949
git-am mainporcelain
@@ -60,9 +60,9 @@ git-cat-file plumbinginterrogators
6060
git-check-attr purehelpers
6161
git-check-ignore purehelpers
6262
git-check-mailmap purehelpers
63+
git-check-ref-format purehelpers
6364
git-checkout mainporcelain
6465
git-checkout-index plumbingmanipulators
65-
git-check-ref-format purehelpers
6666
git-cherry plumbinginterrogators complete
6767
git-cherry-pick mainporcelain
6868
git-citool mainporcelain
@@ -111,7 +111,6 @@ git-index-pack plumbingmanipulators
111111
git-init mainporcelain init
112112
git-instaweb ancillaryinterrogators complete
113113
git-interpret-trailers purehelpers
114-
gitk mainporcelain
115114
git-log mainporcelain info
116115
git-ls-files plumbinginterrogators
117116
git-ls-remote plumbinginterrogators
@@ -124,11 +123,11 @@ git-merge-base plumbinginterrogators
124123
git-merge-file plumbingmanipulators
125124
git-merge-index plumbingmanipulators
126125
git-merge-one-file purehelpers
127-
git-mergetool ancillarymanipulators complete
128126
git-merge-tree ancillaryinterrogators
129-
git-multi-pack-index plumbingmanipulators
127+
git-mergetool ancillarymanipulators complete
130128
git-mktag plumbingmanipulators
131129
git-mktree plumbingmanipulators
130+
git-multi-pack-index plumbingmanipulators
132131
git-mv mainporcelain worktree
133132
git-name-rev plumbinginterrogators
134133
git-notes mainporcelain
@@ -154,23 +153,23 @@ git-request-pull foreignscminterface complete
154153
git-rerere ancillaryinterrogators
155154
git-reset mainporcelain history
156155
git-restore mainporcelain worktree
157-
git-revert mainporcelain
158156
git-rev-list plumbinginterrogators
159157
git-rev-parse plumbinginterrogators
158+
git-revert mainporcelain
160159
git-rm mainporcelain worktree
161160
git-send-email foreignscminterface complete
162161
git-send-pack synchingrepositories
162+
git-sh-i18n purehelpers
163+
git-sh-setup purehelpers
163164
git-shell synchelpers
164165
git-shortlog mainporcelain
165166
git-show mainporcelain info
166167
git-show-branch ancillaryinterrogators complete
167168
git-show-index plumbinginterrogators
168169
git-show-ref plumbinginterrogators
169-
git-sh-i18n purehelpers
170-
git-sh-setup purehelpers
171170
git-sparse-checkout mainporcelain
172-
git-stash mainporcelain
173171
git-stage complete
172+
git-stash mainporcelain
174173
git-status mainporcelain info
175174
git-stripspace purehelpers
176175
git-submodule mainporcelain
@@ -189,7 +188,6 @@ git-var plumbinginterrogators
189188
git-verify-commit ancillaryinterrogators
190189
git-verify-pack plumbinginterrogators
191190
git-verify-tag ancillaryinterrogators
192-
gitweb ancillaryinterrogators
193191
git-whatchanged ancillaryinterrogators complete
194192
git-worktree mainporcelain
195193
git-write-tree plumbingmanipulators
@@ -204,13 +202,15 @@ gitfaq guide
204202
gitglossary guide
205203
githooks guide
206204
gitignore guide
205+
gitk mainporcelain
207206
gitmailmap guide
208207
gitmodules guide
209208
gitnamespaces guide
210209
gitremote-helpers guide
211210
gitrepository-layout guide
212211
gitrevisions guide
213212
gitsubmodules guide
214-
gittutorial-2 guide
215213
gittutorial guide
214+
gittutorial-2 guide
215+
gitweb ancillaryinterrogators
216216
gitworkflows guide

generate-cmdlist.sh

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,38 @@ die () {
66
}
77

88
command_list () {
9-
eval "grep -ve '^#' $exclude_programs" <"$1"
10-
}
11-
12-
get_categories () {
13-
tr ' ' '\012'|
14-
grep -v '^$' |
15-
sort |
16-
uniq
9+
while read cmd rest
10+
do
11+
case "$cmd" in
12+
"#"* | '')
13+
# Ignore comments and allow empty lines
14+
continue
15+
;;
16+
*)
17+
case "$exclude_programs" in
18+
*":$cmd:"*)
19+
;;
20+
*)
21+
echo "$cmd $rest"
22+
;;
23+
esac
24+
esac
25+
done <"$1"
1726
}
1827

1928
category_list () {
20-
command_list "$1" |
21-
cut -c 40- |
22-
get_categories
23-
}
24-
25-
get_synopsis () {
26-
sed -n '
27-
/^NAME/,/'"$1"'/H
28-
${
29-
x
30-
s/.*'"$1"' - \(.*\)/N_("\1")/
31-
p
32-
}' "Documentation/$1.txt"
29+
echo "$1" |
30+
cut -d' ' -f2- |
31+
tr ' ' '\012' |
32+
grep -v '^$' |
33+
LC_ALL=C sort -u
3334
}
3435

3536
define_categories () {
3637
echo
3738
echo "/* Command categories */"
3839
bit=0
39-
category_list "$1" |
40+
echo "$1" |
4041
while read cat
4142
do
4243
echo "#define CAT_$cat (1UL << $bit)"
@@ -50,7 +51,7 @@ define_category_names () {
5051
echo "/* Category names */"
5152
echo "static const char *category_names[] = {"
5253
bit=0
53-
category_list "$1" |
54+
echo "$1" |
5455
while read cat
5556
do
5657
echo " \"$cat\", /* (1UL << $bit) */"
@@ -63,36 +64,47 @@ define_category_names () {
6364
print_command_list () {
6465
echo "static struct cmdname_help command_list[] = {"
6566

66-
command_list "$1" |
67+
echo "$1" |
6768
while read cmd rest
6869
do
69-
printf " { \"$cmd\", $(get_synopsis $cmd), 0"
70-
for cat in $(echo "$rest" | get_categories)
70+
synopsis=
71+
while read line
7172
do
72-
printf " | CAT_$cat"
73-
done
73+
case "$line" in
74+
"$cmd - "*)
75+
synopsis=${line#$cmd - }
76+
break
77+
;;
78+
esac
79+
done <"Documentation/$cmd.txt"
80+
81+
printf '\t{ "%s", N_("%s"), 0' "$cmd" "$synopsis"
82+
printf " | CAT_%s" $rest
7483
echo " },"
7584
done
7685
echo "};"
7786
}
7887

79-
exclude_programs=
88+
exclude_programs=:
8089
while test "--exclude-program" = "$1"
8190
do
8291
shift
83-
exclude_programs="$exclude_programs -e \"^$1 \""
92+
exclude_programs="$exclude_programs$1:"
8493
shift
8594
done
8695

96+
commands="$(command_list "$1")"
97+
categories="$(category_list "$commands")"
98+
8799
echo "/* Automatically generated by generate-cmdlist.sh */
88100
struct cmdname_help {
89101
const char *name;
90102
const char *help;
91103
uint32_t category;
92104
};
93105
"
94-
define_categories "$1"
106+
define_categories "$categories"
95107
echo
96-
define_category_names "$1"
108+
define_category_names "$categories"
97109
echo
98-
print_command_list "$1"
110+
print_command_list "$commands"

0 commit comments

Comments
 (0)