mirror of
https://github.com/git/git.git
synced 2024-12-13 20:06:31 +08:00
1cecd06e36
Change the "define_categories()" and "define_category_names()" functions to take the already-parsed output of "category_list()" as an argument, which brings our number of passes over "command-list.txt" from three to two. Then have "category_list()" itself take the output of "command_list()" as an argument, bringing the number of times we parse the file to one. Compared to the pre-image this speeds us up quite a bit: $ git show HEAD~:generate-cmdlist.sh >generate-cmdlist.sh.old $ hyperfine --warmup 10 -L v ,.old 'sh generate-cmdlist.sh{v} command-list.txt' Benchmark #1: sh generate-cmdlist.sh command-list.txt Time (mean ± σ): 22.9 ms ± 0.3 ms [User: 15.8 ms, System: 9.6 ms] Range (min … max): 22.5 ms … 24.0 ms 125 runs Benchmark #2: sh generate-cmdlist.sh.old command-list.txt Time (mean ± σ): 30.1 ms ± 0.4 ms [User: 24.4 ms, System: 17.5 ms] Range (min … max): 29.5 ms … 32.3 ms 96 runs Summary 'sh generate-cmdlist.sh command-list.txt' ran 1.32 ± 0.02 times faster than 'sh generate-cmdlist.sh.old command-list.txt' Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
111 lines
1.7 KiB
Bash
Executable File
111 lines
1.7 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
die () {
|
|
echo "$@" >&2
|
|
exit 1
|
|
}
|
|
|
|
command_list () {
|
|
while read cmd rest
|
|
do
|
|
case "$cmd" in
|
|
"#"* | '')
|
|
# Ignore comments and allow empty lines
|
|
continue
|
|
;;
|
|
*)
|
|
case "$exclude_programs" in
|
|
*":$cmd:"*)
|
|
;;
|
|
*)
|
|
echo "$cmd $rest"
|
|
;;
|
|
esac
|
|
esac
|
|
done <"$1"
|
|
}
|
|
|
|
category_list () {
|
|
echo "$1" |
|
|
cut -d' ' -f2- |
|
|
tr ' ' '\012' |
|
|
grep -v '^$' |
|
|
LC_ALL=C sort -u
|
|
}
|
|
|
|
define_categories () {
|
|
echo
|
|
echo "/* Command categories */"
|
|
bit=0
|
|
echo "$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
|
|
echo "$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[] = {"
|
|
|
|
echo "$1" |
|
|
while read cmd rest
|
|
do
|
|
synopsis=
|
|
while read line
|
|
do
|
|
case "$line" in
|
|
"$cmd - "*)
|
|
synopsis=${line#$cmd - }
|
|
break
|
|
;;
|
|
esac
|
|
done <"Documentation/$cmd.txt"
|
|
|
|
printf '\t{ "%s", N_("%s"), 0' "$cmd" "$synopsis"
|
|
printf " | CAT_%s" $rest
|
|
echo " },"
|
|
done
|
|
echo "};"
|
|
}
|
|
|
|
exclude_programs=:
|
|
while test "--exclude-program" = "$1"
|
|
do
|
|
shift
|
|
exclude_programs="$exclude_programs$1:"
|
|
shift
|
|
done
|
|
|
|
commands="$(command_list "$1")"
|
|
categories="$(category_list "$commands")"
|
|
|
|
echo "/* Automatically generated by generate-cmdlist.sh */
|
|
struct cmdname_help {
|
|
const char *name;
|
|
const char *help;
|
|
uint32_t category;
|
|
};
|
|
"
|
|
define_categories "$categories"
|
|
echo
|
|
define_category_names "$categories"
|
|
echo
|
|
print_command_list "$commands"
|