On Thu, 28 Sep 2006, Junio C Hamano wrote:
Linus Torvalds [off-list ref] writes:
quoted
So how about just extending the existing "--stat" thing, and just making
it do something like
git diff --stat=72,30
instead (perhaps along with a config option to set the defaults to
something else if we want to).
What do you think?
I am all for it.
Here. Something like this.
You should probably check the "width" and "name_width" values for sanity.
The old code didn't, so I didn't do it, but this actually does check that
the number was a real number (and didn't have crap after it). And it's
easy to check the values, since all cases go through the same point.
I could have made it a more obvious "stupid" parser, I just think it's
better to do it this way.
Linus
----
diff --git a/diff.c b/diff.c
index 98c29bf..8546dde 100644
--- a/diff.c
+++ b/diff.c
@@ -1825,15 +1825,33 @@ int diff_opt_parse(struct diff_options *
else if (!strcmp(arg, "--patch-with-raw")) {
options->output_format |= DIFF_FORMAT_PATCH | DIFF_FORMAT_RAW;
}
- else if (!strcmp(arg, "--stat"))
- options->output_format |= DIFF_FORMAT_DIFFSTAT;
- else if (!strncmp(arg, "--stat-width=", 13)) {
- options->stat_width = strtoul(arg + 13, NULL, 10);
- options->output_format |= DIFF_FORMAT_DIFFSTAT;
- }
- else if (!strncmp(arg, "--stat-name-width=", 18)) {
- options->stat_name_width = strtoul(arg + 18, NULL, 10);
+ else if (!strncmp(arg, "--stat", 6)) {
+ char *end;
+ int width = options->stat_width;
+ int name_width = options->stat_name_width;
+ arg += 6;
+ end = arg;
+
+ switch (*arg) {
+ case '-':
+ if (!strncmp(arg, "-width=", 7))
+ width = strtoul(arg + 7, &end, 10);
+ else if (!strncmp(arg, "-name-width=", 12))
+ name_width = strtoul(arg + 12, &end, 10);
+ break;
+
+ case '=':
+ width = strtoul(arg+1, &end, 10);
+ if (*end == ',')
+ name_width = strtoul(end+1, &end, 10);
+ }
+
+ /* Important! This checks all the error cases! */
+ if (*end)
+ return 0;
options->output_format |= DIFF_FORMAT_DIFFSTAT;
+ options->stat_name_width = name_width;
+ options->stat_width = width;
}
else if (!strcmp(arg, "--check"))
options->output_format |= DIFF_FORMAT_CHECKDIFF;