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:
commit
205be1ee07
@ -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
|
||||||
---------------------
|
---------------------
|
||||||
|
@ -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
113
git.c
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user