Skip to content

Commit

Permalink
Merge branch 'js/alias-p'
Browse files Browse the repository at this point in the history
* js/alias-p:
  git wrapper: add --git-dir=<path> and --bare options
  Allow an alias to start with "-p"
  • Loading branch information
Junio C Hamano committed Jul 28, 2006
2 parents f789f82 + 6acbcb9 commit 205be1e
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 46 deletions.
12 changes: 11 additions & 1 deletion Documentation/git.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ git - the stupid content tracker

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
-----------
Expand Down Expand Up @@ -41,6 +42,15 @@ OPTIONS
environment variable. If no path is given 'git' will print
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
---------------------
Expand Down
2 changes: 1 addition & 1 deletion builtin-help.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ int cmd_version(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)
cmd_usage(0, git_exec_path(), NULL);
else if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a"))
Expand Down
113 changes: 69 additions & 44 deletions git.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,59 @@ static void prepend_to_path(const char *dir, int len)
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 char *alias_string = NULL;

Expand Down Expand Up @@ -106,14 +159,18 @@ static int handle_alias(int *argcp, const char ***argv)

subdir = setup_git_directory_gently(&nongit);
if (!nongit) {
int count;
int count, option_count;
const char** new_argv;

alias_command = (*argv)[0];
git_config(git_alias_config);
if (alias_string) {

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)
die("empty alias for %s", alias_command);
Expand Down Expand Up @@ -268,51 +325,19 @@ int main(int argc, const char **argv, char **envp)
die("cannot handle %s internally", cmd);
}

/* Default command: "help" */
cmd = "help";

/* Look for flags.. */
while (argc > 1) {
cmd = *++argv;
argc--;

if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
setup_pager();
continue;
}

if (strncmp(cmd, "--", 2))
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++;
argc--;
handle_options(&argv, &argc);
if (argc > 0) {
if (!strncmp(argv[0], "--", 2))
argv[0] += 2;
} else {
/* Default command: "help" */
argv[0] = "help";
argc = 1;
}
argv[0] = cmd;
cmd = argv[0];

/*
* We search for git commands in the following order:
Expand Down

0 comments on commit 205be1e

Please sign in to comment.