git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 02/10] generate-cmds.sh: export all commands to command-list.h

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Apr 29, 2018, 18:18 UTC
Message-ID
<20180429181844.21325-3-pclouds@gmail.com>
In-Reply-To
<20180429181844.21325-1-pclouds@gmail.com>

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>
---
 .gitignore          |  1 +
 Makefile            | 13 ++++++---
 command-list.txt    |  4 +--
 generate-cmdlist.sh | 67 ++++++++++++++++++++++++++++++++++++++++++---
 4 files changed, 75 insertions(+), 10 deletions(-)
diff --git a/.gitignore b/.gitignore
index 833ef3b0b7..d4c3914167 100644
--- a/.gitignore
+++ b/.gitignore
@@ -180,6 +180,7 @@
 /gitweb/static/gitweb.js
 /gitweb/static/gitweb.min.*
 /common-cmds.h
+/command-list.h
 *.tar.gz
 *.dsc
 *.deb
diff --git a/Makefile b/Makefile
index 50da82b016..bb29470f88 100644
--- a/Makefile
+++ b/Makefile
@@ -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 \
@@ -1940,6 +1940,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):\
@@ -2150,7 +2155,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.
 
@@ -2529,7 +2534,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"; \
@@ -2777,7 +2782,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
diff --git a/command-list.txt b/command-list.txt
index a1fad28fd8..786536aba0 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -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
diff --git a/generate-cmdlist.sh b/generate-cmdlist.sh
index 31b6d886cb..c9fd524760 100755
--- a/generate-cmdlist.sh
+++ b/generate-cmdlist.sh
@@ -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
@@ -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 [ -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
-- 
2.17.0.664.g8924eee37a
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 86 of 137 in “Keep all info in command-list.txt in git binary”
  1. 0/5 Keep all info in command-list.txt in git binaryNguyễn Thái Ngọc Duy, Mar 26, 2018
  2. 2/5 git.c: implement --list-cmds=all and use it in git-completion.bashNguyễn Thái Ngọc Duy, Mar 26, 2018
  3. Eric SunshineApr 9, 2018
  4. 1/5 git.c: convert --list-builtins to --list-cmds=builtinsNguyễn Thái Ngọc Duy, Mar 26, 2018
  5. 3/5 generate-cmdlist.sh: keep all information in common-cmds.hNguyễn Thái Ngọc Duy, Mar 26, 2018
  6. Eric SunshineApr 9, 2018
  7. Eric SunshineApr 9, 2018
  8. Duy NguyenApr 9, 2018
  9. Duy NguyenApr 15, 2018
  10. 5/5 help: add "-a --verbose" to list all commands with synopsisNguyễn Thái Ngọc Duy, Mar 26, 2018
  11. Eric SunshineApr 9, 2018
  12. Junio C HamanoApr 9, 2018
  13. Eric SunshineApr 9, 2018
  14. Duy NguyenApr 9, 2018
  15. 4/5 git.c: implement --list-cmds=porcelainNguyễn Thái Ngọc Duy, Mar 26, 2018
  16. Eric SunshineApr 9, 2018
  17. Philip OakleyApr 11, 2018
  18. Duy NguyenApr 14, 2018
  19. Philip OakleyApr 15, 2018
  20. Duy NguyenApr 17, 2018
  21. Duy NguyenApr 17, 2018
  22. Philip OakleyApr 17, 2018
  23. Philip OakleyApr 18, 2018
  24. Duy NguyenApr 18, 2018
  25. Philip OakleyApr 19, 2018
  26. 0/6 Keep all info in command-list.txt in git binaryNguyễn Thái Ngọc Duy, Apr 15, 2018
  27. 1/6 git.c: convert --list-builtins to --list-cmds=builtinsNguyễn Thái Ngọc Duy, Apr 15, 2018
  28. 4/6 git.c: implement --list-cmds=porcelainNguyễn Thái Ngọc Duy, Apr 15, 2018
  29. 3/6 generate-cmdlist.sh: keep all information in common-cmds.hNguyễn Thái Ngọc Duy, Apr 15, 2018
  30. Junio C HamanoApr 16, 2018
  31. Øystein WalleApr 23, 2018
  32. SZEDER GáborApr 23, 2018
  33. Junio C HamanoApr 16, 2018
  34. Duy NguyenApr 16, 2018
  35. SZEDER GáborApr 16, 2018
  36. Ramsay JonesApr 16, 2018
  37. Junio C HamanoApr 16, 2018
  38. 6/6 help: use command-list.txt for the source of guidesNguyễn Thái Ngọc Duy, Apr 15, 2018
  39. 2/6 git.c: implement --list-cmds=all and use it in git-completion.bashNguyễn Thái Ngọc Duy, Apr 15, 2018
  40. Junio C HamanoApr 16, 2018
  41. 5/6 help: add "-a --verbose" to list all commands with synopsisNguyễn Thái Ngọc Duy, Apr 15, 2018
  42. 0/6 Keep all info in command-list.txt in git binaryNguyễn Thái Ngọc Duy, Apr 21, 2018
  43. 1/6 git.c: convert --list-*builtins to --list-cmds=*Nguyễn Thái Ngọc Duy, Apr 21, 2018
  44. 2/6 git.c: implement --list-cmds=all and use it in git-completion.bashNguyễn Thái Ngọc Duy, Apr 21, 2018
  45. SZEDER GáborApr 23, 2018
  46. 3/6 generate-cmdlist.sh: keep all information in common-cmds.hNguyễn Thái Ngọc Duy, Apr 21, 2018
  47. 6/6 help: use command-list.txt for the source of guidesNguyễn Thái Ngọc Duy, Apr 21, 2018
  48. Eric SunshineApr 23, 2018
  49. 5/6 help: add "-a --verbose" to list all commands with synopsisNguyễn Thái Ngọc Duy, Apr 21, 2018
  50. 4/6 git.c: implement --list-cmds=porcelainNguyễn Thái Ngọc Duy, Apr 21, 2018
  51. SZEDER GáborApr 23, 2018
  52. Duy NguyenApr 24, 2018
  53. Duy NguyenApr 24, 2018
  54. SZEDER GáborApr 25, 2018
  55. Duy NguyenApr 25, 2018
  56. SZEDER GáborApr 25, 2018
  57. Duy NguyenApr 25, 2018
  58. Duy NguyenApr 21, 2018
  59. Ramsay JonesApr 22, 2018
  60. Duy NguyenApr 22, 2018
  61. Ramsay JonesApr 22, 2018
  62. Duy NguyenApr 22, 2018
  63. Ramsay JonesApr 22, 2018
  64. 00/12 Keep all info in command-list.txt in git binaryNguyễn Thái Ngọc Duy, Apr 25, 2018
  65. 01/12 generate-cmds.sh: factor out synopsis extract codeNguyễn Thái Ngọc Duy, Apr 25, 2018
  66. Eric SunshineApr 25, 2018
  67. SZEDER GáborApr 25, 2018
  68. 02/12 generate-cmds.sh: export all commands to command-list.hNguyễn Thái Ngọc Duy, Apr 25, 2018
  69. Eric SunshineApr 25, 2018
  70. Duy NguyenApr 29, 2018
  71. 03/12 help: use command-list.h for common command listNguyễn Thái Ngọc Duy, Apr 25, 2018
  72. 08/12 git: support --list-cmds=<category>Nguyễn Thái Ngọc Duy, Apr 25, 2018
  73. Eric SunshineApr 25, 2018
  74. 07/12 completion: implement and use --list-cmds=allNguyễn Thái Ngọc Duy, Apr 25, 2018
  75. 06/12 git: accept multiple --list-cmds optionsNguyễn Thái Ngọc Duy, Apr 25, 2018
  76. Eric SunshineApr 25, 2018
  77. 11/12 command-list.txt: add new category "complete"Nguyễn Thái Ngọc Duy, Apr 25, 2018
  78. 09/12 help: add "-a --verbose" to list all commands with synopsisNguyễn Thái Ngọc Duy, Apr 25, 2018
  79. 10/12 help: use command-list.txt for the source of guidesNguyễn Thái Ngọc Duy, Apr 25, 2018
  80. Eric SunshineApr 25, 2018
  81. 05/12 git.c: convert --list-*builtins to --list-cmds=*Nguyễn Thái Ngọc Duy, Apr 25, 2018
  82. 04/12 Remove common-cmds.hNguyễn Thái Ngọc Duy, Apr 25, 2018
  83. 12/12 completion: let git provide the completable command listNguyễn Thái Ngọc Duy, Apr 25, 2018
  84. 00/10 Keep all info in command-list.txt in git binaryNguyễn Thái Ngọc Duy, Apr 29, 2018
  85. 01/10 generate-cmds.sh: factor out synopsis extract codeNguyễn Thái Ngọc Duy, Apr 29, 2018
  86. 02/10 generate-cmds.sh: export all commands to command-list.hNguyễn Thái Ngọc Duy, Apr 29, 2018
  87. 03/10 help: use command-list.h for common command listNguyễn Thái Ngọc Duy, Apr 29, 2018
  88. 06/10 completion: implement and use --list-cmds=main,othersNguyễn Thái Ngọc Duy, Apr 29, 2018
  89. 05/10 git.c: convert --list-*builtins to --list-cmds=*Nguyễn Thái Ngọc Duy, Apr 29, 2018
  90. 10/10 completion: let git provide the completable command listNguyễn Thái Ngọc Duy, Apr 29, 2018
  91. 04/10 Remove common-cmds.hNguyễn Thái Ngọc Duy, Apr 29, 2018
  92. 07/10 git: support --list-cmds=list-<category>Nguyễn Thái Ngọc Duy, Apr 29, 2018
  93. 08/10 help: add "-a --verbose" to list all commands with synopsisNguyễn Thái Ngọc Duy, Apr 29, 2018
  94. 09/10 help: use command-list.txt for the source of guidesNguyễn Thái Ngọc Duy, Apr 29, 2018
  95. Duy NguyenApr 29, 2018
  96. Duy NguyenApr 30, 2018
  97. 00/13 Keep all info in command-list.txt in git binaryNguyễn Thái Ngọc Duy, May 7, 2018
  98. 01/13 generate-cmds.sh: factor out synopsis extract codeNguyễn Thái Ngọc Duy, May 7, 2018
  99. 02/13 generate-cmds.sh: export all commands to command-list.hNguyễn Thái Ngọc Duy, May 7, 2018
  100. Junio C HamanoMay 8, 2018
  101. 04/13 Remove common-cmds.hNguyễn Thái Ngọc Duy, May 7, 2018
  102. 06/13 git --list-cmds: collect command list in a string_listNguyễn Thái Ngọc Duy, May 7, 2018
  103. 07/13 completion: implement and use --list-cmds=main,othersNguyễn Thái Ngọc Duy, May 7, 2018
  104. 05/13 git.c: convert --list-* to --list-cmds=*Nguyễn Thái Ngọc Duy, May 7, 2018
  105. Junio C HamanoMay 8, 2018
  106. 09/13 help: add "-a --verbose" to list all commands with synopsisNguyễn Thái Ngọc Duy, May 7, 2018
  107. 12/13 completion: let git provide the completable command listNguyễn Thái Ngọc Duy, May 7, 2018
  108. 13/13 completion: allow to customize the completable command listNguyễn Thái Ngọc Duy, May 7, 2018
  109. 10/13 help: use command-list.txt for the source of guidesNguyễn Thái Ngọc Duy, May 7, 2018
  110. Junio C HamanoMay 8, 2018
  111. 08/13 git: support --list-cmds=list-<category>Nguyễn Thái Ngọc Duy, May 7, 2018
  112. Junio C HamanoMay 8, 2018
  113. 11/13 command-list.txt: documentation and guide lineNguyễn Thái Ngọc Duy, May 7, 2018
  114. Philip OakleyMay 12, 2018
  115. 03/13 help: use command-list.h for common command listNguyễn Thái Ngọc Duy, May 7, 2018
  116. 00/13 Keep all info in command-list.txt in git binaryNguyễn Thái Ngọc Duy, May 10, 2018
  117. 01/13 generate-cmds.sh: factor out synopsis extract codeNguyễn Thái Ngọc Duy, May 10, 2018
  118. 03/13 help: use command-list.h for common command listNguyễn Thái Ngọc Duy, May 10, 2018
  119. 02/13 generate-cmds.sh: export all commands to command-list.hNguyễn Thái Ngọc Duy, May 10, 2018
  120. 04/13 Remove common-cmds.hNguyễn Thái Ngọc Duy, May 10, 2018
  121. 11/13 command-list.txt: documentation and guide lineNguyễn Thái Ngọc Duy, May 10, 2018
  122. 10/13 help: use command-list.txt for the source of guidesNguyễn Thái Ngọc Duy, May 10, 2018
  123. 12/13 completion: let git provide the completable command listNguyễn Thái Ngọc Duy, May 10, 2018
  124. SZEDER GáborMay 11, 2018
  125. Duy NguyenMay 13, 2018
  126. 13/13 completion: allow to customize the completable command listNguyễn Thái Ngọc Duy, May 10, 2018
  127. 05/13 git.c: convert --list-* to --list-cmds=*Nguyễn Thái Ngọc Duy, May 10, 2018
  128. 06/13 git --list-cmds: collect command list in a string_listNguyễn Thái Ngọc Duy, May 10, 2018
  129. 07/13 completion: implement and use --list-cmds=main,othersNguyễn Thái Ngọc Duy, May 10, 2018
  130. SZEDER GáborMay 11, 2018
  131. SZEDER GáborMay 11, 2018
  132. Duy NguyenMay 11, 2018
  133. 08/13 git: support --list-cmds=list-<category>Nguyễn Thái Ngọc Duy, May 10, 2018
  134. 09/13 help: add "-a --verbose" to list all commands with synopsisNguyễn Thái Ngọc Duy, May 10, 2018
  135. Simon RuderichApr 19, 2018
  136. SZEDER GáborApr 19, 2018
  137. Simon RuderichApr 20, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.