Am 12.11.2018 um 15:50 schrieb Jeff King:
> --- a/sha1-file.c
> +++ b/sha1-file.c
> @@ -2125,6 +2125,32 @@ int for_each_loose_object(each_loose_object_fn cb, 
> void *data,
>       return 0;
>  }
>  
> +static int append_loose_object(const struct object_id *oid, const char *path,
> +                            void *data)
> +{
> +     oid_array_append(data, oid);
> +     return 0;
> +}
> +
> +void odb_load_loose_cache(struct object_directory *odb, int subdir_nr)
> +{
> +     struct strbuf buf = STRBUF_INIT;
> +
> +     if (subdir_nr < 0 ||

Why not make subdir_nr unsigned (like in for_each_file_in_obj_subdir()), and
get rid of this first check?

> +         subdir_nr >= ARRAY_SIZE(odb->loose_objects_subdir_seen))

Using unsigned char for subdir_nr would allow removing the second check as
well, but might hide invalid values in implicit conversions, I guess.

> +             BUG("subdir_nr out of range");

Showing the invalid value (like in for_each_file_in_obj_subdir()) would make
debugging easier in case the impossible actually happens.

> +
> +     if (odb->loose_objects_subdir_seen[subdir_nr])
> +             return;
> +
> +     strbuf_addstr(&buf, odb->path);
> +     for_each_file_in_obj_subdir(subdir_nr, &buf,
> +                                 append_loose_object,
> +                                 NULL, NULL,
> +                                 &odb->loose_objects_cache);
> +     odb->loose_objects_subdir_seen[subdir_nr] = 1;

About here would be the ideal new home for ...

> +}
> +
>  static int check_stream_sha1(git_zstream *stream,
>                            const char *hdr,
>                            unsigned long size,
> diff --git a/sha1-name.c b/sha1-name.c
> index 358ca5e288..b24502811b 100644
> --- a/sha1-name.c
> +++ b/sha1-name.c
> @@ -83,36 +83,19 @@ static void update_candidates(struct disambiguate_state 
> *ds, const struct object
>       /* otherwise, current can be discarded and candidate is still good */
>  }
>  
> -static int append_loose_object(const struct object_id *oid, const char *path,
> -                            void *data)
> -{
> -     oid_array_append(data, oid);
> -     return 0;
> -}
> -
>  static int match_sha(unsigned, const unsigned char *, const unsigned char *);
>  
>  static void find_short_object_filename(struct disambiguate_state *ds)
>  {
>       int subdir_nr = ds->bin_pfx.hash[0];
>       struct object_directory *odb;
> -     struct strbuf buf = STRBUF_INIT;
>  
>       for (odb = the_repository->objects->odb;
>            odb && !ds->ambiguous;
>            odb = odb->next) {
>               int pos;
>  
> -             if (!odb->loose_objects_subdir_seen[subdir_nr]) {
> -                     strbuf_reset(&buf);
> -                     strbuf_addstr(&buf, odb->path);
> -                     for_each_file_in_obj_subdir(subdir_nr, &buf,
> -                                                 append_loose_object,
> -                                                 NULL, NULL,
> -                                                 &odb->loose_objects_cache);
> -                     odb->loose_objects_subdir_seen[subdir_nr] = 1;
> -             }
> -
> +             odb_load_loose_cache(odb, subdir_nr);
>               pos = oid_array_lookup(&odb->loose_objects_cache, &ds->bin_pfx);
>               if (pos < 0)
>                       pos = -1 - pos;
> @@ -125,8 +108,6 @@ static void find_short_object_filename(struct 
> disambiguate_state *ds)
>                       pos++;
>               }
>       }
> -
> -     strbuf_release(&buf);

... this line.

>  }
>  
>  static int match_sha(unsigned len, const unsigned char *a, const unsigned 
> char *b)
> 

Reply via email to