Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Merge branch 'jc/pickaxe-ignore-case'

By Junio C Hamano (2) and Ramsay Jones (1)
* jc/pickaxe-ignore-case:
  ctype.c: Fix a sparse warning
  pickaxe: allow -i to search in patch case-insensitively
  grep: use static trans-case table
  • Loading branch information...
commit 1e4d0875acbce3c881bc1de66c8900cdc240ebe8 2 parents 713194c + f1589d1
Junio C Hamano authored March 07, 2012
36  ctype.c
@@ -25,3 +25,39 @@ unsigned char sane_ctype[256] = {
25 25
 	A, A, A, A, A, A, A, A, A, A, A, R, R, 0, P, 0,		/* 112..127 */
26 26
 	/* Nothing in the 128.. range */
27 27
 };
  28
+
  29
+/* For case-insensitive kwset */
  30
+const char tolower_trans_tbl[256] = {
  31
+	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  32
+	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  33
+	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  34
+	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  35
+	 ' ',  '!',  '"',  '#',  '$',  '%',  '&', 0x27,
  36
+	 '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
  37
+	 '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
  38
+	 '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
  39
+	 '@',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
  40
+	 'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
  41
+	 'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
  42
+	 'x',  'y',  'z',  '[', 0x5c,  ']',  '^',  '_',
  43
+	 '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
  44
+	 'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
  45
+	 'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
  46
+	 'x',  'y',  'z',  '{',  '|',  '}',  '~', 0x7f,
  47
+	0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
  48
+	0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
  49
+	0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
  50
+	0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
  51
+	0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
  52
+	0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
  53
+	0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
  54
+	0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
  55
+	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
  56
+	0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
  57
+	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
  58
+	0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
  59
+	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
  60
+	0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
  61
+	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
  62
+	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
  63
+};
1  diff.h
@@ -82,6 +82,7 @@ typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data)
82 82
 #define DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG (1 << 27)
83 83
 #define DIFF_OPT_DIRSTAT_BY_LINE     (1 << 28)
84 84
 #define DIFF_OPT_FUNCCONTEXT         (1 << 29)
  85
+#define DIFF_OPT_PICKAXE_IGNORE_CASE (1 << 30)
85 86
 
86 87
 #define DIFF_OPT_TST(opts, flag)    ((opts)->flags & DIFF_OPT_##flag)
87 88
 #define DIFF_OPT_SET(opts, flag)    ((opts)->flags |= DIFF_OPT_##flag)
9  diffcore-pickaxe.c
@@ -138,8 +138,12 @@ static void diffcore_pickaxe_grep(struct diff_options *o)
138 138
 {
139 139
 	int err;
140 140
 	regex_t regex;
  141
+	int cflags = REG_EXTENDED | REG_NEWLINE;
141 142
 
142  
-	err = regcomp(&regex, o->pickaxe, REG_EXTENDED | REG_NEWLINE);
  143
+	if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
  144
+		cflags |= REG_ICASE;
  145
+
  146
+	err = regcomp(&regex, o->pickaxe, cflags);
143 147
 	if (err) {
144 148
 		char errbuf[1024];
145 149
 		regerror(err, &regex, errbuf, 1024);
@@ -237,7 +241,8 @@ static void diffcore_pickaxe_count(struct diff_options *o)
237 241
 		}
238 242
 		regexp = &regex;
239 243
 	} else {
240  
-		kws = kwsalloc(NULL);
  244
+		kws = kwsalloc(DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE)
  245
+			       ? tolower_trans_tbl : NULL);
241 246
 		kwsincr(kws, needle, len);
242 247
 		kwsprep(kws);
243 248
 	}
3  git-compat-util.h
@@ -457,6 +457,9 @@ static inline int has_extension(const char *filename, const char *ext)
457 457
 	return len > extlen && !memcmp(filename + len - extlen, ext, extlen);
458 458
 }
459 459
 
  460
+/* in ctype.c, for kwset users */
  461
+extern const char tolower_trans_tbl[256];
  462
+
460 463
 /* Sane ctype - no locale, and works with signed chars */
461 464
 #undef isascii
462 465
 #undef isspace
11  grep.c
@@ -168,15 +168,10 @@ static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
168 168
 		p->fixed = 0;
169 169
 
