@@ -24,7 +24,7 @@ struct config_source {
24
24
size_t pos ;
25
25
} buf ;
26
26
} u ;
27
- const char * origin_type ;
27
+ enum config_origin_type origin_type ;
28
28
const char * name ;
29
29
const char * path ;
30
30
int die_on_error ;
@@ -245,6 +245,7 @@ int git_config_from_parameters(config_fn_t fn, void *data)
245
245
246
246
memset (& source , 0 , sizeof (source ));
247
247
source .prev = cf ;
248
+ source .origin_type = CONFIG_ORIGIN_CMDLINE ;
248
249
cf = & source ;
249
250
250
251
/* sq_dequote will write over it */
@@ -453,6 +454,8 @@ static int git_parse_source(config_fn_t fn, void *data)
453
454
int comment = 0 ;
454
455
int baselen = 0 ;
455
456
struct strbuf * var = & cf -> var ;
457
+ int error_return = 0 ;
458
+ char * error_msg = NULL ;
456
459
457
460
/* U+FEFF Byte Order Mark in UTF8 */
458
461
const char * bomptr = utf8_bom ;
@@ -507,10 +510,40 @@ static int git_parse_source(config_fn_t fn, void *data)
507
510
if (get_value (fn , data , var ) < 0 )
508
511
break ;
509
512
}
513
+
514
+ switch (cf -> origin_type ) {
515
+ case CONFIG_ORIGIN_BLOB :
516
+ error_msg = xstrfmt (_ ("bad config line %d in blob %s" ),
517
+ cf -> linenr , cf -> name );
518
+ break ;
519
+ case CONFIG_ORIGIN_FILE :
520
+ error_msg = xstrfmt (_ ("bad config line %d in file %s" ),
521
+ cf -> linenr , cf -> name );
522
+ break ;
523
+ case CONFIG_ORIGIN_STDIN :
524
+ error_msg = xstrfmt (_ ("bad config line %d in standard input" ),
525
+ cf -> linenr );
526
+ break ;
527
+ case CONFIG_ORIGIN_SUBMODULE_BLOB :
528
+ error_msg = xstrfmt (_ ("bad config line %d in submodule-blob %s" ),
529
+ cf -> linenr , cf -> name );
530
+ break ;
531
+ case CONFIG_ORIGIN_CMDLINE :
532
+ error_msg = xstrfmt (_ ("bad config line %d in command line %s" ),
533
+ cf -> linenr , cf -> name );
534
+ break ;
535
+ default :
536
+ error_msg = xstrfmt (_ ("bad config line %d in %s" ),
537
+ cf -> linenr , cf -> name );
538
+ }
539
+
510
540
if (cf -> die_on_error )
511
- die (_ ( "bad config line %d in %s %s" ), cf -> linenr , cf -> origin_type , cf -> name );
541
+ die ("%s" , error_msg );
512
542
else
513
- return error (_ ("bad config line %d in %s %s" ), cf -> linenr , cf -> origin_type , cf -> name );
543
+ error_return = error ("%s" , error_msg );
544
+
545
+ free (error_msg );
546
+ return error_return ;
514
547
}
515
548
516
549
static int parse_unit_factor (const char * end , uintmax_t * val )
@@ -619,16 +652,47 @@ int git_parse_ulong(const char *value, unsigned long *ret)
619
652
NORETURN
620
653
static void die_bad_number (const char * name , const char * value )
621
654
{
622
- const char * reason = errno == ERANGE ?
623
- "out of range" :
624
- "invalid unit" ;
625
655
if (!value )
626
656
value = "" ;
627
657
628
- if (cf && cf -> origin_type && cf -> name )
629
- die (_ ("bad numeric config value '%s' for '%s' in %s %s: %s" ),
630
- value , name , cf -> origin_type , cf -> name , reason );
631
- die (_ ("bad numeric config value '%s' for '%s': %s" ), value , name , reason );
658
+ if (!(cf && cf -> name ))
659
+ die (errno == ERANGE
660
+ ? _ ("bad numeric config value '%s' for '%s': out of range" )
661
+ : _ ("bad numeric config value '%s' for '%s': invalid unit" ),
662
+ value , name );
663
+
664
+ switch (cf -> origin_type ) {
665
+ case CONFIG_ORIGIN_BLOB :
666
+ die (errno == ERANGE
667
+ ? _ ("bad numeric config value '%s' for '%s' in blob %s: out of range" )
668
+ : _ ("bad numeric config value '%s' for '%s' in blob %s: invalid unit" ),
669
+ value , name , cf -> name );
670
+ case CONFIG_ORIGIN_FILE :
671
+ die (errno == ERANGE
672
+ ? _ ("bad numeric config value '%s' for '%s' in file %s: out of range" )
673
+ : _ ("bad numeric config value '%s' for '%s' in file %s: invalid unit" ),
674
+ value , name , cf -> name );
675
+ case CONFIG_ORIGIN_STDIN :
676
+ die (errno == ERANGE
677
+ ? _ ("bad numeric config value '%s' for '%s' in standard input: out of range" )
678
+ : _ ("bad numeric config value '%s' for '%s' in standard input: invalid unit" ),
679
+ value , name );
680
+ case CONFIG_ORIGIN_SUBMODULE_BLOB :
681
+ die (errno == ERANGE
682
+ ? _ ("bad numeric config value '%s' for '%s' in submodule-blob %s: out of range" )
683
+ : _ ("bad numeric config value '%s' for '%s' in submodule-blob %s: invalid unit" ),
684
+ value , name , cf -> name );
685
+ case CONFIG_ORIGIN_CMDLINE :
686
+ die (errno == ERANGE
687
+ ? _ ("bad numeric config value '%s' for '%s' in command line %s: out of range" )
688
+ : _ ("bad numeric config value '%s' for '%s' in command line %s: invalid unit" ),
689
+ value , name , cf -> name );
690
+ default :
691
+ die (errno == ERANGE
692
+ ? _ ("bad numeric config value '%s' for '%s' in %s: out of range" )
693
+ : _ ("bad numeric config value '%s' for '%s' in %s: invalid unit" ),
694
+ value , name , cf -> name );
695
+ }
632
696
}
633
697
634
698
int git_config_int (const char * name , const char * value )
@@ -1110,7 +1174,8 @@ static int do_config_from(struct config_source *top, config_fn_t fn, void *data)
1110
1174
}
1111
1175
1112
1176
static int do_config_from_file (config_fn_t fn ,
1113
- const char * origin_type , const char * name , const char * path , FILE * f ,
1177
+ const enum config_origin_type origin_type ,
1178
+ const char * name , const char * path , FILE * f ,
1114
1179
void * data )
1115
1180
{
1116
1181
struct config_source top ;
@@ -1129,7 +1194,7 @@ static int do_config_from_file(config_fn_t fn,
1129
1194
1130
1195
static int git_config_from_stdin (config_fn_t fn , void * data )
1131
1196
{
1132
- return do_config_from_file (fn , "standard input" , "" , NULL , stdin , data );
1197
+ return do_config_from_file (fn , CONFIG_ORIGIN_STDIN , "" , NULL , stdin , data );
1133
1198
}
1134
1199
1135
1200
int git_config_from_file (config_fn_t fn , const char * filename , void * data )
@@ -1140,14 +1205,14 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data)
1140
1205
f = fopen (filename , "r" );
1141
1206
if (f ) {
1142
1207
flockfile (f );
1143
- ret = do_config_from_file (fn , "file" , filename , filename , f , data );
1208
+ ret = do_config_from_file (fn , CONFIG_ORIGIN_FILE , filename , filename , f , data );
1144
1209
funlockfile (f );
1145
1210
fclose (f );
1146
1211
}
1147
1212
return ret ;
1148
1213
}
1149
1214
1150
- int git_config_from_mem (config_fn_t fn , const char * origin_type ,
1215
+ int git_config_from_mem (config_fn_t fn , const enum config_origin_type origin_type ,
1151
1216
const char * name , const char * buf , size_t len , void * data )
1152
1217
{
1153
1218
struct config_source top ;
@@ -1184,7 +1249,7 @@ static int git_config_from_blob_sha1(config_fn_t fn,
1184
1249
return error ("reference '%s' does not point to a blob" , name );
1185
1250
}
1186
1251
1187
- ret = git_config_from_mem (fn , "blob" , name , buf , size , data );
1252
+ ret = git_config_from_mem (fn , CONFIG_ORIGIN_BLOB , name , buf , size , data );
1188
1253
free (buf );
1189
1254
1190
1255
return ret ;
@@ -1395,12 +1460,12 @@ static int configset_add_value(struct config_set *cs, const char *key, const cha
1395
1460
if (cf -> name ) {
1396
1461
kv_info -> filename = strintern (cf -> name );
1397
1462
kv_info -> linenr = cf -> linenr ;
1398
- kv_info -> origin_type = strintern ( cf -> origin_type ) ;
1463
+ kv_info -> origin_type = cf -> origin_type ;
1399
1464
} else {
1400
1465
/* for values read from `git_config_from_parameters()` */
1401
1466
kv_info -> filename = NULL ;
1402
1467
kv_info -> linenr = -1 ;
1403
- kv_info -> origin_type = NULL ;
1468
+ kv_info -> origin_type = CONFIG_ORIGIN_CMDLINE ;
1404
1469
}
1405
1470
kv_info -> scope = current_parsing_scope ;
1406
1471
si -> util = kv_info ;
@@ -2481,14 +2546,28 @@ int parse_config_key(const char *var,
2481
2546
2482
2547
const char * current_config_origin_type (void )
2483
2548
{
2484
- const char * type ;
2549
+ int type ;
2485
2550
if (current_config_kvi )
2486
2551
type = current_config_kvi -> origin_type ;
2487
2552
else if (cf )
2488
2553
type = cf -> origin_type ;
2489
2554
else
2490
2555
die ("BUG: current_config_origin_type called outside config callback" );
2491
- return type ? type : "command line" ;
2556
+
2557
+ switch (type ) {
2558
+ case CONFIG_ORIGIN_BLOB :
2559
+ return "blob" ;
2560
+ case CONFIG_ORIGIN_FILE :
2561
+ return "file" ;
2562
+ case CONFIG_ORIGIN_STDIN :
2563
+ return "standard input" ;
2564
+ case CONFIG_ORIGIN_SUBMODULE_BLOB :
2565
+ return "submodule-blob" ;
2566
+ case CONFIG_ORIGIN_CMDLINE :
2567
+ return "command line" ;
2568
+ default :
2569
+ die ("BUG: unknown config origin type" );
2570
+ }
2492
2571
}
2493
2572
2494
2573
const char * current_config_name (void )
0 commit comments