From: Jeff King <peff@peff.net>
To: Pierre Habouzit <madcoder@debian.org>
Cc: git@vger.kernel.org
Subject: [RFH] convert shortlog to use parse_options
Date: Thu, 13 Dec 2007 00:52:26 -0500 [thread overview]
Message-ID: <20071213055226.GA3636@coredump.intra.peff.net> (raw)
Pierre,
I am converting shortlog to use parse_options, but I have hit a behavior
I can't seem to represent.
The "-w" option has an optional argument, and we used to accept only
"-w" or "-wX,Y,Z". However, parse_options allows "-w X,Y,Z".
This means that "-w HEAD" used to mean "turn on wrapping
with default parameters, look at HEAD" and now translates to
"-w with parameter HEAD".
Is there a way to do this currently, or can we add an option flag?
---
builtin-shortlog.c | 111 +++++++++++++++++++++++++++++-----------------------
1 files changed, 62 insertions(+), 49 deletions(-)
diff --git a/builtin-shortlog.c b/builtin-shortlog.c
index 3d8d709..37fdb45 100644
--- a/builtin-shortlog.c
+++ b/builtin-shortlog.c
@@ -6,9 +6,12 @@
#include "revision.h"
#include "utf8.h"
#include "mailmap.h"
+#include "parse-options.h"
-static const char shortlog_usage[] =
-"git-shortlog [-n] [-s] [<commit-id>... ]";
+static const char * const shortlog_usage[] = {
+ "git-shortlog [-n] [-s] [-e] [<commit-id>... ]",
+ NULL
+};
static char *common_repo_prefix;
static int email;
@@ -181,34 +184,45 @@ static int parse_uint(char const **arg, int comma)
}
static const char wrap_arg_usage[] = "-w[<width>[,<indent1>[,<indent2>]]]";
+struct wrap_arg {
+ int enabled;
+ int len;
+ int in1;
+ int in2;
+};
#define DEFAULT_WRAPLEN 76
#define DEFAULT_INDENT1 6
#define DEFAULT_INDENT2 9
-static void parse_wrap_args(const char *arg, int *in1, int *in2, int *wrap)
+static int parse_wrap(const struct option *opt, const char *arg, int unset)
{
- arg += 2; /* skip -w */
+ struct wrap_arg *wrap = opt->value;
- *wrap = parse_uint(&arg, ',');
- if (*wrap < 0)
+ wrap->enabled = 1;
+
+ if (!arg)
+ return 0;
+ wrap->len = parse_uint(&arg, ',');
+ if (wrap->len < 0)
die(wrap_arg_usage);
- *in1 = parse_uint(&arg, ',');
- if (*in1 < 0)
+ wrap->in1 = parse_uint(&arg, ',');
+ if (wrap->in1 < 0)
die(wrap_arg_usage);
- *in2 = parse_uint(&arg, '\0');
- if (*in2 < 0)
+ wrap->in2 = parse_uint(&arg, '\0');
+ if (wrap->in2 < 0)
die(wrap_arg_usage);
- if (!*wrap)
- *wrap = DEFAULT_WRAPLEN;
- if (!*in1)
- *in1 = DEFAULT_INDENT1;
- if (!*in2)
- *in2 = DEFAULT_INDENT2;
- if (*wrap &&
- ((*in1 && *wrap <= *in1) ||
- (*in2 && *wrap <= *in2)))
+ if (!wrap->len)
+ wrap->len = DEFAULT_WRAPLEN;
+ if (!wrap->in1)
+ wrap->in1 = DEFAULT_INDENT1;
+ if (!wrap->in2)
+ wrap->in2 = DEFAULT_INDENT2;
+ if (wrap->len &&
+ ((wrap->in1 && wrap->len <= wrap->in1) ||
+ (wrap->in2 && wrap->len <= wrap->in2)))
die(wrap_arg_usage);
+ return 0;
}
int cmd_shortlog(int argc, const char **argv, const char *prefix)
@@ -216,34 +230,31 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)
struct rev_info rev;
struct path_list list = { NULL, 0, 0, 1 };
int i, j, sort_by_number = 0, summary = 0;
- int wrap_lines = 0;
- int wrap = DEFAULT_WRAPLEN;
- int in1 = DEFAULT_INDENT1;
- int in2 = DEFAULT_INDENT2;
-
- /* since -n is a shadowed rev argument, parse our args first */
- while (argc > 1) {
- if (!strcmp(argv[1], "-n") || !strcmp(argv[1], "--numbered"))
- sort_by_number = 1;
- else if (!strcmp(argv[1], "-s") ||
- !strcmp(argv[1], "--summary"))
- summary = 1;
- else if (!strcmp(argv[1], "-e") ||
- !strcmp(argv[1], "--email"))
- email = 1;
- else if (!prefixcmp(argv[1], "-w")) {
- wrap_lines = 1;
- parse_wrap_args(argv[1], &in1, &in2, &wrap);
- }
- else if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
- usage(shortlog_usage);
- else
- break;
- argv++;
- argc--;
- }
+ struct wrap_arg wrap = {
+ 0,
+ DEFAULT_WRAPLEN,
+ DEFAULT_INDENT1,
+ DEFAULT_INDENT2
+ };
+ struct option options[] = {
+ OPT_BOOLEAN('n', "numbered", &sort_by_number, "sort by number"),
+ OPT_BOOLEAN('s', "summary", &summary,
+ "show commit count summary"),
+ OPT_BOOLEAN('e', "email", &email, "show email addresses"),
+ {
+ OPTION_CALLBACK, 'w', NULL, &wrap, "wrap",
+ "line-wrap commit message", PARSE_OPT_OPTARG,
+ parse_wrap
+ },
+ };
+
+ argc = parse_options(argc, argv, options, shortlog_usage, 0);
+
init_revisions(&rev, prefix);
- argc = setup_revisions(argc, argv, &rev, NULL);
+ /* setup_revisions expects to have the program name in argv[0],
+ * but parse_options has removed it. We have to do parse_options
+ * before setup_revisions, though, to claim "-n". */
+ argc = setup_revisions(argc+1, argv-1, &rev, NULL);
if (argc > 1)
die ("unrecognized argument: %s", argv[1]);
@@ -272,9 +283,11 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)
for (j = onelines->nr - 1; j >= 0; j--) {
const char *msg = onelines->items[j].path;
- if (wrap_lines) {
- int col = print_wrapped_text(msg, in1, in2, wrap);
- if (col != wrap)
+ if (wrap.enabled) {
+ int col = print_wrapped_text(msg,
+ wrap.in1, wrap.in2,
+ wrap.len);
+ if (col != wrap.len)
putchar('\n');
}
else
--
1.5.4.rc0.1088.gfa79c-dirty
next reply other threads:[~2007-12-13 5:52 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-13 5:52 Jeff King [this message]
2007-12-13 9:06 ` [RFH] convert shortlog to use parse_options Pierre Habouzit
2007-12-13 9:10 ` Jeff King
2007-12-13 9:35 ` Pierre Habouzit
2007-12-13 10:26 ` [PATCH 1/2] parseopt: Enforce the use of the sticked form for optional arguments Pierre Habouzit
2007-12-13 10:27 ` [PATCH 2/2] parseopt: Add a gitcli(5) man page Pierre Habouzit
2007-12-13 11:04 ` Wincent Colaiuta
2007-12-13 13:56 ` Pierre Habouzit
2007-12-17 7:28 ` [PATCH] (squashme) gitcli documentation fixups Junio C Hamano
2007-12-17 8:51 ` Pierre Habouzit
2007-12-17 8:57 ` Pierre Habouzit
2007-12-17 7:28 ` [PATCH] builtin-tag: fix fallouts from recent parsopt restriction Junio C Hamano
2007-12-17 9:07 ` Pierre Habouzit
2007-12-17 10:53 ` Junio C Hamano
2007-12-17 10:58 ` Pierre Habouzit
2007-12-17 11:21 ` Junio C Hamano
2007-12-17 12:33 ` Pierre Habouzit
2007-12-17 19:52 ` Junio C Hamano
2007-12-17 20:31 ` Jeff King
2007-12-17 20:42 ` Pierre Habouzit
2007-12-17 21:01 ` Pierre Habouzit
2007-12-17 23:07 ` Jeff King
2007-12-17 23:14 ` Pierre Habouzit
2007-12-17 20:42 ` Junio C Hamano
2007-12-17 20:53 ` Jeff King
2007-12-17 21:24 ` Pierre Habouzit
2007-12-17 21:11 ` Pierre Habouzit
2007-12-17 11:13 ` Junio C Hamano
2007-12-17 11:56 ` Pierre Habouzit
2007-12-17 11:59 ` Pierre Habouzit
2007-12-13 17:40 ` [RFH] convert shortlog to use parse_options Junio C Hamano
2007-12-13 18:03 ` Pierre Habouzit
2007-12-13 18:07 ` Pierre Habouzit
2007-12-13 19:49 ` Junio C Hamano
2007-12-13 18:28 ` Kristian Høgsberg
2007-12-13 18:47 ` Kristian Høgsberg
2007-12-13 20:46 ` Junio C Hamano
2007-12-14 4:08 ` Jeff King
2007-12-14 5:59 ` Junio C Hamano
2007-12-14 8:33 ` Andreas Ericsson
2007-12-14 8:39 ` Pierre Habouzit
2007-12-14 20:34 ` Junio C Hamano
2007-12-15 11:03 ` Pierre Habouzit
2007-12-17 7:27 ` Junio C Hamano
2007-12-17 7:36 ` Andreas Ericsson
2007-12-17 7:59 ` Junio C Hamano
2007-12-17 9:38 ` Andreas Ericsson
2007-12-17 16:21 ` Kristian Høgsberg
2007-12-13 19:31 ` Junio C Hamano
2007-12-13 20:53 ` Pierre Habouzit
2007-12-13 9:29 ` 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=20071213055226.GA3636@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=madcoder@debian.org \
/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).