From: Junio C Hamano Date: Tue, 19 Jul 2016 20:22:17 +0000 (-0700) Subject: Merge branch 'nd/icase' X-Git-Tag: v2.10.0-rc0~109 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/a883c31af66195556a775f75851f46573c98e43d Merge branch 'nd/icase' "git grep -i" has been taught to fold case in non-ascii locales correctly. * nd/icase: grep.c: reuse "icase" variable diffcore-pickaxe: support case insensitive match on non-ascii diffcore-pickaxe: Add regcomp_or_die() grep/pcre: support utf-8 gettext: add is_utf8_locale() grep/pcre: prepare locale-dependent tables for icase matching grep: rewrite an if/else condition to avoid duplicate expression grep/icase: avoid kwsset when -F is specified grep/icase: avoid kwsset on literal non-ascii strings test-regex: expose full regcomp() to the command line test-regex: isolate the bug test code grep: break down an "if" stmt in preparation for next changes --- a883c31af66195556a775f75851f46573c98e43d diff --cc t/helper/test-regex.c index 0dc598ecdc,0000000000..eff26f534f mode 100644,000000..100644 --- a/t/helper/test-regex.c +++ b/t/helper/test-regex.c @@@ -1,20 -1,0 +1,75 @@@ +#include "git-compat-util.h" ++#include "gettext.h" + - int main(int argc, char **argv) ++struct reg_flag { ++ const char *name; ++ int flag; ++}; ++ ++static struct reg_flag reg_flags[] = { ++ { "EXTENDED", REG_EXTENDED }, ++ { "NEWLINE", REG_NEWLINE }, ++ { "ICASE", REG_ICASE }, ++ { "NOTBOL", REG_NOTBOL }, ++#ifdef REG_STARTEND ++ { "STARTEND", REG_STARTEND }, ++#endif ++ { NULL, 0 } ++}; ++ ++static int test_regex_bug(void) +{ + char *pat = "[^={} \t]+"; + char *str = "={}\nfred"; + regex_t r; + regmatch_t m[1]; + + if (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE)) + die("failed regcomp() for pattern '%s'", pat); + if (regexec(&r, str, 1, m, 0)) + die("no match of pattern '%s' to string '%s'", pat, str); + + /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957 */ + if (m[0].rm_so == 3) /* matches '\n' when it should not */ + die("regex bug confirmed: re-build git with NO_REGEX=1"); + - exit(0); ++ return 0; ++} ++ ++int main(int argc, char **argv) ++{ ++ const char *pat; ++ const char *str; ++ int flags = 0; ++ regex_t r; ++ regmatch_t m[1]; ++ ++ if (argc == 2 && !strcmp(argv[1], "--bug")) ++ return test_regex_bug(); ++ else if (argc < 3) ++ usage("test-regex --bug\n" ++ "test-regex []"); ++ ++ argv++; ++ pat = *argv++; ++ str = *argv++; ++ while (*argv) { ++ struct reg_flag *rf; ++ for (rf = reg_flags; rf->name; rf++) ++ if (!strcmp(*argv, rf->name)) { ++ flags |= rf->flag; ++ break; ++ } ++ if (!rf->name) ++ die("do not recognize %s", *argv); ++ argv++; ++ } ++ git_setup_gettext(); ++ ++ if (regcomp(&r, pat, flags)) ++ die("failed regcomp() for pattern '%s'", pat); ++ if (regexec(&r, str, 1, m, 0)) ++ return 1; ++ ++ return 0; +}