grep -I: do not bother to read known-binary files
[git/mingw/4msysgit.git] / builtin / grep.c
blob7e5b60a51696230f8971ea96fe527ea9a21cefa1
1 /*
2 * Builtin "git grep"
4 * Copyright (c) 2006 Junio C Hamano
5 */
6 #include "cache.h"
7 #include "blob.h"
8 #include "tree.h"
9 #include "commit.h"
10 #include "tag.h"
11 #include "tree-walk.h"
12 #include "builtin.h"
13 #include "parse-options.h"
14 #include "string-list.h"
15 #include "run-command.h"
16 #include "userdiff.h"
17 #include "grep.h"
18 #include "quote.h"
19 #include "dir.h"
20 #include "attr.h"
22 #ifndef NO_PTHREADS
23 #include <pthread.h>
24 #include "thread-utils.h"
25 #endif
27 static char const * const grep_usage[] = {
28 "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]",
29 NULL
32 static int use_threads = 1;
34 #ifndef NO_PTHREADS
35 #define THREADS 8
36 static pthread_t threads[THREADS];
38 static void *load_sha1(const unsigned char *sha1, unsigned long *size,
39 const char *name);
40 static void *load_file(const char *filename, size_t *sz);
42 enum work_type {WORK_SHA1, WORK_FILE};
44 /* We use one producer thread and THREADS consumer
45 * threads. The producer adds struct work_items to 'todo' and the
46 * consumers pick work items from the same array.
48 struct work_item
50 enum work_type type;
51 char *name;
53 /* if type == WORK_SHA1, then 'identifier' is a SHA1,
54 * otherwise type == WORK_FILE, and 'identifier' is a NUL
55 * terminated filename.
57 void *identifier;
58 char done;
59 struct strbuf out;
62 /* In the range [todo_done, todo_start) in 'todo' we have work_items
63 * that have been or are processed by a consumer thread. We haven't
64 * written the result for these to stdout yet.
66 * The work_items in [todo_start, todo_end) are waiting to be picked
67 * up by a consumer thread.
69 * The ranges are modulo TODO_SIZE.
71 #define TODO_SIZE 128
72 static struct work_item todo[TODO_SIZE];
73 static int todo_start;
74 static int todo_end;
75 static int todo_done;
77 /* Has all work items been added? */
78 static int all_work_added;
80 /* This lock protects all the variables above. */
81 static pthread_mutex_t grep_mutex;
83 /* Used to serialize calls to read_sha1_file. */
84 static pthread_mutex_t read_sha1_mutex;
86 #define grep_lock() pthread_mutex_lock(&grep_mutex)
87 #define grep_unlock() pthread_mutex_unlock(&grep_mutex)
88 #define read_sha1_lock() pthread_mutex_lock(&read_sha1_mutex)
89 #define read_sha1_unlock() pthread_mutex_unlock(&read_sha1_mutex)
91 /* Signalled when a new work_item is added to todo. */
92 static pthread_cond_t cond_add;
94 /* Signalled when the result from one work_item is written to
95 * stdout.
97 static pthread_cond_t cond_write;
99 /* Signalled when we are finished with everything. */
100 static pthread_cond_t cond_result;
102 static int print_hunk_marks_between_files;
103 static int printed_something;
105 static void add_work(enum work_type type, char *name, void *id)
107 grep_lock();
109 while ((todo_end+1) % ARRAY_SIZE(todo) == todo_done) {
110 pthread_cond_wait(&cond_write, &grep_mutex);
113 todo[todo_end].type = type;
114 todo[todo_end].name = name;
115 todo[todo_end].identifier = id;
116 todo[todo_end].done = 0;
117 strbuf_reset(&todo[todo_end].out);
118 todo_end = (todo_end + 1) % ARRAY_SIZE(todo);
120 pthread_cond_signal(&cond_add);
121 grep_unlock();
124 static struct work_item *get_work(void)
126 struct work_item *ret;
128 grep_lock();
129 while (todo_start == todo_end && !all_work_added) {
130 pthread_cond_wait(&cond_add, &grep_mutex);
133 if (todo_start == todo_end && all_work_added) {
134 ret = NULL;
135 } else {
136 ret = &todo[todo_start];
137 todo_start = (todo_start + 1) % ARRAY_SIZE(todo);
139 grep_unlock();
140 return ret;
143 static void grep_sha1_async(struct grep_opt *opt, char *name,
144 const unsigned char *sha1)
146 unsigned char *s;
147 s = xmalloc(20);
148 memcpy(s, sha1, 20);
149 add_work(WORK_SHA1, name, s);
152 static void grep_file_async(struct grep_opt *opt, char *name,
153 const char *filename)
155 add_work(WORK_FILE, name, xstrdup(filename));
158 static void work_done(struct work_item *w)
160 int old_done;
162 grep_lock();
163 w->done = 1;
164 old_done = todo_done;
165 for(; todo[todo_done].done && todo_done != todo_start;
166 todo_done = (todo_done+1) % ARRAY_SIZE(todo)) {
167 w = &todo[todo_done];
168 if (w->out.len) {
169 if (print_hunk_marks_between_files && printed_something)
170 write_or_die(1, "--\n", 3);
171 write_or_die(1, w->out.buf, w->out.len);
172 printed_something = 1;
174 free(w->name);
175 free(w->identifier);
178 if (old_done != todo_done)
179 pthread_cond_signal(&cond_write);
181 if (all_work_added && todo_done == todo_end)
182 pthread_cond_signal(&cond_result);
184 grep_unlock();
187 static int skip_binary(struct grep_opt *opt, const char *filename)
189 if ((opt->binary & GREP_BINARY_NOMATCH)) {
190 static struct git_attr *attr_text;
191 struct git_attr_check check;
193 if (!attr_text)
194 attr_text = git_attr("text");
195 memset(&check, 0, sizeof(check));
196 check.attr = attr_text;
197 return !git_checkattr(filename, 1, &check) &&
198 ATTR_FALSE(check.value);
200 return 0;
203 static void *run(void *arg)
205 int hit = 0;
206 struct grep_opt *opt = arg;
208 while (1) {
209 struct work_item *w = get_work();
210 if (!w)
211 break;
213 if (skip_binary(opt, (const char *)w->identifier))
214 continue;
216 opt->output_priv = w;
217 if (w->type == WORK_SHA1) {
218 unsigned long sz;
219 void* data = load_sha1(w->identifier, &sz, w->name);
221 if (data) {
222 hit |= grep_buffer(opt, w->name, data, sz);
223 free(data);
225 } else if (w->type == WORK_FILE) {
226 size_t sz;
227 void* data = load_file(w->identifier, &sz);
228 if (data) {
229 hit |= grep_buffer(opt, w->name, data, sz);
230 free(data);
232 } else {
233 assert(0);
236 work_done(w);
238 free_grep_patterns(arg);
239 free(arg);
241 return (void*) (intptr_t) hit;
244 static void strbuf_out(struct grep_opt *opt, const void *buf, size_t size)
246 struct work_item *w = opt->output_priv;
247 strbuf_add(&w->out, buf, size);
250 static void start_threads(struct grep_opt *opt)
252 int i;
254 pthread_mutex_init(&grep_mutex, NULL);
255 pthread_mutex_init(&read_sha1_mutex, NULL);
256 pthread_cond_init(&cond_add, NULL);
257 pthread_cond_init(&cond_write, NULL);
258 pthread_cond_init(&cond_result, NULL);
260 for (i = 0; i < ARRAY_SIZE(todo); i++) {
261 strbuf_init(&todo[i].out, 0);
264 for (i = 0; i < ARRAY_SIZE(threads); i++) {
265 int err;
266 struct grep_opt *o = grep_opt_dup(opt);
267 o->output = strbuf_out;
268 compile_grep_patterns(o);
269 err = pthread_create(&threads[i], NULL, run, o);
271 if (err)
272 die("grep: failed to create thread: %s",
273 strerror(err));
277 static int wait_all(void)
279 int hit = 0;
280 int i;
282 grep_lock();
283 all_work_added = 1;
285 /* Wait until all work is done. */
286 while (todo_done != todo_end)
287 pthread_cond_wait(&cond_result, &grep_mutex);
289 /* Wake up all the consumer threads so they can see that there
290 * is no more work to do.
292 pthread_cond_broadcast(&cond_add);
293 grep_unlock();
295 for (i = 0; i < ARRAY_SIZE(threads); i++) {
296 void *h;
297 pthread_join(threads[i], &h);
298 hit |= (int) (intptr_t) h;
301 pthread_mutex_destroy(&grep_mutex);
302 pthread_mutex_destroy(&read_sha1_mutex);
303 pthread_cond_destroy(&cond_add);
304 pthread_cond_destroy(&cond_write);
305 pthread_cond_destroy(&cond_result);
307 return hit;
309 #else /* !NO_PTHREADS */
310 #define read_sha1_lock()
311 #define read_sha1_unlock()
313 static int wait_all(void)
315 return 0;
317 #endif
319 static int grep_config(const char *var, const char *value, void *cb)
321 struct grep_opt *opt = cb;
322 char *color = NULL;
324 switch (userdiff_config(var, value)) {
325 case 0: break;
326 case -1: return -1;
327 default: return 0;
330 if (!strcmp(var, "color.grep"))
331 opt->color = git_config_colorbool(var, value, -1);
332 else if (!strcmp(var, "color.grep.context"))
333 color = opt->color_context;
334 else if (!strcmp(var, "color.grep.filename"))
335 color = opt->color_filename;
336 else if (!strcmp(var, "color.grep.function"))
337 color = opt->color_function;
338 else if (!strcmp(var, "color.grep.linenumber"))
339 color = opt->color_lineno;
340 else if (!strcmp(var, "color.grep.match"))
341 color = opt->color_match;
342 else if (!strcmp(var, "color.grep.selected"))
343 color = opt->color_selected;
344 else if (!strcmp(var, "color.grep.separator"))
345 color = opt->color_sep;
346 else
347 return git_color_default_config(var, value, cb);
348 if (color) {
349 if (!value)
350 return config_error_nonbool(var);
351 color_parse(value, var, color);
353 return 0;
357 * Return non-zero if max_depth is negative or path has no more then max_depth
358 * slashes.
360 static int accept_subdir(const char *path, int max_depth)
362 if (max_depth < 0)
363 return 1;
365 while ((path = strchr(path, '/')) != NULL) {
366 max_depth--;
367 if (max_depth < 0)
368 return 0;
369 path++;
371 return 1;
375 * Return non-zero if name is a subdirectory of match and is not too deep.
377 static int is_subdir(const char *name, int namelen,
378 const char *match, int matchlen, int max_depth)
380 if (matchlen > namelen || strncmp(name, match, matchlen))
381 return 0;
383 if (name[matchlen] == '\0') /* exact match */
384 return 1;
386 if (!matchlen || match[matchlen-1] == '/' || name[matchlen] == '/')
387 return accept_subdir(name + matchlen + 1, max_depth);
389 return 0;
393 * git grep pathspecs are somewhat different from diff-tree pathspecs;
394 * pathname wildcards are allowed.
396 static int pathspec_matches(const char **paths, const char *name, int max_depth)
398 int namelen, i;
399 if (!paths || !*paths)
400 return accept_subdir(name, max_depth);
401 namelen = strlen(name);
402 for (i = 0; paths[i]; i++) {
403 const char *match = paths[i];
404 int matchlen = strlen(match);
405 const char *cp, *meta;
407 if (is_subdir(name, namelen, match, matchlen, max_depth))
408 return 1;
409 if (!fnmatch(match, name, 0))
410 return 1;
411 if (name[namelen-1] != '/')
412 continue;
414 /* We are being asked if the directory ("name") is worth
415 * descending into.
417 * Find the longest leading directory name that does
418 * not have metacharacter in the pathspec; the name
419 * we are looking at must overlap with that directory.
421 for (cp = match, meta = NULL; cp - match < matchlen; cp++) {
422 char ch = *cp;
423 if (ch == '*' || ch == '[' || ch == '?') {
424 meta = cp;
425 break;
428 if (!meta)
429 meta = cp; /* fully literal */
431 if (namelen <= meta - match) {
432 /* Looking at "Documentation/" and
433 * the pattern says "Documentation/howto/", or
434 * "Documentation/diff*.txt". The name we
435 * have should match prefix.
437 if (!memcmp(match, name, namelen))
438 return 1;
439 continue;
442 if (meta - match < namelen) {
443 /* Looking at "Documentation/howto/" and
444 * the pattern says "Documentation/h*";
445 * match up to "Do.../h"; this avoids descending
446 * into "Documentation/technical/".
448 if (!memcmp(match, name, meta - match))
449 return 1;
450 continue;
453 return 0;
456 static void *lock_and_read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size)
458 void *data;
460 if (use_threads) {
461 read_sha1_lock();
462 data = read_sha1_file(sha1, type, size);
463 read_sha1_unlock();
464 } else {
465 data = read_sha1_file(sha1, type, size);
467 return data;
470 static void *load_sha1(const unsigned char *sha1, unsigned long *size,
471 const char *name)
473 enum object_type type;
474 void *data = lock_and_read_sha1_file(sha1, &type, size);
476 if (!data)
477 error("'%s': unable to read %s", name, sha1_to_hex(sha1));
479 return data;
482 static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1,
483 const char *filename, int tree_name_len)
485 struct strbuf pathbuf = STRBUF_INIT;
486 char *name;
488 if (opt->relative && opt->prefix_length) {
489 quote_path_relative(filename + tree_name_len, -1, &pathbuf,
490 opt->prefix);
491 strbuf_insert(&pathbuf, 0, filename, tree_name_len);
492 } else {
493 strbuf_addstr(&pathbuf, filename);
496 name = strbuf_detach(&pathbuf, NULL);
498 #ifndef NO_PTHREADS
499 if (use_threads) {
500 grep_sha1_async(opt, name, sha1);
501 return 0;
502 } else
503 #endif
505 int hit;
506 unsigned long sz;
507 void *data = load_sha1(sha1, &sz, name);
508 if (!data)
509 hit = 0;
510 else
511 hit = grep_buffer(opt, name, data, sz);
513 free(data);
514 free(name);
515 return hit;
519 static void *load_file(const char *filename, size_t *sz)
521 struct stat st;
522 char *data;
523 int i;
525 if (lstat(filename, &st) < 0) {
526 err_ret:
527 if (errno != ENOENT)
528 error("'%s': %s", filename, strerror(errno));
529 return 0;
531 if (!S_ISREG(st.st_mode))
532 return 0;
533 *sz = xsize_t(st.st_size);
534 i = open(filename, O_RDONLY);
535 if (i < 0)
536 goto err_ret;
537 data = xmalloc(*sz + 1);
538 if (st.st_size != read_in_full(i, data, *sz)) {
539 error("'%s': short read %s", filename, strerror(errno));
540 close(i);
541 free(data);
542 return 0;
544 close(i);
545 data[*sz] = 0;
546 return data;
549 static int grep_file(struct grep_opt *opt, const char *filename)
551 struct strbuf buf = STRBUF_INIT;
552 char *name;
554 if (opt->relative && opt->prefix_length)
555 quote_path_relative(filename, -1, &buf, opt->prefix);
556 else
557 strbuf_addstr(&buf, filename);
558 name = strbuf_detach(&buf, NULL);
560 #ifndef NO_PTHREADS
561 if (use_threads) {
562 grep_file_async(opt, name, filename);
563 return 0;
564 } else
565 #endif
567 int hit;
568 size_t sz;
569 void *data = load_file(filename, &sz);
570 if (!data)
571 hit = 0;
572 else
573 hit = grep_buffer(opt, name, data, sz);
575 free(data);
576 free(name);
577 return hit;
581 static void append_path(struct grep_opt *opt, const void *data, size_t len)
583 struct string_list *path_list = opt->output_priv;
585 if (len == 1 && *(const char *)data == '\0')
586 return;
587 string_list_append(path_list, xstrndup(data, len));
590 static void run_pager(struct grep_opt *opt, const char *prefix)
592 struct string_list *path_list = opt->output_priv;
593 const char **argv = xmalloc(sizeof(const char *) * (path_list->nr + 1));
594 int i, status;
596 for (i = 0; i < path_list->nr; i++)
597 argv[i] = path_list->items[i].string;
598 argv[path_list->nr] = NULL;
600 if (prefix && chdir(prefix))
601 die("Failed to chdir: %s", prefix);
602 status = run_command_v_opt(argv, RUN_USING_SHELL);
603 if (status)
604 exit(status);
605 free(argv);
608 static int grep_cache(struct grep_opt *opt, const char **paths, int cached)
610 int hit = 0;
611 int nr;
612 read_cache();
614 for (nr = 0; nr < active_nr; nr++) {
615 struct cache_entry *ce = active_cache[nr];
616 if (!S_ISREG(ce->ce_mode))
617 continue;
618 if (!pathspec_matches(paths, ce->name, opt->max_depth))
619 continue;
620 if (skip_binary(opt, ce->name))
621 continue;
624 * If CE_VALID is on, we assume worktree file and its cache entry
625 * are identical, even if worktree file has been modified, so use
626 * cache version instead
628 if (cached || (ce->ce_flags & CE_VALID) || ce_skip_worktree(ce)) {
629 if (ce_stage(ce))
630 continue;
631 hit |= grep_sha1(opt, ce->sha1, ce->name, 0);
633 else
634 hit |= grep_file(opt, ce->name);
635 if (ce_stage(ce)) {
636 do {
637 nr++;
638 } while (nr < active_nr &&
639 !strcmp(ce->name, active_cache[nr]->name));
640 nr--; /* compensate for loop control */
642 if (hit && opt->status_only)
643 break;
645 return hit;
648 static int grep_tree(struct grep_opt *opt, const char **paths,
649 struct tree_desc *tree,
650 const char *tree_name, const char *base)
652 int len;
653 int hit = 0;
654 struct name_entry entry;
655 char *down;
656 int tn_len = strlen(tree_name);
657 struct strbuf pathbuf;
659 strbuf_init(&pathbuf, PATH_MAX + tn_len);
661 if (tn_len) {
662 strbuf_add(&pathbuf, tree_name, tn_len);
663 strbuf_addch(&pathbuf, ':');
664 tn_len = pathbuf.len;
666 strbuf_addstr(&pathbuf, base);
667 len = pathbuf.len;
669 while (tree_entry(tree, &entry)) {
670 int te_len = tree_entry_len(entry.path, entry.sha1);
671 pathbuf.len = len;
672 strbuf_add(&pathbuf, entry.path, te_len);
674 if (S_ISDIR(entry.mode))
675 /* Match "abc/" against pathspec to
676 * decide if we want to descend into "abc"
677 * directory.
679 strbuf_addch(&pathbuf, '/');
681 down = pathbuf.buf + tn_len;
682 if (!pathspec_matches(paths, down, opt->max_depth))
684 else if (S_ISREG(entry.mode))
685 hit |= grep_sha1(opt, entry.sha1, pathbuf.buf, tn_len);
686 else if (S_ISDIR(entry.mode)) {
687 enum object_type type;
688 struct tree_desc sub;
689 void *data;
690 unsigned long size;
692 data = lock_and_read_sha1_file(entry.sha1, &type, &size);
693 if (!data)
694 die("unable to read tree (%s)",
695 sha1_to_hex(entry.sha1));
696 init_tree_desc(&sub, data, size);
697 hit |= grep_tree(opt, paths, &sub, tree_name, down);
698 free(data);
700 if (hit && opt->status_only)
701 break;
703 strbuf_release(&pathbuf);
704 return hit;
707 static int grep_object(struct grep_opt *opt, const char **paths,
708 struct object *obj, const char *name)
710 if (obj->type == OBJ_BLOB)
711 return grep_sha1(opt, obj->sha1, name, 0);
712 if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) {
713 struct tree_desc tree;
714 void *data;
715 unsigned long size;
716 int hit;
717 data = read_object_with_reference(obj->sha1, tree_type,
718 &size, NULL);
719 if (!data)
720 die("unable to read tree (%s)", sha1_to_hex(obj->sha1));
721 init_tree_desc(&tree, data, size);
722 hit = grep_tree(opt, paths, &tree, name, "");
723 free(data);
724 return hit;
726 die("unable to grep from object of type %s", typename(obj->type));
729 static int grep_objects(struct grep_opt *opt, const char **paths,
730 const struct object_array *list)
732 unsigned int i;
733 int hit = 0;
734 const unsigned int nr = list->nr;
736 for (i = 0; i < nr; i++) {
737 struct object *real_obj;
738 real_obj = deref_tag(list->objects[i].item, NULL, 0);
739 if (grep_object(opt, paths, real_obj, list->objects[i].name)) {
740 hit = 1;
741 if (opt->status_only)
742 break;
745 return hit;
748 static int grep_directory(struct grep_opt *opt, const char **paths)
750 struct dir_struct dir;
751 int i, hit = 0;
753 memset(&dir, 0, sizeof(dir));
754 setup_standard_excludes(&dir);
756 fill_directory(&dir, paths);
757 for (i = 0; i < dir.nr; i++) {
758 hit |= grep_file(opt, dir.entries[i]->name);
759 if (hit && opt->status_only)
760 break;
762 return hit;
765 static int context_callback(const struct option *opt, const char *arg,
766 int unset)
768 struct grep_opt *grep_opt = opt->value;
769 int value;
770 const char *endp;
772 if (unset) {
773 grep_opt->pre_context = grep_opt->post_context = 0;
774 return 0;
776 value = strtol(arg, (char **)&endp, 10);
777 if (*endp) {
778 return error("switch `%c' expects a numerical value",
779 opt->short_name);
781 grep_opt->pre_context = grep_opt->post_context = value;
782 return 0;
785 static int file_callback(const struct option *opt, const char *arg, int unset)
787 struct grep_opt *grep_opt = opt->value;
788 FILE *patterns;
789 int lno = 0;
790 struct strbuf sb = STRBUF_INIT;
792 patterns = fopen(arg, "r");
793 if (!patterns)
794 die_errno("cannot open '%s'", arg);
795 while (strbuf_getline(&sb, patterns, '\n') == 0) {
796 char *s;
797 size_t len;
799 /* ignore empty line like grep does */
800 if (sb.len == 0)
801 continue;
803 s = strbuf_detach(&sb, &len);
804 append_grep_pat(grep_opt, s, len, arg, ++lno, GREP_PATTERN);
806 fclose(patterns);
807 strbuf_release(&sb);
808 return 0;
811 static int not_callback(const struct option *opt, const char *arg, int unset)
813 struct grep_opt *grep_opt = opt->value;
814 append_grep_pattern(grep_opt, "--not", "command line", 0, GREP_NOT);
815 return 0;
818 static int and_callback(const struct option *opt, const char *arg, int unset)
820 struct grep_opt *grep_opt = opt->value;
821 append_grep_pattern(grep_opt, "--and", "command line", 0, GREP_AND);
822 return 0;
825 static int open_callback(const struct option *opt, const char *arg, int unset)
827 struct grep_opt *grep_opt = opt->value;
828 append_grep_pattern(grep_opt, "(", "command line", 0, GREP_OPEN_PAREN);
829 return 0;
832 static int close_callback(const struct option *opt, const char *arg, int unset)
834 struct grep_opt *grep_opt = opt->value;
835 append_grep_pattern(grep_opt, ")", "command line", 0, GREP_CLOSE_PAREN);
836 return 0;
839 static int pattern_callback(const struct option *opt, const char *arg,
840 int unset)
842 struct grep_opt *grep_opt = opt->value;
843 append_grep_pattern(grep_opt, arg, "-e option", 0, GREP_PATTERN);
844 return 0;
847 static int help_callback(const struct option *opt, const char *arg, int unset)
849 return -1;
852 int cmd_grep(int argc, const char **argv, const char *prefix)
854 int hit = 0;
855 int cached = 0;
856 int seen_dashdash = 0;
857 int external_grep_allowed__ignored;
858 const char *show_in_pager = NULL, *default_pager = "dummy";
859 struct grep_opt opt;
860 struct object_array list = OBJECT_ARRAY_INIT;
861 const char **paths = NULL;
862 struct string_list path_list = STRING_LIST_INIT_NODUP;
863 int i;
864 int dummy;
865 int use_index = 1;
866 struct option options[] = {
867 OPT_BOOLEAN(0, "cached", &cached,
868 "search in index instead of in the work tree"),
869 OPT_BOOLEAN(0, "index", &use_index,
870 "--no-index finds in contents not managed by git"),
871 OPT_GROUP(""),
872 OPT_BOOLEAN('v', "invert-match", &opt.invert,
873 "show non-matching lines"),
874 OPT_BOOLEAN('i', "ignore-case", &opt.ignore_case,
875 "case insensitive matching"),
876 OPT_BOOLEAN('w', "word-regexp", &opt.word_regexp,
877 "match patterns only at word boundaries"),
878 OPT_SET_INT('a', "text", &opt.binary,
879 "process binary files as text", GREP_BINARY_TEXT),
880 OPT_SET_INT('I', NULL, &opt.binary,
881 "don't match patterns in binary files",
882 GREP_BINARY_NOMATCH),
883 { OPTION_INTEGER, 0, "max-depth", &opt.max_depth, "depth",
884 "descend at most <depth> levels", PARSE_OPT_NONEG,
885 NULL, 1 },
886 OPT_GROUP(""),
887 OPT_BIT('E', "extended-regexp", &opt.regflags,
888 "use extended POSIX regular expressions", REG_EXTENDED),
889 OPT_NEGBIT('G', "basic-regexp", &opt.regflags,
890 "use basic POSIX regular expressions (default)",
891 REG_EXTENDED),
892 OPT_BOOLEAN('F', "fixed-strings", &opt.fixed,
893 "interpret patterns as fixed strings"),
894 OPT_GROUP(""),
895 OPT_BOOLEAN('n', NULL, &opt.linenum, "show line numbers"),
896 OPT_NEGBIT('h', NULL, &opt.pathname, "don't show filenames", 1),
897 OPT_BIT('H', NULL, &opt.pathname, "show filenames", 1),
898 OPT_NEGBIT(0, "full-name", &opt.relative,
899 "show filenames relative to top directory", 1),
900 OPT_BOOLEAN('l', "files-with-matches", &opt.name_only,
901 "show only filenames instead of matching lines"),
902 OPT_BOOLEAN(0, "name-only", &opt.name_only,
903 "synonym for --files-with-matches"),
904 OPT_BOOLEAN('L', "files-without-match",
905 &opt.unmatch_name_only,
906 "show only the names of files without match"),
907 OPT_BOOLEAN('z', "null", &opt.null_following_name,
908 "print NUL after filenames"),
909 OPT_BOOLEAN('c', "count", &opt.count,
910 "show the number of matches instead of matching lines"),
911 OPT__COLOR(&opt.color, "highlight matches"),
912 OPT_GROUP(""),
913 OPT_CALLBACK('C', NULL, &opt, "n",
914 "show <n> context lines before and after matches",
915 context_callback),
916 OPT_INTEGER('B', NULL, &opt.pre_context,
917 "show <n> context lines before matches"),
918 OPT_INTEGER('A', NULL, &opt.post_context,
919 "show <n> context lines after matches"),
920 OPT_NUMBER_CALLBACK(&opt, "shortcut for -C NUM",
921 context_callback),
922 OPT_BOOLEAN('p', "show-function", &opt.funcname,
923 "show a line with the function name before matches"),
924 OPT_GROUP(""),
925 OPT_CALLBACK('f', NULL, &opt, "file",
926 "read patterns from file", file_callback),
927 { OPTION_CALLBACK, 'e', NULL, &opt, "pattern",
928 "match <pattern>", PARSE_OPT_NONEG, pattern_callback },
929 { OPTION_CALLBACK, 0, "and", &opt, NULL,
930 "combine patterns specified with -e",
931 PARSE_OPT_NOARG | PARSE_OPT_NONEG, and_callback },
932 OPT_BOOLEAN(0, "or", &dummy, ""),
933 { OPTION_CALLBACK, 0, "not", &opt, NULL, "",
934 PARSE_OPT_NOARG | PARSE_OPT_NONEG, not_callback },
935 { OPTION_CALLBACK, '(', NULL, &opt, NULL, "",
936 PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH,
937 open_callback },
938 { OPTION_CALLBACK, ')', NULL, &opt, NULL, "",
939 PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH,
940 close_callback },
941 OPT_BOOLEAN('q', "quiet", &opt.status_only,
942 "indicate hit with exit status without output"),
943 OPT_BOOLEAN(0, "all-match", &opt.all_match,
944 "show only matches from files that match all patterns"),
945 OPT_GROUP(""),
946 { OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager,
947 "pager", "show matching files in the pager",
948 PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager },
949 OPT_BOOLEAN(0, "ext-grep", &external_grep_allowed__ignored,
950 "allow calling of grep(1) (ignored by this build)"),
951 { OPTION_CALLBACK, 0, "help-all", &options, NULL, "show usage",
952 PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback },
953 OPT_END()
957 * 'git grep -h', unlike 'git grep -h <pattern>', is a request
958 * to show usage information and exit.
960 if (argc == 2 && !strcmp(argv[1], "-h"))
961 usage_with_options(grep_usage, options);
963 memset(&opt, 0, sizeof(opt));
964 opt.prefix = prefix;
965 opt.prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
966 opt.relative = 1;
967 opt.pathname = 1;
968 opt.pattern_tail = &opt.pattern_list;
969 opt.header_tail = &opt.header_list;
970 opt.regflags = REG_NEWLINE;
971 opt.max_depth = -1;
973 strcpy(opt.color_context, "");
974 strcpy(opt.color_filename, "");
975 strcpy(opt.color_function, "");
976 strcpy(opt.color_lineno, "");
977 strcpy(opt.color_match, GIT_COLOR_BOLD_RED);
978 strcpy(opt.color_selected, "");
979 strcpy(opt.color_sep, GIT_COLOR_CYAN);
980 opt.color = -1;
981 git_config(grep_config, &opt);
982 if (opt.color == -1)
983 opt.color = git_use_color_default;
986 * If there is no -- then the paths must exist in the working
987 * tree. If there is no explicit pattern specified with -e or
988 * -f, we take the first unrecognized non option to be the
989 * pattern, but then what follows it must be zero or more
990 * valid refs up to the -- (if exists), and then existing
991 * paths. If there is an explicit pattern, then the first
992 * unrecognized non option is the beginning of the refs list
993 * that continues up to the -- (if exists), and then paths.
995 argc = parse_options(argc, argv, prefix, options, grep_usage,
996 PARSE_OPT_KEEP_DASHDASH |
997 PARSE_OPT_STOP_AT_NON_OPTION |
998 PARSE_OPT_NO_INTERNAL_HELP);
1000 if (use_index && !startup_info->have_repository)
1001 /* die the same way as if we did it at the beginning */
1002 setup_git_directory();
1005 * skip a -- separator; we know it cannot be
1006 * separating revisions from pathnames if
1007 * we haven't even had any patterns yet
1009 if (argc > 0 && !opt.pattern_list && !strcmp(argv[0], "--")) {
1010 argv++;
1011 argc--;
1014 /* First unrecognized non-option token */
1015 if (argc > 0 && !opt.pattern_list) {
1016 append_grep_pattern(&opt, argv[0], "command line", 0,
1017 GREP_PATTERN);
1018 argv++;
1019 argc--;
1022 if (show_in_pager == default_pager)
1023 show_in_pager = git_pager(1);
1024 if (show_in_pager) {
1025 opt.color = 0;
1026 opt.name_only = 1;
1027 opt.null_following_name = 1;
1028 opt.output_priv = &path_list;
1029 opt.output = append_path;
1030 string_list_append(&path_list, show_in_pager);
1031 use_threads = 0;
1033 if ((opt.binary & GREP_BINARY_NOMATCH))
1034 use_threads = 0;
1036 if (!opt.pattern_list)
1037 die("no pattern given.");
1038 if (!opt.fixed && opt.ignore_case)
1039 opt.regflags |= REG_ICASE;
1040 if ((opt.regflags != REG_NEWLINE) && opt.fixed)
1041 die("cannot mix --fixed-strings and regexp");
1043 #ifndef NO_PTHREADS
1044 if (online_cpus() == 1 || !grep_threads_ok(&opt))
1045 use_threads = 0;
1047 if (use_threads) {
1048 if (opt.pre_context || opt.post_context)
1049 print_hunk_marks_between_files = 1;
1050 start_threads(&opt);
1052 #else
1053 use_threads = 0;
1054 #endif
1056 compile_grep_patterns(&opt);
1058 /* Check revs and then paths */
1059 for (i = 0; i < argc; i++) {
1060 const char *arg = argv[i];
1061 unsigned char sha1[20];
1062 /* Is it a rev? */
1063 if (!get_sha1(arg, sha1)) {
1064 struct object *object = parse_object(sha1);
1065 if (!object)
1066 die("bad object %s", arg);
1067 add_object_array(object, arg, &list);
1068 continue;
1070 if (!strcmp(arg, "--")) {
1071 i++;
1072 seen_dashdash = 1;
1074 break;
1077 /* The rest are paths */
1078 if (!seen_dashdash) {
1079 int j;
1080 for (j = i; j < argc; j++)
1081 verify_filename(prefix, argv[j]);
1084 if (i < argc)
1085 paths = get_pathspec(prefix, argv + i);
1086 else if (prefix) {
1087 paths = xcalloc(2, sizeof(const char *));
1088 paths[0] = prefix;
1089 paths[1] = NULL;
1092 if (show_in_pager && (cached || list.nr))
1093 die("--open-files-in-pager only works on the worktree");
1095 if (show_in_pager && opt.pattern_list && !opt.pattern_list->next) {
1096 const char *pager = path_list.items[0].string;
1097 int len = strlen(pager);
1099 if (len > 4 && is_dir_sep(pager[len - 5]))
1100 pager += len - 4;
1102 if (!strcmp("less", pager) || !strcmp("vi", pager)) {
1103 struct strbuf buf = STRBUF_INIT;
1104 strbuf_addf(&buf, "+/%s%s",
1105 strcmp("less", pager) ? "" : "*",
1106 opt.pattern_list->pattern);
1107 string_list_append(&path_list, buf.buf);
1108 strbuf_detach(&buf, NULL);
1112 if (!show_in_pager)
1113 setup_pager();
1116 if (!use_index) {
1117 if (cached)
1118 die("--cached cannot be used with --no-index.");
1119 if (list.nr)
1120 die("--no-index cannot be used with revs.");
1121 hit = grep_directory(&opt, paths);
1122 } else if (!list.nr) {
1123 if (!cached)
1124 setup_work_tree();
1126 hit = grep_cache(&opt, paths, cached);
1127 } else {
1128 if (cached)
1129 die("both --cached and trees are given.");
1130 hit = grep_objects(&opt, paths, &list);
1133 if (use_threads)
1134 hit |= wait_all();
1135 if (hit && show_in_pager)
1136 run_pager(&opt, prefix);
1137 free_grep_patterns(&opt);
1138 return !hit;