Hi,
Attached is my sixth re-roll of a series to add '--column' to 'git
grep'.
The main change since v5 is supporting --column with queries containing
--and, --or, or --not. Previously, I had chosen to die() in this case
since there isn't always a good answer to "what is the first column of
<complicated expression>?" but have gone back on this for two reasons:
1. It is important not to regress calls to git-jump/contrib/git-jump
that contain --and, --or, or --not.
2. It is not that hard to detect the absence of column data in scripts.
Likewise, git-jump will happily accept lines with or without
columnar information, and Vim will accept it as-is.
So, let's support --column and only die() when also given
--invert-match. When we don't have a good answer, print nothing.
Thanks,
Taylor
Taylor Blau (7):
Documentation/config.txt: camel-case lineNumber for consistency
grep.c: expose matched column in match_line()
grep.[ch]: extend grep_opt to allow showing matched column
grep.c: display column number of first match
builtin/grep.c: add '--column' option to 'git-grep(1)'
grep.c: add configuration variables to show matched option
contrib/git-jump/git-jump: jump to match column in addition to line
Documentation/config.txt | 7 ++++++-
Documentation/git-grep.txt | 10 +++++++++-
builtin/grep.c | 4 ++++
contrib/git-jump/README | 12 ++++++++++--
contrib/git-jump/git-jump | 2 +-
grep.c | 40 +++++++++++++++++++++++++++++---------
grep.h | 2 ++
t/t7810-grep.sh | 39 +++++++++++++++++++++++++++++++++++++
8 files changed, 102 insertions(+), 14 deletions(-)
Inter-diff (since v5):
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index dc8f76ce99..c48a578cb1 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -173,8 +173,9 @@ providing this option will cause it to die.
Prefix the line number to matching lines.
--column::
- Prefix the 1-indexed byte-offset of the first match on non-context
lines. This
- option is incompatible with '--invert-match', and extended expressions.
+ Prefix the 1-indexed byte-offset of the first match from the start of
the
+ matching line. This option is incompatible with '--invert-match', and
+ ignored with expressions using '--and', '--or', '--not'.
-l::
--files-with-matches::
diff --git a/grep.c b/grep.c
index 5d904810ad..5ba1b05526 100644
--- a/grep.c
+++ b/grep.c
@@ -1001,9 +1001,6 @@ static void compile_grep_patterns_real(struct grep_opt
*opt)
else if (!opt->extended && !opt->debug)
return;
- if (opt->columnnum && opt->extended)
- die(_("--column and extended expressions cannot be combined"));
-
p = opt->pattern_list;
if (p)
opt->pattern_expression = compile_pattern_expr(&p);
@@ -1411,9 +1408,10 @@ static void show_line(struct grep_opt *opt, char *bol,
char *eol,
/*
* Treat 'cno' as the 1-indexed offset from the start of a non-context
* line to its first match. Otherwise, 'cno' is 0 indicating that we are
- * being called with a context line.
+ * being called with a context line, or we are --extended, and cannot
+ * always show an answer.
*/
- if (opt->columnnum && cno) {
+ if (opt->columnnum && sign == ':' && !opt->extended) {
char buf[32];
xsnprintf(buf, sizeof(buf), "%d", cno);
output_color(opt, buf, strlen(buf), opt->color_columnno);
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index aa56b21ed9..491b2e044a 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -110,6 +110,18 @@ do
test_cmp expected actual
'
+ test_expect_success "grep -w $L (with --column, -C)" '
+ {
+ echo ${HC}file:5:foo mmap bar
+ echo ${HC}file-foo_mmap bar
+ echo ${HC}file:14:foo_mmap bar mmap
+ echo ${HC}file:5:foo mmap bar_mmap
+ echo ${HC}file:14:foo_mmap bar mmap baz
+ } >expected &&
+ git grep --column -w -C1 -e mmap $H >actual &&
+ test_cmp expected actual
+ '
+
test_expect_success "grep -w $L (with --line-number, --column)" '
{
echo ${HC}file:1:5:foo mmap bar
@@ -1617,9 +1629,4 @@ test_expect_success 'grep does not allow --column,
--invert-match' '
test_i18ngrep "\-\-column and \-\-invert-match cannot be combined" err
'
-test_expect_success 'grep does not allow --column, extended' '
- test_must_fail git grep --column --not -e pat 2>err &&
- test_i18ngrep "\-\-column and extended expressions cannot be combined"
err
-'
-
test_done
--
2.17.0