Merge branch 'jc/ws-error-highlight'
"git diff/log --ws-error-highlight=<kind>" lacked the corresponding configuration variable to set it by default. * jc/ws-error-highlight: diff: introduce diff.wsErrorHighlight option diff.c: move ws-error-highlight parsing helpers up diff.c: refactor parse_ws_error_highlight() t4015: split out the "setup" part of ws-error-highlight test
This commit is contained in:
89
diff.c
89
diff.c
@ -43,6 +43,7 @@ static int diff_stat_graph_width;
|
||||
static int diff_dirstat_permille_default = 30;
|
||||
static struct diff_options default_diff_options;
|
||||
static long diff_algorithm;
|
||||
static unsigned ws_error_highlight_default = WSEH_NEW;
|
||||
|
||||
static char diff_colors[][COLOR_MAXLEN] = {
|
||||
GIT_COLOR_RESET,
|
||||
@ -172,6 +173,43 @@ long parse_algorithm_value(const char *value)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int parse_one_token(const char **arg, const char *token)
|
||||
{
|
||||
const char *rest;
|
||||
if (skip_prefix(*arg, token, &rest) && (!*rest || *rest == ',')) {
|
||||
*arg = rest;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_ws_error_highlight(const char *arg)
|
||||
{
|
||||
const char *orig_arg = arg;
|
||||
unsigned val = 0;
|
||||
|
||||
while (*arg) {
|
||||
if (parse_one_token(&arg, "none"))
|
||||
val = 0;
|
||||
else if (parse_one_token(&arg, "default"))
|
||||
val = WSEH_NEW;
|
||||
else if (parse_one_token(&arg, "all"))
|
||||
val = WSEH_NEW | WSEH_OLD | WSEH_CONTEXT;
|
||||
else if (parse_one_token(&arg, "new"))
|
||||
val |= WSEH_NEW;
|
||||
else if (parse_one_token(&arg, "old"))
|
||||
val |= WSEH_OLD;
|
||||
else if (parse_one_token(&arg, "context"))
|
||||
val |= WSEH_CONTEXT;
|
||||
else {
|
||||
return -1 - (int)(arg - orig_arg);
|
||||
}
|
||||
if (*arg)
|
||||
arg++;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
/*
|
||||
* These are to give UI layer defaults.
|
||||
* The core-level commands such as git-diff-files should
|
||||
@ -256,6 +294,15 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
|
||||
|
||||
if (git_diff_heuristic_config(var, value, cb) < 0)
|
||||
return -1;
|
||||
|
||||
if (!strcmp(var, "diff.wserrorhighlight")) {
|
||||
int val = parse_ws_error_highlight(value);
|
||||
if (val < 0)
|
||||
return -1;
|
||||
ws_error_highlight_default = val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (git_color_config(var, value, cb) < 0)
|
||||
return -1;
|
||||
|
||||
@ -3307,7 +3354,7 @@ void diff_setup(struct diff_options *options)
|
||||
options->rename_limit = -1;
|
||||
options->dirstat_permille = diff_dirstat_permille_default;
|
||||
options->context = diff_context_default;
|
||||
options->ws_error_highlight = WSEH_NEW;
|
||||
options->ws_error_highlight = ws_error_highlight_default;
|
||||
DIFF_OPT_SET(options, RENAME_EMPTY);
|
||||
|
||||
/* pathchange left =NULL by default */
|
||||
@ -3698,40 +3745,14 @@ static void enable_patch_output(int *fmt) {
|
||||
*fmt |= DIFF_FORMAT_PATCH;
|
||||
}
|
||||
|
||||
static int parse_one_token(const char **arg, const char *token)
|
||||
static int parse_ws_error_highlight_opt(struct diff_options *opt, const char *arg)
|
||||
{
|
||||
const char *rest;
|
||||
if (skip_prefix(*arg, token, &rest) && (!*rest || *rest == ',')) {
|
||||
*arg = rest;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int val = parse_ws_error_highlight(arg);
|
||||
|
||||
static int parse_ws_error_highlight(struct diff_options *opt, const char *arg)
|
||||
{
|
||||
const char *orig_arg = arg;
|
||||
unsigned val = 0;
|
||||
while (*arg) {
|
||||
if (parse_one_token(&arg, "none"))
|
||||
val = 0;
|
||||
else if (parse_one_token(&arg, "default"))
|
||||
val = WSEH_NEW;
|
||||
else if (parse_one_token(&arg, "all"))
|
||||
val = WSEH_NEW | WSEH_OLD | WSEH_CONTEXT;
|
||||
else if (parse_one_token(&arg, "new"))
|
||||
val |= WSEH_NEW;
|
||||
else if (parse_one_token(&arg, "old"))
|
||||
val |= WSEH_OLD;
|
||||
else if (parse_one_token(&arg, "context"))
|
||||
val |= WSEH_CONTEXT;
|
||||
else {
|
||||
error("unknown value after ws-error-highlight=%.*s",
|
||||
(int)(arg - orig_arg), orig_arg);
|
||||
return 0;
|
||||
}
|
||||
if (*arg)
|
||||
arg++;
|
||||
if (val < 0) {
|
||||
error("unknown value after ws-error-highlight=%.*s",
|
||||
-1 - val, arg);
|
||||
return 0;
|
||||
}
|
||||
opt->ws_error_highlight = val;
|
||||
return 1;
|
||||
@ -3950,7 +3971,7 @@ int diff_opt_parse(struct diff_options *options,
|
||||
else if (skip_prefix(arg, "--submodule=", &arg))
|
||||
return parse_submodule_opt(options, arg);
|
||||
else if (skip_prefix(arg, "--ws-error-highlight=", &arg))
|
||||
return parse_ws_error_highlight(options, arg);
|
||||
return parse_ws_error_highlight_opt(options, arg);
|
||||
|
||||
/* misc options */
|
||||
else if (!strcmp(arg, "-z"))
|
||||
|
Reference in New Issue
Block a user