Merge branch 'jc/revision-parse-int'
The command line parser for the "log" family of commands was too loose when parsing certain numbers, e.g., silently ignoring the extra 'q' in "git log -n 1q" without complaining, which has been tightened up. * jc/revision-parse-int: revision: parse integer arguments to --max-count, --skip, etc., more carefully
This commit is contained in:
41
revision.c
41
revision.c
@ -2223,6 +2223,27 @@ static void add_message_grep(struct rev_info *revs, const char *pattern)
|
||||
add_grep(revs, pattern, GREP_PATTERN_BODY);
|
||||
}
|
||||
|
||||
static int parse_count(const char *arg)
|
||||
{
|
||||
int count;
|
||||
|
||||
if (strtol_i(arg, 10, &count) < 0)
|
||||
die("'%s': not an integer", arg);
|
||||
return count;
|
||||
}
|
||||
|
||||
static timestamp_t parse_age(const char *arg)
|
||||
{
|
||||
timestamp_t num;
|
||||
char *p;
|
||||
|
||||
errno = 0;
|
||||
num = parse_timestamp(arg, &p, 10);
|
||||
if (errno || *p || p == arg)
|
||||
die("'%s': not a number of seconds since epoch", arg);
|
||||
return num;
|
||||
}
|
||||
|
||||
static int handle_revision_opt(struct rev_info *revs, int argc, const char **argv,
|
||||
int *unkc, const char **unkv,
|
||||
const struct setup_revision_opt* opt)
|
||||
@ -2249,29 +2270,27 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
|
||||
}
|
||||
|
||||
if ((argcount = parse_long_opt("max-count", argv, &optarg))) {
|
||||
revs->max_count = atoi(optarg);
|
||||
revs->max_count = parse_count(optarg);
|
||||
revs->no_walk = 0;
|
||||
return argcount;
|
||||
} else if ((argcount = parse_long_opt("skip", argv, &optarg))) {
|
||||
revs->skip_count = atoi(optarg);
|
||||
revs->skip_count = parse_count(optarg);
|
||||
return argcount;
|
||||
} else if ((*arg == '-') && isdigit(arg[1])) {
|
||||
/* accept -<digit>, like traditional "head" */
|
||||
if (strtol_i(arg + 1, 10, &revs->max_count) < 0 ||
|
||||
revs->max_count < 0)
|
||||
die("'%s': not a non-negative integer", arg + 1);
|
||||
revs->max_count = parse_count(arg + 1);
|
||||
revs->no_walk = 0;
|
||||
} else if (!strcmp(arg, "-n")) {
|
||||
if (argc <= 1)
|
||||
return error("-n requires an argument");
|
||||
revs->max_count = atoi(argv[1]);
|
||||
revs->max_count = parse_count(argv[1]);
|
||||
revs->no_walk = 0;
|
||||
return 2;
|
||||
} else if (skip_prefix(arg, "-n", &optarg)) {
|
||||
revs->max_count = atoi(optarg);
|
||||
revs->max_count = parse_count(optarg);
|
||||
revs->no_walk = 0;
|
||||
} else if ((argcount = parse_long_opt("max-age", argv, &optarg))) {
|
||||
revs->max_age = atoi(optarg);
|
||||
revs->max_age = parse_age(optarg);
|
||||
return argcount;
|
||||
} else if ((argcount = parse_long_opt("since", argv, &optarg))) {
|
||||
revs->max_age = approxidate(optarg);
|
||||
@ -2283,7 +2302,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
|
||||
revs->max_age = approxidate(optarg);
|
||||
return argcount;
|
||||
} else if ((argcount = parse_long_opt("min-age", argv, &optarg))) {
|
||||
revs->min_age = atoi(optarg);
|
||||
revs->min_age = parse_age(optarg);
|
||||
return argcount;
|
||||
} else if ((argcount = parse_long_opt("before", argv, &optarg))) {
|
||||
revs->min_age = approxidate(optarg);
|
||||
@ -2371,11 +2390,11 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
|
||||
} else if (!strcmp(arg, "--no-merges")) {
|
||||
revs->max_parents = 1;
|
||||
} else if (skip_prefix(arg, "--min-parents=", &optarg)) {
|
||||
revs->min_parents = atoi(optarg);
|
||||
revs->min_parents = parse_count(optarg);
|
||||
} else if (!strcmp(arg, "--no-min-parents")) {
|
||||
revs->min_parents = 0;
|
||||
} else if (skip_prefix(arg, "--max-parents=", &optarg)) {
|
||||
revs->max_parents = atoi(optarg);
|
||||
revs->max_parents = parse_count(optarg);
|
||||
} else if (!strcmp(arg, "--no-max-parents")) {
|
||||
revs->max_parents = -1;
|
||||
} else if (!strcmp(arg, "--boundary")) {
|
||||
|
Reference in New Issue
Block a user