|  | #!/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 | 
|  | ' | 
|  |  | 
|  | 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 /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_done |