[PATCH v2] diff: fix --relative without arguments
From: Jacob Keller <jacob.e.keller@intel.com>
Date: 2017-12-07 00:59:40
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Jacob Keller <redacted>
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 <redacted>
---
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