mirror of
https://github.com/git/git
synced 2024-10-30 14:03:28 +00:00
e75d2f7f73
Extend the the release_revisions() function so that it frees the "filter" in the "struct rev_info". This in combination with a preceding change to free "cmdline" means that we can mark another set of tests as passing under "TEST_PASSES_SANITIZE_LEAK=true". The "filter" member was added recently inffaa137f64
(revision: put object filter into struct rev_info, 2022-03-09), and this fixes leaks intruded in the subsequent leak7940941de1
(pack-objects: use rev.filter when possible, 2022-03-09) and105c6f14ad
(bundle: parse filter capability, 2022-03-09). The "builtin/pack-objects.c" leak in7940941de1
was effectively with us already, but the variable was referred to by a "static" file-scoped variable. The "bundle.c " leak in105c6f14ad
was newly introduced with the new "filter" feature for bundles. The "t5600-clone-fail-cleanup.sh" change here to add "TEST_PASSES_SANITIZE_LEAK=true" is one of the cases where run-command.c in not carrying the abort() exit code upwards would have had that test passing before, but now it *actually* passes[1]. We should fix the lack of 1=1 mapping of SANITIZE=leak testing to actual leaks some other time, but it's an existing edge case, let's just mark the really-passing test as passing for now. 1. https://lore.kernel.org/git/220303.86fsnz5o9w.gmgdl@evledraar.gmail.com/ Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
110 lines
3 KiB
Bash
Executable file
110 lines
3 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright (C) 2006 Carl D. Worth <cworth@cworth.org>
|
|
#
|
|
|
|
test_description='test git clone to cleanup after failure
|
|
|
|
This test covers the fact that if git clone fails, it should remove
|
|
the directory it created, to avoid the user having to manually
|
|
remove the directory before attempting a clone again.
|
|
|
|
Unless the directory already exists, in which case we clean up only what we
|
|
wrote.
|
|
'
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
|
|
corrupt_repo () {
|
|
test_when_finished "rmdir foo/.git/objects.bak" &&
|
|
mkdir foo/.git/objects.bak/ &&
|
|
test_when_finished "mv foo/.git/objects.bak/* foo/.git/objects/" &&
|
|
mv foo/.git/objects/* foo/.git/objects.bak/
|
|
}
|
|
|
|
test_expect_success 'clone of non-existent source should fail' '
|
|
test_must_fail git clone foo bar
|
|
'
|
|
|
|
test_expect_success 'failed clone should not leave a directory' '
|
|
test_path_is_missing bar
|
|
'
|
|
|
|
test_expect_success 'create a repo to clone' '
|
|
test_create_repo foo
|
|
'
|
|
|
|
test_expect_success 'create objects in repo for later corruption' '
|
|
test_commit -C foo file &&
|
|
git -C foo checkout --detach &&
|
|
test_commit -C foo detached
|
|
'
|
|
|
|
# source repository given to git clone should be relative to the
|
|
# current path not to the target dir
|
|
test_expect_success 'clone of non-existent (relative to $PWD) source should fail' '
|
|
test_must_fail git clone ../foo baz
|
|
'
|
|
|
|
test_expect_success 'clone should work now that source exists' '
|
|
git clone foo bar
|
|
'
|
|
|
|
test_expect_success 'successful clone must leave the directory' '
|
|
test_path_is_dir bar
|
|
'
|
|
|
|
test_expect_success 'failed clone --separate-git-dir should not leave any directories' '
|
|
corrupt_repo &&
|
|
test_must_fail git clone --separate-git-dir gitdir foo worktree &&
|
|
test_path_is_missing gitdir &&
|
|
test_path_is_missing worktree
|
|
'
|
|
|
|
test_expect_success 'failed clone into empty leaves directory (vanilla)' '
|
|
mkdir -p empty &&
|
|
corrupt_repo &&
|
|
test_must_fail git clone foo empty &&
|
|
test_dir_is_empty empty
|
|
'
|
|
|
|
test_expect_success 'failed clone into empty leaves directory (bare)' '
|
|
mkdir -p empty &&
|
|
corrupt_repo &&
|
|
test_must_fail git clone --bare foo empty &&
|
|
test_dir_is_empty empty
|
|
'
|
|
|
|
test_expect_success 'failed clone into empty leaves directory (separate)' '
|
|
mkdir -p empty-git empty-wt &&
|
|
corrupt_repo &&
|
|
test_must_fail git clone --separate-git-dir empty-git foo empty-wt &&
|
|
test_dir_is_empty empty-git &&
|
|
test_dir_is_empty empty-wt
|
|
'
|
|
|
|
test_expect_success 'failed clone into empty leaves directory (separate, git)' '
|
|
mkdir -p empty-git &&
|
|
corrupt_repo &&
|
|
test_must_fail git clone --separate-git-dir empty-git foo no-wt &&
|
|
test_dir_is_empty empty-git &&
|
|
test_path_is_missing no-wt
|
|
'
|
|
|
|
test_expect_success 'failed clone into empty leaves directory (separate, wt)' '
|
|
mkdir -p empty-wt &&
|
|
corrupt_repo &&
|
|
test_must_fail git clone --separate-git-dir no-git foo empty-wt &&
|
|
test_path_is_missing no-git &&
|
|
test_dir_is_empty empty-wt
|
|
'
|
|
|
|
test_expect_success 'transport failure cleans up directory' '
|
|
test_must_fail git clone --no-local \
|
|
-u "f() { git-upload-pack \"\$@\"; return 1; }; f" \
|
|
foo broken-clone &&
|
|
test_path_is_missing broken-clone
|
|
'
|
|
|
|
test_done
|