Skip to content

Commit

Permalink
grep: print context hunk marks between files
Browse files Browse the repository at this point in the history
Print a hunk mark before matches from a new file are shown, in addition
to the current behaviour of printing them if lines have been skipped.

The result is easier to read, as (presumably unrelated) matches from
different files are separated by a hunk mark.  GNU grep does the same.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and Junio C Hamano committed Jul 2, 2009
1 parent 5dd06d3 commit 046802d
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 1 deletion.
11 changes: 11 additions & 0 deletions builtin-grep.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,17 @@ static int flush_grep(struct grep_opt *opt,
argc -= 2;
}

if (opt->pre_context || opt->post_context) {
/*
* grep handles hunk marks between files, but we need to
* do that ourselves between multiple calls.
*/
if (opt->show_hunk_mark)
write_or_die(1, "--\n", 3);
else
opt->show_hunk_mark = 1;
}

status = exec_grep(argc, argv);

if (kept_0) {
Expand Down
7 changes: 6 additions & 1 deletion grep.c
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,12 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
int rest = eol - bol;

if (opt->pre_context || opt->post_context) {
if (opt->last_shown && lno > opt->last_shown + 1)
if (opt->last_shown == 0) {
if (opt->show_hunk_mark)
fputs("--\n", stdout);
else
opt->show_hunk_mark = 1;
} else if (lno > opt->last_shown + 1)
fputs("--\n", stdout);
}
opt->last_shown = lno;
Expand Down
1 change: 1 addition & 0 deletions grep.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ struct grep_opt {
unsigned pre_context;
unsigned post_context;
unsigned last_shown;
int show_hunk_mark;
};

extern void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t);
Expand Down
22 changes: 22 additions & 0 deletions t/t7002-grep.sh
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,28 @@ test_expect_success 'grep -e A --and --not -e B' '
test_cmp expected actual
'

cat >expected <<EOF
y:y yy
--
z:zzz
EOF

# Create 1024 file names that sort between "y" and "z" to make sure
# the two files are handled by different calls to an external grep.
# This depends on MAXARGS in builtin-grep.c being 1024 or less.
c32="0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v"
test_expect_success 'grep -C1, hunk mark between files' '
for a in $c32; do for b in $c32; do : >y-$a$b; done; done &&
git add y-?? &&
git grep -C1 "^[yz]" >actual &&
test_cmp expected actual
'

test_expect_success 'grep -C1 --no-ext-grep, hunk mark between files' '
git grep -C1 --no-ext-grep "^[yz]" >actual &&
test_cmp expected actual
'

test_expect_success 'log grep setup' '
echo a >>file &&
test_tick &&
Expand Down

0 comments on commit 046802d

Please sign in to comment.