aboutsummaryrefslogtreecommitdiffstats
path: root/builtin/diff-pairs.c
diff options
context:
space:
mode:
authorJustin Tobler <jltobler@gmail.com>2025-02-28 15:33:46 -0600
committerJunio C Hamano <gitster@pobox.com>2025-03-03 08:17:47 -0800
commitcf15095ec52f1e997ec9eef42bdf275d2a68fe66 (patch)
treee413d7d7fc680a6d3d9da72960adad54acaee993 /builtin/diff-pairs.c
parentbuiltin: introduce diff-pairs command (diff)
downloadgit-cf15095ec52f1e997ec9eef42bdf275d2a68fe66.tar.gz
git-cf15095ec52f1e997ec9eef42bdf275d2a68fe66.zip
builtin/diff-pairs: allow explicit diff queue flush
The diffs queued from git-diff-pairs(1) are flushed when stdin is closed. To enable greater flexibility, allow control over when the diff queue is flushed by writing a single NUL byte on stdin between input file pairs. Diff output between flushes is separated by a single NUL byte. Signed-off-by: Justin Tobler <jltobler@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/diff-pairs.c')
-rw-r--r--builtin/diff-pairs.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/builtin/diff-pairs.c b/builtin/diff-pairs.c
index 6be17c1abd..71c045331a 100644
--- a/builtin/diff-pairs.c
+++ b/builtin/diff-pairs.c
@@ -57,6 +57,7 @@ int cmd_diff_pairs(int argc, const char **argv, const char *prefix,
show_usage_with_options_if_asked(argc, argv, builtin_diff_pairs_usage, parseopts);
repo_config(repo, git_diff_basic_config, NULL);
+ revs.diffopt.no_free = 1;
revs.disable_stdin = 1;
revs.abbrev = 0;
revs.diff = 1;
@@ -106,6 +107,18 @@ int cmd_diff_pairs(int argc, const char **argv, const char *prefix,
break;
p = meta.buf;
+ if (!*p) {
+ diffcore_std(&revs.diffopt);
+ diff_flush(&revs.diffopt);
+ /*
+ * When the diff queue is explicitly flushed, append a
+ * NUL byte to separate batches of diffs.
+ */
+ fputc('\0', revs.diffopt.file);
+ fflush(revs.diffopt.file);
+ continue;
+ }
+
if (*p != ':')
die(_("invalid raw diff input"));
p++;
@@ -179,6 +192,7 @@ int cmd_diff_pairs(int argc, const char **argv, const char *prefix,
}
}
+ revs.diffopt.no_free = 0;
diffcore_std(&revs.diffopt);
diff_flush(&revs.diffopt);
ret = diff_result_code(&revs);