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:

committed by
Junio C Hamano

parent
b4f2a6ac92
commit
a87cd02ce0
1
.gitignore
vendored
1
.gitignore
vendored
@ -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
|
||||||
|
@ -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.
|
||||||
|
7
Makefile
7
Makefile
@ -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
48
generate-cmdlist.sh
Executable 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
47
git.c
@ -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));
|
||||||
|
Reference in New Issue
Block a user