aboutsummaryrefslogtreecommitdiff
path: root/oidtree.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2026-03-20 08:07:28 +0100
committerJunio C Hamano <gitster@pobox.com>2026-03-20 13:16:22 -0700
commitfe446b01aeaab307adcbfb39d4aaa72c37afbcda (patch)
tree5f28e0581528e50f32f44120a8890a328b2e136f /oidtree.c
parent1382e54a9c9e5f98271a943af9c10299c6ba934b (diff)
downloadgit-fe446b01aeaab307adcbfb39d4aaa72c37afbcda.tar.xz
oidtree: extend iteration to allow for arbitrary return codes
The interface `cb_each()` iterates through a crit-bit tree and calls a specific callback function for each of the contained items. The callback function is expected to return either: - `CB_CONTINUE` in case iteration shall continue. - `CB_BREAK` to abort iteration. This is needlessly restrictive though, as callers may want to return arbitrary values and have them be bubbled up to the `cb_each()` call site. In fact, this is a rather common pattern we have: whenever such a callback function returns a non-zero error code, we abort iteration and bubble up the code as-is. Refactor both the crit-bit tree and oidtree subsystems to behave accordingly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'oidtree.c')
-rw-r--r--oidtree.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/oidtree.c b/oidtree.c
index a4d10cd429..ab9fe7ec7a 100644
--- a/oidtree.c
+++ b/oidtree.c
@@ -71,7 +71,7 @@ struct oidtree_each_data {
uint8_t last_byte;
};
-static enum cb_next iter(struct cb_node *n, void *cb_data)
+static int iter(struct cb_node *n, void *cb_data)
{
struct oidtree_each_data *data = cb_data;
struct object_id k;
@@ -80,18 +80,18 @@ static enum cb_next iter(struct cb_node *n, void *cb_data)
memcpy(&k, n->k, sizeof(k));
if (data->algo != GIT_HASH_UNKNOWN && data->algo != k.algo)
- return CB_CONTINUE;
+ return 0;
if (data->last_nibble_at) {
if ((k.hash[*data->last_nibble_at] ^ data->last_byte) & 0xf0)
- return CB_CONTINUE;
+ return 0;
}
return data->cb(&k, data->cb_data);
}
-void oidtree_each(struct oidtree *ot, const struct object_id *prefix,
- size_t prefix_hex_len, oidtree_each_cb cb, void *cb_data)
+int oidtree_each(struct oidtree *ot, const struct object_id *prefix,
+ size_t prefix_hex_len, oidtree_each_cb cb, void *cb_data)
{
struct oidtree_each_data data = {
.cb = cb,
@@ -106,5 +106,5 @@ void oidtree_each(struct oidtree *ot, const struct object_id *prefix,
data.last_nibble_at = &klen;
}
- cb_each(&ot->tree, prefix->hash, klen, iter, &data);
+ return cb_each(&ot->tree, prefix->hash, klen, iter, &data);
}