From: Jacob Keller <jacob.keller@xxxxxxxxx> Recently, commit f7923a5ece00 ("diff: use skip_to_optional_val()", 2017-12-04) changed how we parsed some diff options, preferring skip_to_optional_val instead of a more complex skip_prefix() setup. Unfortunately, this breaks --relative, because of the semantics of skip_to_optional_val. If no optional_val is given, then the function puts the empty string "" into the arg. Unfortunately, relative passes in options->prefix as the location for the optional argument, and expects this value to remain unchanged if no optional value was given. This results in breaking --relative when no arguments are provided. This cascades into many failures of code flow that rely on this. Partially revert the commit, and restore --relative option parsing to the previous working code. Since no tests exist for --relative without options, add a new test which will help ensure no future regressions. Signed-off-by: Jacob Keller <jacob.keller@xxxxxxxxx> --- Actually perform the revert of --relative handling. diff.c | 6 +++++- t/t4045-diff-relative.sh | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/diff.c b/diff.c index b62e4b61b564..1919afb4f104 100644 --- a/diff.c +++ b/diff.c @@ -4581,8 +4581,12 @@ int diff_opt_parse(struct diff_options *options, options->flags.rename_empty = 1; else if (!strcmp(arg, "--no-rename-empty")) options->flags.rename_empty = 0; - else if (skip_to_optional_val(arg, "--relative", &options->prefix)) + else if (!strcmp(arg, "--relative")) options->flags.relative_name = 1; + else if (skip_prefix(arg, "--relative=", &arg)) { + options->flags.relative_name = 1; + options->prefix = arg; + } /* xdiff options */ else if (!strcmp(arg, "--minimal")) diff --git a/t/t4045-diff-relative.sh b/t/t4045-diff-relative.sh index 3950f5034d31..41e4f59b2ffb 100755 --- a/t/t4045-diff-relative.sh +++ b/t/t4045-diff-relative.sh @@ -70,4 +70,9 @@ for type in diff numstat stat raw; do check_$type dir/file2 --relative=sub done +cd subdir +for type in diff numstat stat raw; do + check_$type file2 --relative +done + test_done -- 2.15.1.477.g3ed0a2a61da8