diff options
| author | Elijah Newren <newren@gmail.com> | 2026-06-14 06:37:22 +0000 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-06-14 07:50:47 -0700 |
| commit | da80feb5be9076bb56af0681d684c36028f92ae6 (patch) | |
| tree | c7a41c6cdca624a16232d9095a844ef3fc6a4588 /gitweb/gitweb.css | |
| parent | 94f057755b7941b321fd11fec1b2e3ca5313a4e0 (diff) | |
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>
Diffstat (limited to 'gitweb/gitweb.css')
0 files changed, 0 insertions, 0 deletions
