Re: [PATCH v2] abbrev: allow extending beyond 20 chars to disambiguate
- From
brian m. carlson <sandals@crustytoothpaste.net>
- Date
- Aug 11, 2025, 22:23 UTC
- Message-ID
- <aJptcgwQmwIbnrqE@fruit.crustytoothpaste.net>
- In-Reply-To
- <xmqqzfc51xvk.fsf@gitster.g>
On 2025-08-11 at 19:06:39, Junio C Hamano wrote:
Show 34 quoted lines
> diff --git a/object-name.c b/object-name.c
> index 11aa0e6afc..8f9af57c0a 100644
> --- a/object-name.c
> +++ b/object-name.c
> @@ -680,6 +680,7 @@ static unsigned msb(unsigned long val)
> struct min_abbrev_data {
> unsigned int init_len;
> unsigned int cur_len;
> + unsigned int max_len;
> char *hex;
> struct repository *repo;
> const struct object_id *oid;
> @@ -699,12 +700,12 @@ static inline char get_hex_char_from_oid(const struct object_id *oid,
> static int extend_abbrev_len(const struct object_id *oid, void *cb_data)
> {
> struct min_abbrev_data *mad = cb_data;
> -
> unsigned int i = mad->init_len;
> +
> while (mad->hex[i] && mad->hex[i] == get_hex_char_from_oid(oid, i))
> i++;
>
> - if (i < GIT_MAX_RAWSZ && i >= mad->cur_len)
> + if (mad->cur_len <= i && i < mad->max_len)
> mad->cur_len = i + 1;
>
> return 0;
> @@ -864,6 +865,7 @@ int repo_find_unique_abbrev_r(struct repository *r, char *hex,
> mad.repo = r;
> mad.init_len = len;
> mad.cur_len = len;
> + mad.max_len = hexsz;
> mad.hex = hex;
> mad.oid = oid;This definitely looks more sensible, since we're using the algorithm specified in the passed in `oid` variable in `repo_find_unique_abbrev_r` to determine the length.
I will admit that despite having touched this code recently in my SHA-1/SHA-256 interoperability work, I'm definitely not an expert in this area, so while I don't see anything that stands out to me as wrong, you probably will want someone else to verify here.
-- brian m. carlson (they/them) Toronto, Ontario, CA