]> asedeno.scripts.mit.edu Git - git.git/blobdiff - builtin/grep.c
Merge branch 'maint'
[git.git] / builtin / grep.c
index 1e8b9465ed509122f298aa1b9aa21f3d70e3297d..cf6c29fa42d96f8bc8282e779617a60d40796166 100644 (file)
@@ -564,7 +564,7 @@ static void append_path(struct grep_opt *opt, const void *data, size_t len)
 
        if (len == 1 && *(const char *)data == '\0')
                return;
-       string_list_append(xstrndup(data, len), path_list);
+       string_list_append(path_list, xstrndup(data, len));
 }
 
 static void run_pager(struct grep_opt *opt, const char *prefix)
@@ -770,11 +770,15 @@ static int file_callback(const struct option *opt, const char *arg, int unset)
        if (!patterns)
                die_errno("cannot open '%s'", arg);
        while (strbuf_getline(&sb, patterns, '\n') == 0) {
+               char *s;
+               size_t len;
+
                /* ignore empty line like grep does */
                if (sb.len == 0)
                        continue;
-               append_grep_pattern(grep_opt, strbuf_detach(&sb, NULL), arg,
-                                   ++lno, GREP_PATTERN);
+
+               s = strbuf_detach(&sb, &len);
+               append_grep_pat(grep_opt, s, len, arg, ++lno, GREP_PATTERN);
        }
        fclose(patterns);
        strbuf_release(&sb);
@@ -828,11 +832,11 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
        int cached = 0;
        int seen_dashdash = 0;
        int external_grep_allowed__ignored;
-       int show_in_pager = 0;
+       const char *show_in_pager = NULL, *default_pager = "dummy";
        struct grep_opt opt;
        struct object_array list = { 0, 0, NULL };
        const char **paths = NULL;
-       struct string_list path_list = { NULL, 0, 0, 0 };
+       struct string_list path_list = STRING_LIST_INIT_NODUP;
        int i;
        int dummy;
        int nongit = 0, use_index = 1;
@@ -916,8 +920,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                OPT_BOOLEAN(0, "all-match", &opt.all_match,
                        "show only matches from files that match all patterns"),
                OPT_GROUP(""),
-               OPT_BOOLEAN('O', "open-files-in-pager", &show_in_pager,
-                       "show matching files in the pager"),
+               { OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager,
+                       "pager", "show matching files in the pager",
+                       PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager },
                OPT_BOOLEAN(0, "ext-grep", &external_grep_allowed__ignored,
                            "allow calling of grep(1) (ignored by this build)"),
                { OPTION_CALLBACK, 0, "help-all", &options, NULL, "show usage",
@@ -993,18 +998,16 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                argc--;
        }
 
+       if (show_in_pager == default_pager)
+               show_in_pager = git_pager(1);
        if (show_in_pager) {
-               const char *pager = git_pager(1);
-               if (!pager) {
-                       show_in_pager = 0;
-               } else {
-                       opt.name_only = 1;
-                       opt.null_following_name = 1;
-                       opt.output_priv = &path_list;
-                       opt.output = append_path;
-                       string_list_append(pager, &path_list);
-                       use_threads = 0;
-               }
+               opt.color = 0;
+               opt.name_only = 1;
+               opt.null_following_name = 1;
+               opt.output_priv = &path_list;
+               opt.output = append_path;
+               string_list_append(&path_list, show_in_pager);
+               use_threads = 0;
        }
 
        if (!opt.pattern_list)
@@ -1078,7 +1081,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                        strbuf_addf(&buf, "+/%s%s",
                                        strcmp("less", pager) ? "" : "*",
                                        opt.pattern_list->pattern);
-                       string_list_append(buf.buf, &path_list);
+                       string_list_append(&path_list, buf.buf);
                        strbuf_detach(&buf, NULL);
                }
        }