@@ -410,7 +410,8 @@ struct atom_value {
410
410
* Used to parse format string and sort specifiers
411
411
*/
412
412
static int parse_ref_filter_atom (const struct ref_format * format ,
413
- const char * atom , const char * ep )
413
+ const char * atom , const char * ep ,
414
+ struct strbuf * err )
414
415
{
415
416
const char * sp ;
416
417
const char * arg ;
@@ -420,7 +421,8 @@ static int parse_ref_filter_atom(const struct ref_format *format,
420
421
if (* sp == '*' && sp < ep )
421
422
sp ++ ; /* deref */
422
423
if (ep <= sp )
423
- die (_ ("malformed field name: %.*s" ), (int )(ep - atom ), atom );
424
+ return strbuf_addf_ret (err , -1 , _ ("malformed field name: %.*s" ),
425
+ (int )(ep - atom ), atom );
424
426
425
427
/* Do we have the atom already used elsewhere? */
426
428
for (i = 0 ; i < used_atom_cnt ; i ++ ) {
@@ -446,7 +448,8 @@ static int parse_ref_filter_atom(const struct ref_format *format,
446
448
}
447
449
448
450
if (ARRAY_SIZE (valid_atom ) <= i )
449
- die (_ ("unknown field name: %.*s" ), (int )(ep - atom ), atom );
451
+ return strbuf_addf_ret (err , -1 , _ ("unknown field name: %.*s" ),
452
+ (int )(ep - atom ), atom );
450
453
451
454
/* Add it in, including the deref prefix */
452
455
at = used_atom_cnt ;
@@ -728,17 +731,21 @@ int verify_ref_format(struct ref_format *format)
728
731
729
732
format -> need_color_reset_at_eol = 0 ;
730
733
for (cp = format -> format ; * cp && (sp = find_next (cp )); ) {
734
+ struct strbuf err = STRBUF_INIT ;
731
735
const char * color , * ep = strchr (sp , ')' );
732
736
int at ;
733
737
734
738
if (!ep )
735
739
return error (_ ("malformed format string %s" ), sp );
736
740
/* sp points at "%(" and ep points at the closing ")" */
737
- at = parse_ref_filter_atom (format , sp + 2 , ep );
741
+ at = parse_ref_filter_atom (format , sp + 2 , ep , & err );
742
+ if (at < 0 )
743
+ die ("%s" , err .buf );
738
744
cp = ep + 1 ;
739
745
740
746
if (skip_prefix (used_atom [at ].name , "color:" , & color ))
741
747
format -> need_color_reset_at_eol = !!strcmp (color , "reset" );
748
+ strbuf_release (& err );
742
749
}
743
750
if (format -> need_color_reset_at_eol && !want_color (format -> use_color ))
744
751
format -> need_color_reset_at_eol = 0 ;
@@ -2157,13 +2164,17 @@ int format_ref_array_item(struct ref_array_item *info,
2157
2164
2158
2165
for (cp = format -> format ; * cp && (sp = find_next (cp )); cp = ep + 1 ) {
2159
2166
struct atom_value * atomv ;
2167
+ int pos ;
2160
2168
2161
2169
ep = strchr (sp , ')' );
2162
2170
if (cp < sp )
2163
2171
append_literal (cp , sp , & state );
2164
- get_ref_atom_value (info ,
2165
- parse_ref_filter_atom (format , sp + 2 , ep ),
2166
- & atomv );
2172
+ pos = parse_ref_filter_atom (format , sp + 2 , ep , error_buf );
2173
+ if (pos < 0 ) {
2174
+ pop_stack_element (& state .stack );
2175
+ return -1 ;
2176
+ }
2177
+ get_ref_atom_value (info , pos , & atomv );
2167
2178
if (atomv -> handler (atomv , & state , error_buf )) {
2168
2179
pop_stack_element (& state .stack );
2169
2180
return -1 ;
@@ -2222,7 +2233,12 @@ static int parse_sorting_atom(const char *atom)
2222
2233
*/
2223
2234
struct ref_format dummy = REF_FORMAT_INIT ;
2224
2235
const char * end = atom + strlen (atom );
2225
- return parse_ref_filter_atom (& dummy , atom , end );
2236
+ struct strbuf err = STRBUF_INIT ;
2237
+ int res = parse_ref_filter_atom (& dummy , atom , end , & err );
2238
+ if (res < 0 )
2239
+ die ("%s" , err .buf );
2240
+ strbuf_release (& err );
2241
+ return res ;
2226
2242
}
2227
2243
2228
2244
/* If no sorting option is given, use refname to sort as default */
0 commit comments