grep: add --break
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>
Sun, 5 Jun 2011 15:24:25 +0000 (17:24 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Jun 2011 01:15:26 +0000 (18:15 -0700)
With --break, an empty line is printed between matches from different
files, increasing readability.  This option is taken from ack
(http://betterthangrep.com/).

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-grep.txt
builtin/grep.c
grep.c
grep.h
t/t7810-grep.sh

index e150c77cffb5d082822bd65c7bfbeb1f431fc42f..dea7cad0c2a617530be8fa132d9e14abbd9c1273 100644 (file)
@@ -148,6 +148,9 @@ OPTIONS
        gives the default to color output.
        Same as `--color=never`.
 
+--break::
+       Print an empty line between matches from different files.
+
 -[ABC] <context>::
        Show `context` trailing (`A` -- after), or leading (`B`
        -- before), or both (`C` -- context) lines, and place a
index 0d5a90b94b5153c17f8834455b8dbb7e252c5284..42bb87f5446b129c1db3f8e6c23e5a058c641266 100644 (file)
@@ -822,6 +822,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                OPT_BOOLEAN('c', "count", &opt.count,
                        "show the number of matches instead of matching lines"),
                OPT__COLOR(&opt.color, "highlight matches"),
+               OPT_BOOLEAN(0, "break", &opt.file_break,
+                       "print empty line between matches from different files"),
                OPT_GROUP(""),
                OPT_CALLBACK('C', NULL, &opt, "n",
                        "show <n> context lines before and after matches",
@@ -976,7 +978,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                use_threads = 0;
 
        if (use_threads) {
-               if (opt.pre_context || opt.post_context)
+               if (opt.pre_context || opt.post_context || opt.file_break)
                        skip_first_line = 1;
                start_threads(&opt);
        }
diff --git a/grep.c b/grep.c
index 3f15085d0e8bc82a0e098b9f3750d69bacc62590..b0b860a984d6516caf960fae847aea6272959c20 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -721,7 +721,10 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
        int rest = eol - bol;
        char *line_color = NULL;
 
-       if (opt->pre_context || opt->post_context) {
+       if (opt->file_break && opt->last_shown == 0) {
+               if (opt->show_hunk_mark)
+                       opt->output(opt, "\n", 1);
+       } else if (opt->pre_context || opt->post_context) {
                if (opt->last_shown == 0) {
                        if (opt->show_hunk_mark) {
                                output_color(opt, "--", 2, opt->color_sep);
@@ -941,7 +944,7 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
        if (!opt->output)
                opt->output = std_output;
 
-       if (opt->pre_context || opt->post_context) {
+       if (opt->pre_context || opt->post_context || opt->file_break) {
                /* Show hunk marks, except for the first file. */
                if (opt->last_shown)
                        opt->show_hunk_mark = 1;
diff --git a/grep.h b/grep.h
index cd055cdfa8cac903382d592f1ec7e2a22bf7f897..638bee848d4fc36edb80e57fd8b8b550dc2c6e72 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -110,6 +110,7 @@ struct grep_opt {
        unsigned post_context;
        unsigned last_shown;
        int show_hunk_mark;
+       int file_break;
        void *priv;
 
        void (*output)(struct grep_opt *opt, const void *data, size_t size);
index 539a8fe6e9391f27d24cd8b85140209b60f10f39..f55793e3cb25c731215c82d1b68ebca097670037 100755 (executable)
@@ -746,4 +746,32 @@ test_expect_success 'grep --color, separator' '
        test_cmp expected actual
 '
 
+cat >expected <<EOF
+hello.c:int main(int argc, const char **argv)
+hello.c:       /* char ?? */
+
+hello_world:Hello_world
+EOF
+
+test_expect_success 'grep --break' '
+       git grep --break -e char -e lo_w hello.c hello_world >actual &&
+       test_cmp expected actual
+'
+
+cat >expected <<EOF
+hello.c:int main(int argc, const char **argv)
+hello.c-{
+--
+hello.c:       /* char ?? */
+hello.c-}
+
+hello_world:Hello_world
+hello_world-HeLLo_world
+EOF
+
+test_expect_success 'grep --break with context' '
+       git grep --break -A1 -e char -e lo_w hello.c hello_world >actual &&
+       test_cmp expected actual
+'
+
 test_done