]> git.ipfire.org Git - thirdparty/git.git/commitdiff
format-patch: refactor output selection
authorJeff King <peff@peff.net>
Wed, 4 Nov 2020 19:28:31 +0000 (14:28 -0500)
committerJunio C Hamano <gitster@pobox.com>
Wed, 4 Nov 2020 22:05:28 +0000 (14:05 -0800)
The --stdout and --output-directory options are mutually exclusive, but
it's hard to tell from reading the code. We have three separate
conditionals that check for use_stdout, and it's only after we've set up
the output_directory fully that we check whether the user also specified
--stdout.

Instead, let's check the exclusion explicitly first, then have a single
conditional that handles stdout versus an output directory. This is
slightly easier to follow now, and also will keep things sane when we
add another output mode in a future patch.

We'll add a few tests as well, covering the mutual exclusion and the
fact that we are not confused by a configured output directory.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/log.c
t/t4014-format-patch.sh

index 0a7ed4bef92b91e75bd8c580544bdd81caea9102..81144626b590f0dfce1afacf4d1ca4aac47c9bc9 100644 (file)
@@ -1942,20 +1942,20 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        if (rev.show_notes)
                load_display_notes(&rev.notes_opt);
 
-       if (!output_directory && !use_stdout)
-               output_directory = config_output_directory;
+       if (use_stdout + !!output_directory > 1)
+               die(_("--stdout and --output-directory are mutually exclusive"));
 
-       if (!use_stdout)
-               output_directory = set_outdir(prefix, output_directory);
-       else
+       if (use_stdout) {
                setup_pager();
-
-       if (output_directory) {
+       } else {
                int saved;
+
+               if (!output_directory)
+                       output_directory = config_output_directory;
+               output_directory = set_outdir(prefix, output_directory);
+
                if (rev.diffopt.use_color != GIT_COLOR_ALWAYS)
                        rev.diffopt.use_color = GIT_COLOR_NEVER;
-               if (use_stdout)
-                       die(_("standard output, or directory, which one?"));
                /*
                 * We consider <outdir> as 'outside of gitdir', therefore avoid
                 * applying adjust_shared_perm in s-c-l-d.
index 294e76c860cf29103422657f5840ef4ce0723812..e8d6156a6ae7b2bfffc377ed939b08d87c24c354 100755 (executable)
@@ -1919,6 +1919,19 @@ test_expect_success 'format-patch -o overrides format.outputDirectory' '
        test_path_is_dir patchset
 '
 
+test_expect_success 'format-patch forbids multiple outputs' '
+       rm -fr outdir &&
+       test_must_fail \
+               git format-patch --stdout --output-directory=outdir
+'
+
+test_expect_success 'configured outdir does not conflict with output options' '
+       rm -fr outdir &&
+       test_config format.outputDirectory outdir &&
+       git format-patch --stdout &&
+       test_path_is_missing outdir
+'
+
 test_expect_success 'format-patch --base' '
        git checkout patchid &&