summaryrefslogtreecommitdiff
path: root/diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2024-05-15 09:52:54 -0700
committerJunio C Hamano <gitster@pobox.com>2024-05-15 09:52:54 -0700
commit068df18c90c335ebe28bda285e742a6408eec3b5 (patch)
treef40261ce76b81d8cdbce26bab8c8633d417acaad /diff.c
parent3fc99d037f10dcce9c1f5e5723ebbf9fc7f1e897 (diff)
parent11be65cfa43416219e85384a3a80d672b65b76ba (diff)
Merge branch 'rs/external-diff-with-exit-code'
The "--exit-code" option of "git diff" command learned to work with the "--ext-diff" option. * rs/external-diff-with-exit-code: diff: fix --exit-code with external diff diff: report unmerged paths as changes in run_diff_cmd()
Diffstat (limited to 'diff.c')
-rw-r--r--diff.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/diff.c b/diff.c
index 108c187577..cd3c8a3978 100644
--- a/diff.c
+++ b/diff.c
@@ -40,6 +40,7 @@
#include "setup.h"
#include "strmap.h"
#include "ws.h"
+#include "write-or-die.h"
#ifdef NO_FAST_WORKING_DIRECTORY
#define FAST_WORKING_DIRECTORY 0
@@ -4404,8 +4405,33 @@ static void run_external_diff(const char *pgm,
diff_free_filespec_data(one);
diff_free_filespec_data(two);
cmd.use_shell = 1;
- if (run_command(&cmd))
- die(_("external diff died, stopping at %s"), name);
+ if (o->flags.diff_from_contents) {
+ int got_output = 0;
+ cmd.out = -1;
+ if (start_command(&cmd))
+ die(_("external diff died, stopping at %s"), name);
+ for (;;) {
+ char buffer[8192];
+ ssize_t len = xread(cmd.out, buffer, sizeof(buffer));
+ if (!len)
+ break;
+ if (len < 0)
+ die(_("unable to read from external diff,"
+ " stopping at %s"), name);
+ got_output = 1;
+ if (write_in_full(1, buffer, len) < 0)
+ die(_("unable to write output of external diff,"
+ " stopping at %s"), name);
+ }
+ close(cmd.out);
+ if (finish_command(&cmd))
+ die(_("external diff died, stopping at %s"), name);
+ if (got_output)
+ o->found_changes = 1;
+ } else {
+ if (run_command(&cmd))
+ die(_("external diff died, stopping at %s"), name);
+ }
remove_tempfile();
}
@@ -4555,6 +4581,7 @@ static void run_diff_cmd(const char *pgm,
o, complete_rewrite);
} else {
fprintf(o->file, "* Unmerged path %s\n", name);
+ o->found_changes = 1;
}
}
@@ -4851,6 +4878,7 @@ void diff_setup_done(struct diff_options *options)
*/
if ((options->xdl_opts & XDF_WHITESPACE_FLAGS) ||
+ options->flags.exit_with_status ||
options->ignore_regex_nr)
options->flags.diff_from_contents = 1;
else
@@ -6741,7 +6769,7 @@ void diff_flush(struct diff_options *options)
if (output_format & DIFF_FORMAT_CALLBACK)
options->format_callback(q, options, options->format_callback_data);
- if (output_format & DIFF_FORMAT_NO_OUTPUT &&
+ if ((!output_format || output_format & DIFF_FORMAT_NO_OUTPUT) &&
options->flags.exit_with_status &&
options->flags.diff_from_contents) {
/*