Skip to content

Commit

Permalink
generate-cmds.sh: export all commands to command-list.h
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
pclouds authored and gitster committed May 10, 2018
1 parent 75ba897 commit f318d73
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 10 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@
/gitweb/static/gitweb.js
/gitweb/static/gitweb.min.*
/common-cmds.h
/command-list.h
*.tar.gz
*.dsc
*.deb
Expand Down
13 changes: 9 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -757,7 +757,7 @@ LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a

GENERATED_H += common-cmds.h
GENERATED_H += common-cmds.h command-list.h

LIB_H = $(shell $(FIND) . \
-name .git -prune -o \
Expand Down Expand Up @@ -1938,6 +1938,11 @@ $(BUILT_INS): git$X
common-cmds.h: generate-cmdlist.sh command-list.txt

common-cmds.h: $(wildcard Documentation/git-*.txt)
$(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh command-list.txt COMMON >$@+ && mv $@+ $@

command-list.h: generate-cmdlist.sh command-list.txt

command-list.h: $(wildcard Documentation/git-*.txt)
$(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh command-list.txt >$@+ && mv $@+ $@

SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
Expand Down Expand Up @@ -2148,7 +2153,7 @@ else
# Dependencies on header files, for platforms that do not support
# the gcc -MMD option.
#
# Dependencies on automatically generated headers such as common-cmds.h
# Dependencies on automatically generated headers such as common-cmds.h or command-list.h
# should _not_ be included here, since they are necessary even when
# building an object for the first time.

Expand Down Expand Up @@ -2527,7 +2532,7 @@ sparse: $(SP_OBJ)
style:
git clang-format --style file --diff --extensions c,h

check: common-cmds.h
check: common-cmds.h command-list.h
@if sparse; \
then \
echo >&2 "Use 'make sparse' instead"; \
Expand Down Expand Up @@ -2775,7 +2780,7 @@ clean: profile-clean coverage-clean
$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
$(RM) -r bin-wrappers $(dep_dirs)
$(RM) -r po/build/
$(RM) *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
$(RM) *.pyc *.pyo */*.pyc */*.pyo common-cmds.h command-list.h $(ETAGS_TARGET) tags cscope*
$(RM) -r $(GIT_TARNAME) .doc-tmp-dir
$(RM) $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
$(RM) $(htmldocs).tar.gz $(manpages).tar.gz
Expand Down
4 changes: 2 additions & 2 deletions command-list.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ info examine the history and state (see also: git help revisions)
history grow, mark and tweak your common history
remote collaborate (see also: git help workflows)

### command list (do not change this line)
# command name category [deprecated] [common]
### command list (do not change this line, also do not change alignment)
# command name category [category] [category]
git-add mainporcelain worktree
git-am mainporcelain
git-annotate ancillaryinterrogators
Expand Down
67 changes: 63 additions & 4 deletions generate-cmdlist.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
#!/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
Expand All @@ -10,14 +32,51 @@ get_synopsis () {
}' "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
Expand Down

0 comments on commit f318d73

Please sign in to comment.