generate-cmds.sh: export all commands to command-list.h
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>maint
							parent
							
								
									75ba897e30
								
							
						
					
					
						commit
						f318d73915
					
				|  | @ -180,6 +180,7 @@ | ||||||
| /gitweb/static/gitweb.js | /gitweb/static/gitweb.js | ||||||
| /gitweb/static/gitweb.min.* | /gitweb/static/gitweb.min.* | ||||||
| /common-cmds.h | /common-cmds.h | ||||||
|  | /command-list.h | ||||||
| *.tar.gz | *.tar.gz | ||||||
| *.dsc | *.dsc | ||||||
| *.deb | *.deb | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										13
									
								
								Makefile
								
								
								
								
							|  | @ -757,7 +757,7 @@ LIB_FILE = libgit.a | ||||||
| XDIFF_LIB = xdiff/lib.a | XDIFF_LIB = xdiff/lib.a | ||||||
| VCSSVN_LIB = vcs-svn/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) . \ | LIB_H = $(shell $(FIND) . \ | ||||||
| 	-name .git -prune -o \ | 	-name .git -prune -o \ | ||||||
|  | @ -1938,6 +1938,11 @@ $(BUILT_INS): git$X | ||||||
| common-cmds.h: generate-cmdlist.sh command-list.txt | common-cmds.h: generate-cmdlist.sh command-list.txt | ||||||
|  |  | ||||||
| common-cmds.h: $(wildcard Documentation/git-*.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 $@+ $@ | 	$(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh command-list.txt >$@+ && mv $@+ $@ | ||||||
|  |  | ||||||
| SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\ | SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\ | ||||||
|  | @ -2148,7 +2153,7 @@ else | ||||||
| # Dependencies on header files, for platforms that do not support | # Dependencies on header files, for platforms that do not support | ||||||
| # the gcc -MMD option. | # 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 | # should _not_ be included here, since they are necessary even when | ||||||
| # building an object for the first time. | # building an object for the first time. | ||||||
|  |  | ||||||
|  | @ -2527,7 +2532,7 @@ sparse: $(SP_OBJ) | ||||||
| style: | style: | ||||||
| 	git clang-format --style file --diff --extensions c,h | 	git clang-format --style file --diff --extensions c,h | ||||||
|  |  | ||||||
| check: common-cmds.h | check: common-cmds.h command-list.h | ||||||
| 	@if sparse; \ | 	@if sparse; \ | ||||||
| 	then \ | 	then \ | ||||||
| 		echo >&2 "Use 'make sparse' instead"; \ | 		echo >&2 "Use 'make sparse' instead"; \ | ||||||
|  | @ -2775,7 +2780,7 @@ clean: profile-clean coverage-clean | ||||||
| 	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL) | 	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL) | ||||||
| 	$(RM) -r bin-wrappers $(dep_dirs) | 	$(RM) -r bin-wrappers $(dep_dirs) | ||||||
| 	$(RM) -r po/build/ | 	$(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) -r $(GIT_TARNAME) .doc-tmp-dir | ||||||
| 	$(RM) $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz | 	$(RM) $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz | ||||||
| 	$(RM) $(htmldocs).tar.gz $(manpages).tar.gz | 	$(RM) $(htmldocs).tar.gz $(manpages).tar.gz | ||||||
|  |  | ||||||
|  | @ -8,8 +8,8 @@ info         examine the history and state (see also: git help revisions) | ||||||
| history      grow, mark and tweak your common history | history      grow, mark and tweak your common history | ||||||
| remote       collaborate (see also: git help workflows) | remote       collaborate (see also: git help workflows) | ||||||
|  |  | ||||||
| ### command list (do not change this line) | ### command list (do not change this line, also do not change alignment) | ||||||
| # command name                          category [deprecated] [common] | # command name                          category [category] [category] | ||||||
| git-add                                 mainporcelain           worktree | git-add                                 mainporcelain           worktree | ||||||
| git-am                                  mainporcelain | git-am                                  mainporcelain | ||||||
| git-annotate                            ancillaryinterrogators | git-annotate                            ancillaryinterrogators | ||||||
|  |  | ||||||
|  | @ -1,5 +1,27 @@ | ||||||
| #!/bin/sh | #!/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 () { | get_synopsis () { | ||||||
| 	sed -n ' | 	sed -n ' | ||||||
| 		/^NAME/,/'"$1"'/H | 		/^NAME/,/'"$1"'/H | ||||||
|  | @ -10,14 +32,51 @@ get_synopsis () { | ||||||
| 		}' "Documentation/$1.txt" | 		}' "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 */ | echo "/* Automatically generated by generate-cmdlist.sh */ | ||||||
| struct cmdname_help { | struct cmdname_help { | ||||||
| 	char name[16]; | 	const char *name; | ||||||
| 	char help[80]; | 	const char *help; | ||||||
| 	unsigned char group; | 	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 | grps=grps$$.tmp | ||||||
| match=match$$.tmp | match=match$$.tmp | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Nguyễn Thái Ngọc Duy
						Nguyễn Thái Ngọc Duy