mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
"git blame file" has always meant "find the origin of each line of the file in the history leading to HEAD, oh by the way, blame the lines that are modified locally to the working tree". This teaches "git blame" that during a conflicted merge, some uncommitted changes may have come from the other history that is being merged. The verify_working_tree_path() function introduced in the previous patch to notice a typo in the filename (primarily on case insensitive filesystems) has been updated to allow a filename that does not exist in HEAD (i.e. the tip of our history) as long as it exists one of the commits being merged, so that a "we deleted, the other side modified" case tracks the history of the file in the history of the other side. Signed-off-by: Junio C Hamano <gitster@pobox.com>
74 lines
1.5 KiB
Bash
Executable file
74 lines
1.5 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
# Based on a test case submitted by Björn Steinbrink.
|
|
|
|
test_description='git blame on conflicted files'
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'setup first case' '
|
|
# Create the old file
|
|
echo "Old line" > file1 &&
|
|
git add file1 &&
|
|
git commit --author "Old Line <ol@localhost>" -m file1.a &&
|
|
|
|
# Branch
|
|
git checkout -b foo &&
|
|
|
|
# Do an ugly move and change
|
|
git rm file1 &&
|
|
echo "New line ..." > file2 &&
|
|
echo "... and more" >> file2 &&
|
|
git add file2 &&
|
|
git commit --author "U Gly <ug@localhost>" -m ugly &&
|
|
|
|
# Back to master and change something
|
|
git checkout master &&
|
|
echo "
|
|
|
|
bla" >> file1 &&
|
|
git commit --author "Old Line <ol@localhost>" -a -m file1.b &&
|
|
|
|
# Back to foo and merge master
|
|
git checkout foo &&
|
|
if git merge master; then
|
|
echo needed conflict here
|
|
exit 1
|
|
else
|
|
echo merge failed - resolving automatically
|
|
fi &&
|
|
echo "New line ...
|
|
... and more
|
|
|
|
bla
|
|
Even more" > file2 &&
|
|
git rm file1 &&
|
|
git commit --author "M Result <mr@localhost>" -a -m merged &&
|
|
|
|
# Back to master and change file1 again
|
|
git checkout master &&
|
|
sed s/bla/foo/ <file1 >X &&
|
|
rm file1 &&
|
|
mv X file1 &&
|
|
git commit --author "No Bla <nb@localhost>" -a -m replace &&
|
|
|
|
# Try to merge into foo again
|
|
git checkout foo &&
|
|
if git merge master; then
|
|
echo needed conflict here
|
|
exit 1
|
|
else
|
|
echo merge failed - test is setup
|
|
fi
|
|
'
|
|
|
|
test_expect_success \
|
|
'blame runs on unconflicted file while other file has conflicts' '
|
|
git blame file2
|
|
'
|
|
|
|
test_expect_success 'blame does not crash with conflicted file in stages 1,3' '
|
|
git blame file1
|
|
'
|
|
|
|
test_done
|