t / t1020-subdirectory.shon commit Merge branch 'jc/checkout-from-tree-keep-local-changes' into maint (df68408)
   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.ss status &&
 115                cd dir &&
 116                git status &&
 117                git ss
 118        )
 119'
 120
 121test_expect_success '!alias expansion' '
 122        pwd >expect &&
 123        (
 124                git config alias.test !pwd &&
 125                cd dir &&
 126                git test >../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 "!sh -c \"printf \$GIT_PREFIX\"" &&
 135                cd dir &&
 136                git test >../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        printf "dir/" >expect &&
 145        printf "#!/bin/sh\n" >diff &&
 146        printf "printf \"\$GIT_PREFIX\"" >>diff &&
 147        chmod +x diff &&
 148        (
 149                cd dir &&
 150                printf "change" >two &&
 151                env 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' '
 166        git clone -s --bare .git foo.git &&
 167        (
 168                cd foo.git &&
 169                GIT_DIR=. git show -s HEAD
 170        )
 171'
 172
 173# This still does not work as it should...
 174: test_expect_success 'no file/rev ambiguity check inside a bare repo' '
 175        git clone -s --bare .git foo.git &&
 176        (
 177                cd foo.git &&
 178                git show -s HEAD
 179        )
 180'
 181
 182test_expect_success SYMLINKS 'detection should not be fooled by a symlink' '
 183        rm -fr foo.git &&
 184        git clone -s .git another &&
 185        ln -s another yetanother &&
 186        (
 187                cd yetanother/.git &&
 188                git show -s HEAD
 189        )
 190'
 191
 192test_done