Code

fast-import: don't allow 'ls' of path with empty components
[git.git] / builtin / grep.c
1 /*
2  * Builtin "git grep"
3  *
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 "thread-utils.h"
22 static char const * const grep_usage[] = {
23         "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]",
24         NULL
25 };
27 static int use_threads = 1;
29 #ifndef NO_PTHREADS
30 #define THREADS 8
31 static pthread_t threads[THREADS];
33 static void *load_sha1(const unsigned char *sha1, unsigned long *size,
34                        const char *name);
35 static void *load_file(const char *filename, size_t *sz);
37 enum work_type {WORK_SHA1, WORK_FILE};
39 /* We use one producer thread and THREADS consumer
40  * threads. The producer adds struct work_items to 'todo' and the
41  * consumers pick work items from the same array.
42  */
43 struct work_item
44 {
45         enum work_type type;
46         char *name;
48         /* if type == WORK_SHA1, then 'identifier' is a SHA1,
49          * otherwise type == WORK_FILE, and 'identifier' is a NUL
50          * terminated filename.
51          */
52         void *identifier;
53         char done;
54         struct strbuf out;
55 };
57 /* In the range [todo_done, todo_start) in 'todo' we have work_items
58  * that have been or are processed by a consumer thread. We haven't
59  * written the result for these to stdout yet.
60  *
61  * The work_items in [todo_start, todo_end) are waiting to be picked
62  * up by a consumer thread.
63  *
64  * The ranges are modulo TODO_SIZE.
65  */
66 #define TODO_SIZE 128
67 static struct work_item todo[TODO_SIZE];
68 static int todo_start;
69 static int todo_end;
70 static int todo_done;
72 /* Has all work items been added? */
73 static int all_work_added;
75 /* This lock protects all the variables above. */
76 static pthread_mutex_t grep_mutex;
78 /* Used to serialize calls to read_sha1_file. */
79 static pthread_mutex_t read_sha1_mutex;
81 #define grep_lock() pthread_mutex_lock(&grep_mutex)
82 #define grep_unlock() pthread_mutex_unlock(&grep_mutex)
83 #define read_sha1_lock() pthread_mutex_lock(&read_sha1_mutex)
84 #define read_sha1_unlock() pthread_mutex_unlock(&read_sha1_mutex)
86 /* Signalled when a new work_item is added to todo. */
87 static pthread_cond_t cond_add;
89 /* Signalled when the result from one work_item is written to
90  * stdout.
91  */
92 static pthread_cond_t cond_write;
94 /* Signalled when we are finished with everything. */
95 static pthread_cond_t cond_result;
97 static int print_hunk_marks_between_files;
98 static int printed_something;
100 static void add_work(enum work_type type, char *name, void *id)
102         grep_lock();
104         while ((todo_end+1) % ARRAY_SIZE(todo) == todo_done) {
105                 pthread_cond_wait(&cond_write, &grep_mutex);
106         }
108         todo[todo_end].type = type;
109         todo[todo_end].name = name;
110         todo[todo_end].identifier = id;
111         todo[todo_end].done = 0;
112         strbuf_reset(&todo[todo_end].out);
113         todo_end = (todo_end + 1) % ARRAY_SIZE(todo);
115         pthread_cond_signal(&cond_add);
116         grep_unlock();
119 static struct work_item *get_work(void)
121         struct work_item *ret;
123         grep_lock();
124         while (todo_start == todo_end && !all_work_added) {
125                 pthread_cond_wait(&cond_add, &grep_mutex);
126         }
128         if (todo_start == todo_end && all_work_added) {
129                 ret = NULL;
130         } else {
131                 ret = &todo[todo_start];
132                 todo_start = (todo_start + 1) % ARRAY_SIZE(todo);
133         }
134         grep_unlock();
135         return ret;
138 static void grep_sha1_async(struct grep_opt *opt, char *name,
139                             const unsigned char *sha1)
141         unsigned char *s;
142         s = xmalloc(20);
143         memcpy(s, sha1, 20);
144         add_work(WORK_SHA1, name, s);
147 static void grep_file_async(struct grep_opt *opt, char *name,
148                             const char *filename)
150         add_work(WORK_FILE, name, xstrdup(filename));
153 static void work_done(struct work_item *w)
155         int old_done;
157         grep_lock();
158         w->done = 1;
159         old_done = todo_done;
160         for(; todo[todo_done].done && todo_done != todo_start;
161             todo_done = (todo_done+1) % ARRAY_SIZE(todo)) {
162                 w = &todo[todo_done];
163                 if (w->out.len) {
164                         if (print_hunk_marks_between_files && printed_something)
165                                 write_or_die(1, "--\n", 3);
166                         write_or_die(1, w->out.buf, w->out.len);
167                         printed_something = 1;
168                 }
169                 free(w->name);
170                 free(w->identifier);
171         }
173         if (old_done != todo_done)
174                 pthread_cond_signal(&cond_write);
176         if (all_work_added && todo_done == todo_end)
177                 pthread_cond_signal(&cond_result);
179         grep_unlock();
182 static void *run(void *arg)
184         int hit = 0;
185         struct grep_opt *opt = arg;
187         while (1) {
188                 struct work_item *w = get_work();
189                 if (!w)
190                         break;
192                 opt->output_priv = w;
193                 if (w->type == WORK_SHA1) {
194                         unsigned long sz;
195                         void* data = load_sha1(w->identifier, &sz, w->name);
197                         if (data) {
198                                 hit |= grep_buffer(opt, w->name, data, sz);
199                                 free(data);
200                         }
201                 } else if (w->type == WORK_FILE) {
202                         size_t sz;
203                         void* data = load_file(w->identifier, &sz);
204                         if (data) {
205                                 hit |= grep_buffer(opt, w->name, data, sz);
206                                 free(data);
207                         }
208                 } else {
209                         assert(0);
210                 }
212                 work_done(w);
213         }
214         free_grep_patterns(arg);
215         free(arg);
217         return (void*) (intptr_t) hit;
220 static void strbuf_out(struct grep_opt *opt, const void *buf, size_t size)
222         struct work_item *w = opt->output_priv;
223         strbuf_add(&w->out, buf, size);
226 static void start_threads(struct grep_opt *opt)
228         int i;
230         pthread_mutex_init(&grep_mutex, NULL);
231         pthread_mutex_init(&read_sha1_mutex, NULL);
232         pthread_cond_init(&cond_add, NULL);
233         pthread_cond_init(&cond_write, NULL);
234         pthread_cond_init(&cond_result, NULL);
236         for (i = 0; i < ARRAY_SIZE(todo); i++) {
237                 strbuf_init(&todo[i].out, 0);
238         }
240         for (i = 0; i < ARRAY_SIZE(threads); i++) {
241                 int err;
242                 struct grep_opt *o = grep_opt_dup(opt);
243                 o->output = strbuf_out;
244                 compile_grep_patterns(o);
245                 err = pthread_create(&threads[i], NULL, run, o);
247                 if (err)
248                         die("grep: failed to create thread: %s",
249                             strerror(err));
250         }
253 static int wait_all(void)
255         int hit = 0;
256         int i;
258         grep_lock();
259         all_work_added = 1;
261         /* Wait until all work is done. */
262         while (todo_done != todo_end)
263                 pthread_cond_wait(&cond_result, &grep_mutex);
265         /* Wake up all the consumer threads so they can see that there
266          * is no more work to do.
267          */
268         pthread_cond_broadcast(&cond_add);
269         grep_unlock();
271         for (i = 0; i < ARRAY_SIZE(threads); i++) {
272                 void *h;
273                 pthread_join(threads[i], &h);
274                 hit |= (int) (intptr_t) h;
275         }
277         pthread_mutex_destroy(&grep_mutex);
278         pthread_mutex_destroy(&read_sha1_mutex);
279         pthread_cond_destroy(&cond_add);
280         pthread_cond_destroy(&cond_write);
281         pthread_cond_destroy(&cond_result);
283         return hit;
285 #else /* !NO_PTHREADS */
286 #define read_sha1_lock()
287 #define read_sha1_unlock()
289 static int wait_all(void)
291         return 0;
293 #endif
295 static int grep_config(const char *var, const char *value, void *cb)
297         struct grep_opt *opt = cb;
298         char *color = NULL;
300         switch (userdiff_config(var, value)) {
301         case 0: break;
302         case -1: return -1;
303         default: return 0;
304         }
306         if (!strcmp(var, "color.grep"))
307                 opt->color = git_config_colorbool(var, value, -1);
308         else if (!strcmp(var, "color.grep.context"))
309                 color = opt->color_context;
310         else if (!strcmp(var, "color.grep.filename"))
311                 color = opt->color_filename;
312         else if (!strcmp(var, "color.grep.function"))
313                 color = opt->color_function;
314         else if (!strcmp(var, "color.grep.linenumber"))
315                 color = opt->color_lineno;
316         else if (!strcmp(var, "color.grep.match"))
317                 color = opt->color_match;
318         else if (!strcmp(var, "color.grep.selected"))
319                 color = opt->color_selected;
320         else if (!strcmp(var, "color.grep.separator"))
321                 color = opt->color_sep;
322         else
323                 return git_color_default_config(var, value, cb);
324         if (color) {
325                 if (!value)
326                         return config_error_nonbool(var);
327                 color_parse(value, var, color);
328         }
329         return 0;
332 /*
333  * Return non-zero if max_depth is negative or path has no more then max_depth
334  * slashes.
335  */
336 static int accept_subdir(const char *path, int max_depth)
338         if (max_depth < 0)
339                 return 1;
341         while ((path = strchr(path, '/')) != NULL) {
342                 max_depth--;
343                 if (max_depth < 0)
344                         return 0;
345                 path++;
346         }
347         return 1;
350 /*
351  * Return non-zero if name is a subdirectory of match and is not too deep.
352  */
353 static int is_subdir(const char *name, int namelen,
354                 const char *match, int matchlen, int max_depth)
356         if (matchlen > namelen || strncmp(name, match, matchlen))
357                 return 0;
359         if (name[matchlen] == '\0') /* exact match */
360                 return 1;
362         if (!matchlen || match[matchlen-1] == '/' || name[matchlen] == '/')
363                 return accept_subdir(name + matchlen + 1, max_depth);
365         return 0;
368 /*
369  * git grep pathspecs are somewhat different from diff-tree pathspecs;
370  * pathname wildcards are allowed.
371  */
372 static int pathspec_matches(const char **paths, const char *name, int max_depth)
374         int namelen, i;
375         if (!paths || !*paths)
376                 return accept_subdir(name, max_depth);
377         namelen = strlen(name);
378         for (i = 0; paths[i]; i++) {
379                 const char *match = paths[i];
380                 int matchlen = strlen(match);
381                 const char *cp, *meta;
383                 if (is_subdir(name, namelen, match, matchlen, max_depth))
384                         return 1;
385                 if (!fnmatch(match, name, 0))
386                         return 1;
387                 if (name[namelen-1] != '/')
388                         continue;
390                 /* We are being asked if the directory ("name") is worth
391                  * descending into.
392                  *
393                  * Find the longest leading directory name that does
394                  * not have metacharacter in the pathspec; the name
395                  * we are looking at must overlap with that directory.
396                  */
397                 for (cp = match, meta = NULL; cp - match < matchlen; cp++) {
398                         char ch = *cp;
399                         if (ch == '*' || ch == '[' || ch == '?') {
400                                 meta = cp;
401                                 break;
402                         }
403                 }
404                 if (!meta)
405                         meta = cp; /* fully literal */
407                 if (namelen <= meta - match) {
408                         /* Looking at "Documentation/" and
409                          * the pattern says "Documentation/howto/", or
410                          * "Documentation/diff*.txt".  The name we
411                          * have should match prefix.
412                          */
413                         if (!memcmp(match, name, namelen))
414                                 return 1;
415                         continue;
416                 }
418                 if (meta - match < namelen) {
419                         /* Looking at "Documentation/howto/" and
420                          * the pattern says "Documentation/h*";
421                          * match up to "Do.../h"; this avoids descending
422                          * into "Documentation/technical/".
423                          */
424                         if (!memcmp(match, name, meta - match))
425                                 return 1;
426                         continue;
427                 }
428         }
429         return 0;
432 static void *lock_and_read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size)
434         void *data;
436         if (use_threads) {
437                 read_sha1_lock();
438                 data = read_sha1_file(sha1, type, size);
439                 read_sha1_unlock();
440         } else {
441                 data = read_sha1_file(sha1, type, size);
442         }
443         return data;
446 static void *load_sha1(const unsigned char *sha1, unsigned long *size,
447                        const char *name)
449         enum object_type type;
450         void *data = lock_and_read_sha1_file(sha1, &type, size);
452         if (!data)
453                 error("'%s': unable to read %s", name, sha1_to_hex(sha1));
455         return data;
458 static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1,
459                      const char *filename, int tree_name_len)
461         struct strbuf pathbuf = STRBUF_INIT;
462         char *name;
464         if (opt->relative && opt->prefix_length) {
465                 quote_path_relative(filename + tree_name_len, -1, &pathbuf,
466                                     opt->prefix);
467                 strbuf_insert(&pathbuf, 0, filename, tree_name_len);
468         } else {
469                 strbuf_addstr(&pathbuf, filename);
470         }
472         name = strbuf_detach(&pathbuf, NULL);
474 #ifndef NO_PTHREADS
475         if (use_threads) {
476                 grep_sha1_async(opt, name, sha1);
477                 return 0;
478         } else
479 #endif
480         {
481                 int hit;
482                 unsigned long sz;
483                 void *data = load_sha1(sha1, &sz, name);
484                 if (!data)
485                         hit = 0;
486                 else
487                         hit = grep_buffer(opt, name, data, sz);
489                 free(data);
490                 free(name);
491                 return hit;
492         }
495 static void *load_file(const char *filename, size_t *sz)
497         struct stat st;
498         char *data;
499         int i;
501         if (lstat(filename, &st) < 0) {
502         err_ret:
503                 if (errno != ENOENT)
504                         error("'%s': %s", filename, strerror(errno));
505                 return 0;
506         }
507         if (!S_ISREG(st.st_mode))
508                 return 0;
509         *sz = xsize_t(st.st_size);
510         i = open(filename, O_RDONLY);
511         if (i < 0)
512                 goto err_ret;
513         data = xmalloc(*sz + 1);
514         if (st.st_size != read_in_full(i, data, *sz)) {
515                 error("'%s': short read %s", filename, strerror(errno));
516                 close(i);
517                 free(data);
518                 return 0;
519         }
520         close(i);
521         data[*sz] = 0;
522         return data;
525 static int grep_file(struct grep_opt *opt, const char *filename)
527         struct strbuf buf = STRBUF_INIT;
528         char *name;
530         if (opt->relative && opt->prefix_length)
531                 quote_path_relative(filename, -1, &buf, opt->prefix);
532         else
533                 strbuf_addstr(&buf, filename);
534         name = strbuf_detach(&buf, NULL);
536 #ifndef NO_PTHREADS
537         if (use_threads) {
538                 grep_file_async(opt, name, filename);
539                 return 0;
540         } else
541 #endif
542         {
543                 int hit;
544                 size_t sz;
545                 void *data = load_file(filename, &sz);
546                 if (!data)
547                         hit = 0;
548                 else
549                         hit = grep_buffer(opt, name, data, sz);
551                 free(data);
552                 free(name);
553                 return hit;
554         }
557 static void append_path(struct grep_opt *opt, const void *data, size_t len)
559         struct string_list *path_list = opt->output_priv;
561         if (len == 1 && *(const char *)data == '\0')
562                 return;
563         string_list_append(path_list, xstrndup(data, len));
566 static void run_pager(struct grep_opt *opt, const char *prefix)
568         struct string_list *path_list = opt->output_priv;
569         const char **argv = xmalloc(sizeof(const char *) * (path_list->nr + 1));
570         int i, status;
572         for (i = 0; i < path_list->nr; i++)
573                 argv[i] = path_list->items[i].string;
574         argv[path_list->nr] = NULL;
576         if (prefix && chdir(prefix))
577                 die("Failed to chdir: %s", prefix);
578         status = run_command_v_opt(argv, RUN_USING_SHELL);
579         if (status)
580                 exit(status);
581         free(argv);
584 static int grep_cache(struct grep_opt *opt, const char **paths, int cached)
586         int hit = 0;
587         int nr;
588         read_cache();
590         for (nr = 0; nr < active_nr; nr++) {
591                 struct cache_entry *ce = active_cache[nr];
592                 if (!S_ISREG(ce->ce_mode))
593                         continue;
594                 if (!pathspec_matches(paths, ce->name, opt->max_depth))
595                         continue;
596                 /*
597                  * If CE_VALID is on, we assume worktree file and its cache entry
598                  * are identical, even if worktree file has been modified, so use
599                  * cache version instead
600                  */
601                 if (cached || (ce->ce_flags & CE_VALID) || ce_skip_worktree(ce)) {
602                         if (ce_stage(ce))
603                                 continue;
604                         hit |= grep_sha1(opt, ce->sha1, ce->name, 0);
605                 }
606                 else
607                         hit |= grep_file(opt, ce->name);
608                 if (ce_stage(ce)) {
609                         do {
610                                 nr++;
611                         } while (nr < active_nr &&
612                                  !strcmp(ce->name, active_cache[nr]->name));
613                         nr--; /* compensate for loop control */
614                 }
615                 if (hit && opt->status_only)
616                         break;
617         }
618         return hit;
621 static int grep_tree(struct grep_opt *opt, const char **paths,
622                      struct tree_desc *tree,
623                      const char *tree_name, const char *base)
625         int len;
626         int hit = 0;
627         struct name_entry entry;
628         char *down;
629         int tn_len = strlen(tree_name);
630         struct strbuf pathbuf;
632         strbuf_init(&pathbuf, PATH_MAX + tn_len);
634         if (tn_len) {
635                 strbuf_add(&pathbuf, tree_name, tn_len);
636                 strbuf_addch(&pathbuf, ':');
637                 tn_len = pathbuf.len;
638         }
639         strbuf_addstr(&pathbuf, base);
640         len = pathbuf.len;
642         while (tree_entry(tree, &entry)) {
643                 int te_len = tree_entry_len(entry.path, entry.sha1);
644                 pathbuf.len = len;
645                 strbuf_add(&pathbuf, entry.path, te_len);
647                 if (S_ISDIR(entry.mode))
648                         /* Match "abc/" against pathspec to
649                          * decide if we want to descend into "abc"
650                          * directory.
651                          */
652                         strbuf_addch(&pathbuf, '/');
654                 down = pathbuf.buf + tn_len;
655                 if (!pathspec_matches(paths, down, opt->max_depth))
656                         ;
657                 else if (S_ISREG(entry.mode))
658                         hit |= grep_sha1(opt, entry.sha1, pathbuf.buf, tn_len);
659                 else if (S_ISDIR(entry.mode)) {
660                         enum object_type type;
661                         struct tree_desc sub;
662                         void *data;
663                         unsigned long size;
665                         data = lock_and_read_sha1_file(entry.sha1, &type, &size);
666                         if (!data)
667                                 die("unable to read tree (%s)",
668                                     sha1_to_hex(entry.sha1));
669                         init_tree_desc(&sub, data, size);
670                         hit |= grep_tree(opt, paths, &sub, tree_name, down);
671                         free(data);
672                 }
673                 if (hit && opt->status_only)
674                         break;
675         }
676         strbuf_release(&pathbuf);
677         return hit;
680 static int grep_object(struct grep_opt *opt, const char **paths,
681                        struct object *obj, const char *name)
683         if (obj->type == OBJ_BLOB)
684                 return grep_sha1(opt, obj->sha1, name, 0);
685         if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) {
686                 struct tree_desc tree;
687                 void *data;
688                 unsigned long size;
689                 int hit;
690                 data = read_object_with_reference(obj->sha1, tree_type,
691                                                   &size, NULL);
692                 if (!data)
693                         die("unable to read tree (%s)", sha1_to_hex(obj->sha1));
694                 init_tree_desc(&tree, data, size);
695                 hit = grep_tree(opt, paths, &tree, name, "");
696                 free(data);
697                 return hit;
698         }
699         die("unable to grep from object of type %s", typename(obj->type));
702 static int grep_objects(struct grep_opt *opt, const char **paths,
703                         const struct object_array *list)
705         unsigned int i;
706         int hit = 0;
707         const unsigned int nr = list->nr;
709         for (i = 0; i < nr; i++) {
710                 struct object *real_obj;
711                 real_obj = deref_tag(list->objects[i].item, NULL, 0);
712                 if (grep_object(opt, paths, real_obj, list->objects[i].name)) {
713                         hit = 1;
714                         if (opt->status_only)
715                                 break;
716                 }
717         }
718         return hit;
721 static int grep_directory(struct grep_opt *opt, const char **paths)
723         struct dir_struct dir;
724         int i, hit = 0;
726         memset(&dir, 0, sizeof(dir));
727         setup_standard_excludes(&dir);
729         fill_directory(&dir, paths);
730         for (i = 0; i < dir.nr; i++) {
731                 hit |= grep_file(opt, dir.entries[i]->name);
732                 if (hit && opt->status_only)
733                         break;
734         }
735         return hit;
738 static int context_callback(const struct option *opt, const char *arg,
739                             int unset)
741         struct grep_opt *grep_opt = opt->value;
742         int value;
743         const char *endp;
745         if (unset) {
746                 grep_opt->pre_context = grep_opt->post_context = 0;
747                 return 0;
748         }
749         value = strtol(arg, (char **)&endp, 10);
750         if (*endp) {
751                 return error("switch `%c' expects a numerical value",
752                              opt->short_name);
753         }
754         grep_opt->pre_context = grep_opt->post_context = value;
755         return 0;
758 static int file_callback(const struct option *opt, const char *arg, int unset)
760         struct grep_opt *grep_opt = opt->value;
761         FILE *patterns;
762         int lno = 0;
763         struct strbuf sb = STRBUF_INIT;
765         patterns = fopen(arg, "r");
766         if (!patterns)
767                 die_errno("cannot open '%s'", arg);
768         while (strbuf_getline(&sb, patterns, '\n') == 0) {
769                 char *s;
770                 size_t len;
772                 /* ignore empty line like grep does */
773                 if (sb.len == 0)
774                         continue;
776                 s = strbuf_detach(&sb, &len);
777                 append_grep_pat(grep_opt, s, len, arg, ++lno, GREP_PATTERN);
778         }
779         fclose(patterns);
780         strbuf_release(&sb);
781         return 0;
784 static int not_callback(const struct option *opt, const char *arg, int unset)
786         struct grep_opt *grep_opt = opt->value;
787         append_grep_pattern(grep_opt, "--not", "command line", 0, GREP_NOT);
788         return 0;
791 static int and_callback(const struct option *opt, const char *arg, int unset)
793         struct grep_opt *grep_opt = opt->value;
794         append_grep_pattern(grep_opt, "--and", "command line", 0, GREP_AND);
795         return 0;
798 static int open_callback(const struct option *opt, const char *arg, int unset)
800         struct grep_opt *grep_opt = opt->value;
801         append_grep_pattern(grep_opt, "(", "command line", 0, GREP_OPEN_PAREN);
802         return 0;
805 static int close_callback(const struct option *opt, const char *arg, int unset)
807         struct grep_opt *grep_opt = opt->value;
808         append_grep_pattern(grep_opt, ")", "command line", 0, GREP_CLOSE_PAREN);
809         return 0;
812 static int pattern_callback(const struct option *opt, const char *arg,
813                             int unset)
815         struct grep_opt *grep_opt = opt->value;
816         append_grep_pattern(grep_opt, arg, "-e option", 0, GREP_PATTERN);
817         return 0;
820 static int help_callback(const struct option *opt, const char *arg, int unset)
822         return -1;
825 int cmd_grep(int argc, const char **argv, const char *prefix)
827         int hit = 0;
828         int cached = 0;
829         int seen_dashdash = 0;
830         int external_grep_allowed__ignored;
831         const char *show_in_pager = NULL, *default_pager = "dummy";
832         struct grep_opt opt;
833         struct object_array list = OBJECT_ARRAY_INIT;
834         const char **paths = NULL;
835         struct string_list path_list = STRING_LIST_INIT_NODUP;
836         int i;
837         int dummy;
838         int use_index = 1;
839         struct option options[] = {
840                 OPT_BOOLEAN(0, "cached", &cached,
841                         "search in index instead of in the work tree"),
842                 OPT_BOOLEAN(0, "index", &use_index,
843                         "--no-index finds in contents not managed by git"),
844                 OPT_GROUP(""),
845                 OPT_BOOLEAN('v', "invert-match", &opt.invert,
846                         "show non-matching lines"),
847                 OPT_BOOLEAN('i', "ignore-case", &opt.ignore_case,
848                         "case insensitive matching"),
849                 OPT_BOOLEAN('w', "word-regexp", &opt.word_regexp,
850                         "match patterns only at word boundaries"),
851                 OPT_SET_INT('a', "text", &opt.binary,
852                         "process binary files as text", GREP_BINARY_TEXT),
853                 OPT_SET_INT('I', NULL, &opt.binary,
854                         "don't match patterns in binary files",
855                         GREP_BINARY_NOMATCH),
856                 { OPTION_INTEGER, 0, "max-depth", &opt.max_depth, "depth",
857                         "descend at most <depth> levels", PARSE_OPT_NONEG,
858                         NULL, 1 },
859                 OPT_GROUP(""),
860                 OPT_BIT('E', "extended-regexp", &opt.regflags,
861                         "use extended POSIX regular expressions", REG_EXTENDED),
862                 OPT_NEGBIT('G', "basic-regexp", &opt.regflags,
863                         "use basic POSIX regular expressions (default)",
864                         REG_EXTENDED),
865                 OPT_BOOLEAN('F', "fixed-strings", &opt.fixed,
866                         "interpret patterns as fixed strings"),
867                 OPT_GROUP(""),
868                 OPT_BOOLEAN('n', NULL, &opt.linenum, "show line numbers"),
869                 OPT_NEGBIT('h', NULL, &opt.pathname, "don't show filenames", 1),
870                 OPT_BIT('H', NULL, &opt.pathname, "show filenames", 1),
871                 OPT_NEGBIT(0, "full-name", &opt.relative,
872                         "show filenames relative to top directory", 1),
873                 OPT_BOOLEAN('l', "files-with-matches", &opt.name_only,
874                         "show only filenames instead of matching lines"),
875                 OPT_BOOLEAN(0, "name-only", &opt.name_only,
876                         "synonym for --files-with-matches"),
877                 OPT_BOOLEAN('L', "files-without-match",
878                         &opt.unmatch_name_only,
879                         "show only the names of files without match"),
880                 OPT_BOOLEAN('z', "null", &opt.null_following_name,
881                         "print NUL after filenames"),
882                 OPT_BOOLEAN('c', "count", &opt.count,
883                         "show the number of matches instead of matching lines"),
884                 OPT__COLOR(&opt.color, "highlight matches"),
885                 OPT_GROUP(""),
886                 OPT_CALLBACK('C', NULL, &opt, "n",
887                         "show <n> context lines before and after matches",
888                         context_callback),
889                 OPT_INTEGER('B', NULL, &opt.pre_context,
890                         "show <n> context lines before matches"),
891                 OPT_INTEGER('A', NULL, &opt.post_context,
892                         "show <n> context lines after matches"),
893                 OPT_NUMBER_CALLBACK(&opt, "shortcut for -C NUM",
894                         context_callback),
895                 OPT_BOOLEAN('p', "show-function", &opt.funcname,
896                         "show a line with the function name before matches"),
897                 OPT_GROUP(""),
898                 OPT_CALLBACK('f', NULL, &opt, "file",
899                         "read patterns from file", file_callback),
900                 { OPTION_CALLBACK, 'e', NULL, &opt, "pattern",
901                         "match <pattern>", PARSE_OPT_NONEG, pattern_callback },
902                 { OPTION_CALLBACK, 0, "and", &opt, NULL,
903                   "combine patterns specified with -e",
904                   PARSE_OPT_NOARG | PARSE_OPT_NONEG, and_callback },
905                 OPT_BOOLEAN(0, "or", &dummy, ""),
906                 { OPTION_CALLBACK, 0, "not", &opt, NULL, "",
907                   PARSE_OPT_NOARG | PARSE_OPT_NONEG, not_callback },
908                 { OPTION_CALLBACK, '(', NULL, &opt, NULL, "",
909                   PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH,
910                   open_callback },
911                 { OPTION_CALLBACK, ')', NULL, &opt, NULL, "",
912                   PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH,
913                   close_callback },
914                 OPT__QUIET(&opt.status_only,
915                            "indicate hit with exit status without output"),
916                 OPT_BOOLEAN(0, "all-match", &opt.all_match,
917                         "show only matches from files that match all patterns"),
918                 OPT_GROUP(""),
919                 { OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager,
920                         "pager", "show matching files in the pager",
921                         PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager },
922                 OPT_BOOLEAN(0, "ext-grep", &external_grep_allowed__ignored,
923                             "allow calling of grep(1) (ignored by this build)"),
924                 { OPTION_CALLBACK, 0, "help-all", &options, NULL, "show usage",
925                   PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback },
926                 OPT_END()
927         };
929         /*
930          * 'git grep -h', unlike 'git grep -h <pattern>', is a request
931          * to show usage information and exit.
932          */
933         if (argc == 2 && !strcmp(argv[1], "-h"))
934                 usage_with_options(grep_usage, options);
936         memset(&opt, 0, sizeof(opt));
937         opt.prefix = prefix;
938         opt.prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
939         opt.relative = 1;
940         opt.pathname = 1;
941         opt.pattern_tail = &opt.pattern_list;
942         opt.header_tail = &opt.header_list;
943         opt.regflags = REG_NEWLINE;
944         opt.max_depth = -1;
946         strcpy(opt.color_context, "");
947         strcpy(opt.color_filename, "");
948         strcpy(opt.color_function, "");
949         strcpy(opt.color_lineno, "");
950         strcpy(opt.color_match, GIT_COLOR_BOLD_RED);
951         strcpy(opt.color_selected, "");
952         strcpy(opt.color_sep, GIT_COLOR_CYAN);
953         opt.color = -1;
954         git_config(grep_config, &opt);
955         if (opt.color == -1)
956                 opt.color = git_use_color_default;
958         /*
959          * If there is no -- then the paths must exist in the working
960          * tree.  If there is no explicit pattern specified with -e or
961          * -f, we take the first unrecognized non option to be the
962          * pattern, but then what follows it must be zero or more
963          * valid refs up to the -- (if exists), and then existing
964          * paths.  If there is an explicit pattern, then the first
965          * unrecognized non option is the beginning of the refs list
966          * that continues up to the -- (if exists), and then paths.
967          */
968         argc = parse_options(argc, argv, prefix, options, grep_usage,
969                              PARSE_OPT_KEEP_DASHDASH |
970                              PARSE_OPT_STOP_AT_NON_OPTION |
971                              PARSE_OPT_NO_INTERNAL_HELP);
973         if (use_index && !startup_info->have_repository)
974                 /* die the same way as if we did it at the beginning */
975                 setup_git_directory();
977         /*
978          * skip a -- separator; we know it cannot be
979          * separating revisions from pathnames if
980          * we haven't even had any patterns yet
981          */
982         if (argc > 0 && !opt.pattern_list && !strcmp(argv[0], "--")) {
983                 argv++;
984                 argc--;
985         }
987         /* First unrecognized non-option token */
988         if (argc > 0 && !opt.pattern_list) {
989                 append_grep_pattern(&opt, argv[0], "command line", 0,
990                                     GREP_PATTERN);
991                 argv++;
992                 argc--;
993         }
995         if (show_in_pager == default_pager)
996                 show_in_pager = git_pager(1);
997         if (show_in_pager) {
998                 opt.color = 0;
999                 opt.name_only = 1;
1000                 opt.null_following_name = 1;
1001                 opt.output_priv = &path_list;
1002                 opt.output = append_path;
1003                 string_list_append(&path_list, show_in_pager);
1004                 use_threads = 0;
1005         }
1007         if (!opt.pattern_list)
1008                 die("no pattern given.");
1009         if (!opt.fixed && opt.ignore_case)
1010                 opt.regflags |= REG_ICASE;
1011         if ((opt.regflags != REG_NEWLINE) && opt.fixed)
1012                 die("cannot mix --fixed-strings and regexp");
1014 #ifndef NO_PTHREADS
1015         if (online_cpus() == 1 || !grep_threads_ok(&opt))
1016                 use_threads = 0;
1018         if (use_threads) {
1019                 if (opt.pre_context || opt.post_context)
1020                         print_hunk_marks_between_files = 1;
1021                 start_threads(&opt);
1022         }
1023 #else
1024         use_threads = 0;
1025 #endif
1027         compile_grep_patterns(&opt);
1029         /* Check revs and then paths */
1030         for (i = 0; i < argc; i++) {
1031                 const char *arg = argv[i];
1032                 unsigned char sha1[20];
1033                 /* Is it a rev? */
1034                 if (!get_sha1(arg, sha1)) {
1035                         struct object *object = parse_object(sha1);
1036                         if (!object)
1037                                 die("bad object %s", arg);
1038                         add_object_array(object, arg, &list);
1039                         continue;
1040                 }
1041                 if (!strcmp(arg, "--")) {
1042                         i++;
1043                         seen_dashdash = 1;
1044                 }
1045                 break;
1046         }
1048         /* The rest are paths */
1049         if (!seen_dashdash) {
1050                 int j;
1051                 for (j = i; j < argc; j++)
1052                         verify_filename(prefix, argv[j]);
1053         }
1055         if (i < argc)
1056                 paths = get_pathspec(prefix, argv + i);
1057         else if (prefix) {
1058                 paths = xcalloc(2, sizeof(const char *));
1059                 paths[0] = prefix;
1060                 paths[1] = NULL;
1061         }
1063         if (show_in_pager && (cached || list.nr))
1064                 die("--open-files-in-pager only works on the worktree");
1066         if (show_in_pager && opt.pattern_list && !opt.pattern_list->next) {
1067                 const char *pager = path_list.items[0].string;
1068                 int len = strlen(pager);
1070                 if (len > 4 && is_dir_sep(pager[len - 5]))
1071                         pager += len - 4;
1073                 if (!strcmp("less", pager) || !strcmp("vi", pager)) {
1074                         struct strbuf buf = STRBUF_INIT;
1075                         strbuf_addf(&buf, "+/%s%s",
1076                                         strcmp("less", pager) ? "" : "*",
1077                                         opt.pattern_list->pattern);
1078                         string_list_append(&path_list, buf.buf);
1079                         strbuf_detach(&buf, NULL);
1080                 }
1081         }
1083         if (!show_in_pager)
1084                 setup_pager();
1087         if (!use_index) {
1088                 if (cached)
1089                         die("--cached cannot be used with --no-index.");
1090                 if (list.nr)
1091                         die("--no-index cannot be used with revs.");
1092                 hit = grep_directory(&opt, paths);
1093         } else if (!list.nr) {
1094                 if (!cached)
1095                         setup_work_tree();
1097                 hit = grep_cache(&opt, paths, cached);
1098         } else {
1099                 if (cached)
1100                         die("both --cached and trees are given.");
1101                 hit = grep_objects(&opt, paths, &list);
1102         }
1104         if (use_threads)
1105                 hit |= wait_all();
1106         if (hit && show_in_pager)
1107                 run_pager(&opt, prefix);
1108         free_grep_patterns(&opt);
1109         return !hit;