git/t/t1509-root-work-tree.sh
Eric Sunshine 35c194dc57 t1509: facilitate repeated script invocations
t1509-root-work-tree.sh, which tests behavior of a Git repository
located at the root `/` directory, refuses to run if it detects the
presence of an existing repository at `/`. This safeguard ensures that
it won't clobber a legitimate repository at that location. However,
because t1509 does a poor job of cleaning up after itself, it runs afoul
of its own safety check on subsequent runs, which makes it painful to
run the script repeatedly since each run requires manual cleanup of
detritus from the previous run.

Address this shortcoming by making t1509 clean up after itself as its
last action. This is safe since the script can only make it to this
cleanup action if it did not find a legitimate repository at `/` in the
first place, so the resources cleaned up here can only have been created
by the script itself.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
2022-12-09 10:41:59 +09:00

265 lines
6.3 KiB
Bash
Executable File

#!/bin/sh
test_description='Test Git when git repository is located at root
This test requires write access in root. Do not bother if you do not
have a throwaway chroot or VM.
Script t1509/prepare-chroot.sh may help you setup chroot, then you
can chroot in and execute this test from there.
'
. ./test-lib.sh
test_cmp_val() {
echo "$1" > expected
echo "$2" > result
test_cmp expected result
}
test_vars() {
test_expect_success "$1: gitdir" '
test_cmp_val "'"$2"'" "$(git rev-parse --git-dir)"
'
test_expect_success "$1: worktree" '
test_cmp_val "'"$3"'" "$(git rev-parse --show-toplevel)"
'
test_expect_success "$1: prefix" '
test_cmp_val "'"$4"'" "$(git rev-parse --show-prefix)"
'
}
test_foobar_root() {
test_expect_success 'add relative' '
test -z "$(cd / && git ls-files)" &&
git add foo/foome &&
git add foo/bar/barme &&
git add me &&
( cd / && git ls-files --stage ) > result &&
test_cmp /ls.expected result &&
rm "$(git rev-parse --git-dir)/index"
'
test_expect_success 'add absolute' '
test -z "$(cd / && git ls-files)" &&
git add /foo/foome &&
git add /foo/bar/barme &&
git add /me &&
( cd / && git ls-files --stage ) > result &&
test_cmp /ls.expected result &&
rm "$(git rev-parse --git-dir)/index"
'
}
test_foobar_foo() {
test_expect_success 'add relative' '
test -z "$(cd / && git ls-files)" &&
git add foome &&
git add bar/barme &&
git add ../me &&
( cd / && git ls-files --stage ) > result &&
test_cmp /ls.expected result &&
rm "$(git rev-parse --git-dir)/index"
'
test_expect_success 'add absolute' '
test -z "$(cd / && git ls-files)" &&
git add /foo/foome &&
git add /foo/bar/barme &&
git add /me &&
( cd / && git ls-files --stage ) > result &&
test_cmp /ls.expected result &&
rm "$(git rev-parse --git-dir)/index"
'
}
test_foobar_foobar() {
test_expect_success 'add relative' '
test -z "$(cd / && git ls-files)" &&
git add ../foome &&
git add barme &&
git add ../../me &&
( cd / && git ls-files --stage ) > result &&
test_cmp /ls.expected result &&
rm "$(git rev-parse --git-dir)/index"
'
test_expect_success 'add absolute' '
test -z "$(cd / && git ls-files)" &&
git add /foo/foome &&
git add /foo/bar/barme &&
git add /me &&
( cd / && git ls-files --stage ) > result &&
test_cmp /ls.expected result &&
rm "$(git rev-parse --git-dir)/index"
'
}
if ! test -w /
then
skip_all="Test requiring writable / skipped. Read this test if you want to run it"
test_done
fi
if test -e /refs || test -e /objects || test -e /info || test -e /hooks ||
test -e /.git || test -e /foo || test -e /me
then
skip_all="Skip test that clobbers existing files in /"
test_done
fi
if [ "$IKNOWWHATIAMDOING" != "YES" ]; then
skip_all="You must set env var IKNOWWHATIAMDOING=YES in order to run this test"
test_done
fi
if ! test_have_prereq NOT_ROOT
then
skip_all="No you can't run this as root"
test_done
fi
ONE_SHA1=d00491fd7e5bb6fa28c517a0bb32b8b506539d4d
test_expect_success 'setup' '
rm -rf /foo &&
mkdir /foo &&
mkdir /foo/bar &&
echo 1 > /foo/foome &&
echo 1 > /foo/bar/barme &&
echo 1 > /me
'
say "GIT_DIR absolute, GIT_WORK_TREE set"
test_expect_success 'go to /' 'cd /'
cat >ls.expected <<EOF
100644 $ONE_SHA1 0 foo/bar/barme
100644 $ONE_SHA1 0 foo/foome
100644 $ONE_SHA1 0 me
EOF
GIT_DIR="$TRASH_DIRECTORY/.git" && export GIT_DIR
GIT_WORK_TREE=/ && export GIT_WORK_TREE
test_vars 'abs gitdir, root' "$GIT_DIR" "/" ""
test_foobar_root
test_expect_success 'go to /foo' 'cd /foo'
test_vars 'abs gitdir, foo' "$GIT_DIR" "/" "foo/"
test_foobar_foo
test_expect_success 'go to /foo/bar' 'cd /foo/bar'
test_vars 'abs gitdir, foo/bar' "$GIT_DIR" "/" "foo/bar/"
test_foobar_foobar
say "GIT_DIR relative, GIT_WORK_TREE set"
test_expect_success 'go to /' 'cd /'
GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
GIT_WORK_TREE=/ && export GIT_WORK_TREE
test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
test_foobar_root
test_expect_success 'go to /foo' 'cd /foo'
GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
GIT_WORK_TREE=/ && export GIT_WORK_TREE
test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
test_foobar_foo
test_expect_success 'go to /foo/bar' 'cd /foo/bar'
GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
GIT_WORK_TREE=/ && export GIT_WORK_TREE
test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
test_foobar_foobar
say "GIT_DIR relative, GIT_WORK_TREE relative"
test_expect_success 'go to /' 'cd /'
GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
GIT_WORK_TREE=. && export GIT_WORK_TREE
test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
test_foobar_root
test_expect_success 'go to /' 'cd /foo'
GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
GIT_WORK_TREE=.. && export GIT_WORK_TREE
test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
test_foobar_foo
test_expect_success 'go to /foo/bar' 'cd /foo/bar'
GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
GIT_WORK_TREE=../.. && export GIT_WORK_TREE
test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
test_foobar_foobar
say ".git at root"
unset GIT_DIR
unset GIT_WORK_TREE
test_expect_success 'go to /' 'cd /'
test_expect_success 'setup' '
rm -rf /.git &&
echo "Initialized empty Git repository in /.git/" > expected &&
git init > result &&
test_cmp expected result &&
git config --global --add safe.directory /
'
test_vars 'auto gitdir, root' ".git" "/" ""
test_foobar_root
test_expect_success 'go to /foo' 'cd /foo'
test_vars 'auto gitdir, foo' "/.git" "/" "foo/"
test_foobar_foo
test_expect_success 'go to /foo/bar' 'cd /foo/bar'
test_vars 'auto gitdir, foo/bar' "/.git" "/" "foo/bar/"
test_foobar_foobar
test_expect_success 'cleanup' 'rm -rf /.git'
say "auto bare gitdir"
# DESTROYYYYY!!!!!
test_expect_success 'setup' '
rm -rf /refs /objects /info /hooks &&
rm -f /HEAD /expected /ls.expected /me /result &&
cd / &&
echo "Initialized empty Git repository in /" > expected &&
git init --bare > result &&
test_cmp expected result
'
test_vars 'auto gitdir, root' "." "" ""
test_expect_success 'go to /foo' 'cd /foo'
test_vars 'auto gitdir, root' "/" "" ""
test_expect_success 'cleanup root' '
rm -rf /.git /refs /objects /info /hooks /branches /foo &&
rm -f /HEAD /config /description /expected /ls.expected /me /result
'
test_done