170 170
 	if (p->fixed) {
171  
-		if (opt->regflags & REG_ICASE || p->ignore_case) {
172  
-			static char trans[256];
173  
-			int i;
174  
-			for (i = 0; i < 256; i++)
175  
-				trans[i] = tolower(i);
176  
-			p->kws = kwsalloc(trans);
177  
-		} else {
  171
+		if (opt->regflags & REG_ICASE || p->ignore_case)
  172
+			p->kws = kwsalloc(tolower_trans_tbl);
  173
+		else
178 174
 			p->kws = kwsalloc(NULL);
179  
-		}
180 175
 		kwsincr(p->kws, p->pattern, p->patternlen);
181 176
 		kwsprep(p->kws);
182 177
 		return;
1  revision.c
@@ -1582,6 +1582,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
1582 1582
 		revs->grep_filter.regflags |= REG_EXTENDED;
1583 1583
 	} else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) {
1584 1584
 		revs->grep_filter.regflags |= REG_ICASE;
  1585
+		DIFF_OPT_SET(&revs->diffopt, PICKAXE_IGNORE_CASE);
1585 1586
 	} else if (!strcmp(arg, "--fixed-strings") || !strcmp(arg, "-F")) {
1586 1587
 		revs->grep_filter.fixed = 1;
1587 1588
 	} else if (!strcmp(arg, "--all-match")) {
119  t/t4209-log-pickaxe.sh
... ...
@@ -0,0 +1,119 @@
  1
+#!/bin/sh
  2
+
  3
+test_description='log --grep/--author/--regexp-ignore-case/-S/-G'
  4
+. ./test-lib.sh
  5
+
  6
+test_expect_success setup '
  7
+	>file &&
  8
+	git add file &&
  9
+	test_tick &&
  10
+	git commit -m initial &&
  11
+
  12
+	echo Picked >file &&
  13
+	test_tick &&
  14
+	git commit -a --author="Another Person <another@example.com>" -m second
  15
+'
  16
+
  17
+test_expect_success 'log --grep' '
  18
+	git log --grep=initial --format=%H >actual &&
  19
+	git rev-parse --verify HEAD^ >expect &&
  20
+	test_cmp expect actual
  21
+'
  22
+
  23
+test_expect_success 'log --grep --regexp-ignore-case' '
  24
+	git log --regexp-ignore-case --grep=InItial --format=%H >actual &&
  25
+	git rev-parse --verify HEAD^ >expect &&
  26
+	test_cmp expect actual
  27
+'
  28
+
  29
+test_expect_success 'log --grep -i' '
  30
+	git log -i --grep=InItial --format=%H >actual &&
  31
+	git rev-parse --verify HEAD^ >expect &&
  32
+	test_cmp expect actual
  33
+'
  34
+
  35
+test_expect_success 'log --author --regexp-ignore-case' '
  36
+	git log --regexp-ignore-case --author=person --format=%H >actual &&
  37
+	git rev-parse --verify HEAD >expect &&
  38
+	test_cmp expect actual
  39
+'
  40
+
  41
+test_expect_success 'log --author -i' '
  42
+	git log -i --author=person --format=%H >actual &&
  43
+	git rev-parse --verify HEAD >expect &&
  44
+	test_cmp expect actual
  45
+'
  46
+
  47
+test_expect_success 'log -G (nomatch)' '
  48
+	git log -Gpicked --format=%H >actual &&
  49
+	>expect &&
  50
+	test_cmp expect actual
  51
+'
  52
+
  53
+test_expect_success 'log -G (match)' '
  54
+	git log -GPicked --format=%H >actual &&
  55
+	git rev-parse --verify HEAD >expect &&
  56
+	test_cmp expect actual
  57
+'
  58
+
  59
+test_expect_success 'log -G --regexp-ignore-case (nomatch)' '
  60
+	git log --regexp-ignore-case -Gpickle --format=%H >actual &&
  61
+	>expect &&
  62
+	test_cmp expect actual
  63
+'
  64
+
  65
+test_expect_success 'log -G -i (nomatch)' '
  66
+	git log -i -Gpickle --format=%H >actual &&
  67
+	>expect &&
  68
+	test_cmp expect actual
  69
+'
  70
+
  71
+test_expect_success 'log -G --regexp-ignore-case (match)' '
  72
+	git log --regexp-ignore-case -Gpicked --format=%H >actual &&
  73
+	git rev-parse --verify HEAD >expect &&
  74
+	test_cmp expect actual
  75
+'
  76
+
  77
+test_expect_success 'log -G -i (match)' '
  78
+	git log -i -Gpicked --format=%H >actual &&
  79
+	git rev-parse --verify HEAD >expect &&
  80
+	test_cmp expect actual
  81
+'
  82
+
  83
+test_expect_success 'log -S (nomatch)' '
  84
+	git log -Spicked --format=%H >actual &&
  85
+	>expect &&
  86
+	test_cmp expect actual
  87
+'
  88
+
  89
+test_expect_success 'log -S (match)' '
  90
+	git log -SPicked --format=%H >actual &&
  91
+	git rev-parse --verify HEAD >expect &&
  92
+	test_cmp expect actual
  93
+'
  94
+
  95
+test_expect_success 'log -S --regexp-ignore-case (match)' '
  96
+	git log --regexp-ignore-case -Spicked --format=%H >actual &&
  97
+	git rev-parse --verify HEAD >expect &&
  98
+	test_cmp expect actual
  99
+'
  100
+
  101
+test_expect_success 'log -S -i (match)' '
  102
+	git log -i -Spicked --format=%H >actual &&
  103
+	git rev-parse --verify HEAD >expect &&
  104
+	test_cmp expect actual
  105
+'
  106
+
  107
+test_expect_success 'log -S --regexp-ignore-case (nomatch)' '
  108
+	git log --regexp-ignore-case -Spickle --format=%H >actual &&
  109
+	>expect &&
  110
+	test_cmp expect actual
  111
+'
  112
+
  113
+test_expect_success 'log -S -i (nomatch)' '
  114
+	git log -i -Spickle --format=%H >actual &&
  115
+	>expect &&
  116
+	test_cmp expect actual
  117
+'
  118
+
  119
+test_done

0 notes on commit 1e4d087

Please sign in to comment.
Something went wrong with that request. Please try again.