t / t7512-status-help.shon commit apply: diagnose incomplete submodule object name better (e28efb1)
   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 advices'
   9
  10. ./test-lib.sh
  11
  12. "$TEST_DIRECTORY"/lib-rebase.sh
  13
  14set_fake_editor
  15
  16test_expect_success 'prepare for conflicts' '
  17        test_commit init main.txt init &&
  18        git branch conflicts &&
  19        test_commit on_master main.txt on_master &&
  20        git checkout conflicts &&
  21        test_commit on_conflicts main.txt on_conflicts
  22'
  23
  24
  25test_expect_success 'status when conflicts unresolved' '
  26        test_must_fail git merge master &&
  27        cat >expected <<-\EOF &&
  28        # On branch conflicts
  29        # You have unmerged paths.
  30        #   (fix conflicts and run "git commit")
  31        #
  32        # Unmerged paths:
  33        #   (use "git add <file>..." to mark resolution)
  34        #
  35        #       both modified:      main.txt
  36        #
  37        no changes added to commit (use "git add" and/or "git commit -a")
  38        EOF
  39        git status --untracked-files=no >actual &&
  40        test_i18ncmp expected actual
  41'
  42
  43
  44test_expect_success 'status when conflicts resolved before commit' '
  45        git reset --hard conflicts &&
  46        test_must_fail git merge master &&
  47        echo one >main.txt &&
  48        git add main.txt &&
  49        cat >expected <<-\EOF &&
  50        # On branch conflicts
  51        # All conflicts fixed but you are still merging.
  52        #   (use "git commit" to conclude merge)
  53        #
  54        # Changes to be committed:
  55        #
  56        #       modified:   main.txt
  57        #
  58        # Untracked files not listed (use -u option to show untracked files)
  59        EOF
  60        git status --untracked-files=no >actual &&
  61        test_i18ncmp expected actual
  62'
  63
  64
  65test_expect_success 'prepare for rebase conflicts' '
  66        git reset --hard master &&
  67        git checkout -b rebase_conflicts &&
  68        test_commit one_rebase main.txt one &&
  69        test_commit two_rebase main.txt two &&
  70        test_commit three_rebase main.txt three
  71'
  72
  73
  74test_expect_success 'status when rebase in progress before resolving conflicts' '
  75        test_when_finished "git rebase --abort" &&
  76        test_must_fail git rebase HEAD^ --onto HEAD^^ &&
  77        cat >expected <<-\EOF &&
  78        # Not currently on any branch.
  79        # You are currently rebasing.
  80        #   (fix conflicts and then run "git rebase --continue")
  81        #   (use "git rebase --skip" to skip this patch)
  82        #   (use "git rebase --abort" to check out the original branch)
  83        #
  84        # Unmerged paths:
  85        #   (use "git reset HEAD <file>..." to unstage)
  86        #   (use "git add <file>..." to mark resolution)
  87        #
  88        #       both modified:      main.txt
  89        #
  90        no changes added to commit (use "git add" and/or "git commit -a")
  91        EOF
  92        git status --untracked-files=no >actual &&
  93        test_i18ncmp expected actual
  94'
  95
  96
  97test_expect_success 'status when rebase in progress before rebase --continue' '
  98        git reset --hard rebase_conflicts &&
  99        test_when_finished "git rebase --abort" &&
 100        test_must_fail git rebase HEAD^ --onto HEAD^^ &&
 101        echo three >main.txt &&
 102        git add main.txt &&
 103        cat >expected <<-\EOF &&
 104        # Not currently on any branch.
 105        # You are currently rebasing.
 106        #   (all conflicts fixed: run "git rebase --continue")
 107        #
 108        # Changes to be committed:
 109        #   (use "git reset HEAD <file>..." to unstage)
 110        #
 111        #       modified:   main.txt
 112        #
 113        # Untracked files not listed (use -u option to show untracked files)
 114        EOF
 115        git status --untracked-files=no >actual &&
 116        test_i18ncmp expected actual
 117'
 118
 119
 120test_expect_success 'prepare for rebase_i_conflicts' '
 121        git reset --hard master &&
 122        git checkout -b rebase_i_conflicts &&
 123        test_commit one_unmerge main.txt one_unmerge &&
 124        git branch rebase_i_conflicts_second &&
 125        test_commit one_master main.txt one_master &&
 126        git checkout rebase_i_conflicts_second &&
 127        test_commit one_second main.txt one_second
 128'
 129
 130
 131test_expect_success 'status during rebase -i when conflicts unresolved' '
 132        test_when_finished "git rebase --abort" &&
 133        test_must_fail git rebase -i rebase_i_conflicts &&
 134        cat >expected <<-\EOF &&
 135        # Not currently on any branch.
 136        # You are currently rebasing.
 137        #   (fix conflicts and then run "git rebase --continue")
 138        #   (use "git rebase --skip" to skip this patch)
 139        #   (use "git rebase --abort" to check out the original branch)
 140        #
 141        # Unmerged paths:
 142        #   (use "git reset HEAD <file>..." to unstage)
 143        #   (use "git add <file>..." to mark resolution)
 144        #
 145        #       both modified:      main.txt
 146        #
 147        no changes added to commit (use "git add" and/or "git commit -a")
 148        EOF
 149        git status --untracked-files=no >actual &&
 150        test_i18ncmp expected actual
 151'
 152
 153
 154test_expect_success 'status during rebase -i after resolving conflicts' '
 155        git reset --hard rebase_i_conflicts_second &&
 156        test_when_finished "git rebase --abort" &&
 157        test_must_fail git rebase -i rebase_i_conflicts &&
 158        git add main.txt &&
 159        cat >expected <<-\EOF &&
 160        # Not currently on any branch.
 161        # You are currently rebasing.
 162        #   (all conflicts fixed: run "git rebase --continue")
 163        #
 164        # Changes to be committed:
 165        #   (use "git reset HEAD <file>..." to unstage)
 166        #
 167        #       modified:   main.txt
 168        #
 169        # Untracked files not listed (use -u option to show untracked files)
 170        EOF
 171        git status --untracked-files=no >actual &&
 172        test_i18ncmp expected actual
 173'
 174
 175
 176test_expect_success 'status when rebasing -i in edit mode' '
 177        git reset --hard master &&
 178        git checkout -b rebase_i_edit &&
 179        test_commit one_rebase_i main.txt one &&
 180        test_commit two_rebase_i main.txt two &&
 181        test_commit three_rebase_i main.txt three &&
 182        FAKE_LINES="1 edit 2" &&
 183        export FAKE_LINES &&
 184        test_when_finished "git rebase --abort" &&
 185        git rebase -i HEAD~2 &&
 186        cat >expected <<-\EOF &&
 187        # Not currently on any branch.
 188        # You are currently editing a commit during a rebase.
 189        #   (use "git commit --amend" to amend the current commit)
 190        #   (use "git rebase --continue" once you are satisfied with your changes)
 191        #
 192        nothing to commit (use -u to show untracked files)
 193        EOF
 194        git status --untracked-files=no >actual &&
 195        test_i18ncmp expected actual
 196'
 197
 198
 199test_expect_success 'status when splitting a commit' '
 200        git reset --hard master &&
 201        git checkout -b split_commit &&
 202        test_commit one_split main.txt one &&
 203        test_commit two_split main.txt two &&
 204        test_commit three_split main.txt three &&
 205        test_commit four_split main.txt four &&
 206        FAKE_LINES="1 edit 2 3" &&
 207        export FAKE_LINES &&
 208        test_when_finished "git rebase --abort" &&
 209        git rebase -i HEAD~3 &&
 210        git reset HEAD^ &&
 211        cat >expected <<-\EOF &&
 212        # Not currently on any branch.
 213        # You are currently splitting a commit during a rebase.
 214        #   (Once your working directory is clean, run "git rebase --continue")
 215        #
 216        # Changes not staged for commit:
 217        #   (use "git add <file>..." to update what will be committed)
 218        #   (use "git checkout -- <file>..." to discard changes in working directory)
 219        #
 220        #       modified:   main.txt
 221        #
 222        no changes added to commit (use "git add" and/or "git commit -a")
 223        EOF
 224        git status --untracked-files=no >actual &&
 225        test_i18ncmp expected actual
 226'
 227
 228
 229test_expect_success 'status after editing the last commit with --amend during a rebase -i' '
 230        git reset --hard master &&
 231        git checkout -b amend_last &&
 232        test_commit one_amend main.txt one &&
 233        test_commit two_amend main.txt two &&
 234        test_commit three_amend main.txt three &&
 235        test_commit four_amend main.txt four &&
 236        FAKE_LINES="1 2 edit 3" &&
 237        export FAKE_LINES &&
 238        test_when_finished "git rebase --abort" &&
 239        git rebase -i HEAD~3 &&
 240        git commit --amend -m "foo" &&
 241        cat >expected <<-\EOF &&
 242        # Not currently on any branch.
 243        # You are currently editing a commit during a rebase.
 244        #   (use "git commit --amend" to amend the current commit)
 245        #   (use "git rebase --continue" once you are satisfied with your changes)
 246        #
 247        nothing to commit (use -u to show untracked files)
 248        EOF
 249        git status --untracked-files=no >actual &&
 250        test_i18ncmp expected actual
 251'
 252
 253
 254test_expect_success 'prepare for several edits' '
 255        git reset --hard master &&
 256        git checkout -b several_edits &&
 257        test_commit one_edits main.txt one &&
 258        test_commit two_edits main.txt two &&
 259        test_commit three_edits main.txt three &&
 260        test_commit four_edits main.txt four
 261'
 262
 263
 264test_expect_success 'status: (continue first edit) second edit' '
 265        FAKE_LINES="edit 1 edit 2 3" &&
 266        export FAKE_LINES &&
 267        test_when_finished "git rebase --abort" &&
 268        git rebase -i HEAD~3 &&
 269        git rebase --continue &&
 270        cat >expected <<-\EOF &&
 271        # Not currently on any branch.
 272        # You are currently editing a commit during a rebase.
 273        #   (use "git commit --amend" to amend the current commit)
 274        #   (use "git rebase --continue" once you are satisfied with your changes)
 275        #
 276        nothing to commit (use -u to show untracked files)
 277        EOF
 278        git status --untracked-files=no >actual &&
 279        test_i18ncmp expected actual
 280'
 281
 282
 283test_expect_success 'status: (continue first edit) second edit and split' '
 284        git reset --hard several_edits &&
 285        FAKE_LINES="edit 1 edit 2 3" &&
 286        export FAKE_LINES &&
 287        test_when_finished "git rebase --abort" &&
 288        git rebase -i HEAD~3 &&
 289        git rebase --continue &&
 290        git reset HEAD^ &&
 291        cat >expected <<-\EOF &&
 292        # Not currently on any branch.
 293        # You are currently splitting a commit during a rebase.
 294        #   (Once your working directory is clean, run "git rebase --continue")
 295        #
 296        # Changes not staged for commit:
 297        #   (use "git add <file>..." to update what will be committed)
 298        #   (use "git checkout -- <file>..." to discard changes in working directory)
 299        #
 300        #       modified:   main.txt
 301        #
 302        no changes added to commit (use "git add" and/or "git commit -a")
 303        EOF
 304        git status --untracked-files=no >actual &&
 305        test_i18ncmp expected actual
 306'
 307
 308
 309test_expect_success 'status: (continue first edit) second edit and amend' '
 310        git reset --hard several_edits &&
 311        FAKE_LINES="edit 1 edit 2 3" &&
 312        export FAKE_LINES &&
 313        test_when_finished "git rebase --abort" &&
 314        git rebase -i HEAD~3 &&
 315        git rebase --continue &&
 316        git commit --amend -m "foo" &&
 317        cat >expected <<-\EOF &&
 318        # Not currently on any branch.
 319        # You are currently editing a commit during a rebase.
 320        #   (use "git commit --amend" to amend the current commit)
 321        #   (use "git rebase --continue" once you are satisfied with your changes)
 322        #
 323        nothing to commit (use -u to show untracked files)
 324        EOF
 325        git status --untracked-files=no >actual &&
 326        test_i18ncmp expected actual
 327'
 328
 329
 330test_expect_success 'status: (amend first edit) second edit' '
 331        git reset --hard several_edits &&
 332        FAKE_LINES="edit 1 edit 2 3" &&
 333        export FAKE_LINES &&
 334        test_when_finished "git rebase --abort" &&
 335        git rebase -i HEAD~3 &&
 336        git commit --amend -m "a" &&
 337        git rebase --continue &&
 338        cat >expected <<-\EOF &&
 339        # Not currently on any branch.
 340        # You are currently editing a commit during a rebase.
 341        #   (use "git commit --amend" to amend the current commit)
 342        #   (use "git rebase --continue" once you are satisfied with your changes)
 343        #
 344        nothing to commit (use -u to show untracked files)
 345        EOF
 346        git status --untracked-files=no >actual &&
 347        test_i18ncmp expected actual
 348'
 349
 350
 351test_expect_success 'status: (amend first edit) second edit and split' '
 352        git reset --hard several_edits &&
 353        FAKE_LINES="edit 1 edit 2 3" &&
 354        export FAKE_LINES &&
 355        test_when_finished "git rebase --abort" &&
 356        git rebase -i HEAD~3 &&
 357        git commit --amend -m "b" &&
 358        git rebase --continue &&
 359        git reset HEAD^ &&
 360        cat >expected <<-\EOF &&
 361        # Not currently on any branch.
 362        # You are currently splitting a commit during a rebase.
 363        #   (Once your working directory is clean, run "git rebase --continue")
 364        #
 365        # Changes not staged for commit:
 366        #   (use "git add <file>..." to update what will be committed)
 367        #   (use "git checkout -- <file>..." to discard changes in working directory)
 368        #
 369        #       modified:   main.txt
 370        #
 371        no changes added to commit (use "git add" and/or "git commit -a")
 372        EOF
 373        git status --untracked-files=no >actual &&
 374        test_i18ncmp expected actual
 375'
 376
 377
 378test_expect_success 'status: (amend first edit) second edit and amend' '
 379        git reset --hard several_edits &&
 380        FAKE_LINES="edit 1 edit 2 3" &&
 381        export FAKE_LINES &&
 382        test_when_finished "git rebase --abort" &&
 383        git rebase -i HEAD~3 &&
 384        git commit --amend -m "c" &&
 385        git rebase --continue &&
 386        git commit --amend -m "d" &&
 387        cat >expected <<-\EOF &&
 388        # Not currently on any branch.
 389        # You are currently editing a commit during a rebase.
 390        #   (use "git commit --amend" to amend the current commit)
 391        #   (use "git rebase --continue" once you are satisfied with your changes)
 392        #
 393        nothing to commit (use -u to show untracked files)
 394        EOF
 395        git status --untracked-files=no >actual &&
 396        test_i18ncmp expected actual
 397'
 398
 399
 400test_expect_success 'status: (split first edit) second edit' '
 401        git reset --hard several_edits &&
 402        FAKE_LINES="edit 1 edit 2 3" &&
 403        export FAKE_LINES &&
 404        test_when_finished "git rebase --abort" &&
 405        git rebase -i HEAD~3 &&
 406        git reset HEAD^ &&
 407        git add main.txt &&
 408        git commit -m "e" &&
 409        git rebase --continue &&
 410        cat >expected <<-\EOF &&
 411        # Not currently on any branch.
 412        # You are currently editing a commit during a rebase.
 413        #   (use "git commit --amend" to amend the current commit)
 414        #   (use "git rebase --continue" once you are satisfied with your changes)
 415        #
 416        nothing to commit (use -u to show untracked files)
 417        EOF
 418        git status --untracked-files=no >actual &&
 419        test_i18ncmp expected actual
 420'
 421
 422
 423test_expect_success 'status: (split first edit) second edit and split' '
 424        git reset --hard several_edits &&
 425        FAKE_LINES="edit 1 edit 2 3" &&
 426        export FAKE_LINES &&
 427        test_when_finished "git rebase --abort" &&
 428        git rebase -i HEAD~3 &&
 429        git reset HEAD^ &&
 430        git add main.txt &&
 431        git commit --amend -m "f" &&
 432        git rebase --continue &&
 433        git reset HEAD^ &&
 434        cat >expected <<-\EOF &&
 435        # Not currently on any branch.
 436        # You are currently splitting a commit during a rebase.
 437        #   (Once your working directory is clean, run "git rebase --continue")
 438        #
 439        # Changes not staged for commit:
 440        #   (use "git add <file>..." to update what will be committed)
 441        #   (use "git checkout -- <file>..." to discard changes in working directory)
 442        #
 443        #       modified:   main.txt
 444        #
 445        no changes added to commit (use "git add" and/or "git commit -a")
 446        EOF
 447        git status --untracked-files=no >actual &&
 448        test_i18ncmp expected actual
 449'
 450
 451
 452test_expect_success 'status: (split first edit) second edit and amend' '
 453        git reset --hard several_edits &&
 454        FAKE_LINES="edit 1 edit 2 3" &&
 455        export FAKE_LINES &&
 456        test_when_finished "git rebase --abort" &&
 457        git rebase -i HEAD~3 &&
 458        git reset HEAD^ &&
 459        git add main.txt &&
 460        git commit --amend -m "g" &&
 461        git rebase --continue &&
 462        git commit --amend -m "h" &&
 463        cat >expected <<-\EOF &&
 464        # Not currently on any branch.
 465        # You are currently editing a commit during a rebase.
 466        #   (use "git commit --amend" to amend the current commit)
 467        #   (use "git rebase --continue" once you are satisfied with your changes)
 468        #
 469        nothing to commit (use -u to show untracked files)
 470        EOF
 471        git status --untracked-files=no >actual &&
 472        test_i18ncmp expected actual
 473'
 474
 475
 476test_expect_success 'prepare am_session' '
 477        git reset --hard master &&
 478        git checkout -b am_session &&
 479        test_commit one_am one.txt "one" &&
 480        test_commit two_am two.txt "two" &&
 481        test_commit three_am three.txt "three"
 482'
 483
 484
 485test_expect_success 'status in an am session: file already exists' '
 486        git checkout -b am_already_exists &&
 487        test_when_finished "rm Maildir/* && git am --abort" &&
 488        git format-patch -1 -oMaildir &&
 489        test_must_fail git am Maildir/*.patch &&
 490        cat >expected <<-\EOF &&
 491        # On branch am_already_exists
 492        # You are in the middle of an am session.
 493        #   (fix conflicts and then run "git am --resolved")
 494        #   (use "git am --skip" to skip this patch)
 495        #   (use "git am --abort" to restore the original branch)
 496        #
 497        nothing to commit (use -u to show untracked files)
 498        EOF
 499        git status --untracked-files=no >actual &&
 500        test_i18ncmp expected actual
 501'
 502
 503
 504test_expect_success 'status in an am session: file does not exist' '
 505        git reset --hard am_session &&
 506        git checkout -b am_not_exists &&
 507        git rm three.txt &&
 508        git commit -m "delete three.txt" &&
 509        test_when_finished "rm Maildir/* && git am --abort" &&
 510        git format-patch -1 -oMaildir &&
 511        test_must_fail git am Maildir/*.patch &&
 512        cat >expected <<-\EOF &&
 513        # On branch am_not_exists
 514        # You are in the middle of an am session.
 515        #   (fix conflicts and then run "git am --resolved")
 516        #   (use "git am --skip" to skip this patch)
 517        #   (use "git am --abort" to restore the original branch)
 518        #
 519        nothing to commit (use -u to show untracked files)
 520        EOF
 521        git status --untracked-files=no >actual &&
 522        test_i18ncmp expected actual
 523'
 524
 525
 526test_expect_success 'status in an am session: empty patch' '
 527        git reset --hard am_session &&
 528        git checkout -b am_empty &&
 529        test_when_finished "rm Maildir/* && git am --abort" &&
 530        git format-patch -3 -oMaildir &&
 531        git rm one.txt two.txt three.txt &&
 532        git commit -m "delete all am_empty" &&
 533        echo error >Maildir/0002-two_am.patch &&
 534        test_must_fail git am Maildir/*.patch &&
 535        cat >expected <<-\EOF &&
 536        # On branch am_empty
 537        # You are in the middle of an am session.
 538        # The current patch is empty.
 539        #   (use "git am --skip" to skip this patch)
 540        #   (use "git am --abort" to restore the original branch)
 541        #
 542        nothing to commit (use -u to show untracked files)
 543        EOF
 544        git status --untracked-files=no >actual &&
 545        test_i18ncmp expected actual
 546'
 547
 548
 549test_expect_success 'status when bisecting' '
 550        git reset --hard master &&
 551        git checkout -b bisect &&
 552        test_commit one_bisect main.txt one &&
 553        test_commit two_bisect main.txt two &&
 554        test_commit three_bisect main.txt three &&
 555        test_when_finished "git bisect reset" &&
 556        git bisect start &&
 557        git bisect bad &&
 558        git bisect good one_bisect &&
 559        cat >expected <<-\EOF &&
 560        # Not currently on any branch.
 561        # You are currently bisecting.
 562        #   (use "git bisect reset" to get back to the original branch)
 563        #
 564        nothing to commit (use -u to show untracked files)
 565        EOF
 566        git status --untracked-files=no >actual &&
 567        test_i18ncmp expected actual
 568'
 569
 570
 571test_expect_success 'status when rebase conflicts with statushints disabled' '
 572        git reset --hard master &&
 573        git checkout -b statushints_disabled &&
 574        test_when_finished "git config --local advice.statushints true" &&
 575        git config --local advice.statushints false &&
 576        test_commit one_statushints main.txt one &&
 577        test_commit two_statushints main.txt two &&
 578        test_commit three_statushints main.txt three &&
 579        test_when_finished "git rebase --abort" &&
 580        test_must_fail git rebase HEAD^ --onto HEAD^^ &&
 581        cat >expected <<-\EOF &&
 582        # Not currently on any branch.
 583        # You are currently rebasing.
 584        #
 585        # Unmerged paths:
 586        #       both modified:      main.txt
 587        #
 588        no changes added to commit
 589        EOF
 590        git status --untracked-files=no >actual &&
 591        test_i18ncmp expected actual
 592'
 593
 594
 595test_expect_success 'prepare for cherry-pick conflicts' '
 596        git reset --hard master &&
 597        git checkout -b cherry_branch &&
 598        test_commit one_cherry main.txt one &&
 599        test_commit two_cherries main.txt two &&
 600        git checkout -b cherry_branch_second &&
 601        test_commit second_cherry main.txt second &&
 602        git checkout cherry_branch &&
 603        test_commit three_cherries main.txt three
 604'
 605
 606
 607test_expect_success 'status when cherry-picking before resolving conflicts' '
 608        test_when_finished "git cherry-pick --abort" &&
 609        test_must_fail git cherry-pick cherry_branch_second &&
 610        cat >expected <<-\EOF &&
 611        # On branch cherry_branch
 612        # You are currently cherry-picking.
 613        #   (fix conflicts and run "git commit")
 614        #
 615        # Unmerged paths:
 616        #   (use "git add <file>..." to mark resolution)
 617        #
 618        #       both modified:      main.txt
 619        #
 620        no changes added to commit (use "git add" and/or "git commit -a")
 621        EOF
 622        git status --untracked-files=no >actual &&
 623        test_i18ncmp expected actual
 624'
 625
 626
 627test_expect_success 'status when cherry-picking after resolving conflicts' '
 628        git reset --hard cherry_branch &&
 629        test_when_finished "git cherry-pick --abort" &&
 630        test_must_fail git cherry-pick cherry_branch_second &&
 631        echo end >main.txt &&
 632        git add main.txt &&
 633        cat >expected <<-\EOF &&
 634        # On branch cherry_branch
 635        # You are currently cherry-picking.
 636        #   (all conflicts fixed: run "git commit")
 637        #
 638        # Changes to be committed:
 639        #
 640        #       modified:   main.txt
 641        #
 642        # Untracked files not listed (use -u option to show untracked files)
 643        EOF
 644        git status --untracked-files=no >actual &&
 645        test_i18ncmp expected actual
 646'
 647
 648
 649test_done