t / t1020-subdirectory.shon commit t1500: avoid changing working directory outside of tests (1e043cf)
   1#!/bin/sh
   2#
   3# Copyright (c) 2006 Junio C Hamano
   4#
   5
   6test_description='Try various core-level commands in subdirectory.
   7'
   8
   9. ./test-lib.sh
  10. "$TEST_DIRECTORY"/lib-read-tree.sh
  11
  12test_expect_success setup '
  13        long="a b c d e f g h i j k l m n o p q r s t u v w x y z" &&
  14        for c in $long; do echo $c; done >one &&
  15        mkdir dir &&
  16        for c in x y z $long a b c; do echo $c; done >dir/two &&
  17        cp one original.one &&
  18        cp dir/two original.two
  19'
  20
  21test_expect_success 'update-index and ls-files' '
  22        git update-index --add one &&
  23        case "$(git ls-files)" in
  24        one) echo pass one ;;
  25        *) echo bad one; exit 1 ;;
  26        esac &&
  27        (
  28                cd dir &&
  29                git update-index --add two &&
  30                case "$(git ls-files)" in
  31                two) echo pass two ;;
  32                *) echo bad two; exit 1 ;;
  33                esac
  34        ) &&
  35        case "$(git ls-files)" in
  36        dir/two"$LF"one) echo pass both ;;
  37        *) echo bad; exit 1 ;;
  38        esac
  39'
  40
  41test_expect_success 'cat-file' '
  42        two=$(git ls-files -s dir/two) &&
  43        two=$(expr "$two" : "[0-7]* \\([0-9a-f]*\\)") &&
  44        echo "$two" &&
  45        git cat-file -p "$two" >actual &&
  46        cmp dir/two actual &&
  47        (
  48                cd dir &&
  49                git cat-file -p "$two" >actual &&
  50                cmp two actual
  51        )
  52'
  53rm -f actual dir/actual
  54
  55test_expect_success 'diff-files' '
  56        echo a >>one &&
  57        echo d >>dir/two &&
  58        case "$(git diff-files --name-only)" in
  59        dir/two"$LF"one) echo pass top ;;
  60        *) echo bad top; exit 1 ;;
  61        esac &&
  62        # diff should not omit leading paths
  63        (
  64                cd dir &&
  65                case "$(git diff-files --name-only)" in
  66                dir/two"$LF"one) echo pass subdir ;;
  67                *) echo bad subdir; exit 1 ;;
  68                esac &&
  69                case "$(git diff-files --name-only .)" in
  70                dir/two) echo pass subdir limited ;;
  71                *) echo bad subdir limited; exit 1 ;;
  72                esac
  73        )
  74'
  75
  76test_expect_success 'write-tree' '
  77        top=$(git write-tree) &&
  78        echo $top &&
  79        (
  80                cd dir &&
  81                sub=$(git write-tree) &&
  82                echo $sub &&
  83                test "z$top" = "z$sub"
  84        )
  85'
  86
  87test_expect_success 'checkout-index' '
  88        git checkout-index -f -u one &&
  89        cmp one original.one &&
  90        (
  91                cd dir &&
  92                git checkout-index -f -u two &&
  93                cmp two ../original.two
  94        )
  95'
  96
  97test_expect_success 'read-tree' '
  98        rm -f one dir/two &&
  99        tree=$(git write-tree) &&
 100        read_tree_u_must_succeed --reset -u "$tree" &&
 101        cmp one original.one &&
 102        cmp dir/two original.two &&
 103        (
 104                cd dir &&
 105                rm -f two &&
 106                read_tree_u_must_succeed --reset -u "$tree" &&
 107                cmp two ../original.two &&
 108                cmp ../one ../original.one
 109        )
 110'
 111
 112test_expect_success 'alias expansion' '
 113        (
 114                git config alias.test-status-alias status &&
 115                cd dir &&
 116                git status &&
 117                git test-status-alias
 118        )
 119'
 120
 121test_expect_success !MINGW '!alias expansion' '
 122        pwd >expect &&
 123        (
 124                git config alias.test-alias-directory !pwd &&
 125                cd dir &&
 126                git test-alias-directory >../actual
 127        ) &&
 128        test_cmp expect actual
 129'
 130
 131test_expect_success 'GIT_PREFIX for !alias' '
 132        printf "dir/" >expect &&
 133        (
 134                git config alias.test-alias-directory "!sh -c \"printf \$GIT_PREFIX\"" &&
 135                cd dir &&
 136                git test-alias-directory >../actual
 137        ) &&
 138        test_cmp expect actual
 139'
 140
 141test_expect_success 'GIT_PREFIX for built-ins' '
 142        # Use GIT_EXTERNAL_DIFF to test that the "diff" built-in
 143        # receives the GIT_PREFIX variable.
 144        echo "dir/" >expect &&
 145        write_script diff <<-\EOF &&
 146        printf "%s\n" "$GIT_PREFIX"
 147        EOF
 148        (
 149                cd dir &&
 150                echo "change" >two &&
 151                GIT_EXTERNAL_DIFF=./diff git diff >../actual
 152                git checkout -- two
 153        ) &&
 154        test_cmp expect actual
 155'
 156
 157test_expect_success 'no file/rev ambiguity check inside .git' '
 158        git commit -a -m 1 &&
 159        (
 160                cd .git &&
 161                git show -s HEAD
 162        )
 163'
 164
 165test_expect_success 'no file/rev ambiguity check inside a bare repo (explicit GIT_DIR)' '
 166        test_when_finished "rm -fr foo.git" &&
 167        git clone -s --bare .git foo.git &&
 168        (
 169                cd foo.git &&
 170                # older Git needed help by exporting GIT_DIR=.
 171                # to realize that it is inside a bare repository.
 172                # We keep this test around for regression testing.
 173                GIT_DIR=. git show -s HEAD
 174        )
 175'
 176
 177test_expect_success 'no file/rev ambiguity check inside a bare repo' '
 178        test_when_finished "rm -fr foo.git" &&
 179        git clone -s --bare .git foo.git &&
 180        (
 181                cd foo.git &&
 182                git show -s HEAD
 183        )
 184'
 185
 186test_expect_success SYMLINKS 'detection should not be fooled by a symlink' '
 187        git clone -s .git another &&
 188        ln -s another yetanother &&
 189        (
 190                cd yetanother/.git &&
 191                git show -s HEAD
 192        )
 193'
 194
 195test_done