488564b311e9eca45a96f1d5fd5a59b5a5666f4b
   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
  16        if test_have_prereq POSIXPERM && test -x "$1/config"
  17        then
  18                echo "$1/config is executable?"
  19                return 1
  20        fi
  21
  22        bare=$(cd "$1" && git config --bool core.bare)
  23        worktree=$(cd "$1" && git config core.worktree) ||
  24        worktree=unset
  25
  26        test "$bare" = "$2" && test "$worktree" = "$3" || {
  27                echo "expected bare=$2 worktree=$3"
  28                echo "     got bare=$bare worktree=$worktree"
  29                return 1
  30        }
  31}
  32
  33test_expect_success 'plain' '
  34        git init plain &&
  35        check_config plain/.git false unset
  36'
  37
  38test_expect_success 'plain nested in bare' '
  39        (
  40                git init --bare bare-ancestor.git &&
  41                cd bare-ancestor.git &&
  42                mkdir plain-nested &&
  43                cd plain-nested &&
  44                git init
  45        ) &&
  46        check_config bare-ancestor.git/plain-nested/.git false unset
  47'
  48
  49test_expect_success 'plain through aliased command, outside any git repo' '
  50        (
  51                HOME=$(pwd)/alias-config &&
  52                export HOME &&
  53                mkdir alias-config &&
  54                echo "[alias] aliasedinit = init" >alias-config/.gitconfig &&
  55
  56                GIT_CEILING_DIRECTORIES=$(pwd) &&
  57                export GIT_CEILING_DIRECTORIES &&
  58
  59                mkdir plain-aliased &&
  60                cd plain-aliased &&
  61                git aliasedinit
  62        ) &&
  63        check_config plain-aliased/.git false unset
  64'
  65
  66test_expect_success 'plain nested through aliased command' '
  67        (
  68                git init plain-ancestor-aliased &&
  69                cd plain-ancestor-aliased &&
  70                echo "[alias] aliasedinit = init" >>.git/config &&
  71                mkdir plain-nested &&
  72                cd plain-nested &&
  73                git aliasedinit
  74        ) &&
  75        check_config plain-ancestor-aliased/plain-nested/.git false unset
  76'
  77
  78test_expect_success 'plain nested in bare through aliased command' '
  79        (
  80                git init --bare bare-ancestor-aliased.git &&
  81                cd bare-ancestor-aliased.git &&
  82                echo "[alias] aliasedinit = init" >>config &&
  83                mkdir plain-nested &&
  84                cd plain-nested &&
  85                git aliasedinit
  86        ) &&
  87        check_config bare-ancestor-aliased.git/plain-nested/.git false unset
  88'
  89
  90test_expect_success 'No extra GIT_* on alias scripts' '
  91        write_script script <<-\EOF &&
  92        env |
  93                sed -n \
  94                        -e "/^GIT_PREFIX=/d" \
  95                        -e "/^GIT_TEXTDOMAINDIR=/d" \
  96                        -e "/^GIT_/s/=.*//p" |
  97                sort
  98        EOF
  99        ./script >expected &&
 100        git config alias.script \!./script &&
 101        ( mkdir sub && cd sub && git script >../actual ) &&
 102        test_cmp expected actual
 103'
 104
 105test_expect_success 'plain with GIT_WORK_TREE' '
 106        mkdir plain-wt &&
 107        test_must_fail env GIT_WORK_TREE="$(pwd)/plain-wt" git init plain-wt
 108'
 109
 110test_expect_success 'plain bare' '
 111        git --bare init plain-bare-1 &&
 112        check_config plain-bare-1 true unset
 113'
 114
 115test_expect_success 'plain bare with GIT_WORK_TREE' '
 116        mkdir plain-bare-2 &&
 117        test_must_fail \
 118                env GIT_WORK_TREE="$(pwd)/plain-bare-2" \
 119                git --bare init plain-bare-2
 120'
 121
 122test_expect_success 'GIT_DIR bare' '
 123        mkdir git-dir-bare.git &&
 124        GIT_DIR=git-dir-bare.git git init &&
 125        check_config git-dir-bare.git true unset
 126'
 127
 128test_expect_success 'init --bare' '
 129        git init --bare init-bare.git &&
 130        check_config init-bare.git true unset
 131'
 132
 133test_expect_success 'GIT_DIR non-bare' '
 134
 135        (
 136                mkdir non-bare &&
 137                cd non-bare &&
 138                GIT_DIR=.git git init
 139        ) &&
 140        check_config non-bare/.git false unset
 141'
 142
 143test_expect_success 'GIT_DIR & GIT_WORK_TREE (1)' '
 144
 145        (
 146                mkdir git-dir-wt-1.git &&
 147                GIT_WORK_TREE=$(pwd) GIT_DIR=git-dir-wt-1.git git init
 148        ) &&
 149        check_config git-dir-wt-1.git false "$(pwd)"
 150'
 151
 152test_expect_success 'GIT_DIR & GIT_WORK_TREE (2)' '
 153        mkdir git-dir-wt-2.git &&
 154        test_must_fail env \
 155                GIT_WORK_TREE="$(pwd)" \
 156                GIT_DIR=git-dir-wt-2.git \
 157                git --bare init
 158'
 159
 160test_expect_success 'reinit' '
 161
 162        (
 163                mkdir again &&
 164                cd again &&
 165                git init >out1 2>err1 &&
 166                git init >out2 2>err2
 167        ) &&
 168        test_i18ngrep "Initialized empty" again/out1 &&
 169        test_i18ngrep "Reinitialized existing" again/out2 &&
 170        >again/empty &&
 171        test_i18ncmp again/empty again/err1 &&
 172        test_i18ncmp again/empty again/err2
 173'
 174
 175test_expect_success 'init with --template' '
 176        mkdir template-source &&
 177        echo content >template-source/file &&
 178        git init --template=../template-source template-custom &&
 179        test_cmp template-source/file template-custom/.git/file
 180'
 181
 182test_expect_success 'init with --template (blank)' '
 183        git init template-plain &&
 184        test_path_is_file template-plain/.git/info/exclude &&
 185        git init --template= template-blank &&
 186        test_path_is_missing template-blank/.git/info/exclude
 187'
 188
 189test_expect_success 'init with init.templatedir set' '
 190        mkdir templatedir-source &&
 191        echo Content >templatedir-source/file &&
 192        test_config_global init.templatedir "${HOME}/templatedir-source" &&
 193        (
 194                mkdir templatedir-set &&
 195                cd templatedir-set &&
 196                sane_unset GIT_TEMPLATE_DIR &&
 197                NO_SET_GIT_TEMPLATE_DIR=t &&
 198                export NO_SET_GIT_TEMPLATE_DIR &&
 199                git init
 200        ) &&
 201        test_cmp templatedir-source/file templatedir-set/.git/file
 202'
 203
 204test_expect_success 'init --bare/--shared overrides system/global config' '
 205        test_config_global core.bare false &&
 206        test_config_global core.sharedRepository 0640 &&
 207        git init --bare --shared=0666 init-bare-shared-override &&
 208        check_config init-bare-shared-override true unset &&
 209        test x0666 = \
 210        x$(git config -f init-bare-shared-override/config core.sharedRepository)
 211'
 212
 213test_expect_success 'init honors global core.sharedRepository' '
 214        test_config_global core.sharedRepository 0666 &&
 215        git init shared-honor-global &&
 216        test x0666 = \
 217        x$(git config -f shared-honor-global/.git/config core.sharedRepository)
 218'
 219
 220test_expect_success 'init allows insanely long --template' '
 221        git init --template=$(printf "x%09999dx" 1) test
 222'
 223
 224test_expect_success 'init creates a new directory' '
 225        rm -fr newdir &&
 226        git init newdir &&
 227        test_path_is_dir newdir/.git/refs
 228'
 229
 230test_expect_success 'init creates a new bare directory' '
 231        rm -fr newdir &&
 232        git init --bare newdir &&
 233        test_path_is_dir newdir/refs
 234'
 235
 236test_expect_success 'init recreates a directory' '
 237        rm -fr newdir &&
 238        mkdir newdir &&
 239        git init newdir &&
 240        test_path_is_dir newdir/.git/refs
 241'
 242
 243test_expect_success 'init recreates a new bare directory' '
 244        rm -fr newdir &&
 245        mkdir newdir &&
 246        git init --bare newdir &&
 247        test_path_is_dir newdir/refs
 248'
 249
 250test_expect_success 'init creates a new deep directory' '
 251        rm -fr newdir &&
 252        git init newdir/a/b/c &&
 253        test_path_is_dir newdir/a/b/c/.git/refs
 254'
 255
 256test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shared)' '
 257        rm -fr newdir &&
 258        (
 259                # Leading directories should honor umask while
 260                # the repository itself should follow "shared"
 261                umask 002 &&
 262                git init --bare --shared=0660 newdir/a/b/c &&
 263                test_path_is_dir newdir/a/b/c/refs &&
 264                ls -ld newdir/a newdir/a/b > lsab.out &&
 265                ! grep -v "^drwxrw[sx]r-x" lsab.out &&
 266                ls -ld newdir/a/b/c > lsc.out &&
 267                ! grep -v "^drwxrw[sx]---" lsc.out
 268        )
 269'
 270
 271test_expect_success 'init notices EEXIST (1)' '
 272        rm -fr newdir &&
 273        >newdir &&
 274        test_must_fail git init newdir &&
 275        test_path_is_file newdir
 276'
 277
 278test_expect_success 'init notices EEXIST (2)' '
 279        rm -fr newdir &&
 280        mkdir newdir &&
 281        >newdir/a &&
 282        test_must_fail git init newdir/a/b &&
 283        test_path_is_file newdir/a
 284'
 285
 286test_expect_success POSIXPERM,SANITY 'init notices EPERM' '
 287        rm -fr newdir &&
 288        mkdir newdir &&
 289        chmod -w newdir &&
 290        test_must_fail git init newdir/a/b
 291'
 292
 293test_expect_success 'init creates a new bare directory with global --bare' '
 294        rm -rf newdir &&
 295        git --bare init newdir &&
 296        test_path_is_dir newdir/refs
 297'
 298
 299test_expect_success 'init prefers command line to GIT_DIR' '
 300        rm -rf newdir &&
 301        mkdir otherdir &&
 302        GIT_DIR=otherdir git --bare init newdir &&
 303        test_path_is_dir newdir/refs &&
 304        test_path_is_missing otherdir/refs
 305'
 306
 307test_expect_success 'init with separate gitdir' '
 308        rm -rf newdir &&
 309        git init --separate-git-dir realgitdir newdir &&
 310        echo "gitdir: $(pwd)/realgitdir" >expected &&
 311        test_cmp expected newdir/.git &&
 312        test_path_is_dir realgitdir/refs
 313'
 314
 315test_expect_success 're-init on .git file' '
 316        ( cd newdir && git init )
 317'
 318
 319test_expect_success 're-init to update git link' '
 320        (
 321        cd newdir &&
 322        git init --separate-git-dir ../surrealgitdir
 323        ) &&
 324        echo "gitdir: $(pwd)/surrealgitdir" >expected &&
 325        test_cmp expected newdir/.git &&
 326        test_path_is_dir surrealgitdir/refs &&
 327        test_path_is_missing realgitdir/refs
 328'
 329
 330test_expect_success 're-init to move gitdir' '
 331        rm -rf newdir realgitdir surrealgitdir &&
 332        git init newdir &&
 333        (
 334        cd newdir &&
 335        git init --separate-git-dir ../realgitdir
 336        ) &&
 337        echo "gitdir: $(pwd)/realgitdir" >expected &&
 338        test_cmp expected newdir/.git &&
 339        test_path_is_dir realgitdir/refs
 340'
 341
 342test_expect_success SYMLINKS 're-init to move gitdir symlink' '
 343        rm -rf newdir realgitdir &&
 344        git init newdir &&
 345        (
 346        cd newdir &&
 347        mv .git here &&
 348        ln -s here .git &&
 349        git init --separate-git-dir ../realgitdir
 350        ) &&
 351        echo "gitdir: $(pwd)/realgitdir" >expected &&
 352        test_cmp expected newdir/.git &&
 353        test_cmp expected newdir/here &&
 354        test_path_is_dir realgitdir/refs
 355'
 356
 357# Tests for the hidden file attribute on windows
 358is_hidden () {
 359        # Use the output of `attrib`, ignore the absolute path
 360        case "$(attrib "$1")" in *H*?:*) return 0;; esac
 361        return 1
 362}
 363
 364test_expect_success MINGW '.git hidden' '
 365        rm -rf newdir &&
 366        (
 367                unset GIT_DIR GIT_WORK_TREE
 368                mkdir newdir &&
 369                cd newdir &&
 370                git init &&
 371                is_hidden .git
 372        ) &&
 373        check_config newdir/.git false unset
 374'
 375
 376test_expect_success MINGW 'bare git dir not hidden' '
 377        rm -rf newdir &&
 378        (
 379                unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
 380                mkdir newdir &&
 381                cd newdir &&
 382                git --bare init
 383        ) &&
 384        ! is_hidden newdir
 385'
 386
 387test_expect_success 'remote init from does not use config from cwd' '
 388        rm -rf newdir &&
 389        test_config core.logallrefupdates true &&
 390        git init newdir &&
 391        echo true >expect &&
 392        git -C newdir config --bool core.logallrefupdates >actual &&
 393        test_cmp expect actual
 394'
 395
 396test_expect_success 're-init from a linked worktree' '
 397        git init main-worktree &&
 398        (
 399                cd main-worktree &&
 400                test_commit first &&
 401                git worktree add ../linked-worktree &&
 402                mv .git/info/exclude expected-exclude &&
 403                find .git/worktrees -print | sort >expected &&
 404                git -C ../linked-worktree init &&
 405                test_cmp expected-exclude .git/info/exclude &&
 406                find .git/worktrees -print | sort >actual &&
 407                test_cmp expected actual
 408        )
 409'
 410
 411test_done