mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
![Ævar Arnfjörð Bjarmason](/assets/img/avatar_default.png)
The read_cache() in prepare_to_commit() would end up clobbering the pointer we had for a previously populated "the_index.cache_tree" in the very common case of "git commit" stressed by e.g. the tests being changed here. We'd populate "the_index.cache_tree" by calling "update_main_cache_tree" in prepare_index(), but would not end up with a "fully prepared" index. What constitutes an existing index is clearly overly fuzzy, here we'll check "active_nr" (aka "the_index.cache_nr"), but our "the_index.cache_tree" might have been malloc()'d already. Thus the code added in11c8a74a64
(commit: write cache-tree data when writing index anyway, 2011-12-06) would end up allocating the "cache_tree", and would interact here with code added in7168624c35
(Do not generate full commit log message if it is not going to be used, 2007-11-28). The result was a very common memory leak. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Taylor Blau <me@ttaylorr.com>
158 lines
3.2 KiB
Bash
Executable file
158 lines
3.2 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='patching from inconvenient places'
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'setup' '
|
|
cat >patch <<-\EOF &&
|
|
diff file.orig file
|
|
--- a/file.orig
|
|
+++ b/file
|
|
@@ -1 +1,2 @@
|
|
1
|
|
+2
|
|
EOF
|
|
patch="$(pwd)/patch" &&
|
|
|
|
echo 1 >preimage &&
|
|
printf "%s\n" 1 2 >postimage &&
|
|
echo 3 >other &&
|
|
|
|
test_tick &&
|
|
git commit --allow-empty -m basis
|
|
'
|
|
|
|
test_expect_success 'setup: subdir' '
|
|
reset_subdir() {
|
|
git reset &&
|
|
mkdir -p sub/dir/b &&
|
|
mkdir -p objects &&
|
|
cp "$1" file &&
|
|
cp "$1" objects/file &&
|
|
cp "$1" sub/dir/file &&
|
|
cp "$1" sub/dir/b/file &&
|
|
git add file sub/dir/file sub/dir/b/file objects/file &&
|
|
cp "$2" file &&
|
|
cp "$2" sub/dir/file &&
|
|
cp "$2" sub/dir/b/file &&
|
|
cp "$2" objects/file &&
|
|
test_might_fail git update-index --refresh -q
|
|
}
|
|
'
|
|
|
|
test_expect_success 'apply from subdir of toplevel' '
|
|
cp postimage expected &&
|
|
reset_subdir other preimage &&
|
|
(
|
|
cd sub/dir &&
|
|
git apply "$patch"
|
|
) &&
|
|
test_cmp expected sub/dir/file
|
|
'
|
|
|
|
test_expect_success 'apply --cached from subdir of toplevel' '
|
|
cp postimage expected &&
|
|
cp other expected.working &&
|
|
reset_subdir preimage other &&
|
|
(
|
|
cd sub/dir &&
|
|
git apply --cached "$patch"
|
|
) &&
|
|
git show :sub/dir/file >actual &&
|
|
test_cmp expected actual &&
|
|
test_cmp expected.working sub/dir/file
|
|
'
|
|
|
|
test_expect_success 'apply --index from subdir of toplevel' '
|
|
cp postimage expected &&
|
|
reset_subdir preimage other &&
|
|
(
|
|
cd sub/dir &&
|
|
test_must_fail git apply --index "$patch"
|
|
) &&
|
|
reset_subdir other preimage &&
|
|
(
|
|
cd sub/dir &&
|
|
test_must_fail git apply --index "$patch"
|
|
) &&
|
|
reset_subdir preimage preimage &&
|
|
(
|
|
cd sub/dir &&
|
|
git apply --index "$patch"
|
|
) &&
|
|
git show :sub/dir/file >actual &&
|
|
test_cmp expected actual &&
|
|
test_cmp expected sub/dir/file
|
|
'
|
|
|
|
test_expect_success 'apply half-broken patch from subdir of toplevel' '
|
|
(
|
|
cd sub/dir &&
|
|
test_must_fail git apply <<-EOF
|
|
--- sub/dir/file
|
|
+++ sub/dir/file
|
|
@@ -1,0 +1,0 @@
|
|
--- file_in_root
|
|
+++ file_in_root
|
|
@@ -1,0 +1,0 @@
|
|
EOF
|
|
)
|
|
'
|
|
|
|
test_expect_success 'apply from .git dir' '
|
|
cp postimage expected &&
|
|
cp preimage .git/file &&
|
|
cp preimage .git/objects/file &&
|
|
(
|
|
cd .git &&
|
|
git apply "$patch"
|
|
) &&
|
|
test_cmp expected .git/file
|
|
'
|
|
|
|
test_expect_success 'apply from subdir of .git dir' '
|
|
cp postimage expected &&
|
|
cp preimage .git/file &&
|
|
cp preimage .git/objects/file &&
|
|
(
|
|
cd .git/objects &&
|
|
git apply "$patch"
|
|
) &&
|
|
test_cmp expected .git/objects/file
|
|
'
|
|
|
|
test_expect_success 'apply --cached from .git dir' '
|
|
cp postimage expected &&
|
|
cp other expected.working &&
|
|
cp other .git/file &&
|
|
reset_subdir preimage other &&
|
|
(
|
|
cd .git &&
|
|
git apply --cached "$patch"
|
|
) &&
|
|
git show :file >actual &&
|
|
test_cmp expected actual &&
|
|
test_cmp expected.working file &&
|
|
test_cmp expected.working .git/file
|
|
'
|
|
|
|
test_expect_success 'apply --cached from subdir of .git dir' '
|
|
cp postimage expected &&
|
|
cp preimage expected.subdir &&
|
|
cp other .git/file &&
|
|
cp other .git/objects/file &&
|
|
reset_subdir preimage other &&
|
|
(
|
|
cd .git/objects &&
|
|
git apply --cached "$patch"
|
|
) &&
|
|
git show :file >actual &&
|
|
git show :objects/file >actual.subdir &&
|
|
test_cmp expected actual &&
|
|
test_cmp expected.subdir actual.subdir
|
|
'
|
|
|
|
test_done
|