t / t7512-status-help.shon commit t4045: abstract away SHA-1-specific constants (5c02428)
   1#!/bin/sh
   2#
   3# Copyright (c) 2012 Valentin Duperray, Lucien Kong, Franck Jonas,
   4#                    Thomas Nguy, Khoi Nguyen
   5#                    Grenoble INP Ensimag
   6#
   7
   8test_description='git status advice'
   9
  10. ./test-lib.sh
  11
  12. "$TEST_DIRECTORY"/lib-rebase.sh
  13
  14set_fake_editor
  15
  16test_expect_success 'prepare for conflicts' '
  17        git config --global advice.statusuoption false &&
  18        test_commit init main.txt init &&
  19        git branch conflicts &&
  20        test_commit on_master main.txt on_master &&
  21        git checkout conflicts &&
  22        test_commit on_conflicts main.txt on_conflicts
  23'
  24
  25
  26test_expect_success 'status when conflicts unresolved' '
  27        test_must_fail git merge master &&
  28        cat >expected <<\EOF &&
  29On branch conflicts
  30You have unmerged paths.
  31  (fix conflicts and run "git commit")
  32  (use "git merge --abort" to abort the merge)
  33
  34Unmerged paths:
  35  (use "git add <file>..." to mark resolution)
  36
  37        both modified:   main.txt
  38
  39no changes added to commit (use "git add" and/or "git commit -a")
  40EOF
  41        git status --untracked-files=no >actual &&
  42        test_i18ncmp expected actual
  43'
  44
  45
  46test_expect_success 'status when conflicts resolved before commit' '
  47        git reset --hard conflicts &&
  48        test_must_fail git merge master &&
  49        echo one >main.txt &&
  50        git add main.txt &&
  51        cat >expected <<\EOF &&
  52On branch conflicts
  53All conflicts fixed but you are still merging.
  54  (use "git commit" to conclude merge)
  55
  56Changes to be committed:
  57
  58        modified:   main.txt
  59
  60Untracked files not listed (use -u option to show untracked files)
  61EOF
  62        git status --untracked-files=no >actual &&
  63        test_i18ncmp expected actual
  64'
  65
  66
  67test_expect_success 'prepare for rebase conflicts' '
  68        git reset --hard master &&
  69        git checkout -b rebase_conflicts &&
  70        test_commit one_rebase main.txt one &&
  71        test_commit two_rebase main.txt two &&
  72        test_commit three_rebase main.txt three
  73'
  74
  75
  76test_expect_success 'status when rebase in progress before resolving conflicts' '
  77        test_when_finished "git rebase --abort" &&
  78        ONTO=$(git rev-parse --short HEAD^^) &&
  79        test_must_fail git rebase HEAD^ --onto HEAD^^ &&
  80        cat >expected <<EOF &&
  81rebase in progress; onto $ONTO
  82You are currently rebasing branch '\''rebase_conflicts'\'' on '\''$ONTO'\''.
  83  (fix conflicts and then run "git rebase --continue")
  84  (use "git rebase --skip" to skip this patch)
  85  (use "git rebase --abort" to check out the original branch)
  86
  87Unmerged paths:
  88  (use "git reset HEAD <file>..." to unstage)
  89  (use "git add <file>..." to mark resolution)
  90
  91        both modified:   main.txt
  92
  93no changes added to commit (use "git add" and/or "git commit -a")
  94EOF
  95        git status --untracked-files=no >actual &&
  96        test_i18ncmp expected actual
  97'
  98
  99
 100test_expect_success 'status when rebase in progress before rebase --continue' '
 101        git reset --hard rebase_conflicts &&
 102        test_when_finished "git rebase --abort" &&
 103        ONTO=$(git rev-parse --short HEAD^^) &&
 104        test_must_fail git rebase HEAD^ --onto HEAD^^ &&
 105        echo three >main.txt &&
 106        git add main.txt &&
 107        cat >expected <<EOF &&
 108rebase in progress; onto $ONTO
 109You are currently rebasing branch '\''rebase_conflicts'\'' on '\''$ONTO'\''.
 110  (all conflicts fixed: run "git rebase --continue")
 111
 112Changes to be committed:
 113  (use "git reset HEAD <file>..." to unstage)
 114
 115        modified:   main.txt
 116
 117Untracked files not listed (use -u option to show untracked files)
 118EOF
 119        git status --untracked-files=no >actual &&
 120        test_i18ncmp expected actual
 121'
 122
 123
 124test_expect_success 'prepare for rebase_i_conflicts' '
 125        git reset --hard master &&
 126        git checkout -b rebase_i_conflicts &&
 127        test_commit one_unmerge main.txt one_unmerge &&
 128        git branch rebase_i_conflicts_second &&
 129        test_commit one_master main.txt one_master &&
 130        git checkout rebase_i_conflicts_second &&
 131        test_commit one_second main.txt one_second
 132'
 133
 134
 135test_expect_success 'status during rebase -i when conflicts unresolved' '
 136        test_when_finished "git rebase --abort" &&
 137        ONTO=$(git rev-parse --short rebase_i_conflicts) &&
 138        LAST_COMMIT=$(git rev-parse --short rebase_i_conflicts_second) &&
 139        test_must_fail git rebase -i rebase_i_conflicts &&
 140        cat >expected <<EOF &&
 141interactive rebase in progress; onto $ONTO
 142Last command done (1 command done):
 143   pick $LAST_COMMIT one_second
 144No commands remaining.
 145You are currently rebasing branch '\''rebase_i_conflicts_second'\'' on '\''$ONTO'\''.
 146  (fix conflicts and then run "git rebase --continue")
 147  (use "git rebase --skip" to skip this patch)
 148  (use "git rebase --abort" to check out the original branch)
 149
 150Unmerged paths:
 151  (use "git reset HEAD <file>..." to unstage)
 152  (use "git add <file>..." to mark resolution)
 153
 154        both modified:   main.txt
 155
 156no changes added to commit (use "git add" and/or "git commit -a")
 157EOF
 158        git status --untracked-files=no >actual &&
 159        test_i18ncmp expected actual
 160'
 161
 162
 163test_expect_success 'status during rebase -i after resolving conflicts' '
 164        git reset --hard rebase_i_conflicts_second &&
 165        test_when_finished "git rebase --abort" &&
 166        ONTO=$(git rev-parse --short rebase_i_conflicts) &&
 167        LAST_COMMIT=$(git rev-parse --short rebase_i_conflicts_second) &&
 168        test_must_fail git rebase -i rebase_i_conflicts &&
 169        git add main.txt &&
 170        cat >expected <<EOF &&
 171interactive rebase in progress; onto $ONTO
 172Last command done (1 command done):
 173   pick $LAST_COMMIT one_second
 174No commands remaining.
 175You are currently rebasing branch '\''rebase_i_conflicts_second'\'' on '\''$ONTO'\''.
 176  (all conflicts fixed: run "git rebase --continue")
 177
 178Changes to be committed:
 179  (use "git reset HEAD <file>..." to unstage)
 180
 181        modified:   main.txt
 182
 183Untracked files not listed (use -u option to show untracked files)
 184EOF
 185        git status --untracked-files=no >actual &&
 186        test_i18ncmp expected actual
 187'
 188
 189
 190test_expect_success 'status when rebasing -i in edit mode' '
 191        git reset --hard master &&
 192        git checkout -b rebase_i_edit &&
 193        test_commit one_rebase_i main.txt one &&
 194        test_commit two_rebase_i main.txt two &&
 195        COMMIT2=$(git rev-parse --short rebase_i_edit) &&
 196        test_commit three_rebase_i main.txt three &&
 197        COMMIT3=$(git rev-parse --short rebase_i_edit) &&
 198        FAKE_LINES="1 edit 2" &&
 199        export FAKE_LINES &&
 200        test_when_finished "git rebase --abort" &&
 201        ONTO=$(git rev-parse --short HEAD~2) &&
 202        git rebase -i HEAD~2 &&
 203        cat >expected <<EOF &&
 204interactive rebase in progress; onto $ONTO
 205Last commands done (2 commands done):
 206   pick $COMMIT2 two_rebase_i
 207   edit $COMMIT3 three_rebase_i
 208No commands remaining.
 209You are currently editing a commit while rebasing branch '\''rebase_i_edit'\'' on '\''$ONTO'\''.
 210  (use "git commit --amend" to amend the current commit)
 211  (use "git rebase --continue" once you are satisfied with your changes)
 212
 213nothing to commit (use -u to show untracked files)
 214EOF
 215        git status --untracked-files=no >actual &&
 216        test_i18ncmp expected actual
 217'
 218
 219
 220test_expect_success 'status when splitting a commit' '
 221        git reset --hard master &&
 222        git checkout -b split_commit &&
 223        test_commit one_split main.txt one &&
 224        test_commit two_split main.txt two &&
 225        COMMIT2=$(git rev-parse --short split_commit) &&
 226        test_commit three_split main.txt three &&
 227        COMMIT3=$(git rev-parse --short split_commit) &&
 228        test_commit four_split main.txt four &&
 229        COMMIT4=$(git rev-parse --short split_commit) &&
 230        FAKE_LINES="1 edit 2 3" &&
 231        export FAKE_LINES &&
 232        test_when_finished "git rebase --abort" &&
 233        ONTO=$(git rev-parse --short HEAD~3) &&
 234        git rebase -i HEAD~3 &&
 235        git reset HEAD^ &&
 236        cat >expected <<EOF &&
 237interactive rebase in progress; onto $ONTO
 238Last commands done (2 commands done):
 239   pick $COMMIT2 two_split
 240   edit $COMMIT3 three_split
 241Next command to do (1 remaining command):
 242   pick $COMMIT4 four_split
 243  (use "git rebase --edit-todo" to view and edit)
 244You are currently splitting a commit while rebasing branch '\''split_commit'\'' on '\''$ONTO'\''.
 245  (Once your working directory is clean, run "git rebase --continue")
 246
 247Changes not staged for commit:
 248  (use "git add <file>..." to update what will be committed)
 249  (use "git checkout -- <file>..." to discard changes in working directory)
 250
 251        modified:   main.txt
 252
 253no changes added to commit (use "git add" and/or "git commit -a")
 254EOF
 255        git status --untracked-files=no >actual &&
 256        test_i18ncmp expected actual
 257'
 258
 259
 260test_expect_success 'status after editing the last commit with --amend during a rebase -i' '
 261        git reset --hard master &&
 262        git checkout -b amend_last &&
 263        test_commit one_amend main.txt one &&
 264        test_commit two_amend main.txt two &&
 265        test_commit three_amend main.txt three &&
 266        COMMIT3=$(git rev-parse --short amend_last) &&
 267        test_commit four_amend main.txt four &&
 268        COMMIT4=$(git rev-parse --short amend_last) &&
 269        FAKE_LINES="1 2 edit 3" &&
 270        export FAKE_LINES &&
 271        test_when_finished "git rebase --abort" &&
 272        ONTO=$(git rev-parse --short HEAD~3) &&
 273        git rebase -i HEAD~3 &&
 274        git commit --amend -m "foo" &&
 275        cat >expected <<EOF &&
 276interactive rebase in progress; onto $ONTO
 277Last commands done (3 commands done):
 278   pick $COMMIT3 three_amend
 279   edit $COMMIT4 four_amend
 280  (see more in file .git/rebase-merge/done)
 281No commands remaining.
 282You are currently editing a commit while rebasing branch '\''amend_last'\'' on '\''$ONTO'\''.
 283  (use "git commit --amend" to amend the current commit)
 284  (use "git rebase --continue" once you are satisfied with your changes)
 285
 286nothing to commit (use -u to show untracked files)
 287EOF
 288        git status --untracked-files=no >actual &&
 289        test_i18ncmp expected actual
 290'
 291
 292
 293test_expect_success 'prepare for several edits' '
 294        git reset --hard master &&
 295        git checkout -b several_edits &&
 296        test_commit one_edits main.txt one &&
 297        test_commit two_edits main.txt two &&
 298        test_commit three_edits main.txt three &&
 299        test_commit four_edits main.txt four
 300'
 301
 302
 303test_expect_success 'status: (continue first edit) second edit' '
 304        FAKE_LINES="edit 1 edit 2 3" &&
 305        export FAKE_LINES &&
 306        test_when_finished "git rebase --abort" &&
 307        COMMIT2=$(git rev-parse --short several_edits^^) &&
 308        COMMIT3=$(git rev-parse --short several_edits^) &&
 309        COMMIT4=$(git rev-parse --short several_edits) &&
 310        ONTO=$(git rev-parse --short HEAD~3) &&
 311        git rebase -i HEAD~3 &&
 312        git rebase --continue &&
 313        cat >expected <<EOF &&
 314interactive rebase in progress; onto $ONTO
 315Last commands done (2 commands done):
 316   edit $COMMIT2 two_edits
 317   edit $COMMIT3 three_edits
 318Next command to do (1 remaining command):
 319   pick $COMMIT4 four_edits
 320  (use "git rebase --edit-todo" to view and edit)
 321You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
 322  (use "git commit --amend" to amend the current commit)
 323  (use "git rebase --continue" once you are satisfied with your changes)
 324
 325nothing to commit (use -u to show untracked files)
 326EOF
 327        git status --untracked-files=no >actual &&
 328        test_i18ncmp expected actual
 329'
 330
 331
 332test_expect_success 'status: (continue first edit) second edit and split' '
 333        git reset --hard several_edits &&
 334        FAKE_LINES="edit 1 edit 2 3" &&
 335        export FAKE_LINES &&
 336        test_when_finished "git rebase --abort" &&
 337        COMMIT2=$(git rev-parse --short several_edits^^) &&
 338        COMMIT3=$(git rev-parse --short several_edits^) &&
 339        COMMIT4=$(git rev-parse --short several_edits) &&
 340        ONTO=$(git rev-parse --short HEAD~3) &&
 341        git rebase -i HEAD~3 &&
 342        git rebase --continue &&
 343        git reset HEAD^ &&
 344        cat >expected <<EOF &&
 345interactive rebase in progress; onto $ONTO
 346Last commands done (2 commands done):
 347   edit $COMMIT2 two_edits
 348   edit $COMMIT3 three_edits
 349Next command to do (1 remaining command):
 350   pick $COMMIT4 four_edits
 351  (use "git rebase --edit-todo" to view and edit)
 352You are currently splitting a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
 353  (Once your working directory is clean, run "git rebase --continue")
 354
 355Changes not staged for commit:
 356  (use "git add <file>..." to update what will be committed)
 357  (use "git checkout -- <file>..." to discard changes in working directory)
 358
 359        modified:   main.txt
 360
 361no changes added to commit (use "git add" and/or "git commit -a")
 362EOF
 363        git status --untracked-files=no >actual &&
 364        test_i18ncmp expected actual
 365'
 366
 367
 368test_expect_success 'status: (continue first edit) second edit and amend' '
 369        git reset --hard several_edits &&
 370        FAKE_LINES="edit 1 edit 2 3" &&
 371        export FAKE_LINES &&
 372        test_when_finished "git rebase --abort" &&
 373        COMMIT2=$(git rev-parse --short several_edits^^) &&
 374        COMMIT3=$(git rev-parse --short several_edits^) &&
 375        COMMIT4=$(git rev-parse --short several_edits) &&
 376        ONTO=$(git rev-parse --short HEAD~3) &&
 377        git rebase -i HEAD~3 &&
 378        git rebase --continue &&
 379        git commit --amend -m "foo" &&
 380        cat >expected <<EOF &&
 381interactive rebase in progress; onto $ONTO
 382Last commands done (2 commands done):
 383   edit $COMMIT2 two_edits
 384   edit $COMMIT3 three_edits
 385Next command to do (1 remaining command):
 386   pick $COMMIT4 four_edits
 387  (use "git rebase --edit-todo" to view and edit)
 388You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
 389  (use "git commit --amend" to amend the current commit)
 390  (use "git rebase --continue" once you are satisfied with your changes)
 391
 392nothing to commit (use -u to show untracked files)
 393EOF
 394        git status --untracked-files=no >actual &&
 395        test_i18ncmp expected actual
 396'
 397
 398
 399test_expect_success 'status: (amend first edit) second edit' '
 400        git reset --hard several_edits &&
 401        FAKE_LINES="edit 1 edit 2 3" &&
 402        export FAKE_LINES &&
 403        test_when_finished "git rebase --abort" &&
 404        COMMIT2=$(git rev-parse --short several_edits^^) &&
 405        COMMIT3=$(git rev-parse --short several_edits^) &&
 406        COMMIT4=$(git rev-parse --short several_edits) &&
 407        ONTO=$(git rev-parse --short HEAD~3) &&
 408        git rebase -i HEAD~3 &&
 409        git commit --amend -m "a" &&
 410        git rebase --continue &&
 411        cat >expected <<EOF &&
 412interactive rebase in progress; onto $ONTO
 413Last commands done (2 commands done):
 414   edit $COMMIT2 two_edits
 415   edit $COMMIT3 three_edits
 416Next command to do (1 remaining command):
 417   pick $COMMIT4 four_edits
 418  (use "git rebase --edit-todo" to view and edit)
 419You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
 420  (use "git commit --amend" to amend the current commit)
 421  (use "git rebase --continue" once you are satisfied with your changes)
 422
 423nothing to commit (use -u to show untracked files)
 424EOF
 425        git status --untracked-files=no >actual &&
 426        test_i18ncmp expected actual
 427'
 428
 429
 430test_expect_success 'status: (amend first edit) second edit and split' '
 431        git reset --hard several_edits &&
 432        FAKE_LINES="edit 1 edit 2 3" &&
 433        export FAKE_LINES &&
 434        test_when_finished "git rebase --abort" &&
 435        ONTO=$(git rev-parse --short HEAD~3) &&
 436        COMMIT2=$(git rev-parse --short several_edits^^) &&
 437        COMMIT3=$(git rev-parse --short several_edits^) &&
 438        COMMIT4=$(git rev-parse --short several_edits) &&
 439        git rebase -i HEAD~3 &&
 440        git commit --amend -m "b" &&
 441        git rebase --continue &&
 442        git reset HEAD^ &&
 443        cat >expected <<EOF &&
 444interactive rebase in progress; onto $ONTO
 445Last commands done (2 commands done):
 446   edit $COMMIT2 two_edits
 447   edit $COMMIT3 three_edits
 448Next command to do (1 remaining command):
 449   pick $COMMIT4 four_edits
 450  (use "git rebase --edit-todo" to view and edit)
 451You are currently splitting a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
 452  (Once your working directory is clean, run "git rebase --continue")
 453
 454Changes not staged for commit:
 455  (use "git add <file>..." to update what will be committed)
 456  (use "git checkout -- <file>..." to discard changes in working directory)
 457
 458        modified:   main.txt
 459
 460no changes added to commit (use "git add" and/or "git commit -a")
 461EOF
 462        git status --untracked-files=no >actual &&
 463        test_i18ncmp expected actual
 464'
 465
 466
 467test_expect_success 'status: (amend first edit) second edit and amend' '
 468        git reset --hard several_edits &&
 469        FAKE_LINES="edit 1 edit 2 3" &&
 470        export FAKE_LINES &&
 471        test_when_finished "git rebase --abort" &&
 472        COMMIT2=$(git rev-parse --short several_edits^^) &&
 473        COMMIT3=$(git rev-parse --short several_edits^) &&
 474        COMMIT4=$(git rev-parse --short several_edits) &&
 475        ONTO=$(git rev-parse --short HEAD~3) &&
 476        git rebase -i HEAD~3 &&
 477        git commit --amend -m "c" &&
 478        git rebase --continue &&
 479        git commit --amend -m "d" &&
 480        cat >expected <<EOF &&
 481interactive rebase in progress; onto $ONTO
 482Last commands done (2 commands done):
 483   edit $COMMIT2 two_edits
 484   edit $COMMIT3 three_edits
 485Next command to do (1 remaining command):
 486   pick $COMMIT4 four_edits
 487  (use "git rebase --edit-todo" to view and edit)
 488You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
 489  (use "git commit --amend" to amend the current commit)
 490  (use "git rebase --continue" once you are satisfied with your changes)
 491
 492nothing to commit (use -u to show untracked files)
 493EOF
 494        git status --untracked-files=no >actual &&
 495        test_i18ncmp expected actual
 496'
 497
 498
 499test_expect_success 'status: (split first edit) second edit' '
 500        git reset --hard several_edits &&
 501        FAKE_LINES="edit 1 edit 2 3" &&
 502        export FAKE_LINES &&
 503        test_when_finished "git rebase --abort" &&
 504        COMMIT2=$(git rev-parse --short several_edits^^) &&
 505        COMMIT3=$(git rev-parse --short several_edits^) &&
 506        COMMIT4=$(git rev-parse --short several_edits) &&
 507        ONTO=$(git rev-parse --short HEAD~3) &&
 508        git rebase -i HEAD~3 &&
 509        git reset HEAD^ &&
 510        git add main.txt &&
 511        git commit -m "e" &&
 512        git rebase --continue &&
 513        cat >expected <<EOF &&
 514interactive rebase in progress; onto $ONTO
 515Last commands done (2 commands done):
 516   edit $COMMIT2 two_edits
 517   edit $COMMIT3 three_edits
 518Next command to do (1 remaining command):
 519   pick $COMMIT4 four_edits
 520  (use "git rebase --edit-todo" to view and edit)
 521You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
 522  (use "git commit --amend" to amend the current commit)
 523  (use "git rebase --continue" once you are satisfied with your changes)
 524
 525nothing to commit (use -u to show untracked files)
 526EOF
 527        git status --untracked-files=no >actual &&
 528        test_i18ncmp expected actual
 529'
 530
 531
 532test_expect_success 'status: (split first edit) second edit and split' '
 533        git reset --hard several_edits &&
 534        FAKE_LINES="edit 1 edit 2 3" &&
 535        export FAKE_LINES &&
 536        test_when_finished "git rebase --abort" &&
 537        COMMIT2=$(git rev-parse --short several_edits^^) &&
 538        COMMIT3=$(git rev-parse --short several_edits^) &&
 539        COMMIT4=$(git rev-parse --short several_edits) &&
 540        ONTO=$(git rev-parse --short HEAD~3) &&
 541        git rebase -i HEAD~3 &&
 542        git reset HEAD^ &&
 543        git add main.txt &&
 544        git commit --amend -m "f" &&
 545        git rebase --continue &&
 546        git reset HEAD^ &&
 547        cat >expected <<EOF &&
 548interactive rebase in progress; onto $ONTO
 549Last commands done (2 commands done):
 550   edit $COMMIT2 two_edits
 551   edit $COMMIT3 three_edits
 552Next command to do (1 remaining command):
 553   pick $COMMIT4 four_edits
 554  (use "git rebase --edit-todo" to view and edit)
 555You are currently splitting a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
 556  (Once your working directory is clean, run "git rebase --continue")
 557
 558Changes not staged for commit:
 559  (use "git add <file>..." to update what will be committed)
 560  (use "git checkout -- <file>..." to discard changes in working directory)
 561
 562        modified:   main.txt
 563
 564no changes added to commit (use "git add" and/or "git commit -a")
 565EOF
 566        git status --untracked-files=no >actual &&
 567        test_i18ncmp expected actual
 568'
 569
 570
 571test_expect_success 'status: (split first edit) second edit and amend' '
 572        git reset --hard several_edits &&
 573        FAKE_LINES="edit 1 edit 2 3" &&
 574        export FAKE_LINES &&
 575        test_when_finished "git rebase --abort" &&
 576        COMMIT2=$(git rev-parse --short several_edits^^) &&
 577        COMMIT3=$(git rev-parse --short several_edits^) &&
 578        COMMIT4=$(git rev-parse --short several_edits) &&
 579        ONTO=$(git rev-parse --short HEAD~3) &&
 580        git rebase -i HEAD~3 &&
 581        git reset HEAD^ &&
 582        git add main.txt &&
 583        git commit --amend -m "g" &&
 584        git rebase --continue &&
 585        git commit --amend -m "h" &&
 586        cat >expected <<EOF &&
 587interactive rebase in progress; onto $ONTO
 588Last commands done (2 commands done):
 589   edit $COMMIT2 two_edits
 590   edit $COMMIT3 three_edits
 591Next command to do (1 remaining command):
 592   pick $COMMIT4 four_edits
 593  (use "git rebase --edit-todo" to view and edit)
 594You are currently editing a commit while rebasing branch '\''several_edits'\'' on '\''$ONTO'\''.
 595  (use "git commit --amend" to amend the current commit)
 596  (use "git rebase --continue" once you are satisfied with your changes)
 597
 598nothing to commit (use -u to show untracked files)
 599EOF
 600        git status --untracked-files=no >actual &&
 601        test_i18ncmp expected actual
 602'
 603
 604
 605test_expect_success 'prepare am_session' '
 606        git reset --hard master &&
 607        git checkout -b am_session &&
 608        test_commit one_am one.txt "one" &&
 609        test_commit two_am two.txt "two" &&
 610        test_commit three_am three.txt "three"
 611'
 612
 613
 614test_expect_success 'status in an am session: file already exists' '
 615        git checkout -b am_already_exists &&
 616        test_when_finished "rm Maildir/* && git am --abort" &&
 617        git format-patch -1 -oMaildir &&
 618        test_must_fail git am Maildir/*.patch &&
 619        cat >expected <<\EOF &&
 620On branch am_already_exists
 621You are in the middle of an am session.
 622  (fix conflicts and then run "git am --continue")
 623  (use "git am --skip" to skip this patch)
 624  (use "git am --abort" to restore the original branch)
 625
 626nothing to commit (use -u to show untracked files)
 627EOF
 628        git status --untracked-files=no >actual &&
 629        test_i18ncmp expected actual
 630'
 631
 632
 633test_expect_success 'status in an am session: file does not exist' '
 634        git reset --hard am_session &&
 635        git checkout -b am_not_exists &&
 636        git rm three.txt &&
 637        git commit -m "delete three.txt" &&
 638        test_when_finished "rm Maildir/* && git am --abort" &&
 639        git format-patch -1 -oMaildir &&
 640        test_must_fail git am Maildir/*.patch &&
 641        cat >expected <<\EOF &&
 642On branch am_not_exists
 643You are in the middle of an am session.
 644  (fix conflicts and then run "git am --continue")
 645  (use "git am --skip" to skip this patch)
 646  (use "git am --abort" to restore the original branch)
 647
 648nothing to commit (use -u to show untracked files)
 649EOF
 650        git status --untracked-files=no >actual &&
 651        test_i18ncmp expected actual
 652'
 653
 654
 655test_expect_success 'status in an am session: empty patch' '
 656        git reset --hard am_session &&
 657        git checkout -b am_empty &&
 658        test_when_finished "rm Maildir/* && git am --abort" &&
 659        git format-patch -3 -oMaildir &&
 660        git rm one.txt two.txt three.txt &&
 661        git commit -m "delete all am_empty" &&
 662        echo error >Maildir/0002-two_am.patch &&
 663        test_must_fail git am Maildir/*.patch &&
 664        cat >expected <<\EOF &&
 665On branch am_empty
 666You are in the middle of an am session.
 667The current patch is empty.
 668  (use "git am --skip" to skip this patch)
 669  (use "git am --abort" to restore the original branch)
 670
 671nothing to commit (use -u to show untracked files)
 672EOF
 673        git status --untracked-files=no >actual &&
 674        test_i18ncmp expected actual
 675'
 676
 677
 678test_expect_success 'status when bisecting' '
 679        git reset --hard master &&
 680        git checkout -b bisect &&
 681        test_commit one_bisect main.txt one &&
 682        test_commit two_bisect main.txt two &&
 683        test_commit three_bisect main.txt three &&
 684        test_when_finished "git bisect reset" &&
 685        git bisect start &&
 686        git bisect bad &&
 687        git bisect good one_bisect &&
 688        TGT=$(git rev-parse --short two_bisect) &&
 689        cat >expected <<EOF &&
 690HEAD detached at $TGT
 691You are currently bisecting, started from branch '\''bisect'\''.
 692  (use "git bisect reset" to get back to the original branch)
 693
 694nothing to commit (use -u to show untracked files)
 695EOF
 696        git status --untracked-files=no >actual &&
 697        test_i18ncmp expected actual
 698'
 699
 700
 701test_expect_success 'status when rebase conflicts with statushints disabled' '
 702        git reset --hard master &&
 703        git checkout -b statushints_disabled &&
 704        test_when_finished "git config --local advice.statushints true" &&
 705        git config --local advice.statushints false &&
 706        test_commit one_statushints main.txt one &&
 707        test_commit two_statushints main.txt two &&
 708        test_commit three_statushints main.txt three &&
 709        test_when_finished "git rebase --abort" &&
 710        ONTO=$(git rev-parse --short HEAD^^) &&
 711        test_must_fail git rebase HEAD^ --onto HEAD^^ &&
 712        cat >expected <<EOF &&
 713rebase in progress; onto $ONTO
 714You are currently rebasing branch '\''statushints_disabled'\'' on '\''$ONTO'\''.
 715
 716Unmerged paths:
 717        both modified:   main.txt
 718
 719no changes added to commit
 720EOF
 721        git status --untracked-files=no >actual &&
 722        test_i18ncmp expected actual
 723'
 724
 725
 726test_expect_success 'prepare for cherry-pick conflicts' '
 727        git reset --hard master &&
 728        git checkout -b cherry_branch &&
 729        test_commit one_cherry main.txt one &&
 730        test_commit two_cherries main.txt two &&
 731        git checkout -b cherry_branch_second &&
 732        test_commit second_cherry main.txt second &&
 733        git checkout cherry_branch &&
 734        test_commit three_cherries main.txt three
 735'
 736
 737
 738test_expect_success 'status when cherry-picking before resolving conflicts' '
 739        test_when_finished "git cherry-pick --abort" &&
 740        test_must_fail git cherry-pick cherry_branch_second &&
 741        TO_CHERRY_PICK=$(git rev-parse --short CHERRY_PICK_HEAD) &&
 742        cat >expected <<EOF &&
 743On branch cherry_branch
 744You are currently cherry-picking commit $TO_CHERRY_PICK.
 745  (fix conflicts and run "git cherry-pick --continue")
 746  (use "git cherry-pick --abort" to cancel the cherry-pick operation)
 747
 748Unmerged paths:
 749  (use "git add <file>..." to mark resolution)
 750
 751        both modified:   main.txt
 752
 753no changes added to commit (use "git add" and/or "git commit -a")
 754EOF
 755        git status --untracked-files=no >actual &&
 756        test_i18ncmp expected actual
 757'
 758
 759
 760test_expect_success 'status when cherry-picking after resolving conflicts' '
 761        git reset --hard cherry_branch &&
 762        test_when_finished "git cherry-pick --abort" &&
 763        test_must_fail git cherry-pick cherry_branch_second &&
 764        TO_CHERRY_PICK=$(git rev-parse --short CHERRY_PICK_HEAD) &&
 765        echo end >main.txt &&
 766        git add main.txt &&
 767        cat >expected <<EOF &&
 768On branch cherry_branch
 769You are currently cherry-picking commit $TO_CHERRY_PICK.
 770  (all conflicts fixed: run "git cherry-pick --continue")
 771  (use "git cherry-pick --abort" to cancel the cherry-pick operation)
 772
 773Changes to be committed:
 774
 775        modified:   main.txt
 776
 777Untracked files not listed (use -u option to show untracked files)
 778EOF
 779        git status --untracked-files=no >actual &&
 780        test_i18ncmp expected actual
 781'
 782
 783test_expect_success 'status showing detached at and from a tag' '
 784        test_commit atag tagging &&
 785        git checkout atag &&
 786        cat >expected <<\EOF &&
 787HEAD detached at atag
 788nothing to commit (use -u to show untracked files)
 789EOF
 790        git status --untracked-files=no >actual &&
 791        test_i18ncmp expected actual &&
 792
 793        git reset --hard HEAD^ &&
 794        cat >expected <<\EOF &&
 795HEAD detached from atag
 796nothing to commit (use -u to show untracked files)
 797EOF
 798        git status --untracked-files=no >actual &&
 799        test_i18ncmp expected actual
 800'
 801
 802test_expect_success 'status while reverting commit (conflicts)' '
 803        git checkout master &&
 804        echo before >to-revert.txt &&
 805        test_commit before to-revert.txt &&
 806        echo old >to-revert.txt &&
 807        test_commit old to-revert.txt &&
 808        echo new >to-revert.txt &&
 809        test_commit new to-revert.txt &&
 810        TO_REVERT=$(git rev-parse --short HEAD^) &&
 811        test_must_fail git revert $TO_REVERT &&
 812        cat >expected <<EOF &&
 813On branch master
 814You are currently reverting commit $TO_REVERT.
 815  (fix conflicts and run "git revert --continue")
 816  (use "git revert --abort" to cancel the revert operation)
 817
 818Unmerged paths:
 819  (use "git reset HEAD <file>..." to unstage)
 820  (use "git add <file>..." to mark resolution)
 821
 822        both modified:   to-revert.txt
 823
 824no changes added to commit (use "git add" and/or "git commit -a")
 825EOF
 826        git status --untracked-files=no >actual &&
 827        test_i18ncmp expected actual
 828'
 829
 830test_expect_success 'status while reverting commit (conflicts resolved)' '
 831        echo reverted >to-revert.txt &&
 832        git add to-revert.txt &&
 833        cat >expected <<EOF &&
 834On branch master
 835You are currently reverting commit $TO_REVERT.
 836  (all conflicts fixed: run "git revert --continue")
 837  (use "git revert --abort" to cancel the revert operation)
 838
 839Changes to be committed:
 840  (use "git reset HEAD <file>..." to unstage)
 841
 842        modified:   to-revert.txt
 843
 844Untracked files not listed (use -u option to show untracked files)
 845EOF
 846        git status --untracked-files=no >actual &&
 847        test_i18ncmp expected actual
 848'
 849
 850test_expect_success 'status after reverting commit' '
 851        git revert --continue &&
 852        cat >expected <<\EOF &&
 853On branch master
 854nothing to commit (use -u to show untracked files)
 855EOF
 856        git status --untracked-files=no >actual &&
 857        test_i18ncmp expected actual
 858'
 859
 860test_expect_success 'prepare for different number of commits rebased' '
 861        git reset --hard master &&
 862        git checkout -b several_commits &&
 863        test_commit one_commit main.txt one &&
 864        test_commit two_commit main.txt two &&
 865        test_commit three_commit main.txt three &&
 866        test_commit four_commit main.txt four
 867'
 868
 869test_expect_success 'status: one command done nothing remaining' '
 870        FAKE_LINES="exec_exit_15" &&
 871        export FAKE_LINES &&
 872        test_when_finished "git rebase --abort" &&
 873        ONTO=$(git rev-parse --short HEAD~3) &&
 874        test_must_fail git rebase -i HEAD~3 &&
 875        cat >expected <<EOF &&
 876interactive rebase in progress; onto $ONTO
 877Last command done (1 command done):
 878   exec exit 15
 879No commands remaining.
 880You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
 881  (use "git commit --amend" to amend the current commit)
 882  (use "git rebase --continue" once you are satisfied with your changes)
 883
 884nothing to commit (use -u to show untracked files)
 885EOF
 886        git status --untracked-files=no >actual &&
 887        test_i18ncmp expected actual
 888'
 889
 890test_expect_success 'status: two commands done with some white lines in done file' '
 891        FAKE_LINES="1 > exec_exit_15  2 3" &&
 892        export FAKE_LINES &&
 893        test_when_finished "git rebase --abort" &&
 894        ONTO=$(git rev-parse --short HEAD~3) &&
 895        COMMIT4=$(git rev-parse --short HEAD) &&
 896        COMMIT3=$(git rev-parse --short HEAD^) &&
 897        COMMIT2=$(git rev-parse --short HEAD^^) &&
 898        test_must_fail git rebase -i HEAD~3 &&
 899        cat >expected <<EOF &&
 900interactive rebase in progress; onto $ONTO
 901Last commands done (2 commands done):
 902   pick $COMMIT2 two_commit
 903   exec exit 15
 904Next commands to do (2 remaining commands):
 905   pick $COMMIT3 three_commit
 906   pick $COMMIT4 four_commit
 907  (use "git rebase --edit-todo" to view and edit)
 908You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
 909  (use "git commit --amend" to amend the current commit)
 910  (use "git rebase --continue" once you are satisfied with your changes)
 911
 912nothing to commit (use -u to show untracked files)
 913EOF
 914        git status --untracked-files=no >actual &&
 915        test_i18ncmp expected actual
 916'
 917
 918test_expect_success 'status: two remaining commands with some white lines in todo file' '
 919        FAKE_LINES="1 2 exec_exit_15 3 > 4" &&
 920        export FAKE_LINES &&
 921        test_when_finished "git rebase --abort" &&
 922        ONTO=$(git rev-parse --short HEAD~4) &&
 923        COMMIT4=$(git rev-parse --short HEAD) &&
 924        COMMIT3=$(git rev-parse --short HEAD^) &&
 925        COMMIT2=$(git rev-parse --short HEAD^^) &&
 926        test_must_fail git rebase -i HEAD~4 &&
 927        cat >expected <<EOF &&
 928interactive rebase in progress; onto $ONTO
 929Last commands done (3 commands done):
 930   pick $COMMIT2 two_commit
 931   exec exit 15
 932  (see more in file .git/rebase-merge/done)
 933Next commands to do (2 remaining commands):
 934   pick $COMMIT3 three_commit
 935   pick $COMMIT4 four_commit
 936  (use "git rebase --edit-todo" to view and edit)
 937You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
 938  (use "git commit --amend" to amend the current commit)
 939  (use "git rebase --continue" once you are satisfied with your changes)
 940
 941nothing to commit (use -u to show untracked files)
 942EOF
 943        git status --untracked-files=no >actual &&
 944        test_i18ncmp expected actual
 945'
 946
 947test_expect_success 'status: handle not-yet-started rebase -i gracefully' '
 948        ONTO=$(git rev-parse --short HEAD^) &&
 949        COMMIT=$(git rev-parse --short HEAD) &&
 950        EDITOR="git status --untracked-files=no >actual" git rebase -i HEAD^ &&
 951        cat >expected <<EOF &&
 952On branch several_commits
 953No commands done.
 954Next command to do (1 remaining command):
 955   pick $COMMIT four_commit
 956  (use "git rebase --edit-todo" to view and edit)
 957You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
 958  (use "git commit --amend" to amend the current commit)
 959  (use "git rebase --continue" once you are satisfied with your changes)
 960
 961nothing to commit (use -u to show untracked files)
 962EOF
 963        test_i18ncmp expected actual
 964'
 965
 966test_done