Through git-diff(1) it is possible to generate a diff directly between two blobs. This is particularly useful when the pre-image and post-image blobs are known and we only care about the diff between them. Unfortunately, if a user has a batch of known blob pairs to compute diffs for, there is currently not a way to do so via a single Git process. To enable support for batch diffs of multiple blob pairs, this series introduces a new diff plumbing command git-diff-blob(1). Similar to git-diff-tree(1), it provides a "--stdin" option that reads a pair of blobs on each line of input and generates the diffs. This is intended to be used for scripting purposes where more fine-grained control for diff generation is desired. Below is an example for each usage: $ git diff-blob HEAD~5000:README.md HEAD:README.md $ git diff-blob --stdin <<EOF 88f126184c52bfe4859ec189d018872902e02a84 665ce5f5a83647619fba9157fa9b0141ae8b228b HEAD~5000:README.md HEAD:README.md EOF Some alternative approaches that were considered: Instead of creating a new plumbing command, the existing git-diff(1) could have been extended with a similar "--batch" option ("--stdin" is techinically already handled through setup_revisions() since it isn't disabled). This option could read from stdin and generate diffs for any valid revision pair that gets provided (not just blob diffs). The primary reason for not going down this route was that git-diff-tree(1) already has support for batch diff generation for commits/trees through its "--stdin" option and teaching git-diff(1) a superset of this functionality would further complicate this porcelain interface for something that seems like more of a plumbing feature. Another idea was to extend the existing git-diff-tree(1) to support generating diffs for blob pairs through its "--stdin" option. This didn't seem like a good fit either though as it is really outside the scope of responsibilities for that command. Ultimately I couldn't find an existing place that seemed like a good fit thus the new plumbing command route was chosen. I'm still not sure though if a standalone "diff-blob" command is the right choice here either. Its primary function of generating a single blob pair diff is a direct subset of git-diff(1) and is thus largely redundant. The only additional value comes from its "--stdin" option which enables batch processing. To an extent it seems much of the existing diff plumbing commands feature set can also be accessed through git-diff(1) so maybe this isn't a big deal. Feedback and suggestions are much appreciated. This series is structured as follows: - Patch 1 introduces the "diff-blob" plumbing command and its surrounding setup. - Patch 2 teaches "diff-blob" the "--stdin" option which allows multiple blob pair diffs to be specified and processed. - Patch 3 teaches "diff-blob" the "-z" option which, when used with "--stdin", uses the NUL character to delimit the inputed blobs and outputted diffs. The series is built on top of caacdb5d (The fifteenth batch, 2024-12-10) with ps/build at 904339ed (Introduce support for the Meson build system, 2024-12-06) merged into it. This is done so the new command is integrated with the meson build system. -Justin Justin Tobler (3): builtin: introduce diff-blob command builtin/diff-blob: add "--stdin" option builtin/diff-blob: Add "-z" option .gitignore | 1 + Documentation/git-diff-blob.txt | 39 +++++++ Documentation/meson.build | 1 + Makefile | 1 + builtin.h | 1 + builtin/diff-blob.c | 200 ++++++++++++++++++++++++++++++++ command-list.txt | 1 + git.c | 1 + meson.build | 1 + t/t4063-diff-blobs.sh | 108 ++++++++++------- 10 files changed, 309 insertions(+), 45 deletions(-) create mode 100644 Documentation/git-diff-blob.txt create mode 100644 builtin/diff-blob.c -- 2.47.1