Skip to content

Commit ad9ac6d

Browse files
Greg Brockmangitster
authored andcommitted
split_cmdline: Allow caller to access error string
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 64fdc08 commit ad9ac6d

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

alias.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ char *alias_lookup(const char *alias)
2222
return alias_val;
2323
}
2424

25+
#define SPLIT_CMDLINE_BAD_ENDING 1
26+
#define SPLIT_CMDLINE_UNCLOSED_QUOTE 2
27+
static const char *split_cmdline_errors[] = {
28+
"cmdline ends with \\",
29+
"unclosed quote"
30+
};
31+
2532
int split_cmdline(char *cmdline, const char ***argv)
2633
{
2734
int src, dst, count = 0, size = 16;
@@ -53,7 +60,7 @@ int split_cmdline(char *cmdline, const char ***argv)
5360
if (!c) {
5461
free(*argv);
5562
*argv = NULL;
56-
return error("cmdline ends with \\");
63+
return -SPLIT_CMDLINE_BAD_ENDING;
5764
}
5865
}
5966
cmdline[dst++] = c;
@@ -66,7 +73,7 @@ int split_cmdline(char *cmdline, const char ***argv)
6673
if (quoted) {
6774
free(*argv);
6875
*argv = NULL;
69-
return error("unclosed quote");
76+
return -SPLIT_CMDLINE_UNCLOSED_QUOTE;
7077
}
7178

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

85+
const char *split_cmdline_strerror(int split_cmdline_errno) {
86+
return split_cmdline_errors[-split_cmdline_errno-1];
87+
}

builtin/merge.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,8 @@ static int git_merge_config(const char *k, const char *v, void *cb)
486486
buf = xstrdup(v);
487487
argc = split_cmdline(buf, &argv);
488488
if (argc < 0)
489-
die("Bad branch.%s.mergeoptions string", branch);
489+
die("Bad branch.%s.mergeoptions string: %s", branch,
490+
split_cmdline_strerror(argc));
490491
argv = xrealloc(argv, sizeof(*argv) * (argc + 2));
491492
memmove(argv + 1, argv, sizeof(*argv) * (argc + 1));
492493
argc++;

cache.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,8 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix);
10961096

10971097
char *alias_lookup(const char *alias);
10981098
int split_cmdline(char *cmdline, const char ***argv);
1099+
/* Takes a negative value returned by split_cmdline */
1100+
const char *split_cmdline_strerror(int cmdline_errno);
10991101

11001102
/* builtin/merge.c */
11011103
int checkout_fast_forward(const unsigned char *from, const unsigned char *to);

git.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ static int handle_alias(int *argcp, const char ***argv)
188188
}
189189
count = split_cmdline(alias_string, &new_argv);
190190
if (count < 0)
191-
die("Bad alias.%s string", alias_command);
191+
die("Bad alias.%s string: %s", alias_command,
192+
split_cmdline_strerror(count));
192193
option_count = handle_options(&new_argv, &count, &envchanged);
193194
if (envchanged)
194195
die("alias '%s' changes environment variables\n"

0 commit comments

Comments
 (0)