Skip to content

Commit

Permalink
Clean up internal command handling
Browse files Browse the repository at this point in the history
This should change no code at all, it just moves the definition of "struct
cmd_struct" out, and then splits out the running of the right command into
the "run_command()" function.

It also removes the long-unused 'envp' pointer passing.

This is just preparation for adding some more error checking.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed Jun 25, 2007
1 parent aeb5932 commit 47d0b4f
Showing 1 changed file with 30 additions and 22 deletions.
52 changes: 30 additions & 22 deletions git.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,14 +216,34 @@ const char git_version_string[] = GIT_VERSION;
*/
#define NOT_BARE (1<<2)

static void handle_internal_command(int argc, const char **argv, char **envp)
struct cmd_struct {
const char *cmd;
int (*fn)(int, const char **, const char *);
int option;
};

static int run_command(struct cmd_struct *p, int argc, const char **argv)
{
const char *prefix;

prefix = NULL;
if (p->option & RUN_SETUP)
prefix = setup_git_directory();
if (p->option & USE_PAGER)
setup_pager();
if (p->option & NOT_BARE) {
if (is_bare_repository() || is_inside_git_dir())
die("%s must be run in a work tree", p->cmd);
}
trace_argv_printf(argv, argc, "trace: built-in: git");

return p->fn(argc, argv, prefix);
}

static void handle_internal_command(int argc, const char **argv)
{
const char *cmd = argv[0];
static struct cmd_struct {
const char *cmd;
int (*fn)(int, const char **, const char *);
int option;
} commands[] = {
static struct cmd_struct commands[] = {
{ "add", cmd_add, RUN_SETUP | NOT_BARE },
{ "annotate", cmd_annotate, RUN_SETUP | USE_PAGER },
{ "apply", cmd_apply },
Expand Down Expand Up @@ -307,25 +327,13 @@ static void handle_internal_command(int argc, const char **argv, char **envp)

for (i = 0; i < ARRAY_SIZE(commands); i++) {
struct cmd_struct *p = commands+i;
const char *prefix;
if (strcmp(p->cmd, cmd))
continue;

prefix = NULL;
if (p->option & RUN_SETUP)
prefix = setup_git_directory();
if (p->option & USE_PAGER)
setup_pager();
if ((p->option & NOT_BARE) &&
(is_bare_repository() || is_inside_git_dir()))
die("%s must be run in a work tree", cmd);
trace_argv_printf(argv, argc, "trace: built-in: git");

exit(p->fn(argc, argv, prefix));
exit(run_command(p, argc, argv));
}
}

int main(int argc, const char **argv, char **envp)
int main(int argc, const char **argv)
{
const char *cmd = argv[0] ? argv[0] : "git-help";
char *slash = strrchr(cmd, '/');
Expand Down Expand Up @@ -358,7 +366,7 @@ int main(int argc, const char **argv, char **envp)
if (!prefixcmp(cmd, "git-")) {
cmd += 4;
argv[0] = cmd;
handle_internal_command(argc, argv, envp);
handle_internal_command(argc, argv);
die("cannot handle %s internally", cmd);
}

Expand Down Expand Up @@ -390,7 +398,7 @@ int main(int argc, const char **argv, char **envp)

while (1) {
/* See if it's an internal command */
handle_internal_command(argc, argv, envp);
handle_internal_command(argc, argv);

/* .. then try the external ones */
execv_git_cmd(argv);
Expand Down

0 comments on commit 47d0b4f

Please sign in to comment.