Jeff King <p...@peff.net> writes:

> We store the hex prefix in a 40-byte buffer with the prefix
> itself followed by 40-minus-len "x" characters. These x's
> serve no purpose, and the lack of NUL termination makes the
> prefix string annoying to use. Let's just terminate it.

> Note that this is in contrast to the binary prefix, which
> _must_ be zero-padded, because we look at the whole thing
> during a binary search to find the first potential match in
> each pack index. 

Makes sense.

> The loose-object hex search cannot use the
> same trick because it has to do a linear walk through the
> unsorted results of readdir() (and even if it could, you'd
> want zeroes instead of x's).

OK.

>  struct disambiguate_state {
>       int len; /* length of prefix in hex chars */
> -     char hex_pfx[GIT_SHA1_HEXSZ];
> +     char hex_pfx[GIT_SHA1_HEXSZ + 1];
>       unsigned char bin_pfx[GIT_SHA1_RAWSZ];
>  
>       disambiguate_hint_fn fn;
> @@ -291,7 +291,6 @@ static int init_object_disambiguation(const char *name, 
> int len,
>               return -1;
>  
>       memset(ds, 0, sizeof(*ds));
> -     memset(ds->hex_pfx, 'x', GIT_SHA1_HEXSZ);

As the whole thing is cleared here...

>  
>       for (i = 0; i < len ;i++) {
>               unsigned char c = name[i];
> @@ -313,6 +312,7 @@ static int init_object_disambiguation(const char *name, 
> int len,
>       }
>  
>       ds->len = len;
> +     ds->hex_pfx[len] = '\0';

... do we even need this one?  It would not hurt, though.

> @@ -351,7 +351,7 @@ static int get_short_sha1(const char *name, int len, 
> unsigned char *sha1,
>       status = finish_object_disambiguation(&ds, sha1);
>  
>       if (!quietly && (status == SHORT_NAME_AMBIGUOUS))
> -             return error("short SHA1 %.*s is ambiguous.", ds.len, 
> ds.hex_pfx);
> +             return error("short SHA1 %s is ambiguous.", ds.hex_pfx);

Makes sense.

Thanks.

Reply via email to