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