Nicer output from 'git'
authorFredrik Kuivinen <freku045@student.liu.se>
Thu, 9 Mar 2006 16:24:19 +0000 (17:24 +0100)
committerJunio C Hamano <junkio@cox.net>
Thu, 9 Mar 2006 20:03:14 +0000 (12:03 -0800)
[jc: with suggestions by Jan-Benedict Glaw]

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
.gitignore
Documentation/git.txt
Makefile
generate-cmdlist.sh [new file with mode: 0755]
git.c

index abbc509..8e94cbd 100644 (file)
@@ -121,6 +121,7 @@ git-write-tree
 git-core-*/?*
 test-date
 test-delta
+common-cmds.h
 *.tar.gz
 *.dsc
 *.deb
index 2d0ca9d..8610d36 100644 (file)
@@ -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.
index cd2c2db..e75a1ab 100644 (file)
--- 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 (executable)
index 0000000..6ee85d5
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+echo "/* Automatically generated by $0 */
+struct cmdname_help
+{
+    char name[16];
+    char help[64];
+};
+
+struct cmdname_help common_cmds[] = {"
+
+sort <<\EOF |
+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
+show-branch
+status
+tag
+verify-tag
+whatchanged
+EOF
+while read cmd
+do
+    sed -n "/NAME/,/git-$cmd/H;
+           \$ {x; s/.*git-$cmd - \\(.*\\)/  {\"$cmd\", \"\1\"},/; p}" \
+       "Documentation/git-$cmd.txt"
+done
+echo "};"
diff --git a/git.c b/git.c
index 746e2af..0b40e30 100644 (file)
--- 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 *exec_path, const char *pattern)
        putchar('\n');
 }
 
+static void list_common_cmds_help()
+{
+       int i, longest = 0;
+
+       for (i = 0; i < ARRAY_SIZE(common_cmds); i++) {
+               if (longest < strlen(common_cmds[i].name))
+                       longest = strlen(common_cmds[i].name);
+       }
+
+       puts("The most commonly used git commands are:");
+       for (i = 0; i < ARRAY_SIZE(common_cmds); 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,10 +208,13 @@ static void cmd_usage(const char *exec_path, const char *fmt, ...)
        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,11 @@ static int cmd_help(int argc, const char **argv, char **envp)
 {
        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;
 }
 
@@ -418,7 +443,7 @@ int main(int argc, const char **argv, char **envp)
                        puts(git_exec_path());
                        exit(0);
                }
-               cmd_usage(NULL, NULL);
+               cmd_usage(0, NULL, NULL);
        }
        argv[0] = cmd;
 
@@ -441,7 +466,7 @@ int main(int argc, const char **argv, char **envp)
        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));