Re* [PATCH 0/5] diff --ignore-case
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:53:06
Subsystem:
the rest · Maintainer:
Linus Torvalds
Junio C Hamano [off-list ref] writes:
Thomas Rast [off-list ref] writes:quoted
I wonder which one of us misunderstood the original request ;-)Heh, I did ;-)quoted
It was } Is there any way to run diff -G with a case insensitivity flag? and I took that to mean "I want to find addition/removal of a string like -G does, but I don't know how it was capitalized".I think it is just the matter of checking REG_ICASE that may be set in revs->grep_filter.regflags, and propagating it down to the regcomp at the beginning of diffcore_pickaxe_grep(). Want to try and see how well it works?
The gist of the patch should look like this. Even though I haven't done anything more than just to compile and run "git log -p -i -G search 233054d", it looks obviously correct ;-) Note that this does not depend on any of the "diff --ignore-case" topic, and it may conflict with [PATCH 6/5]. Among the two "else if" that flips the REG_ICASE in revision.c, it needs to be decided if only one of them, or both of them should set the new option. I haven't thought things through to decide which. diff.h | 1 + diffcore-pickaxe.c | 6 +++++- revision.c | 1 + 3 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/diff.h b/diff.h
index 7af5f1e..182cb0e 100644
--- a/diff.h
+++ b/diff.h@@ -82,6 +82,7 @@ typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data) #define DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG (1 << 27) #define DIFF_OPT_DIRSTAT_BY_LINE (1 << 28) #define DIFF_OPT_FUNCCONTEXT (1 << 29) +#define DIFF_OPT_PICKAXE_IGNORE_CASE (1 << 30) #define DIFF_OPT_TST(opts, flag) ((opts)->flags & DIFF_OPT_##flag) #define DIFF_OPT_SET(opts, flag) ((opts)->flags |= DIFF_OPT_##flag)
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index 380a837..8ffb741 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c@@ -138,8 +138,12 @@ static void diffcore_pickaxe_grep(struct diff_options *o) { int err; regex_t regex; + int cflags = REG_EXTENDED | REG_NEWLINE; - err = regcomp(®ex, o->pickaxe, REG_EXTENDED | REG_NEWLINE); + if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE)) + cflags |= REG_ICASE; + + err = regcomp(®ex, o->pickaxe, cflags); if (err) { char errbuf[1024]; regerror(err, ®ex, errbuf, 1024);
diff --git a/revision.c b/revision.c
index 819ff01..b3554ed 100644
--- a/revision.c
+++ b/revision.c@@ -1582,6 +1582,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->grep_filter.regflags |= REG_EXTENDED; } else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) { revs->grep_filter.regflags |= REG_ICASE; + DIFF_OPT_SET(&revs->diffopt, PICKAXE_IGNORE_CASE); } else if (!strcmp(arg, "--fixed-strings") || !strcmp(arg, "-F")) { revs->grep_filter.fixed = 1; } else if (!strcmp(arg, "--all-match")) {