t / t2203-add-intent.shon commit untracked-cache: be defensive about missing NULs in index (c6909f9)
   1#!/bin/sh
   2
   3test_description='Intent to add'
   4
   5. ./test-lib.sh
   6
   7test_expect_success 'intent to add' '
   8        test_commit 1 &&
   9        git rm 1.t &&
  10        echo hello >1.t &&
  11        echo hello >file &&
  12        echo hello >elif &&
  13        git add -N file &&
  14        git add elif &&
  15        git add -N 1.t
  16'
  17
  18test_expect_success 'git status' '
  19        git status --porcelain | grep -v actual >actual &&
  20        cat >expect <<-\EOF &&
  21        DA 1.t
  22        A  elif
  23         A file
  24        EOF
  25        test_cmp expect actual
  26'
  27
  28test_expect_success 'git status with porcelain v2' '
  29        git status --porcelain=v2 | grep -v "^?" >actual &&
  30        nam1=$(echo 1 | git hash-object --stdin) &&
  31        nam2=$(git hash-object elif) &&
  32        cat >expect <<-EOF &&
  33        1 DA N... 100644 000000 100644 $nam1 $ZERO_OID 1.t
  34        1 A. N... 000000 100644 100644 $ZERO_OID $nam2 elif
  35        1 .A N... 000000 000000 100644 $ZERO_OID $ZERO_OID file
  36        EOF
  37        test_cmp expect actual
  38'
  39
  40test_expect_success 'check result of "add -N"' '
  41        git ls-files -s file >actual &&
  42        empty=$(git hash-object --stdin </dev/null) &&
  43        echo "100644 $empty 0   file" >expect &&
  44        test_cmp expect actual
  45'
  46
  47test_expect_success 'intent to add is just an ordinary empty blob' '
  48        git add -u &&
  49        git ls-files -s file >actual &&
  50        git ls-files -s elif | sed -e "s/elif/file/" >expect &&
  51        test_cmp expect actual
  52'
  53
  54test_expect_success 'intent to add does not clobber existing paths' '
  55        git add -N file elif &&
  56        empty=$(git hash-object --stdin </dev/null) &&
  57        git ls-files -s >actual &&
  58        ! grep "$empty" actual
  59'
  60
  61test_expect_success 'i-t-a entry is simply ignored' '
  62        test_tick &&
  63        git commit -a -m initial &&
  64        git reset --hard &&
  65
  66        echo xyzzy >rezrov &&
  67        echo frotz >nitfol &&
  68        git add rezrov &&
  69        git add -N nitfol &&
  70        git commit -m second &&
  71        test $(git ls-tree HEAD -- nitfol | wc -l) = 0 &&
  72        test $(git diff --name-only HEAD -- nitfol | wc -l) = 1 &&
  73        test $(git diff --name-only -- nitfol | wc -l) = 1
  74'
  75
  76test_expect_success 'can commit with an unrelated i-t-a entry in index' '
  77        git reset --hard &&
  78        echo bozbar >rezrov &&
  79        echo frotz >nitfol &&
  80        git add rezrov &&
  81        git add -N nitfol &&
  82        git commit -m partial rezrov
  83'
  84
  85test_expect_success 'can "commit -a" with an i-t-a entry' '
  86        git reset --hard &&
  87        : >nitfol &&
  88        git add -N nitfol &&
  89        git commit -a -m all
  90'
  91
  92test_expect_success 'cache-tree invalidates i-t-a paths' '
  93        git reset --hard &&
  94        mkdir dir &&
  95        : >dir/foo &&
  96        git add dir/foo &&
  97        git commit -m foo &&
  98
  99        : >dir/bar &&
 100        git add -N dir/bar &&
 101        git diff --name-only >actual &&
 102        echo dir/bar >expect &&
 103        test_cmp expect actual &&
 104
 105        git write-tree >/dev/null &&
 106
 107        git diff --name-only >actual &&
 108        echo dir/bar >expect &&
 109        test_cmp expect actual
 110'
 111
 112test_expect_success 'cache-tree does not ignore dir that has i-t-a entries' '
 113        git init ita-in-dir &&
 114        (
 115                cd ita-in-dir &&
 116                mkdir 2 &&
 117                for f in 1 2/1 2/2 3
 118                do
 119                        echo "$f" >"$f"
 120                done &&
 121                git add 1 2/2 3 &&
 122                git add -N 2/1 &&
 123                git commit -m committed &&
 124                git ls-tree -r HEAD >actual &&
 125                grep 2/2 actual
 126        )
 127'
 128
 129test_expect_success 'cache-tree does skip dir that becomes empty' '
 130        rm -fr ita-in-dir &&
 131        git init ita-in-dir &&
 132        (
 133                cd ita-in-dir &&
 134                mkdir -p 1/2/3 &&
 135                echo 4 >1/2/3/4 &&
 136                git add -N 1/2/3/4 &&
 137                git write-tree >actual &&
 138                echo $EMPTY_TREE >expected &&
 139                test_cmp expected actual
 140        )
 141'
 142
 143test_expect_success 'commit: ita entries ignored in empty initial commit check' '
 144        git init empty-initial-commit &&
 145        (
 146                cd empty-initial-commit &&
 147                : >one &&
 148                git add -N one &&
 149                test_must_fail git commit -m nothing-new-here
 150        )
 151'
 152
 153test_expect_success 'commit: ita entries ignored in empty commit check' '
 154        git init empty-subsequent-commit &&
 155        (
 156                cd empty-subsequent-commit &&
 157                test_commit one &&
 158                : >two &&
 159                git add -N two &&
 160                test_must_fail git commit -m nothing-new-here
 161        )
 162'
 163
 164test_expect_success 'rename detection finds the right names' '
 165        git init rename-detection &&
 166        (
 167                cd rename-detection &&
 168                echo contents >first &&
 169                git add first &&
 170                git commit -m first &&
 171                mv first third &&
 172                git add -N third &&
 173
 174                git status | grep -v "^?" >actual.1 &&
 175                test_i18ngrep "renamed: *first -> third" actual.1 &&
 176
 177                git status --porcelain | grep -v "^?" >actual.2 &&
 178                cat >expected.2 <<-\EOF &&
 179                 R first -> third
 180                EOF
 181                test_cmp expected.2 actual.2 &&
 182
 183                hash=$(git hash-object third) &&
 184                git status --porcelain=v2 | grep -v "^?" >actual.3 &&
 185                cat >expected.3 <<-EOF &&
 186                2 .R N... 100644 100644 100644 $hash $hash R100 third   first
 187                EOF
 188                test_cmp expected.3 actual.3 &&
 189
 190                git diff --stat >actual.4 &&
 191                cat >expected.4 <<-EOF &&
 192                 first => third | 0
 193                 1 file changed, 0 insertions(+), 0 deletions(-)
 194                EOF
 195                test_cmp expected.4 actual.4 &&
 196
 197                git diff --cached --stat >actual.5 &&
 198                test_must_be_empty actual.5
 199
 200        )
 201'
 202
 203test_expect_success 'double rename detection in status' '
 204        git init rename-detection-2 &&
 205        (
 206                cd rename-detection-2 &&
 207                echo contents >first &&
 208                git add first &&
 209                git commit -m first &&
 210                git mv first second &&
 211                mv second third &&
 212                git add -N third &&
 213
 214                git status | grep -v "^?" >actual.1 &&
 215                test_i18ngrep "renamed: *first -> second" actual.1 &&
 216                test_i18ngrep "renamed: *second -> third" actual.1 &&
 217
 218                git status --porcelain | grep -v "^?" >actual.2 &&
 219                cat >expected.2 <<-\EOF &&
 220                R  first -> second
 221                 R second -> third
 222                EOF
 223                test_cmp expected.2 actual.2 &&
 224
 225                hash=$(git hash-object third) &&
 226                git status --porcelain=v2 | grep -v "^?" >actual.3 &&
 227                cat >expected.3 <<-EOF &&
 228                2 R. N... 100644 100644 100644 $hash $hash R100 second  first
 229                2 .R N... 100644 100644 100644 $hash $hash R100 third   second
 230                EOF
 231                test_cmp expected.3 actual.3
 232        )
 233'
 234
 235test_expect_success 'diff-files/diff-cached shows ita as new/not-new files' '
 236        git reset --hard &&
 237        echo new >new-ita &&
 238        git add -N new-ita &&
 239        git diff --summary >actual &&
 240        echo " create mode 100644 new-ita" >expected &&
 241        test_cmp expected actual &&
 242        git diff --cached --summary >actual2 &&
 243        test_must_be_empty actual2
 244'
 245
 246
 247test_expect_success '"diff HEAD" includes ita as new files' '
 248        git reset --hard &&
 249        echo new >new-ita &&
 250        git add -N new-ita &&
 251        git diff HEAD >actual &&
 252        cat >expected <<-\EOF &&
 253        diff --git a/new-ita b/new-ita
 254        new file mode 100644
 255        index 0000000..3e75765
 256        --- /dev/null
 257        +++ b/new-ita
 258        @@ -0,0 +1 @@
 259        +new
 260        EOF
 261        test_cmp expected actual
 262'
 263
 264test_expect_success 'apply --intent-to-add' '
 265        git reset --hard &&
 266        echo new >new-ita &&
 267        git add -N new-ita &&
 268        git diff >expected &&
 269        grep "new file" expected &&
 270        git reset --hard &&
 271        git apply --intent-to-add expected &&
 272        git diff >actual &&
 273        test_cmp expected actual
 274'
 275
 276test_done