From: Linus Torvalds <torvalds@linux-foundation.org>
To: Jeff King <peff@peff.net>
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Pierre Habouzit <madcoder@debian.org>,
Git Mailing List <git@vger.kernel.org>,
Junio C Hamano <gitster@pobox.com>
Subject: Re: [RFC] Re: Convert 'git blame' to parse_options()
Date: Mon, 23 Jun 2008 12:16:17 -0700 (PDT) [thread overview]
Message-ID: <alpine.LFD.1.10.0806231158340.2926@woody.linux-foundation.org> (raw)
In-Reply-To: <alpine.LFD.1.10.0806231137070.2926@woody.linux-foundation.org>
On Mon, 23 Jun 2008, Linus Torvalds wrote:
>
> Or are we going to sit around discussing this for another five months?
So the gauntlet is thrown.
This is the trivial version that (on top of my original patch in this
thread) makes
git blame --since=April -b Makefile
work.
Does it handle all cases? No. In particular, because it still makes
builtin-blame.c use PARSE_OPT_STOP_AT_NON_OPTION, and because cmd_blame.c
simply doesn't do the sane thing (it took me more than five minutes just
because I tried to make it do the same thing and not do any argument
parsing at all, but I just gave up), you still cannot pass it things like
--default HEAD
because it will stop at HEAD, and then do the exact wrong thing.
Could it be improved? I'm sure. And I didn't test it much at all. I also
didn't change any existing users that could possibly use the new
PARSE_OPT_STOP_AT_UNKNOWN thing. So this patch is an example patch only,
to show what I'm talking about when I say "simple".
Linus
---
builtin-blame.c | 2 +-
parse-options.c | 26 ++++++++++++++++++++++----
parse-options.h | 2 ++
3 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/builtin-blame.c b/builtin-blame.c
index f04bd93..059062c 100644
--- a/builtin-blame.c
+++ b/builtin-blame.c
@@ -2195,7 +2195,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
cmd_is_annotate = !strcmp(argv[0], "annotate");
argc = parse_options(argc, argv, options, blame_opt_usage,
- PARSE_OPT_STOP_AT_NON_OPTION | PARSE_OPT_KEEP_DASHDASH);
+ PARSE_OPT_STOP_AT_NON_OPTION | PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN);
/*
* parse_options() offsets things by one - undo for now to make
diff --git a/parse-options.c b/parse-options.c
index acf3fe3..5b4653f 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -7,7 +7,7 @@
struct optparse_t {
const char **argv;
const char **out;
- int argc, cpidx;
+ int argc, cpidx, flags;
const char *opt;
};
@@ -139,6 +139,8 @@ static int parse_short_opt(struct optparse_t *p, const struct option *options)
return get_value(p, options, OPT_SHORT);
}
}
+ if (p->flags & (PARSE_OPT_STOP_AT_UNKNOWN | PARSE_OPT_KEEP_UNKNOWN))
+ return -1;
return error("unknown switch `%c'", *p->opt);
}
@@ -224,6 +226,8 @@ is_abbreviated:
abbrev_option->long_name);
if (abbrev_option)
return get_value(p, abbrev_option, abbrev_flags);
+ if (p->flags & (PARSE_OPT_STOP_AT_UNKNOWN | PARSE_OPT_KEEP_UNKNOWN))
+ return -1;
return error("unknown option `%s'", arg);
}
@@ -253,7 +257,7 @@ static NORETURN void usage_with_options_internal(const char * const *,
int parse_options(int argc, const char **argv, const struct option *options,
const char * const usagestr[], int flags)
{
- struct optparse_t args = { argv + 1, argv, argc - 1, 0, NULL };
+ struct optparse_t args = { argv + 1, argv, argc - 1, 0, flags, NULL };
for (; args.argc; args.argc--, args.argv++) {
const char *arg = args.argv[0];
@@ -269,8 +273,15 @@ int parse_options(int argc, const char **argv, const struct option *options,
args.opt = arg + 1;
if (*args.opt == 'h')
usage_with_options(usagestr, options);
- if (parse_short_opt(&args, options) < 0)
+ if (parse_short_opt(&args, options) < 0) {
+ if (flags & PARSE_OPT_STOP_AT_UNKNOWN)
+ break;
+ if (flags & PARSE_OPT_KEEP_UNKNOWN) {
+ args.out[args.cpidx++] = args.argv[0];
+ continue;
+ }
usage_with_options(usagestr, options);
+ }
if (args.opt)
check_typos(arg + 1, options);
while (args.opt) {
@@ -294,8 +305,15 @@ int parse_options(int argc, const char **argv, const struct option *options,
usage_with_options_internal(usagestr, options, 1);
if (!strcmp(arg + 2, "help"))
usage_with_options(usagestr, options);
- if (parse_long_opt(&args, arg + 2, options))
+ if (parse_long_opt(&args, arg + 2, options)) {
+ if (flags & PARSE_OPT_STOP_AT_UNKNOWN)
+ break;
+ if (flags & PARSE_OPT_KEEP_UNKNOWN) {
+ args.out[args.cpidx++] = args.argv[0];
+ continue;
+ }
usage_with_options(usagestr, options);
+ }
}
memmove(args.out + args.cpidx, args.argv, args.argc * sizeof(*args.out));
diff --git a/parse-options.h b/parse-options.h
index 4ee443d..a98f0ec 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -20,6 +20,8 @@ enum parse_opt_type {
enum parse_opt_flags {
PARSE_OPT_KEEP_DASHDASH = 1,
PARSE_OPT_STOP_AT_NON_OPTION = 2,
+ PARSE_OPT_KEEP_UNKNOWN = 4,
+ PARSE_OPT_STOP_AT_UNKNOWN = 8,
};
enum parse_opt_option_flags {
next prev parent reply other threads:[~2008-06-23 19:17 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-23 5:15 Convert 'git blame' to parse_options() Linus Torvalds
2008-06-23 6:35 ` Junio C Hamano
2008-06-23 12:28 ` Johannes Schindelin
2008-06-23 8:22 ` [RFC] " Pierre Habouzit
2008-06-23 12:26 ` Johannes Schindelin
2008-06-23 15:53 ` Pierre Habouzit
2008-06-23 16:25 ` Johannes Schindelin
2008-06-23 16:25 ` Linus Torvalds
2008-06-23 16:49 ` Jeff King
2008-06-23 17:06 ` Linus Torvalds
2008-06-23 17:15 ` Jeff King
2008-06-23 17:32 ` Linus Torvalds
2008-06-23 18:15 ` Jeff King
2008-06-23 18:36 ` Linus Torvalds
2008-06-23 18:20 ` Linus Torvalds
2008-06-23 18:33 ` Jeff King
2008-06-23 18:47 ` Linus Torvalds
2008-06-23 19:16 ` Linus Torvalds [this message]
2008-06-23 21:09 ` Pierre Habouzit
2008-06-23 21:11 ` [PATCH] parse-opt: have parse_options_{start,end} Pierre Habouzit
2008-06-23 21:11 ` [PATCH] parse-opt: Export a non NORETURN usage dumper Pierre Habouzit
2008-06-23 21:11 ` [PATCH] parse-opt: create parse_options_step Pierre Habouzit
2008-06-23 21:11 ` [PATCH] parse-opt: do not pring errors on unknown options, return -2 intead Pierre Habouzit
2008-06-23 21:11 ` [PATCH] parse-opt: fake short strings for callers to believe in Pierre Habouzit
2008-06-23 22:08 ` [PATCH] parse-opt: do not pring errors on unknown options, return -2 intead Junio C Hamano
2008-06-23 22:13 ` Pierre Habouzit
2008-06-23 21:23 ` [RFC] Re: Convert 'git blame' to parse_options() Pierre Habouzit
2008-06-23 21:23 ` Junio C Hamano
2008-06-23 21:28 ` Pierre Habouzit
2008-06-23 21:26 ` Linus Torvalds
2008-06-23 21:41 ` Linus Torvalds
2008-06-23 21:47 ` Pierre Habouzit
2008-06-23 22:11 ` Junio C Hamano
2008-06-23 22:24 ` Pierre Habouzit
2008-06-23 22:36 ` Pierre Habouzit
2008-06-23 22:38 ` Junio C Hamano
2008-06-23 23:31 ` Pierre Habouzit
2008-06-23 23:40 ` Linus Torvalds
2008-06-23 23:51 ` Junio C Hamano
2008-06-24 7:50 ` Pierre Habouzit
2008-06-24 1:27 ` Jeff King
2008-06-23 19:53 ` Jeff King
2008-06-23 20:04 ` Pierre Habouzit
2008-06-23 20:12 ` Linus Torvalds
2008-06-24 5:35 ` Jeff King
2008-06-24 16:59 ` Linus Torvalds
2008-06-24 17:13 ` Johannes Schindelin
2008-06-24 17:34 ` Jeff King
2008-06-24 17:44 ` Linus Torvalds
2008-06-24 19:46 ` Jeff King
2008-06-24 0:30 ` Junio C Hamano
2008-06-24 8:24 ` Pierre Habouzit
2008-06-24 17:05 ` Linus Torvalds
2008-06-24 19:30 ` Pierre Habouzit
2008-06-24 19:43 ` Pierre Habouzit
2008-06-25 6:09 ` Johannes Sixt
2008-06-23 17:04 ` Johannes Schindelin
2008-06-23 17:21 ` Linus Torvalds
2008-06-23 18:39 ` Johannes Schindelin
2008-06-23 17:26 ` Jeff King
2008-06-23 18:41 ` Johannes Schindelin
2008-06-23 19:24 ` Pierre Habouzit
2008-06-23 16:11 ` Linus Torvalds
2008-06-24 9:12 ` Making parse-opt incremental, reworked series Pierre Habouzit
2008-06-24 9:12 ` [PATCH 1/7] parse-opt: have parse_options_{start,end} Pierre Habouzit
2008-06-24 9:12 ` [PATCH 2/7] parse-opt: Export a non NORETURN usage dumper Pierre Habouzit
2008-06-24 9:12 ` [PATCH 3/7] parse-opt: create parse_options_step Pierre Habouzit
2008-06-24 9:12 ` [PATCH 4/7] parse-opt: do not pring errors on unknown options, return -2 intead Pierre Habouzit
2008-06-24 9:12 ` [PATCH 5/7] parse-opt: fake short strings for callers to believe in Pierre Habouzit
2008-06-24 9:12 ` [PATCH 6/7] parse-opt: add PARSE_OPT_KEEP_ARGV0 parser option Pierre Habouzit
2008-06-24 9:12 ` [PATCH 7/7] Migrate git-blame to parse-option partially Pierre Habouzit
2008-06-24 10:03 ` [PATCH 6/7] parse-opt: add PARSE_OPT_KEEP_ARGV0 parser option Pierre Habouzit
2008-06-24 17:18 ` Linus Torvalds
2008-06-24 19:27 ` Pierre Habouzit
2008-06-24 20:55 ` Pierre Habouzit
2008-06-24 17:20 ` [PATCH 5/7] parse-opt: fake short strings for callers to believe in Linus Torvalds
2008-06-24 19:26 ` Pierre Habouzit
2008-06-25 15:07 ` Andreas Ericsson
2008-06-24 20:58 ` [REPLACEMENT PATCH] " Pierre Habouzit
2008-06-26 8:35 ` Pierre Habouzit
2008-06-26 8:40 ` Junio C Hamano
2008-06-26 9:37 ` Pierre Habouzit
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=alpine.LFD.1.10.0806231158340.2926@woody.linux-foundation.org \
--to=torvalds@linux-foundation.org \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=madcoder@debian.org \
--cc=peff@peff.net \
/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).