t / t1509-root-work-tree.shon commit t/helper: merge test-chmtime into test-tool (0e49649)
   1#!/bin/sh
   2
   3test_description='Test Git when git repository is located at root
   4
   5This test requires write access in root. Do not bother if you do not
   6have a throwaway chroot or VM.
   7
   8Script t1509/prepare-chroot.sh may help you setup chroot, then you
   9can chroot in and execute this test from there.
  10'
  11
  12. ./test-lib.sh
  13
  14test_cmp_val() {
  15        echo "$1" > expected
  16        echo "$2" > result
  17        test_cmp expected result
  18}
  19
  20test_vars() {
  21        test_expect_success "$1: gitdir" '
  22                test_cmp_val "'"$2"'" "$(git rev-parse --git-dir)"
  23        '
  24
  25        test_expect_success "$1: worktree" '
  26                test_cmp_val "'"$3"'" "$(git rev-parse --show-toplevel)"
  27        '
  28
  29        test_expect_success "$1: prefix" '
  30                test_cmp_val "'"$4"'" "$(git rev-parse --show-prefix)"
  31        '
  32}
  33
  34test_foobar_root() {
  35        test_expect_success 'add relative' '
  36                test -z "$(cd / && git ls-files)" &&
  37                git add foo/foome &&
  38                git add foo/bar/barme &&
  39                git add me &&
  40                ( cd / && git ls-files --stage ) > result &&
  41                test_cmp /ls.expected result &&
  42                rm "$(git rev-parse --git-dir)/index"
  43        '
  44
  45        test_expect_success 'add absolute' '
  46                test -z "$(cd / && git ls-files)" &&
  47                git add /foo/foome &&
  48                git add /foo/bar/barme &&
  49                git add /me &&
  50                ( cd / && git ls-files --stage ) > result &&
  51                test_cmp /ls.expected result &&
  52                rm "$(git rev-parse --git-dir)/index"
  53        '
  54
  55}
  56
  57test_foobar_foo() {
  58        test_expect_success 'add relative' '
  59                test -z "$(cd / && git ls-files)" &&
  60                git add foome &&
  61                git add bar/barme &&
  62                git add ../me &&
  63                ( cd / && git ls-files --stage ) > result &&
  64                test_cmp /ls.expected result &&
  65                rm "$(git rev-parse --git-dir)/index"
  66        '
  67
  68        test_expect_success 'add absolute' '
  69                test -z "$(cd / && git ls-files)" &&
  70                git add /foo/foome &&
  71                git add /foo/bar/barme &&
  72                git add /me &&
  73                ( cd / && git ls-files --stage ) > result &&
  74                test_cmp /ls.expected result &&
  75                rm "$(git rev-parse --git-dir)/index"
  76        '
  77}
  78
  79test_foobar_foobar() {
  80        test_expect_success 'add relative' '
  81                test -z "$(cd / && git ls-files)" &&
  82                git add ../foome &&
  83                git add barme &&
  84                git add ../../me &&
  85                ( cd / && git ls-files --stage ) > result &&
  86                test_cmp /ls.expected result &&
  87                rm "$(git rev-parse --git-dir)/index"
  88        '
  89
  90        test_expect_success 'add absolute' '
  91                test -z "$(cd / && git ls-files)" &&
  92                git add /foo/foome &&
  93                git add /foo/bar/barme &&
  94                git add /me &&
  95                ( cd / && git ls-files --stage ) > result &&
  96                test_cmp /ls.expected result &&
  97                rm "$(git rev-parse --git-dir)/index"
  98        '
  99}
 100
 101if ! test -w /
 102then
 103        skip_all="Test requiring writable / skipped. Read this test if you want to run it"
 104        test_done
 105fi
 106
 107if  test -e /refs || test -e /objects || test -e /info || test -e /hooks ||
 108    test -e /.git || test -e /foo || test -e /me
 109then
 110        skip_all="Skip test that clobbers existing files in /"
 111        test_done
 112fi
 113
 114if [ "$IKNOWWHATIAMDOING" != "YES" ]; then
 115        skip_all="You must set env var IKNOWWHATIAMDOING=YES in order to run this test"
 116        test_done
 117fi
 118
 119if ! test_have_prereq NOT_ROOT
 120then
 121        skip_all="No you can't run this as root"
 122        test_done
 123fi
 124
 125ONE_SHA1=d00491fd7e5bb6fa28c517a0bb32b8b506539d4d
 126
 127test_expect_success 'setup' '
 128        rm -rf /foo &&
 129        mkdir /foo &&
 130        mkdir /foo/bar &&
 131        echo 1 > /foo/foome &&
 132        echo 1 > /foo/bar/barme &&
 133        echo 1 > /me
 134'
 135
 136say "GIT_DIR absolute, GIT_WORK_TREE set"
 137
 138test_expect_success 'go to /' 'cd /'
 139
 140cat >ls.expected <<EOF
 141100644 $ONE_SHA1 0      foo/bar/barme
 142100644 $ONE_SHA1 0      foo/foome
 143100644 $ONE_SHA1 0      me
 144EOF
 145
 146GIT_DIR="$TRASH_DIRECTORY/.git" && export GIT_DIR
 147GIT_WORK_TREE=/ && export GIT_WORK_TREE
 148
 149test_vars 'abs gitdir, root' "$GIT_DIR" "/" ""
 150test_foobar_root
 151
 152test_expect_success 'go to /foo' 'cd /foo'
 153
 154test_vars 'abs gitdir, foo' "$GIT_DIR" "/" "foo/"
 155test_foobar_foo
 156
 157test_expect_success 'go to /foo/bar' 'cd /foo/bar'
 158
 159test_vars 'abs gitdir, foo/bar' "$GIT_DIR" "/" "foo/bar/"
 160test_foobar_foobar
 161
 162say "GIT_DIR relative, GIT_WORK_TREE set"
 163
 164test_expect_success 'go to /' 'cd /'
 165
 166GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
 167GIT_WORK_TREE=/ && export GIT_WORK_TREE
 168
 169test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
 170test_foobar_root
 171
 172test_expect_success 'go to /foo' 'cd /foo'
 173
 174GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
 175GIT_WORK_TREE=/ && export GIT_WORK_TREE
 176
 177test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
 178test_foobar_foo
 179
 180test_expect_success 'go to /foo/bar' 'cd /foo/bar'
 181
 182GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
 183GIT_WORK_TREE=/ && export GIT_WORK_TREE
 184
 185test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
 186test_foobar_foobar
 187
 188say "GIT_DIR relative, GIT_WORK_TREE relative"
 189
 190test_expect_success 'go to /' 'cd /'
 191
 192GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
 193GIT_WORK_TREE=. && export GIT_WORK_TREE
 194
 195test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
 196test_foobar_root
 197
 198test_expect_success 'go to /' 'cd /foo'
 199
 200GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
 201GIT_WORK_TREE=.. && export GIT_WORK_TREE
 202
 203test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
 204test_foobar_foo
 205
 206test_expect_success 'go to /foo/bar' 'cd /foo/bar'
 207
 208GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
 209GIT_WORK_TREE=../.. && export GIT_WORK_TREE
 210
 211test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
 212test_foobar_foobar
 213
 214say ".git at root"
 215
 216unset GIT_DIR
 217unset GIT_WORK_TREE
 218
 219test_expect_success 'go to /' 'cd /'
 220test_expect_success 'setup' '
 221        rm -rf /.git &&
 222        echo "Initialized empty Git repository in /.git/" > expected &&
 223        git init > result &&
 224        test_cmp expected result
 225'
 226
 227test_vars 'auto gitdir, root' ".git" "/" ""
 228test_foobar_root
 229
 230test_expect_success 'go to /foo' 'cd /foo'
 231test_vars 'auto gitdir, foo' "/.git" "/" "foo/"
 232test_foobar_foo
 233
 234test_expect_success 'go to /foo/bar' 'cd /foo/bar'
 235test_vars 'auto gitdir, foo/bar' "/.git" "/" "foo/bar/"
 236test_foobar_foobar
 237
 238test_expect_success 'cleanup' 'rm -rf /.git'
 239
 240say "auto bare gitdir"
 241
 242# DESTROYYYYY!!!!!
 243test_expect_success 'setup' '
 244        rm -rf /refs /objects /info /hooks &&
 245        rm -f /expected /ls.expected /me /result &&
 246        cd / &&
 247        echo "Initialized empty Git repository in /" > expected &&
 248        git init --bare > result &&
 249        test_cmp expected result
 250'
 251
 252test_vars 'auto gitdir, root' "." "" ""
 253
 254test_expect_success 'go to /foo' 'cd /foo'
 255
 256test_vars 'auto gitdir, root' "/" "" ""
 257
 258test_done