object-name: backend-generic `get_short_oid()`

The function `get_short_oid()` takes as input an abbreviated object ID and tries to turn that object ID into the full object ID. This is done by iterating through all objects that have the user-provided prefix. If that yields exactly one object we know that the abbreviated object ID is unambiguous, otherwise it is ambiguous and we print the list of objects that match the prefix. We iterate through all objects with the given prefix by calling both `find_short_packed_object()` and `find_short_object_filename()`, which is of course specific to the "files" backend. But we now have a generic way to iterate through objects with a specific prefix. Refactor the code to use `odb_for_each_object()` instead so that it works with object backends different than the "files" backend. Remove the now-unused `find_short_packed_object()` function. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Mar 20, 2026 at 08:07 UTC eac58debd9f61391a61b832e3cee349a20bd2c4a
1 file changed +6 -26
object-name.c
+6 -26
@@ -120,28 +120,6 @@ static void find_short_object_filename(struct disambiguate_state *ds)
120 odb_source_loose_for_each_object(source, NULL, match_prefix, ds, &opts);
121 }
122
123 -static void find_short_packed_object(struct disambiguate_state *ds)
124 -{
125 - struct odb_for_each_object_options opts = {
126 - .prefix = &ds->bin_pfx,
127 - .prefix_hex_len = ds->len,
128 - };
129 - struct odb_source *source;
130 -
131 - /* Skip, unless oids from the storage hash algorithm are wanted */
132 - if (ds->bin_pfx.algo && (&hash_algos[ds->bin_pfx.algo] != ds->repo->hash_algo))
133 - return;
134 -
135 - odb_prepare_alternates(ds->repo->objects);
136 - for (source = ds->repo->objects->sources; source; source = source->next) {
137 - struct odb_source_files *files = odb_source_files_downcast(source);
138 -
139 - packfile_store_for_each_object(files->packed, NULL, match_prefix, ds, &opts);
140 - if (ds->ambiguous)
141 - break;
142 - }
143 -}
144 -
123 static int finish_object_disambiguation(struct disambiguate_state *ds,
124 struct object_id *oid)
125 {
@@ -499,6 +477,7 @@ static enum get_oid_result get_short_oid(struct repository *r,
477 struct object_id *oid,
478 unsigned flags)
479 {
480 + struct odb_for_each_object_options opts = { 0 };
481 int status;
482 struct disambiguate_state ds;
483 int quietly = !!(flags & GET_OID_QUIETLY);
@@ -526,8 +505,10 @@ static enum get_oid_result get_short_oid(struct repository *r,
505 else
506 ds.fn = default_disambiguate_hint;
507
529 - find_short_object_filename(&ds);
530 - find_short_packed_object(&ds);
508 + opts.prefix = &ds.bin_pfx;
509 + opts.prefix_hex_len = ds.len;
510 +
511 + odb_for_each_object_ext(r->objects, NULL, match_prefix, &ds, &opts);
512 status = finish_object_disambiguation(&ds, oid);
513
514 /*
@@ -537,8 +518,7 @@ static enum get_oid_result get_short_oid(struct repository *r,
518 */
519 if (status == MISSING_OBJECT) {
520 odb_reprepare(r->objects);
540 - find_short_object_filename(&ds);
541 - find_short_packed_object(&ds);
521 + odb_for_each_object_ext(r->objects, NULL, match_prefix, &ds, &opts);
522 status = finish_object_disambiguation(&ds, oid);
523 }
524