Jeff King <[email protected]> writes:
> This is not a lot of code, but it's a logical construct that
> should not need to be repeated (and we are about to add a
> third repetition).
Good, but I have two and a half tangential comments about the
context that appears in this patch ;-)
> void object_array_filter(struct object_array *array,
> object_array_each_func_t want, void *cb_data)
> {
> @@ -367,8 +377,7 @@ void object_array_filter(struct object_array *array,
> objects[dst] = objects[src];
> dst++;
> } else {
> - if (objects[src].name != object_array_slopbuf)
> - free(objects[src].name);
> + object_array_release_entry(&objects[src]);
> }
> }
> array->nr = dst;
> @@ -400,8 +409,7 @@ void object_array_remove_duplicates(struct object_array
> *array)
> objects[array->nr] = objects[src];
> array->nr++;
> } else {
> - if (objects[src].name != object_array_slopbuf)
> - free(objects[src].name);
> + object_array_release_entry(&objects[src]);
> }
> }
> }
1. These two functions both remove elements from a given array
in-place, the former being in a more generic form that takes a
caller-specified criterion while the latter uses a hardcoded
condition to decide what to filter. aeb4a51e (object_array:
add function object_array_filter(), 2013-05-25) and later
1506510c (object_array_remove_duplicates(): rewrite to reduce
copying, 2013-05-25) should have refactored the latter further
to implement it in terms of the former, perhaps?
1.5 I would have expected a function to "remove duplicates from an
array" to remove duplicates from the array by comparing the objects
contained in the array, not entries that may (or may not) point at
different objects but happens to share the same name; I think this
function is misnamed.
2. We use object_array_remove_duplicates() to de-dup "git bundle
create x master master", which came from b2a6d1c6 (bundle:
allow the same ref to be given more than once, 2009-01-17),
which is still the sole caller of the function, and I think
this is bogus. Comparing .name would not de-dup "git bundle
create x master refs/heads/master".
I think the right way to fix these two and a half problems is to do
the following:
- object_array_remove_duplicates() (and contains_name() helper it
uses) should be removed from object.c;
- create_bundle() in bundle.c should implement a helper that is
similar to contains_name() but knows about ref dwimming and use
it to call object_array_filter() to replace its call to
object_array_remove_duplicates().
I am not doing this myself, and I do not expect either you or
Michael to do so, either. I am just writing this down to point out
a low hanging fruit to aspiring new contributors (hint, hint).
Thanks.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html