From: Greg Brockman <gdb@MIT.EDU>
To: git@vger.kernel.org, gitster@pobox.com
Cc: Greg Brockman <gdb@mit.edu>
Subject: [PATCH/RFC] split_cmdline: Allow caller to access error string
Date: Sat, 7 Aug 2010 01:13:39 -0400 [thread overview]
Message-ID: <1281158019-25995-1-git-send-email-gdb@mit.edu> (raw)
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>
---
For reference, this functionality was suggested by Junio in
http://article.gmane.org/gmane.comp.version-control.git/151330/. If
we decide to go this route, the git-shell patches currently in pu should
be patched to use split_cmdline_strerror.
Thanks in advance for whatever comments you have on this implementation.
alias.c | 11 ++++++++---
builtin/merge.c | 3 ++-
cache.h | 2 ++
git.c | 3 ++-
4 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/alias.c b/alias.c
index 372b7d8..6f771cb 100644
--- a/alias.c
+++ b/alias.c
@@ -1,7 +1,9 @@
#include "cache.h"
-
static const char *alias_key;
static char *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" };
static int alias_lookup_cb(const char *k, const char *v, void *cb)
{
@@ -53,7 +55,7 @@ int split_cmdline(char *cmdline, const char ***argv)
if (!c) {
free(*argv);
*argv = NULL;
- return error("cmdline ends with \\");
+ return -SPLIT_CMDLINE_BAD_ENDING;
}
}
cmdline[dst++] = c;
@@ -66,7 +68,7 @@ int split_cmdline(char *cmdline, const char ***argv)
if (quoted) {
free(*argv);
*argv = NULL;
- return error("unclosed quote");
+ return -SPLIT_CMDLINE_UNCLOSED_QUOTE;
}
ALLOC_GROW(*argv, count+1, size);
@@ -75,3 +77,6 @@ int split_cmdline(char *cmdline, const char ***argv)
return count;
}
+const char *split_cmdline_strerror(int split_cmdline_errno) {
+ return split_cmdline_errors[-split_cmdline_errno-1];
+}
diff --git a/builtin/merge.c b/builtin/merge.c
index 37ce4f5..b488263 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -486,7 +486,8 @@ static int git_merge_config(const char *k, const char *v, void *cb)
buf = xstrdup(v);
argc = split_cmdline(buf, &argv);
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));
memmove(argv + 1, argv, sizeof(*argv) * (argc + 1));
argc++;
diff --git a/cache.h b/cache.h
index c9fa3df..7466ad0 100644
--- a/cache.h
+++ b/cache.h
@@ -1096,6 +1096,8 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix);
char *alias_lookup(const char *alias);
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 */
int checkout_fast_forward(const unsigned char *from, const unsigned char *to);
diff --git a/git.c b/git.c
index f37028b..6fc07a5 100644
--- a/git.c
+++ b/git.c
@@ -188,7 +188,8 @@ static int handle_alias(int *argcp, const char ***argv)
}
count = split_cmdline(alias_string, &new_argv);
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);
if (envchanged)
die("alias '%s' changes environment variables\n"
--
1.7.0.4
next reply other threads:[~2010-08-07 5:14 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-07 5:13 Greg Brockman [this message]
2010-08-11 18:31 ` [PATCH/RFC] split_cmdline: Allow caller to access error string Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1281158019-25995-1-git-send-email-gdb@mit.edu \
--to=gdb@mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).