t / t7060-wtstatus.shon commit tree-walk: be more specific about corrupt tree errors (2edffef)
   1#!/bin/sh
   2
   3test_description='basic work tree status reporting'
   4
   5. ./test-lib.sh
   6
   7test_expect_success setup '
   8        git config --global advice.statusuoption false &&
   9        test_commit A &&
  10        test_commit B oneside added &&
  11        git checkout A^0 &&
  12        test_commit C oneside created
  13'
  14
  15test_expect_success 'A/A conflict' '
  16        git checkout B^0 &&
  17        test_must_fail git merge C
  18'
  19
  20test_expect_success 'Report path with conflict' '
  21        git diff --cached --name-status >actual &&
  22        echo "U oneside" >expect &&
  23        test_cmp expect actual
  24'
  25
  26test_expect_success 'Report new path with conflict' '
  27        git diff --cached --name-status HEAD^ >actual &&
  28        echo "U oneside" >expect &&
  29        test_cmp expect actual
  30'
  31
  32test_expect_success 'M/D conflict does not segfault' '
  33        cat >expect <<EOF &&
  34On branch side
  35You have unmerged paths.
  36  (fix conflicts and run "git commit")
  37  (use "git merge --abort" to abort the merge)
  38
  39Unmerged paths:
  40  (use "git add/rm <file>..." as appropriate to mark resolution)
  41
  42        deleted by us:   foo
  43
  44no changes added to commit (use "git add" and/or "git commit -a")
  45EOF
  46        mkdir mdconflict &&
  47        (
  48                cd mdconflict &&
  49                git init &&
  50                test_commit initial foo "" &&
  51                test_commit modify foo foo &&
  52                git checkout -b side HEAD^ &&
  53                git rm foo &&
  54                git commit -m delete &&
  55                test_must_fail git merge master &&
  56                test_must_fail git commit --dry-run >../actual &&
  57                test_i18ncmp ../expect ../actual &&
  58                git status >../actual &&
  59                test_i18ncmp ../expect ../actual
  60        )
  61'
  62
  63test_expect_success 'rename & unmerged setup' '
  64        git rm -f -r . &&
  65        cat "$TEST_DIRECTORY/README" >ONE &&
  66        git add ONE &&
  67        test_tick &&
  68        git commit -m "One commit with ONE" &&
  69
  70        echo Modified >TWO &&
  71        cat ONE >>TWO &&
  72        cat ONE >>THREE &&
  73        git add TWO THREE &&
  74        sha1=$(git rev-parse :ONE) &&
  75        git rm --cached ONE &&
  76        (
  77                echo "100644 $sha1 1    ONE" &&
  78                echo "100644 $sha1 2    ONE" &&
  79                echo "100644 $sha1 3    ONE"
  80        ) | git update-index --index-info &&
  81        echo Further >>THREE
  82'
  83
  84test_expect_success 'rename & unmerged status' '
  85        git status -suno >actual &&
  86        cat >expect <<-EOF &&
  87        UU ONE
  88        AM THREE
  89        A  TWO
  90        EOF
  91        test_cmp expect actual
  92'
  93
  94test_expect_success 'git diff-index --cached shows 2 added + 1 unmerged' '
  95        cat >expected <<-EOF &&
  96        U       ONE
  97        A       THREE
  98        A       TWO
  99        EOF
 100        git diff-index --cached --name-status HEAD >actual &&
 101        test_cmp expected actual
 102'
 103
 104test_expect_success 'git diff-index --cached -M shows 2 added + 1 unmerged' '
 105        cat >expected <<-EOF &&
 106        U       ONE
 107        A       THREE
 108        A       TWO
 109        EOF
 110        git diff-index --cached -M --name-status HEAD >actual &&
 111        test_cmp expected actual
 112'
 113
 114test_expect_success 'git diff-index --cached -C shows 2 copies + 1 unmerged' '
 115        cat >expected <<-EOF &&
 116        U       ONE
 117        C       ONE     THREE
 118        C       ONE     TWO
 119        EOF
 120        git diff-index --cached -C --name-status HEAD |
 121        sed "s/^C[0-9]*/C/g" >actual &&
 122        test_cmp expected actual
 123'
 124
 125
 126test_expect_success 'status when conflicts with add and rm advice (deleted by them)' '
 127        git reset --hard &&
 128        git checkout master &&
 129        test_commit init main.txt init &&
 130        git checkout -b second_branch &&
 131        git rm main.txt &&
 132        git commit -m "main.txt deleted on second_branch" &&
 133        test_commit second conflict.txt second &&
 134        git checkout master &&
 135        test_commit on_second main.txt on_second &&
 136        test_commit master conflict.txt master &&
 137        test_must_fail git merge second_branch &&
 138        cat >expected <<\EOF &&
 139On branch master
 140You have unmerged paths.
 141  (fix conflicts and run "git commit")
 142  (use "git merge --abort" to abort the merge)
 143
 144Unmerged paths:
 145  (use "git add/rm <file>..." as appropriate to mark resolution)
 146
 147        both added:      conflict.txt
 148        deleted by them: main.txt
 149
 150no changes added to commit (use "git add" and/or "git commit -a")
 151EOF
 152        git status --untracked-files=no >actual &&
 153        test_i18ncmp expected actual
 154'
 155
 156
 157test_expect_success 'prepare for conflicts' '
 158        git reset --hard &&
 159        git checkout -b conflict &&
 160        test_commit one main.txt one &&
 161        git branch conflict_second &&
 162        git mv main.txt sub_master.txt &&
 163        git commit -m "main.txt renamed in sub_master.txt" &&
 164        git checkout conflict_second &&
 165        git mv main.txt sub_second.txt &&
 166        git commit -m "main.txt renamed in sub_second.txt"
 167'
 168
 169
 170test_expect_success 'status when conflicts with add and rm advice (both deleted)' '
 171        test_must_fail git merge conflict &&
 172        cat >expected <<\EOF &&
 173On branch conflict_second
 174You have unmerged paths.
 175  (fix conflicts and run "git commit")
 176  (use "git merge --abort" to abort the merge)
 177
 178Unmerged paths:
 179  (use "git add/rm <file>..." as appropriate to mark resolution)
 180
 181        both deleted:    main.txt
 182        added by them:   sub_master.txt
 183        added by us:     sub_second.txt
 184
 185no changes added to commit (use "git add" and/or "git commit -a")
 186EOF
 187        git status --untracked-files=no >actual &&
 188        test_i18ncmp expected actual
 189'
 190
 191
 192test_expect_success 'status when conflicts with only rm advice (both deleted)' '
 193        git reset --hard conflict_second &&
 194        test_must_fail git merge conflict &&
 195        git add sub_master.txt &&
 196        git add sub_second.txt &&
 197        cat >expected <<\EOF &&
 198On branch conflict_second
 199You have unmerged paths.
 200  (fix conflicts and run "git commit")
 201  (use "git merge --abort" to abort the merge)
 202
 203Changes to be committed:
 204
 205        new file:   sub_master.txt
 206
 207Unmerged paths:
 208  (use "git rm <file>..." to mark resolution)
 209
 210        both deleted:    main.txt
 211
 212Untracked files not listed (use -u option to show untracked files)
 213EOF
 214        git status --untracked-files=no >actual &&
 215        test_i18ncmp expected actual &&
 216        git reset --hard &&
 217        git checkout master
 218'
 219
 220test_expect_success 'status --branch with detached HEAD' '
 221        git reset --hard &&
 222        git checkout master^0 &&
 223        git status --branch --porcelain >actual &&
 224        cat >expected <<-EOF &&
 225        ## HEAD (no branch)
 226        ?? .gitconfig
 227        ?? actual
 228        ?? expect
 229        ?? expected
 230        ?? mdconflict/
 231        EOF
 232        test_i18ncmp expected actual
 233'
 234
 235## Duplicate the above test and verify --porcelain=v1 arg parsing.
 236test_expect_success 'status --porcelain=v1 --branch with detached HEAD' '
 237        git reset --hard &&
 238        git checkout master^0 &&
 239        git status --branch --porcelain=v1 >actual &&
 240        cat >expected <<-EOF &&
 241        ## HEAD (no branch)
 242        ?? .gitconfig
 243        ?? actual
 244        ?? expect
 245        ?? expected
 246        ?? mdconflict/
 247        EOF
 248        test_i18ncmp expected actual
 249'
 250
 251## Verify parser error on invalid --porcelain argument.
 252test_expect_success 'status --porcelain=bogus' '
 253        test_must_fail git status --porcelain=bogus
 254'
 255
 256test_done