Skip to content

Commit

Permalink
split_cmdline: Allow caller to access error string
Browse files Browse the repository at this point in the history
This allows the caller to add its own error message to that returned
by split_cmdline.  Thus error output following a failed split_cmdline
can be of the form

fatal: Bad alias.test string: cmdline ends with \

rather than

error: cmdline ends with \
fatal: Bad alias.test string

Signed-off-by: Greg Brockman <gdb@mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Greg Brockman authored and gitster committed Aug 11, 2010
1 parent 64fdc08 commit ad9ac6d
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 4 deletions.
14 changes: 12 additions & 2 deletions alias.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ char *alias_lookup(const char *alias)
return alias_val; return alias_val;
} }


#define SPLIT_CMDLINE_BAD_ENDING 1
#define SPLIT_CMDLINE_UNCLOSED_QUOTE 2
static const char *split_cmdline_errors[] = {
"cmdline ends with \\",
"unclosed quote"
};

int split_cmdline(char *cmdline, const char ***argv) int split_cmdline(char *cmdline, const char ***argv)
{ {
int src, dst, count = 0, size = 16; int src, dst, count = 0, size = 16;
Expand Down Expand Up @@ -53,7 +60,7 @@ int split_cmdline(char *cmdline, const char ***argv)
if (!c) { if (!c) {
free(*argv); free(*argv);
*argv = NULL; *argv = NULL;
return error("cmdline ends with \\"); return -SPLIT_CMDLINE_BAD_ENDING;
} }
} }
cmdline[dst++] = c; cmdline[dst++] = c;
Expand All @@ -66,7 +73,7 @@ int split_cmdline(char *cmdline, const char ***argv)
if (quoted) { if (quoted) {
free(*argv); free(*argv);
*argv = NULL; *argv = NULL;
return error("unclosed quote"); return -SPLIT_CMDLINE_UNCLOSED_QUOTE;
} }


ALLOC_GROW(*argv, count+1, size); ALLOC_GROW(*argv, count+1, size);
Expand All @@ -75,3 +82,6 @@ int split_cmdline(char *cmdline, const char ***argv)
return count; return count;
} }


const char *split_cmdline_strerror(int split_cmdline_errno) {
return split_cmdline_errors[-split_cmdline_errno-1];
}
3 changes: 2 additions & 1 deletion builtin/merge.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -486,7 +486,8 @@ static int git_merge_config(const char *k, const char *v, void *cb)
buf = xstrdup(v); buf = xstrdup(v);
argc = split_cmdline(buf, &argv); argc = split_cmdline(buf, &argv);
if (argc < 0) if (argc < 0)
die("Bad branch.%s.mergeoptions string", branch); die("Bad branch.%s.mergeoptions string: %s", branch,
split_cmdline_strerror(argc));
argv = xrealloc(argv, sizeof(*argv) * (argc + 2)); argv = xrealloc(argv, sizeof(*argv) * (argc + 2));
memmove(argv + 1, argv, sizeof(*argv) * (argc + 1)); memmove(argv + 1, argv, sizeof(*argv) * (argc + 1));
argc++; argc++;
Expand Down
2 changes: 2 additions & 0 deletions cache.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1096,6 +1096,8 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix);


char *alias_lookup(const char *alias); char *alias_lookup(const char *alias);
int split_cmdline(char *cmdline, const char ***argv); int split_cmdline(char *cmdline, const char ***argv);
/* Takes a negative value returned by split_cmdline */
const char *split_cmdline_strerror(int cmdline_errno);


/* builtin/merge.c */ /* builtin/merge.c */
int checkout_fast_forward(const unsigned char *from, const unsigned char *to); int checkout_fast_forward(const unsigned char *from, const unsigned char *to);
Expand Down
3 changes: 2 additions & 1 deletion git.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -188,7 +188,8 @@ static int handle_alias(int *argcp, const char ***argv)
} }
count = split_cmdline(alias_string, &new_argv); count = split_cmdline(alias_string, &new_argv);
if (count < 0) if (count < 0)
die("Bad alias.%s string", alias_command); die("Bad alias.%s string: %s", alias_command,
split_cmdline_strerror(count));
option_count = handle_options(&new_argv, &count, &envchanged); option_count = handle_options(&new_argv, &count, &envchanged);
if (envchanged) if (envchanged)
die("alias '%s' changes environment variables\n" die("alias '%s' changes environment variables\n"
Expand Down

0 comments on commit ad9ac6d

Please sign in to comment.