log: parse separate options like git log --grep foo

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Matthieu Moy 2010-08-05 10:22:55 +02:00 committed by Junio C Hamano
parent 1e57208ef0
commit 7d7b86f75f
2 changed files with 53 additions and 28 deletions

View File

@ -1148,6 +1148,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
int *unkc, const char **unkv) int *unkc, const char **unkv)
{ {
const char *arg = argv[0]; const char *arg = argv[0];
const char *optarg;
int argcount;
/* pseudo revision arguments */ /* pseudo revision arguments */
if (!strcmp(arg, "--all") || !strcmp(arg, "--branches") || if (!strcmp(arg, "--all") || !strcmp(arg, "--branches") ||
@ -1160,11 +1162,13 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
return 1; return 1;
} }
if (!prefixcmp(arg, "--max-count=")) { if ((argcount = parse_long_opt("max-count", argv, &optarg))) {
revs->max_count = atoi(arg + 12); revs->max_count = atoi(optarg);
revs->no_walk = 0; revs->no_walk = 0;
} else if (!prefixcmp(arg, "--skip=")) { return argcount;
revs->skip_count = atoi(arg + 7); } else if ((argcount = parse_long_opt("skip", argv, &optarg))) {
revs->skip_count = atoi(optarg);
return argcount;
} else if ((*arg == '-') && isdigit(arg[1])) { } else if ((*arg == '-') && isdigit(arg[1])) {
/* accept -<digit>, like traditional "head" */ /* accept -<digit>, like traditional "head" */
revs->max_count = atoi(arg + 1); revs->max_count = atoi(arg + 1);
@ -1178,18 +1182,24 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
} else if (!prefixcmp(arg, "-n")) { } else if (!prefixcmp(arg, "-n")) {
revs->max_count = atoi(arg + 2); revs->max_count = atoi(arg + 2);
revs->no_walk = 0; revs->no_walk = 0;
} else if (!prefixcmp(arg, "--max-age=")) { } else if ((argcount = parse_long_opt("max-age", argv, &optarg))) {
revs->max_age = atoi(arg + 10); revs->max_age = atoi(optarg);
} else if (!prefixcmp(arg, "--since=")) { return argcount;
revs->max_age = approxidate(arg + 8); } else if ((argcount = parse_long_opt("since", argv, &optarg))) {
} else if (!prefixcmp(arg, "--after=")) { revs->max_age = approxidate(optarg);
revs->max_age = approxidate(arg + 8); return argcount;
} else if (!prefixcmp(arg, "--min-age=")) { } else if ((argcount = parse_long_opt("after", argv, &optarg))) {
revs->min_age = atoi(arg + 10); revs->max_age = approxidate(optarg);
} else if (!prefixcmp(arg, "--before=")) { return argcount;
revs->min_age = approxidate(arg + 9); } else if ((argcount = parse_long_opt("min-age", argv, &optarg))) {
} else if (!prefixcmp(arg, "--until=")) { revs->min_age = atoi(optarg);
revs->min_age = approxidate(arg + 8); return argcount;
} else if ((argcount = parse_long_opt("before", argv, &optarg))) {
revs->min_age = approxidate(optarg);
return argcount;
} else if ((argcount = parse_long_opt("until", argv, &optarg))) {
revs->min_age = approxidate(optarg);
return argcount;
} else if (!strcmp(arg, "--first-parent")) { } else if (!strcmp(arg, "--first-parent")) {
revs->first_parent_only = 1; revs->first_parent_only = 1;
} else if (!strcmp(arg, "--ancestry-path")) { } else if (!strcmp(arg, "--ancestry-path")) {
@ -1295,6 +1305,10 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
revs->pretty_given = 1; revs->pretty_given = 1;
get_commit_format(arg+8, revs); get_commit_format(arg+8, revs);
} else if (!prefixcmp(arg, "--pretty=") || !prefixcmp(arg, "--format=")) { } else if (!prefixcmp(arg, "--pretty=") || !prefixcmp(arg, "--format=")) {
/*
* Detached form ("--pretty X" as opposed to "--pretty=X")
* not allowed, since the argument is optional.
*/
revs->verbose_header = 1; revs->verbose_header = 1;
revs->pretty_given = 1; revs->pretty_given = 1;
get_commit_format(arg+9, revs); get_commit_format(arg+9, revs);
@ -1359,21 +1373,25 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
} else if (!strcmp(arg, "--relative-date")) { } else if (!strcmp(arg, "--relative-date")) {
revs->date_mode = DATE_RELATIVE; revs->date_mode = DATE_RELATIVE;
revs->date_mode_explicit = 1; revs->date_mode_explicit = 1;
} else if (!strncmp(arg, "--date=", 7)) { } else if ((argcount = parse_long_opt("date", argv, &optarg))) {
revs->date_mode = parse_date_format(arg + 7); revs->date_mode = parse_date_format(optarg);
revs->date_mode_explicit = 1; revs->date_mode_explicit = 1;
return argcount;
} else if (!strcmp(arg, "--log-size")) { } else if (!strcmp(arg, "--log-size")) {
revs->show_log_size = 1; revs->show_log_size = 1;
} }
/* /*
* Grepping the commit log * Grepping the commit log
*/ */
else if (!prefixcmp(arg, "--author=")) { else if ((argcount = parse_long_opt("author", argv, &optarg))) {
add_header_grep(revs, GREP_HEADER_AUTHOR, arg+9); add_header_grep(revs, GREP_HEADER_AUTHOR, optarg);
} else if (!prefixcmp(arg, "--committer=")) { return argcount;
add_header_grep(revs, GREP_HEADER_COMMITTER, arg+12); } else if ((argcount = parse_long_opt("committer", argv, &optarg))) {
} else if (!prefixcmp(arg, "--grep=")) { add_header_grep(revs, GREP_HEADER_COMMITTER, optarg);
add_message_grep(revs, arg+7); return argcount;
} else if ((argcount = parse_long_opt("grep", argv, &optarg))) {
add_message_grep(revs, optarg);
return argcount;
} else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) { } else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) {
revs->grep_filter.regflags |= REG_EXTENDED; revs->grep_filter.regflags |= REG_EXTENDED;
} else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) { } else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) {
@ -1382,12 +1400,12 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
revs->grep_filter.fixed = 1; revs->grep_filter.fixed = 1;
} else if (!strcmp(arg, "--all-match")) { } else if (!strcmp(arg, "--all-match")) {
revs->grep_filter.all_match = 1; revs->grep_filter.all_match = 1;
} else if (!prefixcmp(arg, "--encoding=")) { } else if ((argcount = parse_long_opt("encoding", argv, &optarg))) {
arg += 11; if (strcmp(optarg, "none"))
if (strcmp(arg, "none")) git_log_output_encoding = xstrdup(optarg);
git_log_output_encoding = xstrdup(arg);
else else
git_log_output_encoding = ""; git_log_output_encoding = "";
return argcount;
} else if (!strcmp(arg, "--reverse")) { } else if (!strcmp(arg, "--reverse")) {
revs->reverse ^= 1; revs->reverse ^= 1;
} else if (!strcmp(arg, "--children")) { } else if (!strcmp(arg, "--children")) {

View File

@ -201,6 +201,13 @@ test_expect_success 'log --grep' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'log --grep option parsing' '
echo second >expect &&
git log -1 --pretty="tformat:%s" --grep sec >actual &&
test_cmp expect actual &&
test_must_fail git log -1 --pretty="tformat:%s" --grep
'
test_expect_success 'log -i --grep' ' test_expect_success 'log -i --grep' '
echo Second >expect && echo Second >expect &&
git log -1 --pretty="tformat:%s" -i --grep=sec >actual && git log -1 --pretty="tformat:%s" -i --grep=sec >actual &&