From: Julian Phillips Date: Fri, 25 Jun 2010 23:41:39 +0000 (+0100) Subject: Merge branch 'jp/string-list-api-cleanup' into jn/grep-open X-Git-Tag: v1.7.2-rc1~7^2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=0c72cead8435b2865efc884060bd0bd49313cbd5;p=git.git Merge branch 'jp/string-list-api-cleanup' into jn/grep-open An evil merge to adjust the series to cleaned-up API. From: Julian Phillips Subject: [PATCH v2 7/7] grep: fix string_list_append calls Date: Sat, 26 Jun 2010 00:41:39 +0100 Message-ID: <20100625234140.18927.35025.julian@quantumfyre.co.uk> * jp/string-list-api-cleanup: string_list: Fix argument order for string_list_append string_list: Fix argument order for string_list_lookup string_list: Fix argument order for string_list_insert_at_index string_list: Fix argument order for string_list_insert string_list: Fix argument order for for_each_string_list string_list: Fix argument order for print_string_list Signed-off-by: Julian Phillips Signed-off-by: Junio C Hamano --- 0c72cead8435b2865efc884060bd0bd49313cbd5 diff --cc builtin/grep.c index f32fbbc35,b194ea3ce..4b8ddbe0d --- a/builtin/grep.c +++ b/builtin/grep.c @@@ -558,33 -556,6 +558,33 @@@ static int grep_file(struct grep_opt *o } } +static void append_path(struct grep_opt *opt, const void *data, size_t len) +{ + struct string_list *path_list = opt->output_priv; + + 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) +{ + struct string_list *path_list = opt->output_priv; + const char **argv = xmalloc(sizeof(const char *) * (path_list->nr + 1)); + int i, status; + + for (i = 0; i < path_list->nr; i++) + argv[i] = path_list->items[i].string; + argv[path_list->nr] = NULL; + + if (prefix && chdir(prefix)) + die("Failed to chdir: %s", prefix); + status = run_command_v_opt(argv, RUN_USING_SHELL); + if (status) + exit(status); + free(argv); +} + static int grep_cache(struct grep_opt *opt, const char **paths, int cached) { int hit = 0; @@@ -994,17 -943,6 +994,17 @@@ int cmd_grep(int argc, const char **arg argc--; } + if (show_in_pager == default_pager) + show_in_pager = git_pager(1); + if (show_in_pager) { + opt.name_only = 1; + opt.null_following_name = 1; + opt.output_priv = &path_list; + opt.output = append_path; - string_list_append(show_in_pager, &path_list); ++ string_list_append(&path_list, show_in_pager); + use_threads = 0; + } + if (!opt.pattern_list) die("no pattern given."); if (!opt.fixed && opt.ignore_case) @@@ -1061,31 -999,8 +1061,31 @@@ paths[1] = NULL; } + if (show_in_pager && (cached || list.nr)) + die("--open-files-in-pager only works on the worktree"); + + if (show_in_pager && opt.pattern_list && !opt.pattern_list->next) { + const char *pager = path_list.items[0].string; + int len = strlen(pager); + + if (len > 4 && is_dir_sep(pager[len - 5])) + pager += len - 4; + + if (!strcmp("less", pager) || !strcmp("vi", pager)) { + struct strbuf buf = STRBUF_INIT; + 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); + } + } + + if (!show_in_pager) + setup_pager(); + + if (!use_index) { - int hit; if (cached) die("--cached cannot be used with --no-index."); if (list.nr)