t / t0001-init.shon commit Prevent git blame from segfaulting on a missing author name (c8cba79)
   1#!/bin/sh
   2
   3test_description='git init'
   4
   5. ./test-lib.sh
   6
   7check_config () {
   8        if test -d "$1" && test -f "$1/config" && test -d "$1/refs"
   9        then
  10                : happy
  11        else
  12                echo "expected a directory $1, a file $1/config and $1/refs"
  13                return 1
  14        fi
  15        bare=$(GIT_CONFIG="$1/config" git config --bool core.bare)
  16        worktree=$(GIT_CONFIG="$1/config" git config core.worktree) ||
  17        worktree=unset
  18
  19        test "$bare" = "$2" && test "$worktree" = "$3" || {
  20                echo "expected bare=$2 worktree=$3"
  21                echo "     got bare=$bare worktree=$worktree"
  22                return 1
  23        }
  24}
  25
  26test_expect_success 'plain' '
  27        (
  28                unset GIT_DIR GIT_WORK_TREE
  29                mkdir plain &&
  30                cd plain &&
  31                git init
  32        ) &&
  33        check_config plain/.git false unset
  34'
  35
  36test_expect_success 'plain with GIT_WORK_TREE' '
  37        if (
  38                unset GIT_DIR
  39                mkdir plain-wt &&
  40                cd plain-wt &&
  41                GIT_WORK_TREE=$(pwd) git init
  42        )
  43        then
  44                echo Should have failed -- GIT_WORK_TREE should not be used
  45                false
  46        fi
  47'
  48
  49test_expect_success 'plain bare' '
  50        (
  51                unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
  52                mkdir plain-bare-1 &&
  53                cd plain-bare-1 &&
  54                git --bare init
  55        ) &&
  56        check_config plain-bare-1 true unset
  57'
  58
  59test_expect_success 'plain bare with GIT_WORK_TREE' '
  60        if (
  61                unset GIT_DIR GIT_CONFIG
  62                mkdir plain-bare-2 &&
  63                cd plain-bare-2 &&
  64                GIT_WORK_TREE=$(pwd) git --bare init
  65        )
  66        then
  67                echo Should have failed -- GIT_WORK_TREE should not be used
  68                false
  69        fi
  70'
  71
  72test_expect_success 'GIT_DIR bare' '
  73
  74        (
  75                unset GIT_CONFIG
  76                mkdir git-dir-bare.git &&
  77                GIT_DIR=git-dir-bare.git git init
  78        ) &&
  79        check_config git-dir-bare.git true unset
  80'
  81
  82test_expect_success 'init --bare' '
  83
  84        (
  85                unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
  86                mkdir init-bare.git &&
  87                cd init-bare.git &&
  88                git init --bare
  89        ) &&
  90        check_config init-bare.git true unset
  91'
  92
  93test_expect_success 'GIT_DIR non-bare' '
  94
  95        (
  96                unset GIT_CONFIG
  97                mkdir non-bare &&
  98                cd non-bare &&
  99                GIT_DIR=.git git init
 100        ) &&
 101        check_config non-bare/.git false unset
 102'
 103
 104test_expect_success 'GIT_DIR & GIT_WORK_TREE (1)' '
 105
 106        (
 107                unset GIT_CONFIG
 108                mkdir git-dir-wt-1.git &&
 109                GIT_WORK_TREE=$(pwd) GIT_DIR=git-dir-wt-1.git git init
 110        ) &&
 111        check_config git-dir-wt-1.git false "$(pwd)"
 112'
 113
 114test_expect_success 'GIT_DIR & GIT_WORK_TREE (2)' '
 115
 116        if (
 117                unset GIT_CONFIG
 118                mkdir git-dir-wt-2.git &&
 119                GIT_WORK_TREE=$(pwd) GIT_DIR=git-dir-wt-2.git git --bare init
 120        )
 121        then
 122                echo Should have failed -- --bare should not be used
 123                false
 124        fi
 125'
 126
 127test_expect_success 'reinit' '
 128
 129        (
 130                unset GIT_CONFIG GIT_WORK_TREE GIT_CONFIG
 131
 132                mkdir again &&
 133                cd again &&
 134                git init >out1 2>err1 &&
 135                git init >out2 2>err2
 136        ) &&
 137        grep "Initialized empty" again/out1 &&
 138        grep "Reinitialized existing" again/out2 &&
 139        >again/empty &&
 140        test_cmp again/empty again/err1 &&
 141        test_cmp again/empty again/err2
 142'
 143
 144test_expect_success 'init with --template' '
 145        mkdir template-source &&
 146        echo content >template-source/file &&
 147        (
 148                mkdir template-custom &&
 149                cd template-custom &&
 150                git init --template=../template-source
 151        ) &&
 152        test_cmp template-source/file template-custom/.git/file
 153'
 154
 155test_expect_success 'init with --template (blank)' '
 156        (
 157                mkdir template-plain &&
 158                cd template-plain &&
 159                git init
 160        ) &&
 161        test -f template-plain/.git/info/exclude &&
 162        (
 163                mkdir template-blank &&
 164                cd template-blank &&
 165                git init --template=
 166        ) &&
 167        ! test -f template-blank/.git/info/exclude
 168'
 169
 170test_expect_success 'init --bare/--shared overrides system/global config' '
 171        (
 172                HOME="`pwd`" &&
 173                export HOME &&
 174                test_config="$HOME"/.gitconfig &&
 175                unset GIT_CONFIG_NOGLOBAL &&
 176                git config -f "$test_config" core.bare false &&
 177                git config -f "$test_config" core.sharedRepository 0640 &&
 178                mkdir init-bare-shared-override &&
 179                cd init-bare-shared-override &&
 180                git init --bare --shared=0666
 181        ) &&
 182        check_config init-bare-shared-override true unset &&
 183        test x0666 = \
 184        x`git config -f init-bare-shared-override/config core.sharedRepository`
 185'
 186
 187test_expect_success 'init honors global core.sharedRepository' '
 188        (
 189                HOME="`pwd`" &&
 190                export HOME &&
 191                test_config="$HOME"/.gitconfig &&
 192                unset GIT_CONFIG_NOGLOBAL &&
 193                git config -f "$test_config" core.sharedRepository 0666 &&
 194                mkdir shared-honor-global &&
 195                cd shared-honor-global &&
 196                git init
 197        ) &&
 198        test x0666 = \
 199        x`git config -f shared-honor-global/.git/config core.sharedRepository`
 200'
 201
 202test_expect_success 'init rejects insanely long --template' '
 203        (
 204                insane=$(printf "x%09999dx" 1) &&
 205                mkdir test &&
 206                cd test &&
 207                test_must_fail git init --template=$insane
 208        )
 209'
 210
 211test_expect_success 'init creates a new directory' '
 212        rm -fr newdir &&
 213        (
 214                git init newdir &&
 215                test -d newdir/.git/refs
 216        )
 217'
 218
 219test_expect_success 'init creates a new bare directory' '
 220        rm -fr newdir &&
 221        (
 222                git init --bare newdir &&
 223                test -d newdir/refs
 224        )
 225'
 226
 227test_expect_success 'init recreates a directory' '
 228        rm -fr newdir &&
 229        (
 230                mkdir newdir &&
 231                git init newdir &&
 232                test -d newdir/.git/refs
 233        )
 234'
 235
 236test_expect_success 'init recreates a new bare directory' '
 237        rm -fr newdir &&
 238        (
 239                mkdir newdir &&
 240                git init --bare newdir &&
 241                test -d newdir/refs
 242        )
 243'
 244
 245test_expect_success 'init creates a new deep directory' '
 246        rm -fr newdir &&
 247        git init newdir/a/b/c &&
 248        test -d newdir/a/b/c/.git/refs
 249'
 250
 251test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shared)' '
 252        rm -fr newdir &&
 253        (
 254                # Leading directories should honor umask while
 255                # the repository itself should follow "shared"
 256                umask 002 &&
 257                git init --bare --shared=0660 newdir/a/b/c &&
 258                test -d newdir/a/b/c/refs &&
 259                ls -ld newdir/a newdir/a/b > lsab.out &&
 260                ! grep -v "^drwxrw[sx]r-x" lsab.out &&
 261                ls -ld newdir/a/b/c > lsc.out &&
 262                ! grep -v "^drwxrw[sx]---" lsc.out
 263        )
 264'
 265
 266test_expect_success 'init notices EEXIST (1)' '
 267        rm -fr newdir &&
 268        (
 269                >newdir &&
 270                test_must_fail git init newdir &&
 271                test -f newdir
 272        )
 273'
 274
 275test_expect_success 'init notices EEXIST (2)' '
 276        rm -fr newdir &&
 277        (
 278                mkdir newdir &&
 279                >newdir/a
 280                test_must_fail git init newdir/a/b &&
 281                test -f newdir/a
 282        )
 283'
 284
 285test_expect_success POSIXPERM 'init notices EPERM' '
 286        rm -fr newdir &&
 287        (
 288                mkdir newdir &&
 289                chmod -w newdir &&
 290                test_must_fail git init newdir/a/b
 291        )
 292'
 293
 294test_done