On Wed, Aug 31, 2022 at 3:20 PM Junio C Hamano <gitster@xxxxxxxxx> wrote: > > "Elijah Newren via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > > > From: Elijah Newren <newren@xxxxxxxxx> > > > > Commit 95433eeed9 ("diff: add ability to insert additional headers for > > paths", 2022-02-02) introduced the possibility of additional headers, > > created in create_filepairs_for_header_only_notifications(). These are > > represented by inserting additional pairs in diff_queued_diff which > > always have a mode of 0 and a null_oid. When these were added, one > > code path was noted to assume that at least one of the diff_filespecs > > in the pair were valid, and that codepath was corrected. > > > > The submodule_format handling is another codepath with the same issue; > > it would operate on these additional headers and attempt to display them > > as submodule changes. Prevent that by explicitly checking for both > > modes being 0. > > It may make sense to give a concrete name for the condition these > new codepaths check, which presumably exists in the part that was > touched in 95433eeed9 when "that codepath was corrected". I think > you want to treat a diffpair with at least one side with non-zero > mode as a "real" thing (as opposed to the phony "additional headers" > hack), so perhaps > > int diff_filepair_is_phoney(struct diff_filespec *one, > struct diff_filespec *two) > { > return !DIFF_FILE_VALID(one) && !DIFF_FILE_VALID(two); > } > > or something like that. The use of the FILE_VALID macro here is > very much deliberate, and tries to match the more recent hack after > this hunk that says: > > if (!DIFF_FILE_VALID(one) && !DIFF_FILE_VALID(two)) { > /* > * We should only reach this point for pairs from > * create_filepairs_for_header_only_notifications(). For > * these, we should avoid the "/dev/null" special casing > * above, meaning we avoid showing such pairs as either > * "new file" or "deleted file" below. > */ > lbl[0] = a_one; > lbl[1] = b_two; > } > > We shouldn't expect readers to understand (one->mode || two->mode) > is about the same hack as the other one. I like that; I'll make that change.