@@ -1149,6 +1149,63 @@ static int format_trailer_match_cb(const struct strbuf *key, void *ud)
1149
1149
return 0 ;
1150
1150
}
1151
1151
1152
+ int format_set_trailers_options (struct process_trailer_options * opts ,
1153
+ struct string_list * filter_list ,
1154
+ struct strbuf * sepbuf ,
1155
+ struct strbuf * kvsepbuf ,
1156
+ const char * * arg ,
1157
+ char * * invalid_arg )
1158
+ {
1159
+ for (;;) {
1160
+ const char * argval ;
1161
+ size_t arglen ;
1162
+
1163
+ if (* * arg == ')' )
1164
+ break ;
1165
+
1166
+ if (match_placeholder_arg_value (* arg , "key" , arg , & argval , & arglen )) {
1167
+ uintptr_t len = arglen ;
1168
+
1169
+ if (!argval )
1170
+ return -1 ;
1171
+
1172
+ if (len && argval [len - 1 ] == ':' )
1173
+ len -- ;
1174
+ string_list_append (filter_list , argval )-> util = (char * )len ;
1175
+
1176
+ opts -> filter = format_trailer_match_cb ;
1177
+ opts -> filter_data = filter_list ;
1178
+ opts -> only_trailers = 1 ;
1179
+ } else if (match_placeholder_arg_value (* arg , "separator" , arg , & argval , & arglen )) {
1180
+ char * fmt ;
1181
+
1182
+ strbuf_reset (sepbuf );
1183
+ fmt = xstrndup (argval , arglen );
1184
+ strbuf_expand (sepbuf , fmt , strbuf_expand_literal_cb , NULL );
1185
+ free (fmt );
1186
+ opts -> separator = sepbuf ;
1187
+ } else if (match_placeholder_arg_value (* arg , "key_value_separator" , arg , & argval , & arglen )) {
1188
+ char * fmt ;
1189
+
1190
+ strbuf_reset (kvsepbuf );
1191
+ fmt = xstrndup (argval , arglen );
1192
+ strbuf_expand (kvsepbuf , fmt , strbuf_expand_literal_cb , NULL );
1193
+ free (fmt );
1194
+ opts -> key_value_separator = kvsepbuf ;
1195
+ } else if (!match_placeholder_bool_arg (* arg , "only" , arg , & opts -> only_trailers ) &&
1196
+ !match_placeholder_bool_arg (* arg , "unfold" , arg , & opts -> unfold ) &&
1197
+ !match_placeholder_bool_arg (* arg , "keyonly" , arg , & opts -> key_only ) &&
1198
+ !match_placeholder_bool_arg (* arg , "valueonly" , arg , & opts -> value_only )) {
1199
+ if (invalid_arg ) {
1200
+ size_t len = strcspn (* arg , ",)" );
1201
+ * invalid_arg = xstrndup (* arg , len );
1202
+ }
1203
+ return -1 ;
1204
+ }
1205
+ }
1206
+ return 0 ;
1207
+ }
1208
+
1152
1209
static size_t format_commit_one (struct strbuf * sb , /* in UTF-8 */
1153
1210
const char * placeholder ,
1154
1211
void * context )
@@ -1429,45 +1486,8 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
1429
1486
1430
1487
if (* arg == ':' ) {
1431
1488
arg ++ ;
1432
- for (;;) {
1433
- const char * argval ;
1434
- size_t arglen ;
1435
-
1436
- if (match_placeholder_arg_value (arg , "key" , & arg , & argval , & arglen )) {
1437
- uintptr_t len = arglen ;
1438
-
1439
- if (!argval )
1440
- goto trailer_out ;
1441
-
1442
- if (len && argval [len - 1 ] == ':' )
1443
- len -- ;
1444
- string_list_append (& filter_list , argval )-> util = (char * )len ;
1445
-
1446
- opts .filter = format_trailer_match_cb ;
1447
- opts .filter_data = & filter_list ;
1448
- opts .only_trailers = 1 ;
1449
- } else if (match_placeholder_arg_value (arg , "separator" , & arg , & argval , & arglen )) {
1450
- char * fmt ;
1451
-
1452
- strbuf_reset (& sepbuf );
1453
- fmt = xstrndup (argval , arglen );
1454
- strbuf_expand (& sepbuf , fmt , strbuf_expand_literal_cb , NULL );
1455
- free (fmt );
1456
- opts .separator = & sepbuf ;
1457
- } else if (match_placeholder_arg_value (arg , "key_value_separator" , & arg , & argval , & arglen )) {
1458
- char * fmt ;
1459
-
1460
- strbuf_reset (& kvsepbuf );
1461
- fmt = xstrndup (argval , arglen );
1462
- strbuf_expand (& kvsepbuf , fmt , strbuf_expand_literal_cb , NULL );
1463
- free (fmt );
1464
- opts .key_value_separator = & kvsepbuf ;
1465
- } else if (!match_placeholder_bool_arg (arg , "only" , & arg , & opts .only_trailers ) &&
1466
- !match_placeholder_bool_arg (arg , "unfold" , & arg , & opts .unfold ) &&
1467
- !match_placeholder_bool_arg (arg , "keyonly" , & arg , & opts .key_only ) &&
1468
- !match_placeholder_bool_arg (arg , "valueonly" , & arg , & opts .value_only ))
1469
- break ;
1470
- }
1489
+ if (format_set_trailers_options (& opts , & filter_list , & sepbuf , & kvsepbuf , & arg , NULL ))
1490
+ goto trailer_out ;
1471
1491
}
1472
1492
if (* arg == ')' ) {
1473
1493
format_trailers_from_commit (sb , msg + c -> subject_off , & opts );
0 commit comments