From 30d00c395e3fb9f104a3f4a85f06a039c989cd8d Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Sat, 12 Jun 2010 11:31:18 -0500 Subject: [PATCH 1/7] grep: refactor grep_objects loop into its own function Simplify cmd_grep by splitting off the loop that finds matches in a list of trees. So now the main part of cmd_grep looks like: if (!use_index) { int hit = grep_directory(&opt, paths); if (use_threads) hit |= wait_all(); return !hit; } if (!list.nr) { if (!cached) setup_work_tree(); int hit = grep_cache(&opt, paths, cached); if (use_threads) hit |= wait_all; return !hit; } hit = grep_objects(&opt, path, &list); if (use_threads) hit |= wait_all(); return !hit; and is ripe for further refactoring. Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- builtin/grep.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/builtin/grep.c b/builtin/grep.c index b194ea3cea..5b8879f7b3 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -675,6 +675,25 @@ static int grep_object(struct grep_opt *opt, const char **paths, die("unable to grep from object of type %s", typename(obj->type)); } +static int grep_objects(struct grep_opt *opt, const char **paths, + const struct object_array *list) +{ + unsigned int i; + int hit = 0; + const unsigned int nr = list->nr; + + for (i = 0; i < nr; i++) { + struct object *real_obj; + real_obj = deref_tag(list->objects[i].item, NULL, 0); + if (grep_object(opt, paths, real_obj, list->objects[i].name)) { + hit = 1; + if (opt->status_only) + break; + } + } + return hit; +} + static int grep_directory(struct grep_opt *opt, const char **paths) { struct dir_struct dir; @@ -1024,16 +1043,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) if (cached) die("both --cached and trees are given."); - - for (i = 0; i < list.nr; i++) { - struct object *real_obj; - real_obj = deref_tag(list.objects[i].item, NULL, 0); - if (grep_object(&opt, paths, real_obj, list.objects[i].name)) { - hit = 1; - if (opt.status_only) - break; - } - } + hit = grep_objects(&opt, paths, &list); if (use_threads) hit |= wait_all(); From 685359cf2d1996aed2f1b1e2857528819d27105d Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Sat, 12 Jun 2010 11:32:11 -0500 Subject: [PATCH 2/7] Unify code paths of threaded greps There were three awfully similar code paths ending the threaded grep. It is better to avoid duplicated code, though. This change might very well prevent a race, where the grep patterns were free()d before waiting that all threads finished. Signed-off-by: Johannes Schindelin Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- builtin/grep.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/builtin/grep.c b/builtin/grep.c index 5b8879f7b3..2111212890 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -590,7 +590,6 @@ static int grep_cache(struct grep_opt *opt, const char **paths, int cached) if (hit && opt->status_only) break; } - free_grep_patterns(opt); return hit; } @@ -708,7 +707,6 @@ static int grep_directory(struct grep_opt *opt, const char **paths) if (hit && opt->status_only) break; } - free_grep_patterns(opt); return hit; } @@ -1019,32 +1017,22 @@ int cmd_grep(int argc, const char **argv, const char *prefix) } if (!use_index) { - int hit; if (cached) die("--cached cannot be used with --no-index."); if (list.nr) die("--no-index cannot be used with revs."); hit = grep_directory(&opt, paths); - if (use_threads) - hit |= wait_all(); - return !hit; - } - - if (!list.nr) { - int hit; + } else if (!list.nr) { if (!cached) setup_work_tree(); hit = grep_cache(&opt, paths, cached); - if (use_threads) - hit |= wait_all(); - return !hit; + } else { + if (cached) + die("both --cached and trees are given."); + hit = grep_objects(&opt, paths, &list); } - if (cached) - die("both --cached and trees are given."); - hit = grep_objects(&opt, paths, &list); - if (use_threads) hit |= wait_all(); free_grep_patterns(&opt); From 678e484b7d4e6388edeec3470bbbcd206817c148 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Sat, 12 Jun 2010 11:36:51 -0500 Subject: [PATCH 3/7] grep: Add the option '--open-files-in-pager' This adds an option to open the matching files in the pager, and if the pager happens to be "less" (or "vi") and there is only one grep pattern, it also jumps to the first match right away. The short option was chose as '-O' to avoid clashes with GNU grep's options (as suggested by Junio). So, 'git grep -O abc' is a short form for 'less +/abc $(grep -l abc)' except that it works also with spaces in file names, and it does not start the pager if there was no matching file. [jn: rebased and added tests; with error handling fix from Junio squashed in] Signed-off-by: Johannes Schindelin Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- Documentation/git-grep.txt | 8 ++ builtin/grep.c | 73 ++++++++++++++ git.c | 2 +- t/lib-pager.sh | 15 +++ t/t7006-pager.sh | 16 +-- t/{t7002-grep.sh => t7810-grep.sh} | 0 t/t7811-grep-open.sh | 154 +++++++++++++++++++++++++++++ 7 files changed, 255 insertions(+), 13 deletions(-) create mode 100644 t/lib-pager.sh rename t/{t7002-grep.sh => t7810-grep.sh} (100%) create mode 100755 t/t7811-grep-open.sh diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt index 4b32322a67..8fdd8e1e42 100644 --- a/Documentation/git-grep.txt +++ b/Documentation/git-grep.txt @@ -14,6 +14,7 @@ SYNOPSIS [-E | --extended-regexp] [-G | --basic-regexp] [-F | --fixed-strings] [-n] [-l | --files-with-matches] [-L | --files-without-match] + [-O | --open-files-in-pager] [-z | --null] [-c | --count] [--all-match] [-q | --quiet] [--max-depth ] @@ -104,6 +105,13 @@ OPTIONS For better compatibility with 'git diff', `--name-only` is a synonym for `--files-with-matches`. +-O:: +--open-files-in-pager:: + Open the matching files in the pager (not the output of 'grep'). + If the pager happens to be "less" or "vi", and the user + specified only one pattern, the first file is positioned at + the first match automatically. + -z:: --null:: Output \0 instead of the character that normally follows a diff --git a/builtin/grep.c b/builtin/grep.c index 2111212890..1e8b9465ed 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -11,6 +11,8 @@ #include "tree-walk.h" #include "builtin.h" #include "parse-options.h" +#include "string-list.h" +#include "run-command.h" #include "userdiff.h" #include "grep.h" #include "quote.h" @@ -556,6 +558,33 @@ static int grep_file(struct grep_opt *opt, const char *filename) } } +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); +} + +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; @@ -799,9 +828,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; struct grep_opt opt; struct object_array list = { 0, 0, NULL }; const char **paths = NULL; + struct string_list path_list = { NULL, 0, 0, 0 }; int i; int dummy; int nongit = 0, use_index = 1; @@ -885,6 +916,8 @@ 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"), 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", @@ -960,6 +993,20 @@ int cmd_grep(int argc, const char **argv, const char *prefix) argc--; } + 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; + } + } + if (!opt.pattern_list) die("no pattern given."); if (!opt.fixed && opt.ignore_case) @@ -1016,6 +1063,30 @@ int cmd_grep(int argc, const char **argv, const char *prefix) 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); + strbuf_detach(&buf, NULL); + } + } + + if (!show_in_pager) + setup_pager(); + + if (!use_index) { if (cached) die("--cached cannot be used with --no-index."); @@ -1035,6 +1106,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix) if (use_threads) hit |= wait_all(); + if (hit && show_in_pager) + run_pager(&opt, prefix); free_grep_patterns(&opt); return !hit; } diff --git a/git.c b/git.c index 99f036302a..265fa09d8d 100644 --- a/git.c +++ b/git.c @@ -329,7 +329,7 @@ static void handle_internal_command(int argc, const char **argv) { "fsck-objects", cmd_fsck, RUN_SETUP }, { "gc", cmd_gc, RUN_SETUP }, { "get-tar-commit-id", cmd_get_tar_commit_id }, - { "grep", cmd_grep, USE_PAGER }, + { "grep", cmd_grep }, { "hash-object", cmd_hash_object }, { "help", cmd_help }, { "index-pack", cmd_index_pack }, diff --git a/t/lib-pager.sh b/t/lib-pager.sh new file mode 100644 index 0000000000..f8c6025876 --- /dev/null +++ b/t/lib-pager.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +test_expect_success 'determine default pager' ' + test_might_fail git config --unset core.pager && + less=$( + unset PAGER GIT_PAGER; + git var GIT_PAGER + ) && + test -n "$less" +' + +if expr "$less" : '^[a-z][a-z]*$' >/dev/null +then + test_set_prereq SIMPLEPAGER +fi diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh index 3bc7a2a796..fc993fc8c4 100755 --- a/t/t7006-pager.sh +++ b/t/t7006-pager.sh @@ -3,6 +3,7 @@ test_description='Test automatic use of a pager.' . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-pager.sh cleanup_fail() { echo >&2 cleanup failed @@ -158,21 +159,12 @@ test_expect_success 'color when writing to a file intended for a pager' ' colorful colorful.log ' -test_expect_success 'determine default pager' ' - unset PAGER GIT_PAGER && - test_might_fail git config --unset core.pager || - cleanup_fail && - - less=$(git var GIT_PAGER) && - test -n "$less" -' - -if expr "$less" : '^[a-z][a-z]*$' >/dev/null && test_have_prereq TTY +if test_have_prereq SIMPLEPAGER && test_have_prereq TTY then - test_set_prereq SIMPLEPAGER + test_set_prereq SIMPLEPAGERTTY fi -test_expect_success SIMPLEPAGER 'default pager is used by default' ' +test_expect_success SIMPLEPAGERTTY 'default pager is used by default' ' unset PAGER GIT_PAGER && test_might_fail git config --unset core.pager && rm -f default_pager_used || diff --git a/t/t7002-grep.sh b/t/t7810-grep.sh similarity index 100% rename from t/t7002-grep.sh rename to t/t7810-grep.sh diff --git a/t/t7811-grep-open.sh b/t/t7811-grep-open.sh new file mode 100755 index 0000000000..fcfc56ea61 --- /dev/null +++ b/t/t7811-grep-open.sh @@ -0,0 +1,154 @@ +#!/bin/sh + +test_description='git grep --open-files-in-pager +' + +. ./test-lib.sh +. "$TEST_DIRECTORY"/lib-pager.sh +unset PAGER GIT_PAGER + +test_expect_success 'setup' ' + test_commit initial grep.h " +enum grep_pat_token { + GREP_PATTERN, + GREP_PATTERN_HEAD, + GREP_PATTERN_BODY, + GREP_AND, + GREP_OPEN_PAREN, + GREP_CLOSE_PAREN, + GREP_NOT, + GREP_OR, +};" && + + test_commit add-user revision.c " + } + if (seen_dashdash) + read_pathspec_from_stdin(revs, &sb, prune); + strbuf_release(&sb); +} + +static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what) +{ + append_grep_pattern(&revs->grep_filter, ptn, \"command line\", 0, what); +" && + + mkdir subdir && + test_commit subdir subdir/grep.c "enum grep_pat_token" && + + test_commit uninteresting unrelated "hello, world" && + + echo GREP_PATTERN >untracked +' + +test_expect_success SIMPLEPAGER 'git grep -O' ' + cat >$less <<-\EOF && + #!/bin/sh + printf "%s\n" "$@" >pager-args + EOF + chmod +x $less && + cat >expect.less <<-\EOF && + +/*GREP_PATTERN + grep.h + EOF + echo grep.h >expect.notless && + >empty && + + PATH=.:$PATH git grep -O GREP_PATTERN >out && + { + test_cmp expect.less pager-args || + test_cmp expect.notless pager-args + } && + test_cmp empty out +' + +test_expect_success 'git grep -O --cached' ' + test_must_fail git grep --cached -O GREP_PATTERN >out 2>msg && + grep open-files-in-pager msg +' + +test_expect_success 'git grep -O --no-index' ' + rm -f expect.less pager-args out && + cat >expect <<-\EOF && + grep.h + untracked + EOF + >empty && + + ( + GIT_PAGER='\''printf "%s\n" >pager-args'\'' && + export GIT_PAGER && + git grep --no-index -O GREP_PATTERN >out + ) && + test_cmp expect pager-args && + test_cmp empty out +' + +test_expect_success 'setup: fake "less"' ' + cat >less <<-\EOF + #!/bin/sh + printf "%s\n" "$@" >actual + EOF +' + +test_expect_success 'git grep -O jumps to line in less' ' + cat >expect <<-\EOF && + +/*GREP_PATTERN + grep.h + EOF + >empty && + + GIT_PAGER=./less git grep -O GREP_PATTERN >out && + test_cmp expect actual && + test_cmp empty out +' + +test_expect_success 'modified file' ' + rm -f actual && + cat >less <<-\EOF && + #!/bin/sh + printf "%s\n" "$@" >actual + EOF + chmod +x $less && + cat >expect <<-\EOF && + +/*enum grep_pat_token + grep.h + revision.c + subdir/grep.c + unrelated + EOF + >empty && + + echo "enum grep_pat_token" >unrelated && + test_when_finished "git checkout HEAD unrelated" && + GIT_PAGER=./less git grep -F -O "enum grep_pat_token" >out && + test_cmp expect actual && + test_cmp empty out +' + +test_expect_success 'run from subdir' ' + rm -f actual && + echo grep.c >expect && + >empty && + + ( + cd subdir && + export GIT_PAGER && + GIT_PAGER='\''printf "%s\n" >../args'\'' && + git grep -O "enum grep_pat_token" >../out && + GIT_PAGER="pwd >../dir; :" && + git grep -O "enum grep_pat_token" >../out2 + ) && + case $(cat dir) in + *subdir) + : good + ;; + *) + false + ;; + esac && + test_cmp expect args && + test_cmp empty out && + test_cmp empty out2 +' + +test_done From 0af88c15e2eb0a680c3797da8d8b97636b797f66 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Sat, 12 Jun 2010 11:39:46 -0500 Subject: [PATCH 4/7] grep -O: allow optional argument specifying the pager (or editor) Suppose you want to edit all files that contain a specific search term. Of course, you can do something totally trivial such as git grep -z -e | xargs -0r vi +/ but maybe you are happy that the same will be achieved by git grep -Ovi now. [jn: rebased and added tests] Signed-off-by: Johannes Schindelin Signed-off-by: Jonathan Nieder Acked-by: Paolo Bonzini Signed-off-by: Junio C Hamano --- Documentation/git-grep.txt | 6 +++--- builtin/grep.c | 26 ++++++++++++-------------- t/t7811-grep-open.sh | 9 ++++++--- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt index 8fdd8e1e42..d89ec32485 100644 --- a/Documentation/git-grep.txt +++ b/Documentation/git-grep.txt @@ -14,7 +14,7 @@ SYNOPSIS [-E | --extended-regexp] [-G | --basic-regexp] [-F | --fixed-strings] [-n] [-l | --files-with-matches] [-L | --files-without-match] - [-O | --open-files-in-pager] + [(-O | --open-files-in-pager) []] [-z | --null] [-c | --count] [--all-match] [-q | --quiet] [--max-depth ] @@ -105,8 +105,8 @@ OPTIONS For better compatibility with 'git diff', `--name-only` is a synonym for `--files-with-matches`. --O:: ---open-files-in-pager:: +-O []:: +--open-files-in-pager []:: Open the matching files in the pager (not the output of 'grep'). If the pager happens to be "less" or "vi", and the user specified only one pattern, the first file is positioned at diff --git a/builtin/grep.c b/builtin/grep.c index 1e8b9465ed..f32fbbc35a 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -828,7 +828,7 @@ 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; @@ -916,8 +916,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 +994,15 @@ 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.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); + use_threads = 0; } if (!opt.pattern_list) diff --git a/t/t7811-grep-open.sh b/t/t7811-grep-open.sh index fcfc56ea61..8db4fc8b10 100755 --- a/t/t7811-grep-open.sh +++ b/t/t7811-grep-open.sh @@ -99,7 +99,11 @@ test_expect_success 'git grep -O jumps to line in less' ' GIT_PAGER=./less git grep -O GREP_PATTERN >out && test_cmp expect actual && - test_cmp empty out + test_cmp empty out && + + git grep -O./less GREP_PATTERN >out2 && + test_cmp expect actual && + test_cmp empty out2 ' test_expect_success 'modified file' ' @@ -135,8 +139,7 @@ test_expect_success 'run from subdir' ' export GIT_PAGER && GIT_PAGER='\''printf "%s\n" >../args'\'' && git grep -O "enum grep_pat_token" >../out && - GIT_PAGER="pwd >../dir; :" && - git grep -O "enum grep_pat_token" >../out2 + git grep -O"pwd >../dir; :" "enum grep_pat_token" >../out2 ) && case $(cat dir) in *subdir) From 832ac79edf0e0e9108f5da5b10b496a227667f40 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 21 Jun 2010 12:37:13 -0500 Subject: [PATCH 5/7] t/lib-pager.sh: remove unnecessary '^' from 'expr' regular expression Regular expressions matched by 'expr' have an implicit '^' at the beginning of them and so are anchored to the beginning of the string. Using the '^' character to mean "match at the beginning", is redundant and could produce the wrong result if 'expr' implementations interpret the '^' as a literal '^'. Additionally, GNU expr 5.97 complains like this: expr: warning: unportable BRE: `^[a-z][a-z]*$': using `^' as the first character of the basic regular expression is not portable; it is being ignored Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- t/lib-pager.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/lib-pager.sh b/t/lib-pager.sh index f8c6025876..ba03eab14f 100644 --- a/t/lib-pager.sh +++ b/t/lib-pager.sh @@ -9,7 +9,7 @@ test_expect_success 'determine default pager' ' test -n "$less" ' -if expr "$less" : '^[a-z][a-z]*$' >/dev/null +if expr "$less" : '[a-z][a-z]*$' >/dev/null then test_set_prereq SIMPLEPAGER fi From 6a1b3fc78311f16834d885e4e0baead8e51ed631 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 21 Jun 2010 12:37:14 -0500 Subject: [PATCH 6/7] t/t7811-grep-open.sh: ensure fake "less" is made executable The fake "less" script was not being made executable. This can cause the tests that follow to fail. This failure is not apparent on platforms which have DEFAULT_PAGER set to the string "less", since lib-pager.sh will have set the $less variable to "less" and the SIMPLEPAGER prerequisite will have been set, and so the "less" script will have already been created properly and made executable in test 2 'git grep -O'. On platforms which set DEFAULT_PAGER to something like "more", no such script will have been previously created, and tests 7 and 8 will fail. So, add a call to chmod to make the fake "less" script executable. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- t/t7811-grep-open.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/t/t7811-grep-open.sh b/t/t7811-grep-open.sh index 8db4fc8b10..2e5c701566 100755 --- a/t/t7811-grep-open.sh +++ b/t/t7811-grep-open.sh @@ -84,10 +84,11 @@ test_expect_success 'git grep -O --no-index' ' ' test_expect_success 'setup: fake "less"' ' - cat >less <<-\EOF + cat >less <<-\EOF && #!/bin/sh printf "%s\n" "$@" >actual EOF + chmod +x less ' test_expect_success 'git grep -O jumps to line in less' ' From 7f5329f46dd3221618124df70aee2391aef6305a Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 21 Jun 2010 12:37:15 -0500 Subject: [PATCH 7/7] t/t7811-grep-open.sh: remove broken/redundant creation of fake "less" script The fake "less" script was already created in a previous test titled 'setup: fake "less"', so it is redundant. Additionally, it is broken since the redirection of 'cat' is to a file named 'less', but the chmod operates on the file named by the $less variable which may not contain the value 'less'. So, just remove this code, and rely on the creation of the fake "less" script performed earlier within the test script. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- t/t7811-grep-open.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/t/t7811-grep-open.sh b/t/t7811-grep-open.sh index 2e5c701566..c110441344 100755 --- a/t/t7811-grep-open.sh +++ b/t/t7811-grep-open.sh @@ -109,11 +109,6 @@ test_expect_success 'git grep -O jumps to line in less' ' test_expect_success 'modified file' ' rm -f actual && - cat >less <<-\EOF && - #!/bin/sh - printf "%s\n" "$@" >actual - EOF - chmod +x $less && cat >expect <<-\EOF && +/*enum grep_pat_token grep.h