1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-19 19:56:08 +02:00
git/t/t8002-blame.sh
Jonathan Tan a64d2aae5a sha1-file: make pretend_object_file() not prefetch
When pretend_object_file() is invoked with an object that does not exist
(as is the typical case), there is no need to fetch anything from the
promisor remote, because the caller already knows what the object is
supposed to contain. Therefore, suppress the fetch. (The
OBJECT_INFO_QUICK flag is added for the same reason.)

This was noticed at $DAYJOB when "blame" was run on a file that had
uncommitted modifications.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-07-21 16:27:22 -07:00

137 lines
3.4 KiB
Bash
Executable File

#!/bin/sh
test_description='git blame'
. ./test-lib.sh
PROG='git blame -c'
. "$TEST_DIRECTORY"/annotate-tests.sh
test_expect_success 'blame untracked file in empty repo' '
>untracked &&
test_must_fail git blame untracked
'
PROG='git blame -c -e'
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_expect_success 'setup showEmail tests' '
echo "bin: test number 1" >one &&
git add one &&
GIT_AUTHOR_NAME=name1 \
GIT_AUTHOR_EMAIL=email1@test.git \
git commit -m First --date="2010-01-01 01:00:00" &&
cat >expected_n <<-\EOF &&
(name1 2010-01-01 01:00:00 +0000 1) bin: test number 1
EOF
cat >expected_e <<-\EOF
(<email1@test.git> 2010-01-01 01:00:00 +0000 1) bin: test number 1
EOF
'
find_blame () {
sed -e 's/^[^(]*//'
}
test_expect_success 'blame with no options and no config' '
git blame one >blame &&
find_blame <blame >result &&
test_cmp expected_n result
'
test_expect_success 'blame with showemail options' '
git blame --show-email one >blame1 &&
find_blame <blame1 >result &&
test_cmp expected_e result &&
git blame -e one >blame2 &&
find_blame <blame2 >result &&
test_cmp expected_e result &&
git blame --no-show-email one >blame3 &&
find_blame <blame3 >result &&
test_cmp expected_n result
'
test_expect_success 'blame with showEmail config false' '
git config blame.showEmail false &&
git blame one >blame1 &&
find_blame <blame1 >result &&
test_cmp expected_n result &&
git blame --show-email one >blame2 &&
find_blame <blame2 >result &&
test_cmp expected_e result &&
git blame -e one >blame3 &&
find_blame <blame3 >result &&
test_cmp expected_e result &&
git blame --no-show-email one >blame4 &&
find_blame <blame4 >result &&
test_cmp expected_n result
'
test_expect_success 'blame with showEmail config true' '
git config blame.showEmail true &&
git blame one >blame1 &&
find_blame <blame1 >result &&
test_cmp expected_e result &&
git blame --no-show-email one >blame2 &&
find_blame <blame2 >result &&
test_cmp expected_n result
'
test_expect_success 'set up abbrev tests' '
test_commit abbrev &&
sha1=$(git rev-parse --verify HEAD) &&
check_abbrev () {
expect=$1; shift
echo $sha1 | cut -c 1-$expect >expect &&
git blame "$@" abbrev.t >actual &&
perl -lne "/[0-9a-f]+/ and print \$&" <actual >actual.sha &&
test_cmp expect actual.sha
}
'
test_expect_success 'blame --abbrev=<n> works' '
# non-boundary commits get +1 for alignment
check_abbrev 31 --abbrev=30 HEAD &&
check_abbrev 30 --abbrev=30 ^HEAD
'
test_expect_success 'blame -l aligns regular and boundary commits' '
check_abbrev 40 -l HEAD &&
check_abbrev 39 -l ^HEAD
'
test_expect_success 'blame --abbrev=40 behaves like -l' '
check_abbrev 40 --abbrev=40 HEAD &&
check_abbrev 39 --abbrev=40 ^HEAD
'
test_expect_success '--no-abbrev works like --abbrev=40' '
check_abbrev 40 --no-abbrev
'
test_expect_success '--exclude-promisor-objects does not BUG-crash' '
test_must_fail git blame --exclude-promisor-objects one
'
test_expect_success 'blame with uncommitted edits in partial clone does not crash' '
git init server &&
echo foo >server/file.txt &&
git -C server add file.txt &&
git -C server commit -m file &&
git clone --filter=blob:none "file://$(pwd)/server" client &&
echo bar >>client/file.txt &&
git -C client blame file.txt
'
test_done