@@ -20,10 +20,15 @@ struct disambiguate_state {
2020 unsigned candidate_ok :1 ;
2121 unsigned disambiguate_fn_used :1 ;
2222 unsigned ambiguous :1 ;
23+ unsigned always_call_fn :1 ;
2324};
2425
2526static void update_candidates (struct disambiguate_state * ds , const unsigned char * current )
2627{
28+ if (ds -> always_call_fn ) {
29+ ds -> ambiguous = ds -> fn (current , ds -> cb_data ) ? 1 : 0 ;
30+ return ;
31+ }
2732 if (!ds -> candidate_exists ) {
2833 /* this is the first candidate */
2934 hashcpy (ds -> candidate , current );
@@ -272,17 +277,12 @@ static int disambiguate_blob_only(const unsigned char *sha1, void *cb_data_unuse
272277 return kind == OBJ_BLOB ;
273278}
274279
275- static int get_short_sha1 (const char * name , int len , unsigned char * sha1 ,
276- unsigned flags )
280+ static int prepare_prefixes (const char * name , int len ,
281+ unsigned char * bin_pfx ,
282+ char * hex_pfx )
277283{
278- int i , status ;
279- char hex_pfx [40 ];
280- unsigned char bin_pfx [20 ];
281- struct disambiguate_state ds ;
282- int quietly = !!(flags & GET_SHA1_QUIETLY );
284+ int i ;
283285
284- if (len < MINIMUM_ABBREV || len > 40 )
285- return -1 ;
286286 hashclr (bin_pfx );
287287 memset (hex_pfx , 'x' , 40 );
288288 for (i = 0 ; i < len ;i ++ ) {
@@ -303,6 +303,22 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
303303 val <<= 4 ;
304304 bin_pfx [i >> 1 ] |= val ;
305305 }
306+ return 0 ;
307+ }
308+
309+ static int get_short_sha1 (const char * name , int len , unsigned char * sha1 ,
310+ unsigned flags )
311+ {
312+ int status ;
313+ char hex_pfx [40 ];
314+ unsigned char bin_pfx [20 ];
315+ struct disambiguate_state ds ;
316+ int quietly = !!(flags & GET_SHA1_QUIETLY );
317+
318+ if (len < MINIMUM_ABBREV || len > 40 )
319+ return -1 ;
320+ if (prepare_prefixes (name , len , bin_pfx , hex_pfx ) < 0 )
321+ return -1 ;
306322
307323 prepare_alt_odb ();
308324
@@ -327,6 +343,31 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
327343 return status ;
328344}
329345
346+
347+ int for_each_abbrev (const char * prefix , each_abbrev_fn fn , void * cb_data )
348+ {
349+ char hex_pfx [40 ];
350+ unsigned char bin_pfx [20 ];
351+ struct disambiguate_state ds ;
352+ int len = strlen (prefix );
353+
354+ if (len < MINIMUM_ABBREV || len > 40 )
355+ return -1 ;
356+ if (prepare_prefixes (prefix , len , bin_pfx , hex_pfx ) < 0 )
357+ return -1 ;
358+
359+ prepare_alt_odb ();
360+
361+ memset (& ds , 0 , sizeof (ds ));
362+ ds .always_call_fn = 1 ;
363+ ds .cb_data = cb_data ;
364+ ds .fn = fn ;
365+
366+ find_short_object_filename (len , hex_pfx , & ds );
367+ find_short_packed_object (len , bin_pfx , & ds );
368+ return ds .ambiguous ;
369+ }
370+
330371const char * find_unique_abbrev (const unsigned char * sha1 , int len )
331372{
332373 int status , exists ;
0 commit comments