aboutsummaryrefslogtreecommitdiff
path: root/object-name.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2026-03-20 08:07:37 +0100
committerJunio C Hamano <gitster@pobox.com>2026-03-20 13:16:42 -0700
commit1a2842d1b1e91d5e068d231cf4df4e783bdf9205 (patch)
tree40dbc8c53872fb0f02b8030d59ecb9e24171ba3a /object-name.c
parent67f47eab61c3a2c14f2d0351c3844f12fbd95dd2 (diff)
downloadgit-1a2842d1b1e91d5e068d231cf4df4e783bdf9205.tar.xz
object-name: simplify computing common prefixes
The function `extend_abbrev_len()` computes the length of common hex characters between two object IDs. This is done by: - Making the caller provide the `hex` string for the needle object ID. - Comparing every hex position of the haystack object ID with `get_hex_char_from_oid()`. Turning the binary representation into hex first is roundabout though: we can simply compare the binary representation and give some special attention to the final nibble. Introduce a new function `oid_common_prefix_hexlen()` that does exactly this and refactor the code to use the new function. This allows us to drop the `struct min_abbrev_data::hex` field. Furthermore, this function will be used in by some other callsites in subsequent commits. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'object-name.c')
-rw-r--r--object-name.c23
1 files changed, 3 insertions, 20 deletions
diff --git a/object-name.c b/object-name.c
index d82fb49f39..32e9c23e40 100644
--- a/object-name.c
+++ b/object-name.c
@@ -585,32 +585,16 @@ static unsigned msb(unsigned long val)
struct min_abbrev_data {
unsigned int init_len;
unsigned int cur_len;
- char *hex;
struct repository *repo;
const struct object_id *oid;
};
-static inline char get_hex_char_from_oid(const struct object_id *oid,
- unsigned int pos)
-{
- static const char hex[] = "0123456789abcdef";
-
- if ((pos & 1) == 0)
- return hex[oid->hash[pos >> 1] >> 4];
- else
- return hex[oid->hash[pos >> 1] & 0xf];
-}
-
static int extend_abbrev_len(const struct object_id *oid,
struct min_abbrev_data *mad)
{
- unsigned int i = mad->init_len;
- while (mad->hex[i] && mad->hex[i] == get_hex_char_from_oid(oid, i))
- i++;
-
- if (mad->hex[i] && i >= mad->cur_len)
- mad->cur_len = i + 1;
-
+ unsigned len = oid_common_prefix_hexlen(oid, mad->oid);
+ if (len != hash_algos[oid->algo].hexsz && len >= mad->cur_len)
+ mad->cur_len = len + 1;
return 0;
}
@@ -785,7 +769,6 @@ int repo_find_unique_abbrev_r(struct repository *r, char *hex,
mad.repo = r;
mad.init_len = len;
mad.cur_len = len;
- mad.hex = hex;
mad.oid = oid;
find_abbrev_len_packed(&mad);