static int grep_file(struct grep_opt *opt, const char *filename) { struct strbuf buf = STRBUF_INIT; if (opt->relative && opt->prefix_length) quote_path_relative(filename, -1, &buf, opt->prefix); else strbuf_addstr(&buf, filename); #ifndef NO_PTHREADS if (use_threads) { add_work(opt, GREP_SOURCE_FILE, buf.buf, filename, filename); strbuf_release(&buf); return 0; } else #endif { struct grep_source gs; int hit; grep_source_init(&gs, GREP_SOURCE_FILE, buf.buf, filename, filename); strbuf_release(&buf); hit = grep_source(opt, &gs); grep_source_clear(&gs); return hit; } }
static int grep_oid(struct grep_opt *opt, const struct object_id *oid, const char *filename, int tree_name_len, const char *path) { struct strbuf pathbuf = STRBUF_INIT; if (opt->relative && opt->prefix_length) { quote_path_relative(filename + tree_name_len, opt->prefix, &pathbuf); strbuf_insert(&pathbuf, 0, filename, tree_name_len); } else { strbuf_addstr(&pathbuf, filename); } #ifndef NO_PTHREADS if (num_threads) { add_work(opt, GREP_SOURCE_OID, pathbuf.buf, path, oid); strbuf_release(&pathbuf); return 0; } else #endif { struct grep_source gs; int hit; grep_source_init(&gs, GREP_SOURCE_OID, pathbuf.buf, path, oid); strbuf_release(&pathbuf); hit = grep_source(opt, &gs); grep_source_clear(&gs); return hit; } }
static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, const char *filename, int tree_name_len, const char *path) { struct strbuf pathbuf = STRBUF_INIT; if (opt->relative && opt->prefix_length) { quote_path_relative(filename + tree_name_len, -1, &pathbuf, opt->prefix); strbuf_insert(&pathbuf, 0, filename, tree_name_len); } else { strbuf_addstr(&pathbuf, filename); } #ifndef NO_PTHREADS if (use_threads) { add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1); strbuf_release(&pathbuf); return 0; } else #endif { struct grep_source gs; int hit; grep_source_init(&gs, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1); strbuf_release(&pathbuf); hit = grep_source(opt, &gs); grep_source_clear(&gs); return hit; } }
static int grep_file(struct grep_opt *opt, const char *filename) { struct strbuf buf = STRBUF_INIT; struct grep_source gs; if (opt->relative && opt->prefix_length) quote_path_relative(filename, opt->prefix, &buf); else strbuf_addstr(&buf, filename); grep_source_init(&gs, GREP_SOURCE_FILE, buf.buf, filename, filename); strbuf_release(&buf); #ifndef NO_PTHREADS if (num_threads) { /* * add_work() copies gs and thus assumes ownership of * its fields, so do not call grep_source_clear() */ add_work(opt, &gs); return 0; } else #endif { int hit; hit = grep_source(opt, &gs); grep_source_clear(&gs); return hit; } }
int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size) { struct grep_source gs; int r; grep_source_init(&gs, GREP_SOURCE_BUF, NULL, NULL, NULL); gs.buf = buf; gs.size = size; r = grep_source(opt, &gs); grep_source_clear(&gs); return r; }
/* * Prep grep structures for a submodule grep * sha1: the sha1 of the submodule or NULL if using the working tree * filename: name of the submodule including tree name of parent * path: location of the submodule */ static int grep_submodule(struct grep_opt *opt, const unsigned char *sha1, const char *filename, const char *path) { if (!is_submodule_initialized(path)) return 0; if (!is_submodule_populated(path)) { /* * If searching history, check for the presense of the * submodule's gitdir before skipping the submodule. */ if (sha1) { const struct submodule *sub = submodule_from_path(null_sha1, path); if (sub) path = git_path("modules/%s", sub->name); if (!(is_directory(path) && is_git_directory(path))) return 0; } else { return 0; } } #ifndef NO_PTHREADS if (num_threads) { add_work(opt, GREP_SOURCE_SUBMODULE, filename, path, sha1); return 0; } else #endif { struct work_item w; int hit; grep_source_init(&w.source, GREP_SOURCE_SUBMODULE, filename, path, sha1); strbuf_init(&w.out, 0); opt->output_priv = &w; hit = grep_submodule_launch(opt, &w.source); write_or_die(1, w.out.buf, w.out.len); grep_source_clear(&w.source); strbuf_release(&w.out); return hit; } }
static void work_done(struct work_item *w) { int old_done; grep_lock(); w->done = 1; old_done = todo_done; for(; todo[todo_done].done && todo_done != todo_start; todo_done = (todo_done+1) % ARRAY_SIZE(todo)) { w = &todo[todo_done]; if (w->out.len) { const char *p = w->out.buf; size_t len = w->out.len; /* Skip the leading hunk mark of the first file. */ if (skip_first_line) { while (len) { len--; if (*p++ == '\n') break; } skip_first_line = 0; } write_or_die(1, p, len); } grep_source_clear(&w->source); } if (old_done != todo_done) pthread_cond_signal(&cond_write); if (all_work_added && todo_done == todo_end) pthread_cond_signal(&cond_result); grep_unlock(); }
static int grep_oid(struct grep_opt *opt, const struct object_id *oid, const char *filename, int tree_name_len, const char *path) { struct strbuf pathbuf = STRBUF_INIT; struct grep_source gs; if (opt->relative && opt->prefix_length) { quote_path_relative(filename + tree_name_len, opt->prefix, &pathbuf); strbuf_insert(&pathbuf, 0, filename, tree_name_len); } else { strbuf_addstr(&pathbuf, filename); } grep_source_init(&gs, GREP_SOURCE_OID, pathbuf.buf, path, oid); strbuf_release(&pathbuf); #ifndef NO_PTHREADS if (num_threads) { /* * add_work() copies gs and thus assumes ownership of * its fields, so do not call grep_source_clear() */ add_work(opt, &gs); return 0; } else #endif { int hit; hit = grep_source(opt, &gs); grep_source_clear(&gs); return hit; } }