git/t/t6428-merge-conflicts-sparse.sh
Patrick Steinhardt de54b450a3 merge-ort: unconditionally release attributes index
We conditionally release the index used for reading gitattributes in
merge-ort based on whether or the index has been populated. This check
uses `cache_nr` as a condition. This isn't sufficient though, as the
variable may be zero even when some other parts of the index have been
populated. This leads to memory leaks when sparse checkouts are in use,
as we may not end up releasing the sparse checkout patterns.

Fix this issue by unconditionally releasing the index.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2024-08-14 10:08:00 -07:00

146 lines
2.8 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_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-merge.sh
# Testcase basic, conflicting changes in 'numerals'
test_setup_numerals () {
git init 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 --no-cone 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_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 --no-cone README &&
test_path_is_file README &&
test_path_is_missing numerals &&
echo foobar >numerals &&
test_must_fail git merge -s recursive B^0 &&
test_path_is_missing .git/MERGE_HEAD &&
test_path_is_file numerals &&
# numerals should still have "foobar" in it
echo foobar >expect &&
test_cmp expect numerals
)
'
test_done