Merge branch 'mh/maint-parse-dirstat-fix'

Cleans up some code and avoids a potential bug.

* mh/maint-parse-dirstat-fix:
  parse_dirstat_params(): use string_list to split comma-separated string
This commit is contained in:
Jeff King 2012-11-09 12:42:21 -05:00
Родитель f07e5551a8 02e8ca0e50
Коммит 8736c9010c
1 изменённых файлов: 21 добавлений и 19 удалений

40
diff.c
Просмотреть файл

@ -15,6 +15,7 @@
#include "sigchain.h"
#include "submodule.h"
#include "ll-merge.h"
#include "string-list.h"
#ifdef NO_FAST_WORKING_DIRECTORY
#define FAST_WORKING_DIRECTORY 0
@ -69,26 +70,30 @@ static int parse_diff_color_slot(const char *var, int ofs)
return -1;
}
static int parse_dirstat_params(struct diff_options *options, const char *params,
static int parse_dirstat_params(struct diff_options *options, const char *params_string,
struct strbuf *errmsg)
{
const char *p = params;
int p_len, ret = 0;
char *params_copy = xstrdup(params_string);
struct string_list params = STRING_LIST_INIT_NODUP;
int ret = 0;
int i;
while (*p) {
p_len = strchrnul(p, ',') - p;
if (!memcmp(p, "changes", p_len)) {
if (*params_copy)
string_list_split_in_place(&params, params_copy, ',', -1);
for (i = 0; i < params.nr; i++) {
const char *p = params.items[i].string;
if (!strcmp(p, "changes")) {
DIFF_OPT_CLR(options, DIRSTAT_BY_LINE);
DIFF_OPT_CLR(options, DIRSTAT_BY_FILE);
} else if (!memcmp(p, "lines", p_len)) {
} else if (!strcmp(p, "lines")) {
DIFF_OPT_SET(options, DIRSTAT_BY_LINE);
DIFF_OPT_CLR(options, DIRSTAT_BY_FILE);
} else if (!memcmp(p, "files", p_len)) {
} else if (!strcmp(p, "files")) {
DIFF_OPT_CLR(options, DIRSTAT_BY_LINE);
DIFF_OPT_SET(options, DIRSTAT_BY_FILE);
} else if (!memcmp(p, "noncumulative", p_len)) {
} else if (!strcmp(p, "noncumulative")) {
DIFF_OPT_CLR(options, DIRSTAT_CUMULATIVE);
} else if (!memcmp(p, "cumulative", p_len)) {
} else if (!strcmp(p, "cumulative")) {
DIFF_OPT_SET(options, DIRSTAT_CUMULATIVE);
} else if (isdigit(*p)) {
char *end;
@ -100,24 +105,21 @@ static int parse_dirstat_params(struct diff_options *options, const char *params
while (isdigit(*++end))
; /* nothing */
}
if (end - p == p_len)
if (!*end)
options->dirstat_permille = permille;
else {
strbuf_addf(errmsg, _(" Failed to parse dirstat cut-off percentage '%.*s'\n"),
p_len, p);
strbuf_addf(errmsg, _(" Failed to parse dirstat cut-off percentage '%s'\n"),
p);
ret++;
}
} else {
strbuf_addf(errmsg, _(" Unknown dirstat parameter '%.*s'\n"),
p_len, p);
strbuf_addf(errmsg, _(" Unknown dirstat parameter '%s'\n"), p);
ret++;
}
p += p_len;
if (*p)
p++; /* more parameters, swallow separator */
}
string_list_clear(&params, 0);
free(params_copy);
return ret;
}