Merge branch 'nd/diff-parseopt-3'
Third batch to teach the diff machinery to use the parse-options API. * nd/diff-parseopt-3: diff-parseopt: convert --submodule diff-parseopt: convert --ignore-submodules diff-parseopt: convert --textconv diff-parseopt: convert --ext-diff diff-parseopt: convert --quiet diff-parseopt: convert --exit-code diff-parseopt: convert --color-words diff-parseopt: convert --word-diff-regex diff-parseopt: convert --word-diff diff-parseopt: convert --[no-]color diff-parseopt: convert --[no-]follow diff-parseopt: convert -R diff-parseopt: convert -a|--text diff-parseopt: convert --full-index diff-parseopt: convert --binary diff-parseopt: convert --anchored diff-parseopt: convert --diff-algorithm diff-parseopt: convert --histogram diff-parseopt: convert --patience diff-parseopt: convert --[no-]indent-heuristic
This commit is contained in:
commit
8a9a837a63
@ -436,7 +436,7 @@ endif::git-format-patch[]
|
||||
|
||||
--binary::
|
||||
In addition to `--full-index`, output a binary diff that
|
||||
can be applied with `git-apply`.
|
||||
can be applied with `git-apply`. Implies `--patch`.
|
||||
|
||||
--abbrev[=<n>]::
|
||||
Instead of showing the full 40-byte hexadecimal object
|
||||
|
342
diff.c
342
diff.c
@ -4788,14 +4788,6 @@ static int parse_dirstat_opt(struct diff_options *options, const char *params)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int parse_submodule_opt(struct diff_options *options, const char *value)
|
||||
{
|
||||
if (parse_submodule_params(options, value))
|
||||
die(_("Failed to parse --submodule option parameter: '%s'"),
|
||||
value);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const char diff_status_letters[] = {
|
||||
DIFF_STATUS_ADDED,
|
||||
DIFF_STATUS_COPIED,
|
||||
@ -4906,6 +4898,31 @@ static int parse_objfind_opt(struct diff_options *opt, const char *arg)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int diff_opt_anchored(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
options->xdl_opts = DIFF_WITH_ALG(options, PATIENCE_DIFF);
|
||||
ALLOC_GROW(options->anchors, options->anchors_nr + 1,
|
||||
options->anchors_alloc);
|
||||
options->anchors[options->anchors_nr++] = xstrdup(arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_binary(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
BUG_ON_OPT_ARG(arg);
|
||||
enable_patch_output(&options->output_format);
|
||||
options->flags.binary = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_break_rewrites(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
@ -4943,6 +4960,18 @@ static int diff_opt_char(const struct option *opt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_color_words(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
options->use_color = 1;
|
||||
options->word_diff = DIFF_WORDS_COLOR;
|
||||
options->word_regex = arg;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_compact_summary(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
@ -4958,6 +4987,24 @@ static int diff_opt_compact_summary(const struct option *opt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_diff_algorithm(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
long value = parse_algorithm_value(arg);
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
if (value < 0)
|
||||
return error(_("option diff-algorithm accepts \"myers\", "
|
||||
"\"minimal\", \"patience\" and \"histogram\""));
|
||||
|
||||
/* clear out previous settings */
|
||||
DIFF_XDL_CLR(options, NEED_MINIMAL);
|
||||
options->xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK;
|
||||
options->xdl_opts |= value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_dirstat(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
@ -5010,6 +5057,34 @@ static int diff_opt_find_renames(const struct option *opt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_follow(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_ARG(arg);
|
||||
if (unset) {
|
||||
options->flags.follow_renames = 0;
|
||||
options->flags.default_follow_renames = 0;
|
||||
} else {
|
||||
options->flags.follow_renames = 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_ignore_submodules(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
if (!arg)
|
||||
arg = "all";
|
||||
options->flags.override_submodule_config = 1;
|
||||
handle_ignore_submodules_arg(options, arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static enum parse_opt_result diff_opt_output(struct parse_opt_ctx_t *ctx,
|
||||
const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
@ -5027,6 +5102,26 @@ static enum parse_opt_result diff_opt_output(struct parse_opt_ctx_t *ctx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_patience(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
int i;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
BUG_ON_OPT_ARG(arg);
|
||||
options->xdl_opts = DIFF_WITH_ALG(options, PATIENCE_DIFF);
|
||||
/*
|
||||
* Both --patience and --anchored use PATIENCE_DIFF
|
||||
* internally, so remove any anchors previously
|
||||
* specified.
|
||||
*/
|
||||
for (i = 0; i < options->anchors_nr; i++)
|
||||
free(options->anchors[i]);
|
||||
options->anchors_nr = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_relative(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
@ -5039,6 +5134,35 @@ static int diff_opt_relative(const struct option *opt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_submodule(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
if (!arg)
|
||||
arg = "log";
|
||||
if (parse_submodule_params(options, arg))
|
||||
return error(_("failed to parse --submodule option parameter: '%s'"),
|
||||
arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_textconv(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_ARG(arg);
|
||||
if (unset) {
|
||||
options->flags.allow_textconv = 0;
|
||||
} else {
|
||||
options->flags.allow_textconv = 1;
|
||||
options->flags.textconv_set_via_cmdline = 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_unified(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
@ -5055,6 +5179,44 @@ static int diff_opt_unified(const struct option *opt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_word_diff(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
if (arg) {
|
||||
if (!strcmp(arg, "plain"))
|
||||
options->word_diff = DIFF_WORDS_PLAIN;
|
||||
else if (!strcmp(arg, "color")) {
|
||||
options->use_color = 1;
|
||||
options->word_diff = DIFF_WORDS_COLOR;
|
||||
}
|
||||
else if (!strcmp(arg, "porcelain"))
|
||||
options->word_diff = DIFF_WORDS_PORCELAIN;
|
||||
else if (!strcmp(arg, "none"))
|
||||
options->word_diff = DIFF_WORDS_NONE;
|
||||
else
|
||||
return error(_("bad --word-diff argument: %s"), arg);
|
||||
} else {
|
||||
if (options->word_diff == DIFF_WORDS_NONE)
|
||||
options->word_diff = DIFF_WORDS_PLAIN;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_word_diff_regex(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
if (options->word_diff == DIFF_WORDS_NONE)
|
||||
options->word_diff = DIFF_WORDS_PLAIN;
|
||||
options->word_regex = arg;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void prep_parse_options(struct diff_options *options)
|
||||
{
|
||||
struct option parseopts[] = {
|
||||
@ -5132,6 +5294,13 @@ static void prep_parse_options(struct diff_options *options)
|
||||
OPT_CALLBACK_F(0, "compact-summary", options, NULL,
|
||||
N_("generate compact summary in diffstat"),
|
||||
PARSE_OPT_NOARG, diff_opt_compact_summary),
|
||||
OPT_CALLBACK_F(0, "binary", options, NULL,
|
||||
N_("output a binary diff that can be applied"),
|
||||
PARSE_OPT_NONEG | PARSE_OPT_NOARG, diff_opt_binary),
|
||||
OPT_BOOL(0, "full-index", &options->flags.full_index,
|
||||
N_("show full pre- and post-image object names on the \"index\" lines")),
|
||||
OPT_COLOR_FLAG(0, "color", &options->use_color,
|
||||
N_("show colored diff")),
|
||||
OPT_CALLBACK_F(0, "output-indicator-new",
|
||||
&options->output_indicators[OUTPUT_INDICATOR_NEW],
|
||||
N_("<char>"),
|
||||
@ -5171,6 +5340,9 @@ static void prep_parse_options(struct diff_options *options)
|
||||
0, PARSE_OPT_NONEG),
|
||||
OPT_BOOL(0, "rename-empty", &options->flags.rename_empty,
|
||||
N_("use empty blobs as rename source")),
|
||||
OPT_CALLBACK_F(0, "follow", options, NULL,
|
||||
N_("continue listing the history of a file beyond renames"),
|
||||
PARSE_OPT_NOARG, diff_opt_follow),
|
||||
|
||||
OPT_GROUP(N_("Diff algorithm options")),
|
||||
OPT_BIT(0, "minimal", &options->xdl_opts,
|
||||
@ -5191,12 +5363,58 @@ static void prep_parse_options(struct diff_options *options)
|
||||
OPT_BIT_F(0, "ignore-blank-lines", &options->xdl_opts,
|
||||
N_("ignore changes whose lines are all blank"),
|
||||
XDF_IGNORE_BLANK_LINES, PARSE_OPT_NONEG),
|
||||
OPT_BIT(0, "indent-heuristic", &options->xdl_opts,
|
||||
N_("heuristic to shift diff hunk boundaries for easy reading"),
|
||||
XDF_INDENT_HEURISTIC),
|
||||
OPT_CALLBACK_F(0, "patience", options, NULL,
|
||||
N_("generate diff using the \"patience diff\" algorithm"),
|
||||
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
|
||||
diff_opt_patience),
|
||||
OPT_BITOP(0, "histogram", &options->xdl_opts,
|
||||
N_("generate diff using the \"histogram diff\" algorithm"),
|
||||
XDF_HISTOGRAM_DIFF, XDF_DIFF_ALGORITHM_MASK),
|
||||
OPT_CALLBACK_F(0, "diff-algorithm", options, N_("<algorithm>"),
|
||||
N_("choose a diff algorithm"),
|
||||
PARSE_OPT_NONEG, diff_opt_diff_algorithm),
|
||||
OPT_CALLBACK_F(0, "anchored", options, N_("<text>"),
|
||||
N_("generate diff using the \"anchored diff\" algorithm"),
|
||||
PARSE_OPT_NONEG, diff_opt_anchored),
|
||||
OPT_CALLBACK_F(0, "word-diff", options, N_("<mode>"),
|
||||
N_("show word diff, using <mode> to delimit changed words"),
|
||||
PARSE_OPT_NONEG | PARSE_OPT_OPTARG, diff_opt_word_diff),
|
||||
OPT_CALLBACK_F(0, "word-diff-regex", options, N_("<regex>"),
|
||||
N_("use <regex> to decide what a word is"),
|
||||
PARSE_OPT_NONEG, diff_opt_word_diff_regex),
|
||||
OPT_CALLBACK_F(0, "color-words", options, N_("<regex>"),
|
||||
N_("equivalent to --word-diff=color --word-diff-regex=<regex>"),
|
||||
PARSE_OPT_NONEG | PARSE_OPT_OPTARG, diff_opt_color_words),
|
||||
|
||||
OPT_GROUP(N_("Diff other options")),
|
||||
OPT_CALLBACK_F(0, "relative", options, N_("<prefix>"),
|
||||
N_("when run from subdir, exclude changes outside and show relative paths"),
|
||||
PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
|
||||
diff_opt_relative),
|
||||
OPT_BOOL('a', "text", &options->flags.text,
|
||||
N_("treat all files as text")),
|
||||
OPT_BOOL('R', NULL, &options->flags.reverse_diff,
|
||||
N_("swap two inputs, reverse the diff")),
|
||||
OPT_BOOL(0, "exit-code", &options->flags.exit_with_status,
|
||||
N_("exit with 1 if there were differences, 0 otherwise")),
|
||||
OPT_BOOL(0, "quiet", &options->flags.quick,
|
||||
N_("disable all output of the program")),
|
||||
OPT_BOOL(0, "ext-diff", &options->flags.allow_external,
|
||||
N_("allow an external diff helper to be executed")),
|
||||
OPT_CALLBACK_F(0, "textconv", options, NULL,
|
||||
N_("run external text conversion filters when comparing binary files"),
|
||||
PARSE_OPT_NOARG, diff_opt_textconv),
|
||||
OPT_CALLBACK_F(0, "ignore-submodules", options, N_("<when>"),
|
||||
N_("ignore changes to submodules in the diff generation"),
|
||||
PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
|
||||
diff_opt_ignore_submodules),
|
||||
OPT_CALLBACK_F(0, "submodule", options, N_("<format>"),
|
||||
N_("specify how differences in submodules are shown"),
|
||||
PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
|
||||
diff_opt_submodule),
|
||||
{ OPTION_CALLBACK, 0, "output", options, N_("<file>"),
|
||||
N_("Output to a specific file"),
|
||||
PARSE_OPT_NONEG, NULL, 0, diff_opt_output },
|
||||
@ -5228,66 +5446,8 @@ int diff_opt_parse(struct diff_options *options,
|
||||
if (ac)
|
||||
return ac;
|
||||
|
||||
/* xdiff options */
|
||||
if (!strcmp(arg, "--indent-heuristic"))
|
||||
DIFF_XDL_SET(options, INDENT_HEURISTIC);
|
||||
else if (!strcmp(arg, "--no-indent-heuristic"))
|
||||
DIFF_XDL_CLR(options, INDENT_HEURISTIC);
|
||||
else if (!strcmp(arg, "--patience")) {
|
||||
int i;
|
||||
options->xdl_opts = DIFF_WITH_ALG(options, PATIENCE_DIFF);
|
||||
/*
|
||||
* Both --patience and --anchored use PATIENCE_DIFF
|
||||
* internally, so remove any anchors previously
|
||||
* specified.
|
||||
*/
|
||||
for (i = 0; i < options->anchors_nr; i++)
|
||||
free(options->anchors[i]);
|
||||
options->anchors_nr = 0;
|
||||
} else if (!strcmp(arg, "--histogram"))
|
||||
options->xdl_opts = DIFF_WITH_ALG(options, HISTOGRAM_DIFF);
|
||||
else if ((argcount = parse_long_opt("diff-algorithm", av, &optarg))) {
|
||||
long value = parse_algorithm_value(optarg);
|
||||
if (value < 0)
|
||||
return error("option diff-algorithm accepts \"myers\", "
|
||||
"\"minimal\", \"patience\" and \"histogram\"");
|
||||
/* clear out previous settings */
|
||||
DIFF_XDL_CLR(options, NEED_MINIMAL);
|
||||
options->xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK;
|
||||
options->xdl_opts |= value;
|
||||
return argcount;
|
||||
} else if (skip_prefix(arg, "--anchored=", &arg)) {
|
||||
options->xdl_opts = DIFF_WITH_ALG(options, PATIENCE_DIFF);
|
||||
ALLOC_GROW(options->anchors, options->anchors_nr + 1,
|
||||
options->anchors_alloc);
|
||||
options->anchors[options->anchors_nr++] = xstrdup(arg);
|
||||
}
|
||||
|
||||
/* flags options */
|
||||
else if (!strcmp(arg, "--binary")) {
|
||||
enable_patch_output(&options->output_format);
|
||||
options->flags.binary = 1;
|
||||
}
|
||||
else if (!strcmp(arg, "--full-index"))
|
||||
options->flags.full_index = 1;
|
||||
else if (!strcmp(arg, "-a") || !strcmp(arg, "--text"))
|
||||
options->flags.text = 1;
|
||||
else if (!strcmp(arg, "-R"))
|
||||
options->flags.reverse_diff = 1;
|
||||
else if (!strcmp(arg, "--follow"))
|
||||
options->flags.follow_renames = 1;
|
||||
else if (!strcmp(arg, "--no-follow")) {
|
||||
options->flags.follow_renames = 0;
|
||||
options->flags.default_follow_renames = 0;
|
||||
} else if (skip_to_optional_arg_default(arg, "--color", &arg, "always")) {
|
||||
int value = git_config_colorbool(NULL, arg);
|
||||
if (value < 0)
|
||||
return error("option `color' expects \"always\", \"auto\", or \"never\"");
|
||||
options->use_color = value;
|
||||
}
|
||||
else if (!strcmp(arg, "--no-color"))
|
||||
options->use_color = 0;
|
||||
else if (!strcmp(arg, "--color-moved")) {
|
||||
if (!strcmp(arg, "--color-moved")) {
|
||||
if (diff_color_moved_default)
|
||||
options->color_moved = diff_color_moved_default;
|
||||
if (options->color_moved == COLOR_MOVED_NO)
|
||||
@ -5306,53 +5466,7 @@ int diff_opt_parse(struct diff_options *options,
|
||||
if (cm & COLOR_MOVED_WS_ERROR)
|
||||
return -1;
|
||||
options->color_moved_ws_handling = cm;
|
||||
} else if (skip_to_optional_arg_default(arg, "--color-words", &options->word_regex, NULL)) {
|
||||
options->use_color = 1;
|
||||
options->word_diff = DIFF_WORDS_COLOR;
|
||||
}
|
||||
else if (!strcmp(arg, "--word-diff")) {
|
||||
if (options->word_diff == DIFF_WORDS_NONE)
|
||||
options->word_diff = DIFF_WORDS_PLAIN;
|
||||
}
|
||||
else if (skip_prefix(arg, "--word-diff=", &arg)) {
|
||||
if (!strcmp(arg, "plain"))
|
||||
options->word_diff = DIFF_WORDS_PLAIN;
|
||||
else if (!strcmp(arg, "color")) {
|
||||
options->use_color = 1;
|
||||
options->word_diff = DIFF_WORDS_COLOR;
|
||||
}
|
||||
else if (!strcmp(arg, "porcelain"))
|
||||
options->word_diff = DIFF_WORDS_PORCELAIN;
|
||||
else if (!strcmp(arg, "none"))
|
||||
options->word_diff = DIFF_WORDS_NONE;
|
||||
else
|
||||
die("bad --word-diff argument: %s", arg);
|
||||
}
|
||||
else if ((argcount = parse_long_opt("word-diff-regex", av, &optarg))) {
|
||||
if (options->word_diff == DIFF_WORDS_NONE)
|
||||
options->word_diff = DIFF_WORDS_PLAIN;
|
||||
options->word_regex = optarg;
|
||||
return argcount;
|
||||
}
|
||||
else if (!strcmp(arg, "--exit-code"))
|
||||
options->flags.exit_with_status = 1;
|
||||
else if (!strcmp(arg, "--quiet"))
|
||||
options->flags.quick = 1;
|
||||
else if (!strcmp(arg, "--ext-diff"))
|
||||
options->flags.allow_external = 1;
|
||||
else if (!strcmp(arg, "--no-ext-diff"))
|
||||
options->flags.allow_external = 0;
|
||||
else if (!strcmp(arg, "--textconv")) {
|
||||
options->flags.allow_textconv = 1;
|
||||
options->flags.textconv_set_via_cmdline = 1;
|
||||
} else if (!strcmp(arg, "--no-textconv"))
|
||||
options->flags.allow_textconv = 0;
|
||||
else if (skip_to_optional_arg_default(arg, "--ignore-submodules", &arg, "all")) {
|
||||
options->flags.override_submodule_config = 1;
|
||||
handle_ignore_submodules_arg(options, arg);
|
||||
} else if (skip_to_optional_arg_default(arg, "--submodule", &arg, "log"))
|
||||
return parse_submodule_opt(options, arg);
|
||||
else if (skip_prefix(arg, "--ws-error-highlight=", &arg))
|
||||
} else if (skip_prefix(arg, "--ws-error-highlight=", &arg))
|
||||
return parse_ws_error_highlight_opt(options, arg);
|
||||
else if (!strcmp(arg, "--ita-invisible-in-index"))
|
||||
options->ita_invisible_in_index = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user