Re: [PATCH] blame: make diff algorithm configurable
- From
- Phillip Wood <phillip.wood123@gmail.com>
- Date
- Oct 23, 2025, 16:03 UTC
- Message-ID
- <0d6019c7-5e73-4195-b5d2-b43f2cb6399d@gmail.com>
- In-Reply-To
- <pull.2075.git.git.1760972162827.gitgitgadget@gmail.com>
Hi Antonin
On 20/10/2025 15:56, Antonin Delpeuch via GitGitGadget wrote:
Show 5 quoted lines
> From: Antonin Delpeuch <antonin@delpeuch.eu> > > The diff algorithm used in 'git-blame(1)' can be configured using the > `--diff-algorithm` option or the `diff.algorithm` config variable. > Myers diff remains the default.
I think this sounds like a reasonable thing to do, although it is technically a breaking change.
Show 17 quoted lines
> diff --git a/builtin/blame.c b/builtin/blame.c
> index 2703820258..177b606e81 100644
> --- a/builtin/blame.c
> +++ b/builtin/blame.c
> @@ -779,6 +779,19 @@ static int git_blame_config(const char *var, const char *value,
> }
> }
>
> + if (!strcmp(var, "diff.algorithm")) {
> + long diff_algorithm;
> + if (!value)
> + return config_error_nonbool(var);
> + diff_algorithm = parse_algorithm_value(value);
> + if (diff_algorithm < 0)
> + return error(_("unknown value for config '%s': %s"),
> + var, value);
> + xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK;I think this should be
xdl_opts &= ~(XDF_DIFF_ALGORITHM_MASK | XDF_NEED_MINIMAL);
as you have below for the option parsing.
Show 24 quoted lines
> + xdl_opts |= diff_algorithm;
> + return 0;
> + }
> +
> if (git_diff_heuristic_config(var, value, cb) < 0)
> return -1;
> if (userdiff_config(var, value) < 0)
> @@ -824,6 +837,26 @@ static int blame_move_callback(const struct option *option, const char *arg, int
> return 0;
> }
>
> +static int blame_diff_algorithm_callback(const struct option *option,
> + const char *arg, int unset)
> +{
> + int *opt = option->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\""));
> +
> + // ignore any previous --minimal setting, following git-diff's behaviorStyle - oneline comments should look like
/* comment */
> + *opt &= ~XDF_NEED_MINIMAL; > + *opt &= ~XDF_DIFF_ALGORITHM_MASK; > + *opt |= value;
"git blame" also has a "--minimal" option which now needs to clear the diff algorithm when it sets the minimal flag.
Thanks
Phillip