2006-03-05 19:13:34 +08:00
|
|
|
# This file isn't used as a test script directly, instead it is
|
2011-04-22 06:07:36 +08:00
|
|
|
# sourced from t8001-annotate.sh and t8002-blame.sh.
|
2006-03-05 19:13:34 +08:00
|
|
|
|
2014-07-17 23:37:05 +08:00
|
|
|
if test_have_prereq MINGW
|
|
|
|
then
|
|
|
|
sanitize_L () {
|
|
|
|
echo "$1" | sed 'sX\(^-L\|,\)\^\?/X&\\;*Xg'
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sanitize_L () {
|
|
|
|
echo "$1"
|
|
|
|
}
|
|
|
|
fi
|
|
|
|
|
2006-03-06 14:07:37 +08:00
|
|
|
check_count () {
|
2013-07-18 05:25:28 +08:00
|
|
|
head= &&
|
2013-07-18 05:25:30 +08:00
|
|
|
file='file' &&
|
2013-07-18 05:25:29 +08:00
|
|
|
options= &&
|
|
|
|
while :
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
-h) head="$2"; shift; shift ;;
|
2013-07-18 05:25:30 +08:00
|
|
|
-f) file="$2"; shift; shift ;;
|
2014-07-17 23:37:05 +08:00
|
|
|
-L*) options="$options $(sanitize_L "$1")"; shift ;;
|
2013-07-18 05:25:29 +08:00
|
|
|
-*) options="$options $1"; shift ;;
|
|
|
|
*) break ;;
|
|
|
|
esac
|
|
|
|
done &&
|
2013-07-18 05:25:30 +08:00
|
|
|
echo "$PROG $options $file $head" >&4 &&
|
|
|
|
$PROG $options $file $head >actual &&
|
2013-07-18 05:25:28 +08:00
|
|
|
perl -e '
|
2006-03-06 14:07:37 +08:00
|
|
|
my %expect = (@ARGV);
|
2010-10-16 19:09:20 +08:00
|
|
|
my %count = map { $_ => 0 } keys %expect;
|
2006-03-06 14:07:37 +08:00
|
|
|
while (<STDIN>) {
|
|
|
|
if (/^[0-9a-f]+\t\(([^\t]+)\t/) {
|
|
|
|
my $author = $1;
|
|
|
|
for ($author) { s/^\s*//; s/\s*$//; }
|
2010-10-16 19:09:20 +08:00
|
|
|
$count{$author}++;
|
2006-03-06 14:07:37 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
my $bad = 0;
|
|
|
|
while (my ($author, $count) = each %count) {
|
|
|
|
my $ok;
|
2010-10-16 19:09:20 +08:00
|
|
|
my $value = 0;
|
|
|
|
$value = $expect{$author} if defined $expect{$author};
|
|
|
|
if ($value != $count) {
|
2006-03-06 14:07:37 +08:00
|
|
|
$bad = 1;
|
|
|
|
$ok = "bad";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$ok = "good";
|
|
|
|
}
|
2010-10-16 19:09:20 +08:00
|
|
|
print STDERR "Author $author (expected $value, attributed $count) $ok\n";
|
2006-03-06 14:07:37 +08:00
|
|
|
}
|
|
|
|
exit($bad);
|
2013-07-18 05:25:28 +08:00
|
|
|
' "$@" <actual
|
2006-03-06 14:07:37 +08:00
|
|
|
}
|
|
|
|
|
2013-07-18 05:25:28 +08:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
blame: fix object casting regression
Commit 1b0d400 refactored the prepare_final() function so
that it could be reused in multiple places. Originally, the
loop had two outputs: a commit to stuff into sb->final, and
the name of the commit from the rev->pending array.
After the refactor, that loop is put in its own function
with a single return value: the object_array_entry from the
rev->pending array. This contains both the name and the object,
but with one important difference: the object is the
_original_ object found by the revision parser, not the
dereferenced commit. If one feeds a tag to "git blame", we
end up casting the tag object to a "struct commit", which
causes a segfault.
Instead, let's return the commit (properly casted) directly
from the function, and take the "name" as an optional
out-parameter. This does the right thing, and actually
simplifies the callers, who no longer need to cast or
dereference the object_array_entry themselves.
[test case by Max Kirillov <max@max630.net>]
Signed-off-by: Jeff King <peff@peff.net>
2015-11-18 07:22:37 +08:00
|
|
|
test_expect_success 'blame by tag objects' '
|
|
|
|
git tag -m "test tag" testTag &&
|
|
|
|
git tag -m "test tag #2" testTag2 testTag &&
|
|
|
|
check_count -h testTag A 2 &&
|
|
|
|
check_count -h testTag2 A 2
|
|
|
|
'
|
|
|
|
|
2013-07-18 05:25:28 +08:00
|
|
|
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' '
|
2013-10-31 17:25:33 +08:00
|
|
|
git merge branch1
|
2013-07-18 05:25:28 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame 2 authors + 2 merged-in authors' '
|
|
|
|
check_count A 2 B 1 B1 2 B2 1
|
|
|
|
'
|
|
|
|
|
2015-09-15 18:05:39 +08:00
|
|
|
test_expect_success 'blame --first-parent blames merge for branch1' '
|
|
|
|
check_count --first-parent A 2 B 1 "A U Thor" 2 B2 1
|
|
|
|
'
|
|
|
|
|
2013-07-18 05:25:28 +08:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2013-12-28 04:49:57 +08:00
|
|
|
test_expect_success 'blame huge graft' '
|
|
|
|
test_when_finished "git checkout branch2" &&
|
|
|
|
test_when_finished "rm -f .git/info/grafts" &&
|
|
|
|
graft= &&
|
|
|
|
for i in 0 1 2
|
|
|
|
do
|
|
|
|
for j in 0 1 2 3 4 5 6 7 8 9
|
|
|
|
do
|
|
|
|
git checkout --orphan "$i$j" &&
|
|
|
|
printf "%s\n" "$i" "$j" >file &&
|
|
|
|
test_tick &&
|
|
|
|
GIT_AUTHOR_NAME=$i$j GIT_AUTHOR_EMAIL=$i$j@test.git \
|
|
|
|
git commit -a -m "$i$j" &&
|
|
|
|
commit=$(git rev-parse --verify HEAD) &&
|
|
|
|
graft="$graft$commit "
|
|
|
|
done
|
|
|
|
done &&
|
|
|
|
printf "%s " $graft >.git/info/grafts &&
|
|
|
|
check_count -h 00 01 1 10 1
|
|
|
|
'
|
|
|
|
|
2013-07-18 05:25:28 +08:00
|
|
|
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
|
|
|
|
'
|
2013-07-18 05:25:29 +08:00
|
|
|
|
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:49 +08:00
|
|
|
test_expect_success 'blame -L -X' '
|
2013-08-06 21:59:48 +08:00
|
|
|
test_must_fail $PROG -L-1 file
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:49 +08:00
|
|
|
test_expect_success 'blame -L 0' '
|
2013-08-06 21:59:48 +08:00
|
|
|
test_must_fail $PROG -L0 file
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:49 +08:00
|
|
|
test_expect_success 'blame -L ,0' '
|
2013-08-06 21:59:48 +08:00
|
|
|
test_must_fail $PROG -L,0 file
|
|
|
|
'
|
|
|
|
|
2013-07-31 16:15:45 +08:00
|
|
|
test_expect_success 'blame -L ,+0' '
|
2013-07-31 16:15:44 +08:00
|
|
|
test_must_fail $PROG -L,+0 file
|
|
|
|
'
|
|
|
|
|
2013-07-31 16:15:43 +08:00
|
|
|
test_expect_success 'blame -L X,+0' '
|
2013-07-31 16:15:42 +08:00
|
|
|
test_must_fail $PROG -L1,+0 file
|
|
|
|
'
|
|
|
|
|
2013-07-18 05:25:29 +08:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2013-07-31 16:15:45 +08:00
|
|
|
test_expect_success 'blame -L ,-0' '
|
2013-07-31 16:15:44 +08:00
|
|
|
test_must_fail $PROG -L,-0 file
|
|
|
|
'
|
|
|
|
|
2013-07-31 16:15:43 +08:00
|
|
|
test_expect_success 'blame -L X,-0' '
|
2013-07-31 16:15:42 +08:00
|
|
|
test_must_fail $PROG -L1,-0 file
|
|
|
|
'
|
|
|
|
|
2013-07-18 05:25:29 +08:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2013-07-31 16:15:36 +08:00
|
|
|
# 'file' ends with an incomplete line, so 'wc' reports one fewer lines than
|
|
|
|
# git-blame sees, hence the last line is actually $(wc...)+1.
|
|
|
|
test_expect_success 'blame -L X (X == nlines)' '
|
|
|
|
n=$(expr $(wc -l <file) + 1) &&
|
|
|
|
check_count -L$n C 1
|
|
|
|
'
|
|
|
|
|
blame: fix -L bounds checking bug
Since inception, -LX,Y has correctly reported an out-of-range error when
Y is beyond end of file, however, X was not checked, and an out-of-range
X would cause a crash. 92f9e273 (blame: prevent a segv when -L given
start > EOF; 2010-02-08) attempted to rectify this shortcoming but has
its own off-by-one error which allows X to extend one line past end of
file. For example, given a file with 5 lines:
git blame -L5 foo # OK, blames line 5
git blame -L6 foo # accepted, no error, no output, huh?
git blame -L7 foo # error "fatal: file foo has only 5 lines"
Fix this bug.
In order to avoid regressing "blame foo" when foo is an empty file, the
fix is slightly more complicated than changing '<' to '<='.
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-07-31 16:15:38 +08:00
|
|
|
test_expect_success 'blame -L X (X == nlines + 1)' '
|
2013-07-31 16:15:36 +08:00
|
|
|
n=$(expr $(wc -l <file) + 2) &&
|
|
|
|
test_must_fail $PROG -L$n file
|
|
|
|
'
|
|
|
|
|
2013-07-18 05:25:29 +08:00
|
|
|
test_expect_success 'blame -L X (X > nlines)' '
|
|
|
|
test_must_fail $PROG -L12345 file
|
|
|
|
'
|
|
|
|
|
2013-07-31 16:15:36 +08:00
|
|
|
test_expect_success 'blame -L ,Y (Y == nlines)' '
|
|
|
|
n=$(expr $(wc -l <file) + 1) &&
|
|
|
|
check_count -L,$n A 1 B 1 B1 1 B2 1 "A U Thor" 1 C 1 D 1 E 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L ,Y (Y == nlines + 1)' '
|
|
|
|
n=$(expr $(wc -l <file) + 2) &&
|
|
|
|
test_must_fail $PROG -L,$n file
|
|
|
|
'
|
|
|
|
|
2013-07-18 05:25:29 +08:00
|
|
|
test_expect_success 'blame -L ,Y (Y > nlines)' '
|
|
|
|
test_must_fail $PROG -L,12345 file
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:39 +08:00
|
|
|
test_expect_success 'blame -L multiple (disjoint)' '
|
|
|
|
check_count -L2,3 -L6,7 A 1 B1 1 B2 1 "A U Thor" 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L multiple (disjoint: unordered)' '
|
|
|
|
check_count -L6,7 -L2,3 A 1 B1 1 B2 1 "A U Thor" 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L multiple (adjacent)' '
|
|
|
|
check_count -L2,3 -L4,5 A 1 B 1 B2 1 D 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L multiple (adjacent: unordered)' '
|
|
|
|
check_count -L4,5 -L2,3 A 1 B 1 B2 1 D 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L multiple (overlapping)' '
|
|
|
|
check_count -L2,4 -L3,5 A 1 B 1 B2 1 D 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L multiple (overlapping: unordered)' '
|
|
|
|
check_count -L3,5 -L2,4 A 1 B 1 B2 1 D 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L multiple (superset/subset)' '
|
|
|
|
check_count -L2,8 -L3,5 A 1 B 1 B1 1 B2 1 C 1 D 1 "A U Thor" 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L multiple (superset/subset: unordered)' '
|
|
|
|
check_count -L3,5 -L2,8 A 1 B 1 B1 1 B2 1 C 1 D 1 "A U Thor" 1
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:42 +08:00
|
|
|
test_expect_success 'blame -L /RE/ (relative)' '
|
|
|
|
check_count -L3,3 -L/fox/ B1 1 B2 1 C 1 D 1 "A U Thor" 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L /RE/ (relative: no preceding range)' '
|
|
|
|
check_count -L/dog/ A 1 B 1 B1 1 B2 1 C 1 D 1 "A U Thor" 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L /RE/ (relative: adjacent)' '
|
|
|
|
check_count -L1,1 -L/dog/,+1 A 1 E 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L /RE/ (relative: not found)' '
|
|
|
|
test_must_fail $PROG -L4,4 -L/dog/ file
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L /RE/ (relative: end-of-file)' '
|
|
|
|
test_must_fail $PROG -L, -L/$/ file
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:45 +08:00
|
|
|
test_expect_success 'blame -L ^/RE/ (absolute)' '
|
|
|
|
check_count -L3,3 -L^/dog/,+2 A 1 B2 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L ^/RE/ (absolute: no preceding range)' '
|
|
|
|
check_count -L^/dog/,+2 A 1 B2 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L ^/RE/ (absolute: not found)' '
|
|
|
|
test_must_fail $PROG -L4,4 -L^/tambourine/ file
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L ^/RE/ (absolute: end-of-file)' '
|
|
|
|
n=$(expr $(wc -l <file) + 1) &&
|
|
|
|
check_count -L$n -L^/$/,+2 A 1 C 1 E 1
|
|
|
|
'
|
|
|
|
|
2013-07-18 05:25:30 +08:00
|
|
|
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 &&
|
t8001, t8002: fix "blame -L :literal" test on NetBSD
Sub-test 42 of t8001 and t8002 ("blame -L :literal") fails on NetBSD
with the following verbose output:
git annotate -L:main hello.c
Author F (expected 4, attributed 3) bad
Author G (expected 1, attributed 1) good
This is not caused by different behaviour of git blame or annotate on
that platform, but by different test input, in turn caused by a sed
command that forgets to add a newline on NetBSD. Here's the diff of the
commit that adds "goodbye" to hello.c, for Linux:
@@ -1,4 +1,5 @@
int main(int argc, const char *argv[])
{
puts("hello");
+ puts("goodbye");
}
We see that it adds an extra TAB, but that's not a problem. Here's the
same on NetBSD:
@@ -1,4 +1,4 @@
int main(int argc, const char *argv[])
{
puts("hello");
-}
+ puts("goodbye");}
It also adds an extra TAB, but it is missing the newline character
after the semicolon.
The following patch gets rid of the extra TAB at the beginning, but
more importantly adds the missing newline at the end in a (hopefully)
portable way, mentioned in http://sed.sourceforge.net/sedfaq4.html.
The diff becomes this, on both Linux and NetBSD:
@@ -1,4 +1,5 @@
int main(int argc, const char *argv[])
{
puts("hello");
+ puts("goodbye");
}
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-08-05 23:21:17 +08:00
|
|
|
sed -e "/}/ {x; s/$/Qputs(\"goodbye\");/; G;}" <hello.orig |
|
|
|
|
tr Q "\\t" >hello.c &&
|
2013-07-18 05:25:30 +08:00
|
|
|
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 &&
|
2015-03-20 18:07:15 +08:00
|
|
|
tr Q "\\t" >>hello.c <<-\EOF &&
|
2013-07-18 05:25:30 +08:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:46 +08:00
|
|
|
test_expect_success 'blame -L :RE (relative)' '
|
|
|
|
check_count -f hello.c -L3,3 -L:ma.. F 1 H 4
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L :RE (relative: no preceding range)' '
|
|
|
|
check_count -f hello.c -L:ma.. F 4 G 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L :RE (relative: not found)' '
|
|
|
|
test_must_fail $PROG -L3,3 -L:tambourine hello.c
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L :RE (relative: end-of-file)' '
|
|
|
|
test_must_fail $PROG -L, -L:main hello.c
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:47 +08:00
|
|
|
test_expect_success 'blame -L ^:RE (absolute)' '
|
|
|
|
check_count -f hello.c -L3,3 -L^:ma.. F 4 G 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L ^:RE (absolute: no preceding range)' '
|
|
|
|
check_count -f hello.c -L^:ma.. F 4 G 1
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L ^:RE (absolute: not found)' '
|
|
|
|
test_must_fail $PROG -L4,4 -L^:tambourine hello.c
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L ^:RE (absolute: end-of-file)' '
|
|
|
|
n=$(printf "%d" $(wc -l <hello.c)) &&
|
|
|
|
check_count -f hello.c -L$n -L^:ma.. F 4 G 1 H 1
|
|
|
|
'
|
|
|
|
|
2013-07-31 16:15:37 +08:00
|
|
|
test_expect_success 'setup incremental' '
|
|
|
|
(
|
|
|
|
GIT_AUTHOR_NAME=I &&
|
|
|
|
export GIT_AUTHOR_NAME &&
|
|
|
|
GIT_AUTHOR_EMAIL=I@test.git &&
|
|
|
|
export GIT_AUTHOR_EMAIL &&
|
|
|
|
>incremental &&
|
|
|
|
git add incremental &&
|
|
|
|
git commit -m "step 0" &&
|
|
|
|
printf "partial" >>incremental &&
|
|
|
|
git commit -a -m "step 0.5" &&
|
|
|
|
echo >>incremental &&
|
|
|
|
git commit -a -m "step 1"
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame empty' '
|
|
|
|
check_count -h HEAD^^ -f incremental
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:49 +08:00
|
|
|
test_expect_success 'blame -L 0 empty' '
|
|
|
|
test_must_fail $PROG -L0 incremental HEAD^^
|
2013-07-31 16:15:37 +08:00
|
|
|
'
|
|
|
|
|
blame: fix -L bounds checking bug
Since inception, -LX,Y has correctly reported an out-of-range error when
Y is beyond end of file, however, X was not checked, and an out-of-range
X would cause a crash. 92f9e273 (blame: prevent a segv when -L given
start > EOF; 2010-02-08) attempted to rectify this shortcoming but has
its own off-by-one error which allows X to extend one line past end of
file. For example, given a file with 5 lines:
git blame -L5 foo # OK, blames line 5
git blame -L6 foo # accepted, no error, no output, huh?
git blame -L7 foo # error "fatal: file foo has only 5 lines"
Fix this bug.
In order to avoid regressing "blame foo" when foo is an empty file, the
fix is slightly more complicated than changing '<' to '<='.
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-07-31 16:15:38 +08:00
|
|
|
test_expect_success 'blame -L 1 empty' '
|
2013-07-31 16:15:37 +08:00
|
|
|
test_must_fail $PROG -L1 incremental HEAD^^
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L 2 empty' '
|
|
|
|
test_must_fail $PROG -L2 incremental HEAD^^
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame half' '
|
|
|
|
check_count -h HEAD^ -f incremental I 1
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:49 +08:00
|
|
|
test_expect_success 'blame -L 0 half' '
|
|
|
|
test_must_fail $PROG -L0 incremental HEAD^
|
2013-07-31 16:15:37 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L 1 half' '
|
|
|
|
check_count -h HEAD^ -f incremental -L1 I 1
|
|
|
|
'
|
|
|
|
|
blame: fix -L bounds checking bug
Since inception, -LX,Y has correctly reported an out-of-range error when
Y is beyond end of file, however, X was not checked, and an out-of-range
X would cause a crash. 92f9e273 (blame: prevent a segv when -L given
start > EOF; 2010-02-08) attempted to rectify this shortcoming but has
its own off-by-one error which allows X to extend one line past end of
file. For example, given a file with 5 lines:
git blame -L5 foo # OK, blames line 5
git blame -L6 foo # accepted, no error, no output, huh?
git blame -L7 foo # error "fatal: file foo has only 5 lines"
Fix this bug.
In order to avoid regressing "blame foo" when foo is an empty file, the
fix is slightly more complicated than changing '<' to '<='.
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-07-31 16:15:38 +08:00
|
|
|
test_expect_success 'blame -L 2 half' '
|
2013-07-31 16:15:37 +08:00
|
|
|
test_must_fail $PROG -L2 incremental HEAD^
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L 3 half' '
|
|
|
|
test_must_fail $PROG -L3 incremental HEAD^
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame full' '
|
|
|
|
check_count -f incremental I 1
|
|
|
|
'
|
|
|
|
|
2013-08-06 21:59:49 +08:00
|
|
|
test_expect_success 'blame -L 0 full' '
|
|
|
|
test_must_fail $PROG -L0 incremental
|
2013-07-31 16:15:37 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L 1 full' '
|
|
|
|
check_count -f incremental -L1 I 1
|
|
|
|
'
|
|
|
|
|
blame: fix -L bounds checking bug
Since inception, -LX,Y has correctly reported an out-of-range error when
Y is beyond end of file, however, X was not checked, and an out-of-range
X would cause a crash. 92f9e273 (blame: prevent a segv when -L given
start > EOF; 2010-02-08) attempted to rectify this shortcoming but has
its own off-by-one error which allows X to extend one line past end of
file. For example, given a file with 5 lines:
git blame -L5 foo # OK, blames line 5
git blame -L6 foo # accepted, no error, no output, huh?
git blame -L7 foo # error "fatal: file foo has only 5 lines"
Fix this bug.
In order to avoid regressing "blame foo" when foo is an empty file, the
fix is slightly more complicated than changing '<' to '<='.
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-07-31 16:15:38 +08:00
|
|
|
test_expect_success 'blame -L 2 full' '
|
2013-07-31 16:15:37 +08:00
|
|
|
test_must_fail $PROG -L2 incremental
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L 3 full' '
|
|
|
|
test_must_fail $PROG -L3 incremental
|
|
|
|
'
|
|
|
|
|
2013-07-31 16:15:35 +08:00
|
|
|
test_expect_success 'blame -L' '
|
|
|
|
test_must_fail $PROG -L file
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L X,+' '
|
|
|
|
test_must_fail $PROG -L1,+ file
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L X,-' '
|
|
|
|
test_must_fail $PROG -L1,- file
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L X (non-numeric X)' '
|
|
|
|
test_must_fail $PROG -LX file
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L X,Y (non-numeric Y)' '
|
|
|
|
test_must_fail $PROG -L1,Y file
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L X,+N (non-numeric N)' '
|
|
|
|
test_must_fail $PROG -L1,+N file
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'blame -L X,-N (non-numeric N)' '
|
2013-07-18 05:25:29 +08:00
|
|
|
test_must_fail $PROG -L1,-N file
|
|
|
|
'
|
2013-08-06 21:59:45 +08:00
|
|
|
|
|
|
|
test_expect_success 'blame -L ,^/RE/' '
|
|
|
|
test_must_fail $PROG -L1,^/99/ file
|
|
|
|
'
|