Nicer output from 'git'

[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>
This commit is contained in:
Fredrik Kuivinen
2006-03-09 17:24:19 +01:00
committed by Junio C Hamano
parent b4f2a6ac92
commit a87cd02ce0
5 changed files with 96 additions and 18 deletions

1
.gitignore vendored
View File

@ -121,6 +121,7 @@ git-write-tree
git-core-*/?* git-core-*/?*
test-date test-date
test-delta test-delta
common-cmds.h
*.tar.gz *.tar.gz
*.dsc *.dsc
*.deb *.deb

View File

@ -20,15 +20,16 @@ brings your stuff to the plumbing).
OPTIONS OPTIONS
------- -------
--version:: --version::
prints the git suite version that the 'git' program came from. Prints the git suite version that the 'git' program came from.
--help:: --help::
prints the synopsis and a list of available commands. Prints the synopsis and a list of the most commonly used
If a git command is named this option will bring up the commands. If a git command is named this option will bring up
man-page for that command. the man-page for that command. If the option '--all' or '-a' is
given then all available commands are printed.
--exec-path:: --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 This can also be controlled by setting the GIT_EXEC_PATH
environment variable. If no path is given 'git' will print environment variable. If no path is given 'git' will print
the current setting and then exit. the current setting and then exit.

View File

@ -452,10 +452,13 @@ all:
strip: $(PROGRAMS) git$X strip: $(PROGRAMS) git$X
$(STRIP) $(STRIP_OPTS) $(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)"' \ $(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
$(ALL_CFLAGS) -o $@ $(filter %.c,$^) $(LIB_FILE) $(LIBS) $(ALL_CFLAGS) -o $@ $(filter %.c,$^) $(LIB_FILE) $(LIBS)
common-cmds.h: Documentation/git-*.txt
./generate-cmdlist.sh > $@
$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
rm -f $@ rm -f $@
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
@ -612,7 +615,7 @@ rpm: dist
clean: clean:
rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o $(LIB_FILE) rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o $(LIB_FILE)
rm -f $(ALL_PROGRAMS) git$X 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 -rf $(GIT_TARNAME)
rm -f $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz rm -f $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
$(MAKE) -C Documentation/ clean $(MAKE) -C Documentation/ clean

48
generate-cmdlist.sh Executable file
View File

@ -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 "};"

47
git.c
View File

@ -11,6 +11,7 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include "git-compat-util.h" #include "git-compat-util.h"
#include "exec_cmd.h" #include "exec_cmd.h"
#include "common-cmds.h"
#include "cache.h" #include "cache.h"
#include "commit.h" #include "commit.h"
@ -171,11 +172,29 @@ static void list_commands(const char *exec_path, const char *pattern)
putchar('\n'); 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__ #ifdef __GNUC__
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, ...)
__attribute__((__format__(__printf__, 2, 3), __noreturn__)); __attribute__((__format__(__printf__, 3, 4), __noreturn__));
#endif #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) { if (fmt) {
va_list ap; va_list ap;
@ -189,10 +208,13 @@ static void cmd_usage(const char *exec_path, const char *fmt, ...)
else else
puts(git_usage); puts(git_usage);
putchar('\n'); if (exec_path) {
putchar('\n');
if(exec_path) if (show_all)
list_commands(exec_path, "git-*"); list_commands(exec_path, "git-*");
else
list_common_cmds_help();
}
exit(1); exit(1);
} }
@ -244,8 +266,11 @@ static int cmd_help(int argc, const char **argv, char **envp)
{ {
const char *help_cmd = argv[1]; const char *help_cmd = argv[1];
if (!help_cmd) if (!help_cmd)
cmd_usage(git_exec_path(), NULL); cmd_usage(0, git_exec_path(), NULL);
show_man_page(help_cmd); 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; return 0;
} }
@ -418,7 +443,7 @@ int main(int argc, const char **argv, char **envp)
puts(git_exec_path()); puts(git_exec_path());
exit(0); exit(0);
} }
cmd_usage(NULL, NULL); cmd_usage(0, NULL, NULL);
} }
argv[0] = cmd; argv[0] = cmd;
@ -441,7 +466,7 @@ int main(int argc, const char **argv, char **envp)
execv_git_cmd(argv); execv_git_cmd(argv);
if (errno == ENOENT) 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", fprintf(stderr, "Failed to run command '%s': %s\n",
git_command, strerror(errno)); git_command, strerror(errno));