aboutsummaryrefslogtreecommitdiff
path: root/oidtree.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2026-04-06 15:42:48 -0700
committerJunio C Hamano <gitster@pobox.com>2026-04-06 15:42:49 -0700
commitd75badf83bc3fc8e47413970874bac681eeb5bbe (patch)
tree081e6d6ef91541664ae664acc0af7f8e7f943d01 /oidtree.c
parent2f8c3f6a5a6d6a3de205be709e1a598b9d4b0b3e (diff)
parent83869e15fa9ef3b0ea2adbfe2fe68a309f95b856 (diff)
downloadgit-d75badf83bc3fc8e47413970874bac681eeb5bbe.tar.xz
Merge branch 'ps/odb-generic-object-name-handling'
Object name handling (disambiguation and abbreviation) has been refactored to be backend-generic, moving logic into the respective object database backends. * ps/odb-generic-object-name-handling: odb: introduce generic `odb_find_abbrev_len()` object-file: move logic to compute packed abbreviation length object-name: move logic to compute loose abbreviation length object-name: simplify computing common prefixes object-name: abbreviate loose object names without `disambiguate_state` object-name: merge `update_candidates()` and `match_prefix()` object-name: backend-generic `get_short_oid()` object-name: backend-generic `repo_collect_ambiguous()` object-name: extract function to parse object ID prefixes object-name: move logic to iterate through packed prefixed objects object-name: move logic to iterate through loose prefixed objects odb: introduce `struct odb_for_each_object_options` oidtree: extend iteration to allow for arbitrary return codes oidtree: modernize the code a bit object-file: fix sparse 'plain integer as NULL pointer' error
Diffstat (limited to 'oidtree.c')
-rw-r--r--oidtree.c63
1 files changed, 32 insertions, 31 deletions
diff --git a/oidtree.c b/oidtree.c
index 324de94934..ab9fe7ec7a 100644
--- a/oidtree.c
+++ b/oidtree.c
@@ -6,14 +6,6 @@
#include "oidtree.h"
#include "hash.h"
-struct oidtree_iter_data {
- oidtree_iter fn;
- void *arg;
- size_t *last_nibble_at;
- uint32_t algo;
- uint8_t last_byte;
-};
-
void oidtree_init(struct oidtree *ot)
{
cb_init(&ot->tree);
@@ -54,8 +46,7 @@ void oidtree_insert(struct oidtree *ot, const struct object_id *oid)
cb_insert(&ot->tree, on, sizeof(*oid));
}
-
-int oidtree_contains(struct oidtree *ot, const struct object_id *oid)
+bool oidtree_contains(struct oidtree *ot, const struct object_id *oid)
{
struct object_id k;
size_t klen = sizeof(k);
@@ -69,41 +60,51 @@ int oidtree_contains(struct oidtree *ot, const struct object_id *oid)
klen += BUILD_ASSERT_OR_ZERO(offsetof(struct object_id, hash) <
offsetof(struct object_id, algo));
- return cb_lookup(&ot->tree, (const uint8_t *)&k, klen) ? 1 : 0;
+ return !!cb_lookup(&ot->tree, (const uint8_t *)&k, klen);
}
-static enum cb_next iter(struct cb_node *n, void *arg)
+struct oidtree_each_data {
+ oidtree_each_cb cb;
+ void *cb_data;
+ size_t *last_nibble_at;
+ uint32_t algo;
+ uint8_t last_byte;
+};
+
+static int iter(struct cb_node *n, void *cb_data)
{
- struct oidtree_iter_data *x = arg;
+ struct oidtree_each_data *data = cb_data;
struct object_id k;
/* Copy to provide 4-byte alignment needed by struct object_id. */
memcpy(&k, n->k, sizeof(k));
- if (x->algo != GIT_HASH_UNKNOWN && x->algo != k.algo)
- return CB_CONTINUE;
+ if (data->algo != GIT_HASH_UNKNOWN && data->algo != k.algo)
+ return 0;
- if (x->last_nibble_at) {
- if ((k.hash[*x->last_nibble_at] ^ x->last_byte) & 0xf0)
- return CB_CONTINUE;
+ if (data->last_nibble_at) {
+ if ((k.hash[*data->last_nibble_at] ^ data->last_byte) & 0xf0)
+ return 0;
}
- return x->fn(&k, x->arg);
+ return data->cb(&k, data->cb_data);
}
-void oidtree_each(struct oidtree *ot, const struct object_id *oid,
- size_t oidhexsz, oidtree_iter fn, void *arg)
+int oidtree_each(struct oidtree *ot, const struct object_id *prefix,
+ size_t prefix_hex_len, oidtree_each_cb cb, void *cb_data)
{
- size_t klen = oidhexsz / 2;
- struct oidtree_iter_data x = { 0 };
- assert(oidhexsz <= GIT_MAX_HEXSZ);
+ struct oidtree_each_data data = {
+ .cb = cb,
+ .cb_data = cb_data,
+ .algo = prefix->algo,
+ };
+ size_t klen = prefix_hex_len / 2;
+ assert(prefix_hex_len <= GIT_MAX_HEXSZ);
- x.fn = fn;
- x.arg = arg;
- x.algo = oid->algo;
- if (oidhexsz & 1) {
- x.last_byte = oid->hash[klen];
- x.last_nibble_at = &klen;
+ if (prefix_hex_len & 1) {
+ data.last_byte = prefix->hash[klen];
+ data.last_nibble_at = &klen;
}
- cb_each(&ot->tree, (const uint8_t *)oid, klen, iter, &x);
+
+ return cb_each(&ot->tree, prefix->hash, klen, iter, &data);
}