[PATCH 1/3] Nicer output from 'git'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Fredrik Kuivinen <freku045@xxxxxxxxxxxxxx>


---

 .gitignore            |    1 +
 Documentation/git.txt |   11 ++++++-----
 Makefile              |    7 +++++--
 generate-cmdlist.sh   |   22 ++++++++++++++++++++++
 git.c                 |   50 +++++++++++++++++++++++++++++++++++++------------
 5 files changed, 72 insertions(+), 19 deletions(-)

diff --git a/.gitignore b/.gitignore
index abbc509..8e94cbd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -121,6 +121,7 @@ git-write-tree
 git-core-*/?*
 test-date
 test-delta
+common-cmds.h
 *.tar.gz
 *.dsc
 *.deb
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 2d0ca9d..8610d36 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -20,15 +20,16 @@ brings your stuff to the plumbing).
 OPTIONS
 -------
 --version::
-	prints the git suite version that the 'git' program came from.
+	Prints the git suite version that the 'git' program came from.
 
 --help::
-	prints the synopsis and a list of available commands.
-	If a git command is named this option will bring up the
-	man-page for that command.
+	Prints the synopsis and a list of the most commonly used
+	commands.  If a git command is named this option will bring up
+	the man-page for that command. If the option '--all' or '-a' is
+	given then all available commands are printed.
 
 --exec-path::
-	path to wherever your core git programs are installed.
+	Path to wherever your core git programs are installed.
 	This can also be controlled by setting the GIT_EXEC_PATH
 	environment variable. If no path is given 'git' will print
 	the current setting and then exit.
diff --git a/Makefile b/Makefile
index 1c555da..dc9a742 100644
--- a/Makefile
+++ b/Makefile
@@ -452,10 +452,13 @@ all:
 strip: $(PROGRAMS) git$X
 	$(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X
 
-git$X: git.c $(LIB_FILE)
+git$X: git.c common-cmds.h $(LIB_FILE)
 	$(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
 		$(ALL_CFLAGS) -o $@ $(filter %.c,$^) $(LIB_FILE) $(LIBS)
 
+common-cmds.h: Documentation/git-*.txt
+	./generate-cmdlist.sh > $@
+
 $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
 	rm -f $@
 	sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
@@ -612,7 +615,7 @@ rpm: dist
 clean:
 	rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o $(LIB_FILE)
 	rm -f $(ALL_PROGRAMS) git$X
-	rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo
+	rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h
 	rm -rf $(GIT_TARNAME)
 	rm -f $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
 	$(MAKE) -C Documentation/ clean
diff --git a/generate-cmdlist.sh b/generate-cmdlist.sh
new file mode 100755
index 0000000..02091b5
--- /dev/null
+++ b/generate-cmdlist.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+echo "/* Automatically generated by $0 */
+struct cmdname_help 
+{
+    char name[16];
+    char help[64];
+};
+
+struct cmdname_help common_cmds[] = {"
+
+# Please keep this list sorted
+for i in "add" "apply" "bisect" "branch" "checkout" "cherry-pick" "clone" \
+"commit" "diff" "fetch" "grep" "init-db" "log" "merge" "mv" \
+"prune" "pull" "push" "rebase" "reset" "revert" "rm" "show-branch" \
+"status" "tag" "verify-tag" "whatchanged"
+do
+    sed -n "/NAME/,/git-$i/H;
+	    \$ {x; s/.*git-$i - \\(.*\\)/{\"$i\", \"\1\"},/; p}" \
+	"Documentation/git-$i.txt"
+done
+echo "};"
diff --git a/git.c b/git.c
index 164d3e9..2cbb471 100644
--- a/git.c
+++ b/git.c
@@ -11,6 +11,7 @@
 #include <sys/ioctl.h>
 #include "git-compat-util.h"
 #include "exec_cmd.h"
+#include "common-cmds.h"
 
 #include "cache.h"
 #include "commit.h"
@@ -171,11 +172,29 @@ static void list_commands(const char *ex
 	putchar('\n');
 }
 
+static void list_common_cmds_help()
+{
+	int i, longest = 0;
+
+	for(i = 0; i < sizeof(common_cmds)/sizeof(struct cmdname_help); i++) {
+		if(strlen(common_cmds[i].name) > longest)
+			longest = strlen(common_cmds[i].name);
+	}
+
+	puts("The most commonly used git commands are:");
+	for(i = 0; i < sizeof(common_cmds)/sizeof(struct cmdname_help); i++) {
+		printf("    %s", common_cmds[i].name);
+		mput_char(' ', longest - strlen(common_cmds[i].name) + 4);
+		puts(common_cmds[i].help);
+	}
+	puts("(use 'git help -a' to get a list of all installed git commands)");
+}
+
 #ifdef __GNUC__
-static void cmd_usage(const char *exec_path, const char *fmt, ...)
-	__attribute__((__format__(__printf__, 2, 3), __noreturn__));
+static void cmd_usage(int show_all, const char *exec_path, const char *fmt, ...)
+	__attribute__((__format__(__printf__, 3, 4), __noreturn__));
 #endif
-static void cmd_usage(const char *exec_path, const char *fmt, ...)
+static void cmd_usage(int show_all, const char *exec_path, const char *fmt, ...)
 {
 	if (fmt) {
 		va_list ap;
@@ -189,11 +208,14 @@ static void cmd_usage(const char *exec_p
 	else
 		puts(git_usage);
 
-	putchar('\n');
-
-	if(exec_path)
-		list_commands(exec_path, "git-*");
-
+	if(exec_path) {
+		putchar('\n');
+		if(show_all)
+			list_commands(exec_path, "git-*");
+		else
+			list_common_cmds_help();
+        }
+        
 	exit(1);
 }
 
@@ -244,8 +266,12 @@ static int cmd_help(int argc, const char
 {
 	const char *help_cmd = argv[1];
 	if (!help_cmd)
-		cmd_usage(git_exec_path(), NULL);
-	show_man_page(help_cmd);
+		cmd_usage(0, git_exec_path(), NULL);
+	else if(!strcmp(help_cmd, "--all") ||
+		!strcmp(help_cmd, "-a"))
+		cmd_usage(1, git_exec_path(), NULL);
+	else
+		show_man_page(help_cmd);
 	return 0;
 }
 
@@ -420,7 +446,7 @@ int main(int argc, const char **argv, ch
 			puts(git_exec_path());
 			exit(0);
 		}
-		cmd_usage(NULL, NULL);
+		cmd_usage(0, NULL, NULL);
 	}
 	argv[0] = cmd;
 
@@ -443,7 +469,7 @@ int main(int argc, const char **argv, ch
 	execv_git_cmd(argv);
 
 	if (errno == ENOENT)
-		cmd_usage(exec_path, "'%s' is not a git-command", cmd);
+		cmd_usage(0, exec_path, "'%s' is not a git-command", cmd);
 
 	fprintf(stderr, "Failed to run command '%s': %s\n",
 		git_command, strerror(errno));
-
: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]