git/t/t6428-merge-conflicts-sparse.sh
Elijah Newren 66b209b86a merge-ort: implement CE_SKIP_WORKTREE handling with conflicted entries
When merge conflicts occur in paths removed by a sparse-checkout, we
need to unsparsify those paths (clear the SKIP_WORKTREE bit), and write
out the conflicted file to the working copy.  In the very unlikely case
that someone manually put a file into the working copy at the location
of the SKIP_WORKTREE file, we need to avoid overwriting whatever edits
they have made and move that file to a different location first.

Signed-off-by: Elijah Newren <newren@gmail.com>
Reviewed-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-03-20 12:35:40 -07:00

159 lines
3.1 KiB
Bash
Executable File

#!/bin/sh
test_description="merge cases"
# The setup for all of them, pictorially, is:
#
# A
# o
# / \
# O o ?
# \ /
# o
# B
#
# To help make it easier to follow the flow of tests, they have been
# divided into sections and each test will start with a quick explanation
# of what commits O, A, and B contain.
#
# Notation:
# z/{b,c} means files z/b and z/c both exist
# x/d_1 means file x/d exists with content d1. (Purpose of the
# underscore notation is to differentiate different
# files that might be renamed into each other's paths.)
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-merge.sh
# Testcase basic, conflicting changes in 'numerals'
test_setup_numerals () {
test_create_repo numerals_$1 &&
(
cd numerals_$1 &&
>README &&
test_write_lines I II III >numerals &&
git add README numerals &&
test_tick &&
git commit -m "O" &&
git branch O &&
git branch A &&
git branch B &&
git checkout A &&
test_write_lines I II III IIII >numerals &&
git add numerals &&
test_tick &&
git commit -m "A" &&
git checkout B &&
test_write_lines I II III IV >numerals &&
git add numerals &&
test_tick &&
git commit -m "B" &&
cat <<-EOF >expected-index &&
H README
M numerals
M numerals
M numerals
EOF
cat <<-EOF >expected-merge
I
II
III
<<<<<<< HEAD
IIII
=======
IV
>>>>>>> B^0
EOF
)
}
test_expect_success 'conflicting entries written to worktree even if sparse' '
test_setup_numerals plain &&
(
cd numerals_plain &&
git checkout A^0 &&
test_path_is_file README &&
test_path_is_file numerals &&
git sparse-checkout init &&
git sparse-checkout set README &&
test_path_is_file README &&
test_path_is_missing numerals &&
test_must_fail git merge -s recursive B^0 &&
git ls-files -t >index_files &&
test_cmp expected-index index_files &&
test_path_is_file README &&
test_path_is_file numerals &&
test_cmp expected-merge numerals &&
# 4 other files:
# * expected-merge
# * expected-index
# * index_files
# * others
git ls-files -o >others &&
test_line_count = 4 others
)
'
test_expect_merge_algorithm failure success 'present-despite-SKIP_WORKTREE handled reasonably' '
test_setup_numerals in_the_way &&
(
cd numerals_in_the_way &&
git checkout A^0 &&
test_path_is_file README &&
test_path_is_file numerals &&
git sparse-checkout init &&
git sparse-checkout set README &&
test_path_is_file README &&
test_path_is_missing numerals &&
echo foobar >numerals &&
test_must_fail git merge -s recursive B^0 &&
git ls-files -t >index_files &&
test_cmp expected-index index_files &&
test_path_is_file README &&
test_path_is_file numerals &&
test_cmp expected-merge numerals &&
# There should still be a file with "foobar" in it
grep foobar * &&
# 5 other files:
# * expected-merge
# * expected-index
# * index_files
# * others
# * whatever name was given to the numerals file that had
# "foobar" in it
git ls-files -o >others &&
test_line_count = 5 others
)
'
test_done