]> git.ipfire.org Git - thirdparty/git.git/commit
merge-ort: propagate callback errors from traverse_trees_wrapper()
authorElijah Newren <newren@gmail.com>
Sun, 14 Jun 2026 06:37:22 +0000 (06:37 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sun, 14 Jun 2026 14:50:47 +0000 (07:50 -0700)
commitda80feb5be9076bb56af0681d684c36028f92ae6
treec7a41c6cdca624a16232d9095a844ef3fc6a4588
parent94f057755b7941b321fd11fec1b2e3ca5313a4e0
merge-ort: propagate callback errors from traverse_trees_wrapper()

traverse_trees_wrapper() saves entries from a first pass through
traverse_trees() and then replays them through the real callback
(collect_merge_info_callback).  However, the replay loop silently
discards the callback return value.  This is not a deferred error;
it is an ignored error.

Today the only originator of a negative return in this entire call
graph is traverse_trees()'s "exceeded maximum allowed tree depth"
check; everything else (collect_merge_info_callback,
traverse_trees_wrapper, the inner traverse_trees recursion) only
relays that.  So in current Git, the visible effect of dropping the
replay callback's return value is narrow but bad: a tree nested past
core.maxTreeDepth has its -1 swallowed, the subtree below the limit
is silently pruned, and the merge completes as if that were the
correct result.

A later patch in this series will teach collect_merge_info_callback()
to return -1 on an additional path -- detecting duplicate
entries in malformed trees -- which is similarly handled today by
just ignoring the problem (resulting in mostly a "last one wins" rule,
though the non-last entry can mutate various state flags).

Capture the return value, stop the loop on negative returns, and
propagate the error to the caller.  The callback returns a positive mask
value on success, so normalize non-negative returns to
0 for the caller.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
merge-ort.c