@@ -260,6 +260,53 @@ static int wait_all(void)
260
260
}
261
261
#endif
262
262
263
+ static int parse_pattern_type_arg (const char * opt , const char * arg )
264
+ {
265
+ if (!strcmp (arg , "default" ))
266
+ return GREP_PATTERN_TYPE_UNSPECIFIED ;
267
+ else if (!strcmp (arg , "basic" ))
268
+ return GREP_PATTERN_TYPE_BRE ;
269
+ else if (!strcmp (arg , "extended" ))
270
+ return GREP_PATTERN_TYPE_ERE ;
271
+ else if (!strcmp (arg , "fixed" ))
272
+ return GREP_PATTERN_TYPE_FIXED ;
273
+ else if (!strcmp (arg , "perl" ))
274
+ return GREP_PATTERN_TYPE_PCRE ;
275
+ die ("bad %s argument: %s" , opt , arg );
276
+ }
277
+
278
+ static void grep_pattern_type_options (const int pattern_type , struct grep_opt * opt )
279
+ {
280
+ switch (pattern_type ) {
281
+ case GREP_PATTERN_TYPE_UNSPECIFIED :
282
+ /* fall through */
283
+
284
+ case GREP_PATTERN_TYPE_BRE :
285
+ opt -> fixed = 0 ;
286
+ opt -> pcre = 0 ;
287
+ opt -> regflags &= ~REG_EXTENDED ;
288
+ break ;
289
+
290
+ case GREP_PATTERN_TYPE_ERE :
291
+ opt -> fixed = 0 ;
292
+ opt -> pcre = 0 ;
293
+ opt -> regflags |= REG_EXTENDED ;
294
+ break ;
295
+
296
+ case GREP_PATTERN_TYPE_FIXED :
297
+ opt -> fixed = 1 ;
298
+ opt -> pcre = 0 ;
299
+ opt -> regflags &= ~REG_EXTENDED ;
300
+ break ;
301
+
302
+ case GREP_PATTERN_TYPE_PCRE :
303
+ opt -> fixed = 0 ;
304
+ opt -> pcre = 1 ;
305
+ opt -> regflags &= ~REG_EXTENDED ;
306
+ break ;
307
+ }
308
+ }
309
+
263
310
static int grep_config (const char * var , const char * value , void * cb )
264
311
{
265
312
struct grep_opt * opt = cb ;
@@ -270,12 +317,17 @@ static int grep_config(const char *var, const char *value, void *cb)
270
317
271
318
if (!strcmp (var , "grep.extendedregexp" )) {
272
319
if (git_config_bool (var , value ))
273
- opt -> regflags |= REG_EXTENDED ;
320
+ opt -> extended_regexp_option = 1 ;
274
321
else
275
- opt -> regflags &= ~ REG_EXTENDED ;
322
+ opt -> extended_regexp_option = 0 ;
276
323
return 0 ;
277
324
}
278
325
326
+ if (!strcmp (var , "grep.patterntype" )) {
327
+ opt -> pattern_type_option = parse_pattern_type_arg (var , value );
328
+ return 0 ;
329
+ }
330
+
279
331
if (!strcmp (var , "grep.linenumber" )) {
280
332
opt -> linenum = git_config_bool (var , value );
281
333
return 0 ;
@@ -669,14 +721,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
669
721
int i ;
670
722
int dummy ;
671
723
int use_index = 1 ;
672
- enum {
673
- pattern_type_unspecified = 0 ,
674
- pattern_type_bre ,
675
- pattern_type_ere ,
676
- pattern_type_fixed ,
677
- pattern_type_pcre ,
678
- };
679
- int pattern_type = pattern_type_unspecified ;
724
+ int pattern_type_arg = GREP_PATTERN_TYPE_UNSPECIFIED ;
680
725
681
726
struct option options [] = {
682
727
OPT_BOOLEAN (0 , "cached" , & cached ,
@@ -703,18 +748,18 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
703
748
"descend at most <depth> levels" , PARSE_OPT_NONEG ,
704
749
NULL , 1 },
705
750
OPT_GROUP ("" ),
706
- OPT_SET_INT ('E' , "extended-regexp" , & pattern_type ,
751
+ OPT_SET_INT ('E' , "extended-regexp" , & pattern_type_arg ,
707
752
"use extended POSIX regular expressions" ,
708
- pattern_type_ere ),
709
- OPT_SET_INT ('G' , "basic-regexp" , & pattern_type ,
753
+ GREP_PATTERN_TYPE_ERE ),
754
+ OPT_SET_INT ('G' , "basic-regexp" , & pattern_type_arg ,
710
755
"use basic POSIX regular expressions (default)" ,
711
- pattern_type_bre ),
712
- OPT_SET_INT ('F' , "fixed-strings" , & pattern_type ,
756
+ GREP_PATTERN_TYPE_BRE ),
757
+ OPT_SET_INT ('F' , "fixed-strings" , & pattern_type_arg ,
713
758
"interpret patterns as fixed strings" ,
714
- pattern_type_fixed ),
715
- OPT_SET_INT ('P' , "perl-regexp" , & pattern_type ,
759
+ GREP_PATTERN_TYPE_FIXED ),
760
+ OPT_SET_INT ('P' , "perl-regexp" , & pattern_type_arg ,
716
761
"use Perl-compatible regular expressions" ,
717
- pattern_type_pcre ),
762
+ GREP_PATTERN_TYPE_PCRE ),
718
763
OPT_GROUP ("" ),
719
764
OPT_BOOLEAN ('n' , "line-number" , & opt .linenum , "show line numbers" ),
720
765
OPT_NEGBIT ('h' , NULL , & opt .pathname , "don't show filenames" , 1 ),
@@ -799,6 +844,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
799
844
opt .header_tail = & opt .header_list ;
800
845
opt .regflags = REG_NEWLINE ;
801
846
opt .max_depth = -1 ;
847
+ opt .pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED ;
848
+ opt .extended_regexp_option = 0 ;
802
849
803
850
strcpy (opt .color_context , "" );
804
851
strcpy (opt .color_filename , "" );
@@ -824,28 +871,13 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
824
871
PARSE_OPT_KEEP_DASHDASH |
825
872
PARSE_OPT_STOP_AT_NON_OPTION |
826
873
PARSE_OPT_NO_INTERNAL_HELP );
827
- switch (pattern_type ) {
828
- case pattern_type_fixed :
829
- opt .fixed = 1 ;
830
- opt .pcre = 0 ;
831
- break ;
832
- case pattern_type_bre :
833
- opt .fixed = 0 ;
834
- opt .pcre = 0 ;
835
- opt .regflags &= ~REG_EXTENDED ;
836
- break ;
837
- case pattern_type_ere :
838
- opt .fixed = 0 ;
839
- opt .pcre = 0 ;
840
- opt .regflags |= REG_EXTENDED ;
841
- break ;
842
- case pattern_type_pcre :
843
- opt .fixed = 0 ;
844
- opt .pcre = 1 ;
845
- break ;
846
- default :
847
- break ; /* nothing */
848
- }
874
+
875
+ if (pattern_type_arg != GREP_PATTERN_TYPE_UNSPECIFIED )
876
+ grep_pattern_type_options (pattern_type_arg , & opt );
877
+ else if (opt .pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED )
878
+ grep_pattern_type_options (opt .pattern_type_option , & opt );
879
+ else if (opt .extended_regexp_option )
880
+ grep_pattern_type_options (GREP_PATTERN_TYPE_ERE , & opt );
849
881
850
882
if (use_index && !startup_info -> have_repository )
851
883
/* die the same way as if we did it at the beginning */
0 commit comments