Merge pull request #472 from thockin/master

Don't try to remove the root if it appears corrupt (v4)
This commit is contained in:
Kubernetes Prow Robot 2022-01-23 01:15:56 -08:00 committed by GitHub
commit 6dc0e44697
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 27 deletions

View File

@ -1058,7 +1058,10 @@ func (git *repoSync) CloneRepo(ctx context.Context) error {
if strings.Contains(err.Error(), "already exists and is not an empty directory") { if strings.Contains(err.Error(), "already exists and is not an empty directory") {
// Maybe a previous run crashed? Git won't use this dir. // Maybe a previous run crashed? Git won't use this dir.
git.log.V(0).Info("git root exists and is not empty (previous crash?), cleaning up", "path", git.root) git.log.V(0).Info("git root exists and is not empty (previous crash?), cleaning up", "path", git.root)
err := os.RemoveAll(git.root) // We remove the contents rather than the dir itself, because a
// common use-case is to have a volume mounted at git.root, which
// makes removing it impossible.
err := removeDirContents(git.root, git.log)
if err != nil { if err != nil {
return err return err
} }

View File

@ -98,10 +98,19 @@ function docker_kill() {
docker kill "$1" >/dev/null docker kill "$1" >/dev/null
} }
# DIR is the directory in which all this test's state lives.
RUNID="${RANDOM}${RANDOM}" RUNID="${RANDOM}${RANDOM}"
DIR="/tmp/git-sync-e2e.$RUNID" DIR="/tmp/git-sync-e2e.$RUNID"
mkdir "$DIR" mkdir "$DIR"
# WORK is temp space and in reset for each testcase.
WORK="$DIR/work"
function clean_work() {
rm -rf "$WORK"
mkdir -p "$WORK"
}
# REPO is the source repo under test.
REPO="$DIR/repo" REPO="$DIR/repo"
MAIN_BRANCH="e2e-branch" MAIN_BRANCH="e2e-branch"
function init_repo() { function init_repo() {
@ -113,6 +122,7 @@ function init_repo() {
git -C "$REPO" commit -aqm "init file" git -C "$REPO" commit -aqm "init file"
} }
# ROOT is the volume (usually) used as --root.
ROOT="$DIR/root" ROOT="$DIR/root"
function clean_root() { function clean_root() {
rm -rf "$ROOT" rm -rf "$ROOT"
@ -144,7 +154,9 @@ function GIT_SYNC() {
--label git-sync-e2e="$RUNID" \ --label git-sync-e2e="$RUNID" \
--network="host" \ --network="host" \
-u $(id -u):$(id -g) \ -u $(id -u):$(id -g) \
-v "$DIR":"$DIR":rw \ -v "$ROOT":"$ROOT":rw \
-v "$REPO":"$REPO":ro \
-v "$WORK":"$WORK":ro \
-v "$(pwd)/slow_git_clone.sh":"$SLOW_GIT_CLONE":ro \ -v "$(pwd)/slow_git_clone.sh":"$SLOW_GIT_CLONE":ro \
-v "$(pwd)/slow_git_fetch.sh":"$SLOW_GIT_FETCH":ro \ -v "$(pwd)/slow_git_fetch.sh":"$SLOW_GIT_FETCH":ro \
-v "$(pwd)/askpass_git.sh":"$ASKPASS_GIT":ro \ -v "$(pwd)/askpass_git.sh":"$ASKPASS_GIT":ro \
@ -180,19 +192,18 @@ function remove_containers() {
function e2e::head_once_root_doesnt_exist() { function e2e::head_once_root_doesnt_exist() {
echo "$FUNCNAME" > "$REPO"/file echo "$FUNCNAME" > "$REPO"/file
git -C "$REPO" commit -qam "$FUNCNAME" git -C "$REPO" commit -qam "$FUNCNAME"
rm -rf "$ROOT" # remove the root to test
GIT_SYNC \ GIT_SYNC \
--one-time \ --one-time \
--repo="file://$REPO" \ --repo="file://$REPO" \
--branch="$MAIN_BRANCH" \ --branch="$MAIN_BRANCH" \
--rev=HEAD \ --rev=HEAD \
--root="$ROOT" \ --root="$ROOT/subdir" \
--link="link" \ --link="link" \
>> "$1" 2>&1 >> "$1" 2>&1
assert_link_exists "$ROOT"/link assert_link_exists "$ROOT"/subdir/link
assert_file_exists "$ROOT"/link/file assert_file_exists "$ROOT"/subdir/link/file
assert_file_eq "$ROOT"/link/file "$FUNCNAME" assert_file_eq "$ROOT"/subdir/link/file "$FUNCNAME"
} }
############################################## ##############################################
@ -241,14 +252,14 @@ function e2e::head_once_root_flag_is_weird() {
function e2e::head_once_root_flag_has_symlink() { function e2e::head_once_root_flag_has_symlink() {
echo "$FUNCNAME" > "$REPO"/file echo "$FUNCNAME" > "$REPO"/file
git -C "$REPO" commit -qam "$FUNCNAME" git -C "$REPO" commit -qam "$FUNCNAME"
ln -s "$ROOT" "$DIR/rootlink" # symlink to test ln -s "$ROOT" "$ROOT/rootlink" # symlink to test
GIT_SYNC \ GIT_SYNC \
--one-time \ --one-time \
--repo="file://$REPO" \ --repo="file://$REPO" \
--branch="$MAIN_BRANCH" \ --branch="$MAIN_BRANCH" \
--rev=HEAD \ --rev=HEAD \
--root="$DIR/rootlink" \ --root="$ROOT/rootlink" \
--link="link" \ --link="link" \
>> "$1" 2>&1 >> "$1" 2>&1
assert_link_exists "$ROOT"/link assert_link_exists "$ROOT"/link
@ -262,7 +273,6 @@ function e2e::head_once_root_flag_has_symlink() {
function e2e::non_zero_exit() { function e2e::non_zero_exit() {
echo "$FUNCNAME" > "$REPO"/file echo "$FUNCNAME" > "$REPO"/file
git -C "$REPO" commit -qam "$FUNCNAME" git -C "$REPO" commit -qam "$FUNCNAME"
ln -s "$ROOT" "$DIR/rootlink" # symlink to test
( (
set +o errexit set +o errexit
@ -271,7 +281,7 @@ function e2e::non_zero_exit() {
--repo="file://$REPO" \ --repo="file://$REPO" \
--branch="$MAIN_BRANCH" \ --branch="$MAIN_BRANCH" \
--rev=does-not-exit \ --rev=does-not-exit \
--root="$DIR/rootlink" \ --root="$ROOT" \
--link="link" \ --link="link" \
>> "$1" 2>&1 >> "$1" 2>&1
RET=$? RET=$?
@ -317,7 +327,6 @@ function e2e::head_once_root_exists_but_fails_sanity() {
SHA=$(git -C "$REPO" rev-parse HEAD) SHA=$(git -C "$REPO" rev-parse HEAD)
# Make an invalid git repo. # Make an invalid git repo.
mkdir -p "$ROOT"
git -C "$ROOT" init >/dev/null git -C "$ROOT" init >/dev/null
echo "ref: refs/heads/nonexist" > "$ROOT/.git/HEAD" echo "ref: refs/heads/nonexist" > "$ROOT/.git/HEAD"
@ -1124,7 +1133,7 @@ function e2e::exechook_fail_once() {
# Test webhook success # Test webhook success
############################################## ##############################################
function e2e::webhook_success() { function e2e::webhook_success() {
HITLOG="$DIR/hitlog" HITLOG="$WORK/hitlog"
# First sync # First sync
cat /dev/null > "$HITLOG" cat /dev/null > "$HITLOG"
@ -1171,7 +1180,7 @@ function e2e::webhook_success() {
# Test webhook fail-retry # Test webhook fail-retry
############################################## ##############################################
function e2e::webhook_fail_retry() { function e2e::webhook_fail_retry() {
HITLOG="$DIR/hitlog" HITLOG="$WORK/hitlog"
# First sync - return a failure to ensure that we try again # First sync - return a failure to ensure that we try again
cat /dev/null > "$HITLOG" cat /dev/null > "$HITLOG"
@ -1220,7 +1229,7 @@ function e2e::webhook_fail_retry() {
# Test webhook success with --one-time # Test webhook success with --one-time
############################################## ##############################################
function e2e::webhook_success_once() { function e2e::webhook_success_once() {
HITLOG="$DIR/hitlog" HITLOG="$WORK/hitlog"
# First sync # First sync
cat /dev/null > "$HITLOG" cat /dev/null > "$HITLOG"
@ -1257,7 +1266,7 @@ function e2e::webhook_success_once() {
# Test webhook fail with --one-time # Test webhook fail with --one-time
############################################## ##############################################
function e2e::webhook_fail_retry_once() { function e2e::webhook_fail_retry_once() {
HITLOG="$DIR/hitlog" HITLOG="$WORK/hitlog"
# First sync - return a failure to ensure that we try again # First sync - return a failure to ensure that we try again
cat /dev/null > "$HITLOG" cat /dev/null > "$HITLOG"
@ -1293,7 +1302,7 @@ function e2e::webhook_fail_retry_once() {
# Test webhook fire-and-forget # Test webhook fire-and-forget
############################################## ##############################################
function e2e::webhook_fire_and_forget() { function e2e::webhook_fire_and_forget() {
HITLOG="$DIR/hitlog" HITLOG="$WORK/hitlog"
cat /dev/null > "$HITLOG" cat /dev/null > "$HITLOG"
CTR=$(docker_run \ CTR=$(docker_run \
@ -1386,7 +1395,7 @@ function e2e::http() {
function e2e::submodule_sync() { function e2e::submodule_sync() {
# Init submodule repo # Init submodule repo
SUBMODULE_REPO_NAME="sub" SUBMODULE_REPO_NAME="sub"
SUBMODULE="$DIR/$SUBMODULE_REPO_NAME" SUBMODULE="$WORK/$SUBMODULE_REPO_NAME"
mkdir "$SUBMODULE" mkdir "$SUBMODULE"
git -C "$SUBMODULE" init -q -b "$MAIN_BRANCH" git -C "$SUBMODULE" init -q -b "$MAIN_BRANCH"
@ -1396,7 +1405,7 @@ function e2e::submodule_sync() {
# Init nested submodule repo # Init nested submodule repo
NESTED_SUBMODULE_REPO_NAME="nested-sub" NESTED_SUBMODULE_REPO_NAME="nested-sub"
NESTED_SUBMODULE="$DIR/$NESTED_SUBMODULE_REPO_NAME" NESTED_SUBMODULE="$WORK/$NESTED_SUBMODULE_REPO_NAME"
mkdir "$NESTED_SUBMODULE" mkdir "$NESTED_SUBMODULE"
git -C "$NESTED_SUBMODULE" init -q -b "$MAIN_BRANCH" git -C "$NESTED_SUBMODULE" init -q -b "$MAIN_BRANCH"
@ -1487,7 +1496,7 @@ function e2e::submodule_sync() {
function e2e::submodule_sync_depth() { function e2e::submodule_sync_depth() {
# Init submodule repo # Init submodule repo
SUBMODULE_REPO_NAME="sub" SUBMODULE_REPO_NAME="sub"
SUBMODULE="$DIR/$SUBMODULE_REPO_NAME" SUBMODULE="$WORK/$SUBMODULE_REPO_NAME"
mkdir "$SUBMODULE" mkdir "$SUBMODULE"
git -C "$SUBMODULE" init -q -b "$MAIN_BRANCH" git -C "$SUBMODULE" init -q -b "$MAIN_BRANCH"
@ -1565,7 +1574,7 @@ function e2e::submodule_sync_depth() {
function e2e::submodule_sync_off() { function e2e::submodule_sync_off() {
# Init submodule repo # Init submodule repo
SUBMODULE_REPO_NAME="sub" SUBMODULE_REPO_NAME="sub"
SUBMODULE="$DIR/$SUBMODULE_REPO_NAME" SUBMODULE="$WORK/$SUBMODULE_REPO_NAME"
mkdir "$SUBMODULE" mkdir "$SUBMODULE"
git -C "$SUBMODULE" init -q -b "$MAIN_BRANCH" git -C "$SUBMODULE" init -q -b "$MAIN_BRANCH"
@ -1596,7 +1605,7 @@ function e2e::submodule_sync_off() {
function e2e::submodule_sync_shallow() { function e2e::submodule_sync_shallow() {
# Init submodule repo # Init submodule repo
SUBMODULE_REPO_NAME="sub" SUBMODULE_REPO_NAME="sub"
SUBMODULE="$DIR/$SUBMODULE_REPO_NAME" SUBMODULE="$WORK/$SUBMODULE_REPO_NAME"
mkdir "$SUBMODULE" mkdir "$SUBMODULE"
git -C "$SUBMODULE" init -q -b "$MAIN_BRANCH" git -C "$SUBMODULE" init -q -b "$MAIN_BRANCH"
@ -1606,7 +1615,7 @@ function e2e::submodule_sync_shallow() {
# Init nested submodule repo # Init nested submodule repo
NESTED_SUBMODULE_REPO_NAME="nested-sub" NESTED_SUBMODULE_REPO_NAME="nested-sub"
NESTED_SUBMODULE="$DIR/$NESTED_SUBMODULE_REPO_NAME" NESTED_SUBMODULE="$WORK/$NESTED_SUBMODULE_REPO_NAME"
mkdir "$NESTED_SUBMODULE" mkdir "$NESTED_SUBMODULE"
git -C "$NESTED_SUBMODULE" init -q -b "$MAIN_BRANCH" git -C "$NESTED_SUBMODULE" init -q -b "$MAIN_BRANCH"
@ -1670,9 +1679,9 @@ function e2e::ssh() {
# Test sparse-checkout files # Test sparse-checkout files
############################################## ##############################################
function e2e::sparse_checkout() { function e2e::sparse_checkout() {
echo "!/*" > "$DIR"/sparseconfig echo "!/*" > "$WORK"/sparseconfig
echo "!/*/" >> "$DIR"/sparseconfig echo "!/*/" >> "$WORK"/sparseconfig
echo "file2" >> "$DIR"/sparseconfig echo "file2" >> "$WORK"/sparseconfig
echo "$FUNCNAME" > "$REPO"/file echo "$FUNCNAME" > "$REPO"/file
echo "$FUNCNAME" > "$REPO"/file2 echo "$FUNCNAME" > "$REPO"/file2
mkdir "$REPO"/dir mkdir "$REPO"/dir
@ -1688,7 +1697,7 @@ function e2e::sparse_checkout() {
--rev=HEAD \ --rev=HEAD \
--root="$ROOT" \ --root="$ROOT" \
--link="link" \ --link="link" \
--sparse-checkout-file="$DIR/sparseconfig" \ --sparse-checkout-file="$WORK/sparseconfig" \
>> "$1" 2>&1 >> "$1" 2>&1
assert_link_exists "$ROOT"/link assert_link_exists "$ROOT"/link
assert_file_exists "$ROOT"/link/file2 assert_file_exists "$ROOT"/link/file2
@ -1848,6 +1857,7 @@ echo
# Iterate over the chosen tests and run them. # Iterate over the chosen tests and run them.
for t; do for t; do
clean_root clean_root
clean_work
init_repo init_repo
echo -n "testcase $t: " echo -n "testcase $t: "
if "e2e::${t}" "${DIR}/log.$t"; then if "e2e::${t}" "${DIR}/log.$t"; then