]> git.ipfire.org Git - thirdparty/git.git/commitdiff
2.36 format-patch regression fix
authorRené Scharfe <l.s.r@web.de>
Sat, 30 Apr 2022 10:32:44 +0000 (12:32 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 30 Apr 2022 18:49:59 +0000 (11:49 -0700)
e900d494dc (diff: add an API for deferred freeing, 2021-02-11) added a
way to allow reusing diffopts: the no_free bit.  244c27242f (diff.[ch]:
have diff_free() call clear_pathspec(opts.pathspec), 2022-02-16) made
that mechanism mandatory.

git format-patch only sets no_free when --output is given, causing it to
forget pathspecs after the first commit.  Set no_free unconditionally
instead.

The existing test was unable to detect this breakage because it checks
stderr for the absence of a certain string, but format-patch writes to
stdout.  Also the test was not checking the case of one commit modifying
multiple files and a pathspec limiting the diff.  Replace it with a more
thorough one.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/log.c
t/t4014-format-patch.sh

index c211d66d1d0e7fcf11958aaa651be233e7a9c3ed..9acc130594a45a4f06175f0150bba75aa1cd09ae 100644 (file)
@@ -1883,6 +1883,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        rev.diff = 1;
        rev.max_parents = 1;
        rev.diffopt.flags.recursive = 1;
+       rev.diffopt.no_free = 1;
        rev.subject_prefix = fmt_patch_subject_prefix;
        memset(&s_r_opt, 0, sizeof(s_r_opt));
        s_r_opt.def = "HEAD";
@@ -2008,13 +2009,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 
        if (use_stdout) {
                setup_pager();
-       } else if (rev.diffopt.close_file) {
-               /*
-                * The diff code parsed --output; it has already opened the
-                * file, but we must instruct it not to close after each diff.
-                */
-               rev.diffopt.no_free = 1;
-       } else {
+       } else if (!rev.diffopt.close_file) {
                int saved;
 
                if (!output_directory)
index 7dc5a5c736e3f2db0c4bc29c20321b6a386661df..fbec8ad2ef7bb263765357c2f783448184c6b808 100755 (executable)
@@ -926,11 +926,40 @@ test_expect_success 'format-patch --numstat should produce a patch' '
 '
 
 test_expect_success 'format-patch -- <path>' '
-       git format-patch main..side -- file 2>error &&
-       ! grep "Use .--" error
+       rm -f *.patch &&
+       git checkout -b pathspec main &&
+
+       echo file_a 1 >file_a &&
+       echo file_b 1 >file_b &&
+       git add file_a file_b &&
+       git commit -m pathspec_initial &&
+
+       echo file_a 2 >>file_a &&
+       git add file_a &&
+       git commit -m pathspec_a &&
+
+       echo file_b 2 >>file_b &&
+       git add file_b &&
+       git commit -m pathspec_b &&
+
+       echo file_a 3 >>file_a &&
+       echo file_b 3 >>file_b &&
+       git add file_a file_b &&
+       git commit -m pathspec_ab &&
+
+       cat >expect <<-\EOF &&
+       0001-pathspec_initial.patch
+       0002-pathspec_a.patch
+       0003-pathspec_ab.patch
+       EOF
+
+       git format-patch main..pathspec -- file_a >output &&
+       test_cmp expect output &&
+       ! grep file_b *.patch
 '
 
 test_expect_success 'format-patch --ignore-if-in-upstream HEAD' '
+       git checkout side &&
        git format-patch --ignore-if-in-upstream HEAD
 '