зеркало из https://github.com/microsoft/git.git
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:
Коммит
8736c9010c
40
diff.c
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(¶ms, 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(¶ms, 0);
|
||||
free(params_copy);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче