mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Eric Sunshine](/assets/img/avatar_default.png)
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>
265 lines
6.3 KiB
Bash
Executable file
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
|