mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
The current generate-cmds.sh generates just enough to print "git help" output. That is, it only extracts help text for common commands. The script is now updated to extract help text for all commands and keep command classification a new file, command-list.h. This will be useful later: - "git help -a" could print a short summary of all commands instead of just the common ones. - "git" could produce a list of commands of one or more category. One of its use is to reduce another command classification embedded in git-completion.bash. The new file can be generated but is not used anywhere yet. The plan is we migrate away from common-cmds.h. Then we can kill off common-cmds.h build rules and generation code (and also delete duplicate content in command-list.h which we keep for now to not mess generate-cmds.sh up too much). PS. The new fixed column requirement on command-list.txt is technically not needed. But it helps simplify the code a bit at this stage. We could lift this restriction later if we want to. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
114 lines
1.8 KiB
Bash
Executable File
114 lines
1.8 KiB
Bash
Executable File
#!/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 {
|
|
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
|
|
|
|
echo "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")
|
|
echo " {\"$cmd\", $(get_synopsis git-$cmd), $tag},"
|
|
done
|
|
echo "};"
|