On Wed, Nov 4, 2020 at 8:29 AM Jeff King <peff@xxxxxxxx> wrote: > [...] > The simplest solution would be to just disallow --output with > format-patch, as nobody ever intended it to work. However, we have > accidentally documented it (because format-patch includes diff-options). > And it does work with "git log", which writes the whole output to the > specified file. It's easy enough to make that work for format-patch, > too: it's really the same as --stdout, but pointed at a specific file. > [...] > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > diff --git a/builtin/log.c b/builtin/log.c > @@ -1942,11 +1942,18 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) > + } else if (rev.diffopt.close_file) { > + /* > + * The diff code parsed --output; it has already opened the > + * file, but but we must instruct it not to close after each > + * diff. > + */ > + rev.diffopt.close_file = 0; > } else { The commit message's justification for supporting --output seems reasonable. However, my knee-jerk reaction to the implementation was that it feels overly magical and a bit too hacky. I can see the logic in it but it also leaves a bad taste when the implementation has to "undo" a side-effect of some other piece of code, which makes it feel unplanned and fragile. The question which popped into my mind immediately was "why not handle --output explicitly via builtin_format_patch_options[] along with other first-class options?". This review comment may or may not be actionable; it's just expressing surprise and a bit of nose-wrinkling I experienced. > diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh > @@ -1919,6 +1919,39 @@ test_expect_success 'format-patch -o overrides format.outputDirectory' ' > +test_expect_success 'format-patch forbids multiple outputs' ' > + rm -fr outfile outdir && > + test_must_fail \ > + git format-patch --stdout --output=outfile && > + test_must_fail \ > + git format-patch --stdout --output-directory=outdir && > + test_must_fail \ > + git format-patch --output=outfile --output-directory=outdir > +' I would have expected to see this test added in patch [1/3], and then extended by this patch with the addition of the --output case(s).