Merge branch 'js/alias-p'

* js/alias-p:
  git wrapper: add --git-dir=<path> and --bare options
  Allow an alias to start with "-p"
This commit is contained in:
Junio C Hamano 2006-07-28 12:33:57 -07:00
commit 205be1ee07
3 changed files with 81 additions and 46 deletions

View File

@ -8,7 +8,8 @@ git - the stupid content tracker
SYNOPSIS SYNOPSIS
-------- --------
'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ARGS] 'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate]
[--bare] [--git-dir=GIT_DIR] [--help] COMMAND [ARGS]
DESCRIPTION DESCRIPTION
----------- -----------
@ -41,6 +42,15 @@ OPTIONS
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.
-p|--paginate::
Pipe all output into 'less' (or if set, $PAGER).
--git-dir=<path>::
Set the path to the repository. This can also be controlled by
setting the GIT_DIR environment variable.
--bare::
Same as --git-dir=`pwd`.
FURTHER DOCUMENTATION FURTHER DOCUMENTATION
--------------------- ---------------------

View File

@ -229,7 +229,7 @@ int cmd_version(int argc, const char **argv, char **envp)
int cmd_help(int argc, const char **argv, char **envp) int cmd_help(int argc, const char **argv, char **envp)
{ {
const char *help_cmd = argv[1]; const char *help_cmd = argc > 1 ? argv[1] : NULL;
if (!help_cmd) if (!help_cmd)
cmd_usage(0, git_exec_path(), NULL); cmd_usage(0, git_exec_path(), NULL);
else if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a")) else if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a"))

113
git.c
View File

@ -35,6 +35,59 @@ static void prepend_to_path(const char *dir, int len)
setenv("PATH", path, 1); setenv("PATH", path, 1);
} }
static int handle_options(const char*** argv, int* argc)
{
int handled = 0;
while (*argc > 0) {
const char *cmd = (*argv)[0];
if (cmd[0] != '-')
break;
/*
* For legacy reasons, the "version" and "help"
* commands can be written with "--" prepended
* to make them look like flags.
*/
if (!strcmp(cmd, "--help") || !strcmp(cmd, "--version"))
break;
/*
* Check remaining flags.
*/
if (!strncmp(cmd, "--exec-path", 11)) {
cmd += 11;
if (*cmd == '=')
git_set_exec_path(cmd + 1);
else {
puts(git_exec_path());
exit(0);
}
} else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
setup_pager();
} else if (!strcmp(cmd, "--git-dir")) {
if (*argc < 1)
return -1;
setenv("GIT_DIR", (*argv)[1], 1);
(*argv)++;
(*argc)--;
} else if (!strncmp(cmd, "--git-dir=", 10)) {
setenv("GIT_DIR", cmd + 10, 1);
} else if (!strcmp(cmd, "--bare")) {
static char git_dir[1024];
setenv("GIT_DIR", getcwd(git_dir, 1024), 1);
} else {
fprintf(stderr, "Unknown option: %s\n", cmd);
cmd_usage(0, NULL, NULL);
}
(*argv)++;
(*argc)--;
handled++;
}
return handled;
}
static const char *alias_command; static const char *alias_command;
static char *alias_string = NULL; static char *alias_string = NULL;
@ -106,7 +159,7 @@ static int handle_alias(int *argcp, const char ***argv)
subdir = setup_git_directory_gently(&nongit); subdir = setup_git_directory_gently(&nongit);
if (!nongit) { if (!nongit) {
int count; int count, option_count;
const char** new_argv; const char** new_argv;
alias_command = (*argv)[0]; alias_command = (*argv)[0];
@ -114,6 +167,10 @@ static int handle_alias(int *argcp, const char ***argv)
if (alias_string) { if (alias_string) {
count = split_cmdline(alias_string, &new_argv); count = split_cmdline(alias_string, &new_argv);
option_count = handle_options(&new_argv, &count);
memmove(new_argv - option_count, new_argv,
count * sizeof(char *));
new_argv -= option_count;
if (count < 1) if (count < 1)
die("empty alias for %s", alias_command); die("empty alias for %s", alias_command);
@ -268,51 +325,19 @@ int main(int argc, const char **argv, char **envp)
die("cannot handle %s internally", cmd); die("cannot handle %s internally", cmd);
} }
/* Default command: "help" */
cmd = "help";
/* Look for flags.. */ /* Look for flags.. */
while (argc > 1) { argv++;
cmd = *++argv; argc--;
argc--; handle_options(&argv, &argc);
if (argc > 0) {
if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) { if (!strncmp(argv[0], "--", 2))
setup_pager(); argv[0] += 2;
continue; } else {
} /* Default command: "help" */
argv[0] = "help";
if (strncmp(cmd, "--", 2)) argc = 1;
break;
cmd += 2;
/*
* For legacy reasons, the "version" and "help"
* commands can be written with "--" prepended
* to make them look like flags.
*/
if (!strcmp(cmd, "help"))
break;
if (!strcmp(cmd, "version"))
break;
/*
* Check remaining flags (which by now must be
* "--exec-path", but maybe we will accept
* other arguments some day)
*/
if (!strncmp(cmd, "exec-path", 9)) {
cmd += 9;
if (*cmd == '=') {
git_set_exec_path(cmd + 1);
continue;
}
puts(git_exec_path());
exit(0);
}
cmd_usage(0, NULL, NULL);
} }
argv[0] = cmd; cmd = argv[0];
/* /*
* We search for git commands in the following order: * We search for git commands in the following order: