All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] fix blame -L regression; add tests
@ 2013-07-17 21:25 Eric Sunshine
  2013-07-17 21:25 ` [PATCH 1/6] line-range: fix "blame -L X,-N" regression Eric Sunshine
                   ` (6 more replies)
  0 siblings, 7 replies; 12+ messages in thread
From: Eric Sunshine @ 2013-07-17 21:25 UTC (permalink / raw)
  To: git; +Cc: Eric Sunshine, Thomas Rast, Bo Yang

This series fixes a regression in "blame -L X,-N", adds blame -L tests,
and makes minor documentation adjustments. The tests, in particular,
were motivated by the desire to revisit and continue working on [1]
which extends git-blame to accept multiple -L's. That topic will need to
extend blame -L tests, of which there were essentially none.

Patches [2/6] (modernize style) and [3/6] (add blame -L tests) are
intentionally independent of the "git log -L" topic (from earlier this
year) to which the other patches are related.  This independence should
allow these two patches to graduate at their own pace without being tied
to "git log -L".

[1]: http://thread.gmane.org/gmane.comp.version-control.git/229755/

Eric Sunshine (6):
  line-range: fix "blame -L X,-N" regression
  t8001/t8002 (blame): modernize style
  t8001/t8002 (blame): add blame -L tests
  t8001/t8002 (blame): add blame -L :funcname tests
  blame-options.txt: place each -L option variation on its own line
  blame-options.txt: explain that -L <start> and <end> are optional

 Documentation/blame-options.txt |  10 +-
 line-range.c                    |   7 +
 t/annotate-tests.sh             | 363 ++++++++++++++++++++++++++++------------
 t/t8001-annotate.sh             |   6 +-
 t/t8002-blame.sh                |  12 +-
 5 files changed, 283 insertions(+), 115 deletions(-)

-- 
1.8.3.3.1016.g4f0baba

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/6] line-range: fix "blame -L X,-N" regression
  2013-07-17 21:25 [PATCH 0/6] fix blame -L regression; add tests Eric Sunshine
@ 2013-07-17 21:25 ` Eric Sunshine
  2013-07-17 21:25 ` [PATCH 2/6] t8001/t8002 (blame): modernize style Eric Sunshine
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Eric Sunshine @ 2013-07-17 21:25 UTC (permalink / raw)
  To: git; +Cc: Eric Sunshine, Thomas Rast, Bo Yang

"blame -L X,-N" is documented as blaming "N lines ending at X".  In
practice, the behavior is achieved by swapping the two range endpoints
if the second is less than the first.  25ed3412 (Refactor parse_loc;
2013-03-28) broke this interpretation by removing the swapping code from
blame.c and failing to add it to line-range.c along with other code
relocated from blame.c. Thus, such a range is effectively treated as
empty.  Fix this regression.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
 line-range.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/line-range.c b/line-range.c
index 8faf943..3942475 100644
--- a/line-range.c
+++ b/line-range.c
@@ -211,6 +211,8 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb,
 		    void *cb_data, long lines, long *begin, long *end,
 		    const char *path)
 {
+	*begin = *end = 0;
+
 	if (*arg == ':') {
 		arg = parse_range_funcname(arg, nth_line_cb, cb_data, lines, begin, end, path);
 		if (!arg || *arg)
@@ -226,6 +228,11 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb,
 	if (*arg)
 		return -1;
 
+	if (*begin && *end && *end < *begin) {
+		long tmp;
+		tmp = *end; *end = *begin; *begin = tmp;
+	}
+
 	return 0;
 }
 
-- 
1.8.3.3.1016.g4f0baba

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/6] t8001/t8002 (blame): modernize style
  2013-07-17 21:25 [PATCH 0/6] fix blame -L regression; add tests Eric Sunshine
  2013-07-17 21:25 ` [PATCH 1/6] line-range: fix "blame -L X,-N" regression Eric Sunshine
@ 2013-07-17 21:25 ` Eric Sunshine
  2013-07-17 21:25 ` [PATCH 3/6] t8001/t8002 (blame): add blame -L tests Eric Sunshine
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Eric Sunshine @ 2013-07-17 21:25 UTC (permalink / raw)
  To: git; +Cc: Eric Sunshine, Thomas Rast, Bo Yang

In particular,

- indent with tabs
- cuddle test description and opening body quote with test_expect_foo
- normalize test descriptions and case
- remove whitepsace following redirection operator
- use standardized filenames (such as "actual", "expected")

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
 t/annotate-tests.sh | 221 +++++++++++++++++++++++++++-------------------------
 t/t8001-annotate.sh |   6 +-
 t/t8002-blame.sh    |  12 ++-
 3 files changed, 127 insertions(+), 112 deletions(-)

diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh
index c56a77d..3aa6964 100644
--- a/t/annotate-tests.sh
+++ b/t/annotate-tests.sh
@@ -2,11 +2,11 @@
 # sourced from t8001-annotate.sh and t8002-blame.sh.
 
 check_count () {
-	head=
-	case "$1" in -h) head="$2"; shift; shift ;; esac
-	echo "$PROG file $head" >&4
-	$PROG file $head >.result || return 1
-	cat .result | perl -e '
+	head= &&
+	case "$1" in -h) head="$2"; shift; shift ;; esac &&
+	echo "$PROG file $head" >&4 &&
+	$PROG file $head >actual &&
+	perl -e '
 		my %expect = (@ARGV);
 		my %count = map { $_ => 0 } keys %expect;
 		while (<STDIN>) {
@@ -31,107 +31,114 @@ check_count () {
 			print STDERR "Author $author (expected $value, attributed $count) $ok\n";
 		}
 		exit($bad);
-	' "$@"
+	' "$@" <actual
 }
 
-test_expect_success \
-    'prepare reference tree' \
-    'echo "1A quick brown fox jumps over the" >file &&
-     echo "lazy dog" >>file &&
-     git add file &&
-     GIT_AUTHOR_NAME="A" GIT_AUTHOR_EMAIL="A@test.git" git commit -a -m "Initial."'
-
-test_expect_success \
-    'check all lines blamed on A' \
-    'check_count A 2'
-
-test_expect_success \
-    'Setup new lines blamed on B' \
-    'echo "2A quick brown fox jumps over the" >>file &&
-     echo "lazy dog" >> file &&
-     GIT_AUTHOR_NAME="B" GIT_AUTHOR_EMAIL="B@test.git" git commit -a -m "Second."'
-
-test_expect_success \
-    'Two lines blamed on A, two on B' \
-    'check_count A 2 B 2'
-
-test_expect_success \
-    'merge-setup part 1' \
-    'git checkout -b branch1 master &&
-     echo "3A slow green fox jumps into the" >> file &&
-     echo "well." >> file &&
-     GIT_AUTHOR_NAME="B1" GIT_AUTHOR_EMAIL="B1@test.git" git commit -a -m "Branch1-1"'
-
-test_expect_success \
-    'Two lines blamed on A, two on B, two on B1' \
-    'check_count A 2 B 2 B1 2'
-
-test_expect_success \
-    'merge-setup part 2' \
-    'git checkout -b branch2 master &&
-     sed -e "s/2A quick brown/4A quick brown lazy dog/" < file > file.new &&
-     mv file.new file &&
-     GIT_AUTHOR_NAME="B2" GIT_AUTHOR_EMAIL="B2@test.git" git commit -a -m "Branch2-1"'
-
-test_expect_success \
-    'Two lines blamed on A, one on B, one on B2' \
-    'check_count A 2 B 1 B2 1'
-
-test_expect_success \
-    'merge-setup part 3' \
-    'git pull . branch1'
-
-test_expect_success \
-    'Two lines blamed on A, one on B, two on B1, one on B2' \
-    'check_count A 2 B 1 B1 2 B2 1'
-
-test_expect_success \
-    'Annotating an old revision works' \
-    'check_count -h master A 2 B 2'
-
-test_expect_success \
-    'Annotating an old revision works' \
-    'check_count -h master^ A 2'
-
-test_expect_success \
-    'merge-setup part 4' \
-    'echo "evil merge." >>file &&
-     git commit -a --amend'
-
-test_expect_success \
-    'Two lines blamed on A, one on B, two on B1, one on B2, one on A U Thor' \
-    'check_count A 2 B 1 B1 2 B2 1 "A U Thor" 1'
-
-test_expect_success \
-    'an incomplete line added' \
-    'echo "incomplete" | tr -d "\\012" >>file &&
-    GIT_AUTHOR_NAME="C" GIT_AUTHOR_EMAIL="C@test.git" git commit -a -m "Incomplete"'
-
-test_expect_success \
-    'With incomplete lines.' \
-    'check_count A 2 B 1 B1 2 B2 1 "A U Thor" 1 C 1'
-
-test_expect_success \
-    'some edit' \
-    'mv file file.orig &&
-    {
-	cat file.orig &&
-	echo
-    } | sed -e "s/^3A/99/" -e "/^1A/d" -e "/^incomplete/d" > file &&
-    echo "incomplete" | tr -d "\\012" >>file &&
-    GIT_AUTHOR_NAME="D" GIT_AUTHOR_EMAIL="D@test.git" git commit -a -m "edit"'
-
-test_expect_success \
-    'some edit' \
-    'check_count A 1 B 1 B1 1 B2 1 "A U Thor" 1 C 1 D 1'
-
-test_expect_success \
-    'an obfuscated email added' \
-    'echo "No robots allowed" > file.new &&
-     cat file >> file.new &&
-     mv file.new file &&
-     GIT_AUTHOR_NAME="E" GIT_AUTHOR_EMAIL="E at test dot git" git commit -a -m "norobots"'
-
-test_expect_success \
-    'obfuscated email parsed' \
-    'check_count A 1 B 1 B1 1 B2 1 "A U Thor" 1 C 1 D 1 E 1'
+test_expect_success 'setup A lines' '
+	echo "1A quick brown fox jumps over the" >file &&
+	echo "lazy dog" >>file &&
+	git add file &&
+	GIT_AUTHOR_NAME="A" GIT_AUTHOR_EMAIL="A@test.git" \
+	git commit -a -m "Initial."
+'
+
+test_expect_success 'blame 1 author' '
+	check_count A 2
+'
+
+test_expect_success 'setup B lines' '
+	echo "2A quick brown fox jumps over the" >>file &&
+	echo "lazy dog" >>file &&
+	GIT_AUTHOR_NAME="B" GIT_AUTHOR_EMAIL="B@test.git" \
+	git commit -a -m "Second."
+'
+
+test_expect_success 'blame 2 authors' '
+	check_count A 2 B 2
+'
+
+test_expect_success 'setup B1 lines (branch1)' '
+	git checkout -b branch1 master &&
+	echo "3A slow green fox jumps into the" >>file &&
+	echo "well." >>file &&
+	GIT_AUTHOR_NAME="B1" GIT_AUTHOR_EMAIL="B1@test.git" \
+	git commit -a -m "Branch1-1"
+'
+
+test_expect_success 'blame 2 authors + 1 branch1 author' '
+	check_count A 2 B 2 B1 2
+'
+
+test_expect_success 'setup B2 lines (branch2)' '
+	git checkout -b branch2 master &&
+	sed -e "s/2A quick brown/4A quick brown lazy dog/" <file >file.new &&
+	mv file.new file &&
+	GIT_AUTHOR_NAME="B2" GIT_AUTHOR_EMAIL="B2@test.git" \
+	git commit -a -m "Branch2-1"
+'
+
+test_expect_success 'blame 2 authors + 1 branch2 author' '
+	check_count A 2 B 1 B2 1
+'
+
+test_expect_success 'merge branch1 & branch2' '
+	git pull . branch1
+'
+
+test_expect_success 'blame 2 authors + 2 merged-in authors' '
+	check_count A 2 B 1 B1 2 B2 1
+'
+
+test_expect_success 'blame ancestor' '
+	check_count -h master A 2 B 2
+'
+
+test_expect_success 'blame great-ancestor' '
+	check_count -h master^ A 2
+'
+
+test_expect_success 'setup evil merge' '
+	echo "evil merge." >>file &&
+	git commit -a --amend
+'
+
+test_expect_success 'blame evil merge' '
+	check_count A 2 B 1 B1 2 B2 1 "A U Thor" 1
+'
+
+test_expect_success 'setup incomplete line' '
+	echo "incomplete" | tr -d "\\012" >>file &&
+	GIT_AUTHOR_NAME="C" GIT_AUTHOR_EMAIL="C@test.git" \
+	git commit -a -m "Incomplete"
+'
+
+test_expect_success 'blame incomplete line' '
+	check_count A 2 B 1 B1 2 B2 1 "A U Thor" 1 C 1
+'
+
+test_expect_success 'setup edits' '
+	mv file file.orig &&
+	{
+		cat file.orig &&
+		echo
+	} | sed -e "s/^3A/99/" -e "/^1A/d" -e "/^incomplete/d" >file &&
+	echo "incomplete" | tr -d "\\012" >>file &&
+	GIT_AUTHOR_NAME="D" GIT_AUTHOR_EMAIL="D@test.git" \
+	git commit -a -m "edit"
+'
+
+test_expect_success 'blame edits' '
+	check_count A 1 B 1 B1 1 B2 1 "A U Thor" 1 C 1 D 1
+'
+
+test_expect_success 'setup obfuscated email' '
+	echo "No robots allowed" >file.new &&
+	cat file >>file.new &&
+	mv file.new file &&
+	GIT_AUTHOR_NAME="E" GIT_AUTHOR_EMAIL="E at test dot git" \
+	git commit -a -m "norobots"
+'
+
+test_expect_success 'blame obfuscated email' '
+	check_count A 1 B 1 B1 1 B2 1 "A U Thor" 1 C 1 D 1 E 1
+'
diff --git a/t/t8001-annotate.sh b/t/t8001-annotate.sh
index 41962f0..72176e4 100755
--- a/t/t8001-annotate.sh
+++ b/t/t8001-annotate.sh
@@ -6,9 +6,9 @@ test_description='git annotate'
 PROG='git annotate'
 . "$TEST_DIRECTORY"/annotate-tests.sh
 
-test_expect_success 'Annotating an old revision works' '
-	git annotate file master >result &&
-	awk "{ print \$3; }" <result >authors &&
+test_expect_success 'annotate old revision' '
+	git annotate file master >actual &&
+	awk "{ print \$3; }" <actual >authors &&
 	test 2 = $(grep A <authors | wc -l) &&
 	test 2 = $(grep B <authors | wc -l)
 '
diff --git a/t/t8002-blame.sh b/t/t8002-blame.sh
index e2896cf..5cdf3f1 100755
--- a/t/t8002-blame.sh
+++ b/t/t8002-blame.sh
@@ -7,8 +7,16 @@ PROG='git blame -c'
 . "$TEST_DIRECTORY"/annotate-tests.sh
 
 PROG='git blame -c -e'
-test_expect_success 'Blame --show-email works' '
-    check_count "<A@test.git>" 1 "<B@test.git>" 1 "<B1@test.git>" 1 "<B2@test.git>" 1 "<author@example.com>" 1 "<C@test.git>" 1 "<D@test.git>" 1 "<E at test dot git>" 1
+test_expect_success 'blame --show-email' '
+	check_count \
+		"<A@test.git>" 1 \
+		"<B@test.git>" 1 \
+		"<B1@test.git>" 1 \
+		"<B2@test.git>" 1 \
+		"<author@example.com>" 1 \
+		"<C@test.git>" 1 \
+		"<D@test.git>" 1 \
+		"<E at test dot git>" 1
 '
 
 test_done
-- 
1.8.3.3.1016.g4f0baba

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/6] t8001/t8002 (blame): add blame -L tests
  2013-07-17 21:25 [PATCH 0/6] fix blame -L regression; add tests Eric Sunshine
  2013-07-17 21:25 ` [PATCH 1/6] line-range: fix "blame -L X,-N" regression Eric Sunshine
  2013-07-17 21:25 ` [PATCH 2/6] t8001/t8002 (blame): modernize style Eric Sunshine
@ 2013-07-17 21:25 ` Eric Sunshine
  2013-07-17 21:25 ` [PATCH 4/6] t8001/t8002 (blame): add blame -L :funcname tests Eric Sunshine
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Eric Sunshine @ 2013-07-17 21:25 UTC (permalink / raw)
  To: git; +Cc: Eric Sunshine, Thomas Rast, Bo Yang

With the exception of a couple "corner case" checks in t8003 (and some
indirect tests in t4211 of -L parsing code shared by log -L), there is
no systematic checking of blame -L.  Add tests to check blame -L
directly.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
 t/annotate-tests.sh | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 101 insertions(+), 3 deletions(-)

diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh
index 3aa6964..b6a7478 100644
--- a/t/annotate-tests.sh
+++ b/t/annotate-tests.sh
@@ -3,9 +3,17 @@
 
 check_count () {
 	head= &&
-	case "$1" in -h) head="$2"; shift; shift ;; esac &&
-	echo "$PROG file $head" >&4 &&
-	$PROG file $head >actual &&
+	options= &&
+	while :
+	do
+		case "$1" in
+		-h) head="$2"; shift; shift ;;
+		-*) options="$options $1"; shift ;;
+		*) break ;;
+		esac
+	done &&
+	echo "$PROG $options file $head" >&4 &&
+	$PROG $options file $head >actual &&
 	perl -e '
 		my %expect = (@ARGV);
 		my %count = map { $_ => 0 } keys %expect;
@@ -142,3 +150,93 @@ test_expect_success 'setup obfuscated email' '
 test_expect_success 'blame obfuscated email' '
 	check_count A 1 B 1 B1 1 B2 1 "A U Thor" 1 C 1 D 1 E 1
 '
+
+test_expect_success 'blame -L 1 (all)' '
+	check_count -L1 A 1 B 1 B1 1 B2 1 "A U Thor" 1 C 1 D 1 E 1
+'
+
+test_expect_success 'blame -L , (all)' '
+	check_count -L, A 1 B 1 B1 1 B2 1 "A U Thor" 1 C 1 D 1 E 1
+'
+
+test_expect_success 'blame -L X (X to end)' '
+	check_count -L5 B1 1 C 1 D 1 "A U Thor" 1
+'
+
+test_expect_success 'blame -L X, (X to end)' '
+	check_count -L5, B1 1 C 1 D 1 "A U Thor" 1
+'
+
+test_expect_success 'blame -L ,Y (up to Y)' '
+	check_count -L,3 A 1 B2 1 E 1
+'
+
+test_expect_success 'blame -L X,X' '
+	check_count -L3,3 B2 1
+'
+
+test_expect_success 'blame -L X,Y' '
+	check_count -L3,6 B 1 B1 1 B2 1 D 1
+'
+
+test_expect_success 'blame -L Y,X (undocumented)' '
+	check_count -L6,3 B 1 B1 1 B2 1 D 1
+'
+
+test_expect_success 'blame -L X,+1' '
+	check_count -L3,+1 B2 1
+'
+
+test_expect_success 'blame -L X,+N' '
+	check_count -L3,+4 B 1 B1 1 B2 1 D 1
+'
+
+test_expect_success 'blame -L X,-1' '
+	check_count -L3,-1 B2 1
+'
+
+test_expect_success 'blame -L X,-N' '
+	check_count -L6,-4 B 1 B1 1 B2 1 D 1
+'
+
+test_expect_success 'blame -L /RE/ (RE to end)' '
+	check_count -L/evil/ C 1 "A U Thor" 1
+'
+
+test_expect_success 'blame -L /RE/,/RE2/' '
+	check_count -L/robot/,/green/ A 1 B 1 B2 1 D 1 E 1
+'
+
+test_expect_success 'blame -L X,/RE/' '
+	check_count -L5,/evil/ B1 1 D 1 "A U Thor" 1
+'
+
+test_expect_success 'blame -L /RE/,Y' '
+	check_count -L/99/,7 B1 1 D 1 "A U Thor" 1
+'
+
+test_expect_success 'blame -L /RE/,+N' '
+	check_count -L/99/,+3 B1 1 D 1 "A U Thor" 1
+'
+
+test_expect_success 'blame -L /RE/,-N' '
+	check_count -L/99/,-3 B 1 B2 1 D 1
+'
+
+test_expect_success 'blame -L X (X > nlines)' '
+	test_must_fail $PROG -L12345 file
+'
+
+test_expect_success 'blame -L ,Y (Y > nlines)' '
+	test_must_fail $PROG -L,12345 file
+'
+
+test_expect_success 'blame -L bogus' '
+	test_must_fail $PROG -L file &&
+	test_must_fail $PROG -L1,+ file &&
+	test_must_fail $PROG -L1,- file &&
+	test_must_fail $PROG -LX file &&
+	test_must_fail $PROG -L1,X file &&
+	test_must_fail $PROG -L1,+N file &&
+	test_must_fail $PROG -L1,-N file
+'
-- 
1.8.3.3.1016.g4f0baba

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/6] t8001/t8002 (blame): add blame -L :funcname tests
  2013-07-17 21:25 [PATCH 0/6] fix blame -L regression; add tests Eric Sunshine
                   ` (2 preceding siblings ...)
  2013-07-17 21:25 ` [PATCH 3/6] t8001/t8002 (blame): add blame -L tests Eric Sunshine
@ 2013-07-17 21:25 ` Eric Sunshine
  2013-07-17 21:25 ` [PATCH 5/6] blame-options.txt: place each -L option variation on its own line Eric Sunshine
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Eric Sunshine @ 2013-07-17 21:25 UTC (permalink / raw)
  To: git; +Cc: Eric Sunshine, Thomas Rast, Bo Yang

git-blame inherited "-L :funcname" support when "-L :funcname:file" was
implemented for git-log. Add tests.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
 t/annotate-tests.sh | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 46 insertions(+), 2 deletions(-)

diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh
index b6a7478..0bfee00 100644
--- a/t/annotate-tests.sh
+++ b/t/annotate-tests.sh
@@ -3,17 +3,19 @@
 
 check_count () {
 	head= &&
+	file='file' &&
 	options= &&
 	while :
 	do
 		case "$1" in
 		-h) head="$2"; shift; shift ;;
+		-f) file="$2"; shift; shift ;;
 		-*) options="$options $1"; shift ;;
 		*) break ;;
 		esac
 	done &&
-	echo "$PROG $options file $head" >&4 &&
-	$PROG $options file $head >actual &&
+	echo "$PROG $options $file $head" >&4 &&
+	$PROG $options $file $head >actual &&
 	perl -e '
 		my %expect = (@ARGV);
 		my %count = map { $_ => 0 } keys %expect;
@@ -231,6 +233,48 @@ test_expect_success 'blame -L ,Y (Y > nlines)' '
 	test_must_fail $PROG -L,12345 file
 '
 
+test_expect_success 'setup -L :regex' '
+	tr Q "\\t" >hello.c <<-\EOF &&
+	int main(int argc, const char *argv[])
+	{
+	Qputs("hello");
+	}
+	EOF
+	git add hello.c &&
+	GIT_AUTHOR_NAME="F" GIT_AUTHOR_EMAIL="F@test.git" \
+	git commit -m "hello" &&
+
+	mv hello.c hello.orig &&
+	sed -e "/}/i\\
+	Qputs(\"goodbye\");" <hello.orig | tr Q "\\t" >hello.c &&
+	GIT_AUTHOR_NAME="G" GIT_AUTHOR_EMAIL="G@test.git" \
+	git commit -a -m "goodbye" &&
+
+	mv hello.c hello.orig &&
+	echo "#include <stdio.h>" >hello.c &&
+	cat hello.orig >>hello.c &&
+	tr Q "\\t" >>hello.c <<-\EOF
+	void mail()
+	{
+	Qputs("mail");
+	}
+	EOF
+	GIT_AUTHOR_NAME="H" GIT_AUTHOR_EMAIL="H@test.git" \
+	git commit -a -m "mail"
+'
+
+test_expect_success 'blame -L :literal' '
+	check_count -f hello.c -L:main F 4 G 1
+'
+
+test_expect_success 'blame -L :regex' '
+	check_count -f hello.c "-L:m[a-z][a-z]l" H 4
+'
+
+test_expect_success 'blame -L :nomatch' '
+	test_must_fail $PROG -L:nomatch hello.c
+'
+
 test_expect_success 'blame -L bogus' '
 	test_must_fail $PROG -L file &&
 	test_must_fail $PROG -L1,+ file &&
-- 
1.8.3.3.1016.g4f0baba

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/6] blame-options.txt: place each -L option variation on its own line
  2013-07-17 21:25 [PATCH 0/6] fix blame -L regression; add tests Eric Sunshine
                   ` (3 preceding siblings ...)
  2013-07-17 21:25 ` [PATCH 4/6] t8001/t8002 (blame): add blame -L :funcname tests Eric Sunshine
@ 2013-07-17 21:25 ` Eric Sunshine
  2013-07-18 11:56   ` Thomas Rast
  2013-07-17 21:25 ` [PATCH 6/6] blame-options.txt: explain that -L <start> and <end> are optional Eric Sunshine
  2013-07-18 12:04 ` [PATCH 0/6] fix blame -L regression; add tests Thomas Rast
  6 siblings, 1 reply; 12+ messages in thread
From: Eric Sunshine @ 2013-07-17 21:25 UTC (permalink / raw)
  To: git; +Cc: Eric Sunshine, Thomas Rast, Bo Yang

Standard practice in Git documentation is for each variation of an
option (such as: -p / --porcelain) to be placed on its own line in the
OPTIONS table. The -L option does not follow suit. It cuddles
"-L <start>,<end>" and "-L :<regex>", separated by a comma. This is
inconsistent and potentially confusing since the comma separating them
is typeset the same as the comma in "<start>,<end>". Fix this by placing
each variation on its own line.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
 Documentation/blame-options.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index e9f984b..624b353 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -9,7 +9,8 @@
 --show-stats::
 	Include additional statistics at the end of blame output.
 
--L <start>,<end>, -L :<regex>::
+-L <start>,<end>::
+-L :<regex>::
 	Annotate only the given line range.  <start> and <end> can take
 	one of these forms:
 
-- 
1.8.3.3.1016.g4f0baba

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 6/6] blame-options.txt: explain that -L <start> and <end> are optional
  2013-07-17 21:25 [PATCH 0/6] fix blame -L regression; add tests Eric Sunshine
                   ` (4 preceding siblings ...)
  2013-07-17 21:25 ` [PATCH 5/6] blame-options.txt: place each -L option variation on its own line Eric Sunshine
@ 2013-07-17 21:25 ` Eric Sunshine
  2013-07-18 12:04 ` [PATCH 0/6] fix blame -L regression; add tests Thomas Rast
  6 siblings, 0 replies; 12+ messages in thread
From: Eric Sunshine @ 2013-07-17 21:25 UTC (permalink / raw)
  To: git; +Cc: Eric Sunshine, Thomas Rast, Bo Yang

The ability to omit either end of the -L range is a handy but
undocumented shortcut, and is thus not easily discovered. Fix this
shortcoming.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
 Documentation/blame-options.txt | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index 624b353..4e55b15 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -11,8 +11,11 @@
 
 -L <start>,<end>::
 -L :<regex>::
-	Annotate only the given line range.  <start> and <end> can take
-	one of these forms:
+	Annotate only the given line range.  <start> and <end> are optional.
+	``-L <start>'' or ``-L <start>,'' spans from <start> to end of file.
+	``-L ,<end>'' spans from start of file to <end>.
++
+<start> and <end> can take one of these forms:
 
 include::line-range-format.txt[]
 
-- 
1.8.3.3.1016.g4f0baba

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/6] blame-options.txt: place each -L option variation on its own line
  2013-07-17 21:25 ` [PATCH 5/6] blame-options.txt: place each -L option variation on its own line Eric Sunshine
@ 2013-07-18 11:56   ` Thomas Rast
  2013-07-18 17:51     ` Junio C Hamano
  0 siblings, 1 reply; 12+ messages in thread
From: Thomas Rast @ 2013-07-18 11:56 UTC (permalink / raw)
  To: Eric Sunshine; +Cc: git, Bo Yang

Eric Sunshine <sunshine@sunshineco.com> writes:

> Standard practice in Git documentation is for each variation of an
> option (such as: -p / --porcelain) to be placed on its own line in the
> OPTIONS table. The -L option does not follow suit. It cuddles
> "-L <start>,<end>" and "-L :<regex>", separated by a comma. This is
> inconsistent and potentially confusing since the comma separating them
> is typeset the same as the comma in "<start>,<end>". Fix this by placing
> each variation on its own line.

Ok, but why not fix them all in one go?

Edited to remove the false positives:

$ git grep -n '^.*,.*::$' Documentation/*.txt
Documentation/blame-options.txt:12:-L <start>,<end>, -L :<regex>::
Documentation/config.txt:1252:gitcvs.dbuser, gitcvs.dbpass::
Documentation/config.txt:1513:http.lowSpeedLimit, http.lowSpeedTime::
Documentation/git-add.txt:90:-e, \--edit::
Documentation/git-check-attr.txt:22:-a, --all::
Documentation/git-check-ignore.txt:26:-q, --quiet::
Documentation/git-check-ignore.txt:30:-v, --verbose::
Documentation/git-check-ignore.txt:42:-n, --non-matching::
Documentation/git-log.txt:65:-L <start>,<end>:<file>, -L :<regex>:<file>::
Documentation/git-log.txt:156:git log -L '/int main/',/^}/:main.c::
Documentation/git-p4.txt:171:--verbose, -v::
Documentation/git-p4.txt:282:--dry-run, -n::

-- 
Thomas Rast
trast@{inf,student}.ethz.ch

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 0/6] fix blame -L regression; add tests
  2013-07-17 21:25 [PATCH 0/6] fix blame -L regression; add tests Eric Sunshine
                   ` (5 preceding siblings ...)
  2013-07-17 21:25 ` [PATCH 6/6] blame-options.txt: explain that -L <start> and <end> are optional Eric Sunshine
@ 2013-07-18 12:04 ` Thomas Rast
  6 siblings, 0 replies; 12+ messages in thread
From: Thomas Rast @ 2013-07-18 12:04 UTC (permalink / raw)
  To: Eric Sunshine; +Cc: git, Bo Yang

Eric Sunshine <sunshine@sunshineco.com> writes:

> This series fixes a regression in "blame -L X,-N", adds blame -L tests,
> and makes minor documentation adjustments. The tests, in particular,
> were motivated by the desire to revisit and continue working on [1]
> which extends git-blame to accept multiple -L's. That topic will need to
> extend blame -L tests, of which there were essentially none.
>
> Patches [2/6] (modernize style) and [3/6] (add blame -L tests) are
> intentionally independent of the "git log -L" topic (from earlier this
> year) to which the other patches are related.  This independence should
> allow these two patches to graduate at their own pace without being tied
> to "git log -L".
>
> [1]: http://thread.gmane.org/gmane.comp.version-control.git/229755/
>
> Eric Sunshine (6):
>   line-range: fix "blame -L X,-N" regression
>   t8001/t8002 (blame): modernize style
>   t8001/t8002 (blame): add blame -L tests
>   t8001/t8002 (blame): add blame -L :funcname tests
>   blame-options.txt: place each -L option variation on its own line
>   blame-options.txt: explain that -L <start> and <end> are optional

Thanks, and except for the comment I just sent out,
Acked-by: Thomas Rast <trast@inf.ethz.ch>

In case it wasn't obvious to anyone else: the tests do actually verify
that the right lines were picked, by counting how often each author is
blamed.

-- 
Thomas Rast
trast@{inf,student}.ethz.ch

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/6] blame-options.txt: place each -L option variation on its own line
  2013-07-18 11:56   ` Thomas Rast
@ 2013-07-18 17:51     ` Junio C Hamano
  2013-07-22 10:38       ` Thomas Rast
  0 siblings, 1 reply; 12+ messages in thread
From: Junio C Hamano @ 2013-07-18 17:51 UTC (permalink / raw)
  To: Thomas Rast; +Cc: Eric Sunshine, git, Bo Yang

Thomas Rast <tr@thomasrast.ch> writes:

> Eric Sunshine <sunshine@sunshineco.com> writes:
>
>> Standard practice in Git documentation is for each variation of an
>> option (such as: -p / --porcelain) to be placed on its own line in the
>> OPTIONS table. The -L option does not follow suit. It cuddles
>> "-L <start>,<end>" and "-L :<regex>", separated by a comma. This is
>> inconsistent and potentially confusing since the comma separating them
>> is typeset the same as the comma in "<start>,<end>". Fix this by placing
>> each variation on its own line.
>
> Ok, but why not fix them all in one go?
>
> Edited to remove the false positives:
>
> $ git grep -n '^.*,.*::$' Documentation/*.txt
> Documentation/blame-options.txt:12:-L <start>,<end>, -L :<regex>::
> Documentation/config.txt:1252:gitcvs.dbuser, gitcvs.dbpass::
> Documentation/config.txt:1513:http.lowSpeedLimit, http.lowSpeedTime::
> Documentation/git-add.txt:90:-e, \--edit::
> Documentation/git-check-attr.txt:22:-a, --all::
> Documentation/git-check-ignore.txt:26:-q, --quiet::
> Documentation/git-check-ignore.txt:30:-v, --verbose::
> Documentation/git-check-ignore.txt:42:-n, --non-matching::
> Documentation/git-log.txt:65:-L <start>,<end>:<file>, -L :<regex>:<file>::
> Documentation/git-log.txt:156:git log -L '/int main/',/^}/:main.c::
> Documentation/git-p4.txt:171:--verbose, -v::
> Documentation/git-p4.txt:282:--dry-run, -n::

Thanks, but I think it is cleaner to fix the others in a separate
"treewide clean-up" patch.

Also I wonder if this one Documentation/git-log.txt:156

    git log -L '/int main/',/^}/:main.c

should be more like one of these:

    git log -L '/int main/,/^}/':main.c
    git log -L '/int main/,/^}/:main.c'

I find it somewhat hard to spot the closing sq in the middle of a
string.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/6] blame-options.txt: place each -L option variation on its own line
  2013-07-18 17:51     ` Junio C Hamano
@ 2013-07-22 10:38       ` Thomas Rast
  2013-07-22 17:25         ` Junio C Hamano
  0 siblings, 1 reply; 12+ messages in thread
From: Thomas Rast @ 2013-07-22 10:38 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Thomas Rast, Eric Sunshine, git, Bo Yang

Junio C Hamano <gitster@pobox.com> writes:

> Also I wonder if this one Documentation/git-log.txt:156
>
>     git log -L '/int main/',/^}/:main.c
>
> should be more like one of these:
>
>     git log -L '/int main/,/^}/':main.c
>     git log -L '/int main/,/^}/:main.c'
>
> I find it somewhat hard to spot the closing sq in the middle of a
> string.

There's a distinct advantage to keeping the sq before the colon, at
least in my config (and I think I haven't changed the defaults as far as
this goes): bash will try to complete a filename if you type

  git log -L '...':mai<TAB>

but not if you instead do

  git log -L '...:'mai<TAB>


-- 
Thomas Rast
trast@{inf,student}.ethz.ch

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/6] blame-options.txt: place each -L option variation on its own line
  2013-07-22 10:38       ` Thomas Rast
@ 2013-07-22 17:25         ` Junio C Hamano
  0 siblings, 0 replies; 12+ messages in thread
From: Junio C Hamano @ 2013-07-22 17:25 UTC (permalink / raw)
  To: Thomas Rast; +Cc: Thomas Rast, Eric Sunshine, git, Bo Yang

Thomas Rast <trast@inf.ethz.ch> writes:

> Junio C Hamano <gitster@pobox.com> writes:
>
>> Also I wonder if this one Documentation/git-log.txt:156
>>
>>     git log -L '/int main/',/^}/:main.c
>>
>> should be more like one of these:
>>
>>     git log -L '/int main/,/^}/':main.c
>>     git log -L '/int main/,/^}/:main.c'
>>
>> I find it somewhat hard to spot the closing sq in the middle of a
>> string.
>
> There's a distinct advantage to keeping the sq before the colon, at
> least in my config (and I think I haven't changed the defaults as far as
> this goes): bash will try to complete a filename if you type
>
>   git log -L '...':mai<TAB>
>
> but not if you instead do
>
>   git log -L '...:'mai<TAB>

Interesting.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2013-07-22 17:25 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-17 21:25 [PATCH 0/6] fix blame -L regression; add tests Eric Sunshine
2013-07-17 21:25 ` [PATCH 1/6] line-range: fix "blame -L X,-N" regression Eric Sunshine
2013-07-17 21:25 ` [PATCH 2/6] t8001/t8002 (blame): modernize style Eric Sunshine
2013-07-17 21:25 ` [PATCH 3/6] t8001/t8002 (blame): add blame -L tests Eric Sunshine
2013-07-17 21:25 ` [PATCH 4/6] t8001/t8002 (blame): add blame -L :funcname tests Eric Sunshine
2013-07-17 21:25 ` [PATCH 5/6] blame-options.txt: place each -L option variation on its own line Eric Sunshine
2013-07-18 11:56   ` Thomas Rast
2013-07-18 17:51     ` Junio C Hamano
2013-07-22 10:38       ` Thomas Rast
2013-07-22 17:25         ` Junio C Hamano
2013-07-17 21:25 ` [PATCH 6/6] blame-options.txt: explain that -L <start> and <end> are optional Eric Sunshine
2013-07-18 12:04 ` [PATCH 0/6] fix blame -L regression; add tests Thomas Rast

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.