t / t3701-add-interactive.shon commit Merge branch 'rs/urlmatch-cleanup' (536c1ec)
   1#!/bin/sh
   2
   3test_description='add -i basic tests'
   4. ./test-lib.sh
   5
   6if ! test_have_prereq PERL
   7then
   8        skip_all='skipping add -i tests, perl not available'
   9        test_done
  10fi
  11
  12test_expect_success 'setup (initial)' '
  13        echo content >file &&
  14        git add file &&
  15        echo more >>file &&
  16        echo lines >>file
  17'
  18test_expect_success 'status works (initial)' '
  19        git add -i </dev/null >output &&
  20        grep "+1/-0 *+2/-0 file" output
  21'
  22
  23test_expect_success 'setup expected' '
  24cat >expected <<EOF
  25new file mode 100644
  26index 0000000..d95f3ad
  27--- /dev/null
  28+++ b/file
  29@@ -0,0 +1 @@
  30+content
  31EOF
  32'
  33
  34test_expect_success 'diff works (initial)' '
  35        (echo d; echo 1) | git add -i >output &&
  36        sed -ne "/new file/,/content/p" <output >diff &&
  37        test_cmp expected diff
  38'
  39test_expect_success 'revert works (initial)' '
  40        git add file &&
  41        (echo r; echo 1) | git add -i &&
  42        git ls-files >output &&
  43        ! grep . output
  44'
  45
  46test_expect_success 'setup (commit)' '
  47        echo baseline >file &&
  48        git add file &&
  49        git commit -m commit &&
  50        echo content >>file &&
  51        git add file &&
  52        echo more >>file &&
  53        echo lines >>file
  54'
  55test_expect_success 'status works (commit)' '
  56        git add -i </dev/null >output &&
  57        grep "+1/-0 *+2/-0 file" output
  58'
  59
  60test_expect_success 'setup expected' '
  61cat >expected <<EOF
  62index 180b47c..b6f2c08 100644
  63--- a/file
  64+++ b/file
  65@@ -1 +1,2 @@
  66 baseline
  67+content
  68EOF
  69'
  70
  71test_expect_success 'diff works (commit)' '
  72        (echo d; echo 1) | git add -i >output &&
  73        sed -ne "/^index/,/content/p" <output >diff &&
  74        test_cmp expected diff
  75'
  76test_expect_success 'revert works (commit)' '
  77        git add file &&
  78        (echo r; echo 1) | git add -i &&
  79        git add -i </dev/null >output &&
  80        grep "unchanged *+3/-0 file" output
  81'
  82
  83
  84test_expect_success 'setup expected' '
  85cat >expected <<EOF
  86EOF
  87'
  88
  89test_expect_success 'setup fake editor' '
  90        >fake_editor.sh &&
  91        chmod a+x fake_editor.sh &&
  92        test_set_editor "$(pwd)/fake_editor.sh"
  93'
  94
  95test_expect_success 'dummy edit works' '
  96        (echo e; echo a) | git add -p &&
  97        git diff > diff &&
  98        test_cmp expected diff
  99'
 100
 101test_expect_success 'setup patch' '
 102cat >patch <<EOF
 103@@ -1,1 +1,4 @@
 104 this
 105+patch
 106-does not
 107 apply
 108EOF
 109'
 110
 111test_expect_success 'setup fake editor' '
 112        echo "#!$SHELL_PATH" >fake_editor.sh &&
 113        cat >>fake_editor.sh <<\EOF &&
 114mv -f "$1" oldpatch &&
 115mv -f patch "$1"
 116EOF
 117        chmod a+x fake_editor.sh &&
 118        test_set_editor "$(pwd)/fake_editor.sh"
 119'
 120
 121test_expect_success 'bad edit rejected' '
 122        git reset &&
 123        (echo e; echo n; echo d) | git add -p >output &&
 124        grep "hunk does not apply" output
 125'
 126
 127test_expect_success 'setup patch' '
 128cat >patch <<EOF
 129this patch
 130is garbage
 131EOF
 132'
 133
 134test_expect_success 'garbage edit rejected' '
 135        git reset &&
 136        (echo e; echo n; echo d) | git add -p >output &&
 137        grep "hunk does not apply" output
 138'
 139
 140test_expect_success 'setup patch' '
 141cat >patch <<EOF
 142@@ -1,0 +1,0 @@
 143 baseline
 144+content
 145+newcontent
 146+lines
 147EOF
 148'
 149
 150test_expect_success 'setup expected' '
 151cat >expected <<EOF
 152diff --git a/file b/file
 153index b5dd6c9..f910ae9 100644
 154--- a/file
 155+++ b/file
 156@@ -1,4 +1,4 @@
 157 baseline
 158 content
 159-newcontent
 160+more
 161 lines
 162EOF
 163'
 164
 165test_expect_success 'real edit works' '
 166        (echo e; echo n; echo d) | git add -p &&
 167        git diff >output &&
 168        test_cmp expected output
 169'
 170
 171test_expect_success 'skip files similarly as commit -a' '
 172        git reset &&
 173        echo file >.gitignore &&
 174        echo changed >file &&
 175        echo y | git add -p file &&
 176        git diff >output &&
 177        git reset &&
 178        git commit -am commit &&
 179        git diff >expected &&
 180        test_cmp expected output &&
 181        git reset --hard HEAD^
 182'
 183rm -f .gitignore
 184
 185test_expect_success FILEMODE 'patch does not affect mode' '
 186        git reset --hard &&
 187        echo content >>file &&
 188        chmod +x file &&
 189        printf "n\\ny\\n" | git add -p &&
 190        git show :file | grep content &&
 191        git diff file | grep "new mode"
 192'
 193
 194test_expect_success FILEMODE 'stage mode but not hunk' '
 195        git reset --hard &&
 196        echo content >>file &&
 197        chmod +x file &&
 198        printf "y\\nn\\n" | git add -p &&
 199        git diff --cached file | grep "new mode" &&
 200        git diff          file | grep "+content"
 201'
 202
 203
 204test_expect_success FILEMODE 'stage mode and hunk' '
 205        git reset --hard &&
 206        echo content >>file &&
 207        chmod +x file &&
 208        printf "y\\ny\\n" | git add -p &&
 209        git diff --cached file | grep "new mode" &&
 210        git diff --cached file | grep "+content" &&
 211        test -z "$(git diff file)"
 212'
 213
 214# end of tests disabled when filemode is not usable
 215
 216test_expect_success 'setup again' '
 217        git reset --hard &&
 218        test_chmod +x file &&
 219        echo content >>file
 220'
 221
 222# Write the patch file with a new line at the top and bottom
 223test_expect_success 'setup patch' '
 224cat >patch <<EOF
 225index 180b47c..b6f2c08 100644
 226--- a/file
 227+++ b/file
 228@@ -1,2 +1,4 @@
 229+firstline
 230 baseline
 231 content
 232+lastline
 233EOF
 234'
 235
 236# Expected output, similar to the patch but w/ diff at the top
 237test_expect_success 'setup expected' '
 238cat >expected <<EOF
 239diff --git a/file b/file
 240index b6f2c08..61b9053 100755
 241--- a/file
 242+++ b/file
 243@@ -1,2 +1,4 @@
 244+firstline
 245 baseline
 246 content
 247+lastline
 248EOF
 249'
 250
 251# Test splitting the first patch, then adding both
 252test_expect_success 'add first line works' '
 253        git commit -am "clear local changes" &&
 254        git apply patch &&
 255        (echo s; echo y; echo y) | git add -p file &&
 256        git diff --cached > diff &&
 257        test_cmp expected diff
 258'
 259
 260test_expect_success 'setup expected' '
 261cat >expected <<EOF
 262diff --git a/non-empty b/non-empty
 263deleted file mode 100644
 264index d95f3ad..0000000
 265--- a/non-empty
 266+++ /dev/null
 267@@ -1 +0,0 @@
 268-content
 269EOF
 270'
 271
 272test_expect_success 'deleting a non-empty file' '
 273        git reset --hard &&
 274        echo content >non-empty &&
 275        git add non-empty &&
 276        git commit -m non-empty &&
 277        rm non-empty &&
 278        echo y | git add -p non-empty &&
 279        git diff --cached >diff &&
 280        test_cmp expected diff
 281'
 282
 283test_expect_success 'setup expected' '
 284cat >expected <<EOF
 285diff --git a/empty b/empty
 286deleted file mode 100644
 287index e69de29..0000000
 288EOF
 289'
 290
 291test_expect_success 'deleting an empty file' '
 292        git reset --hard &&
 293        > empty &&
 294        git add empty &&
 295        git commit -m empty &&
 296        rm empty &&
 297        echo y | git add -p empty &&
 298        git diff --cached >diff &&
 299        test_cmp expected diff
 300'
 301
 302test_expect_success 'split hunk setup' '
 303        git reset --hard &&
 304        for i in 10 20 30 40 50 60
 305        do
 306                echo $i
 307        done >test &&
 308        git add test &&
 309        test_tick &&
 310        git commit -m test &&
 311
 312        for i in 10 15 20 21 22 23 24 30 40 50 60
 313        do
 314                echo $i
 315        done >test
 316'
 317
 318test_expect_success 'split hunk "add -p (edit)"' '
 319        # Split, say Edit and do nothing.  Then:
 320        #
 321        # 1. Broken version results in a patch that does not apply and
 322        # only takes [y/n] (edit again) so the first q is discarded
 323        # and then n attempts to discard the edit. Repeat q enough
 324        # times to get out.
 325        #
 326        # 2. Correct version applies the (not)edited version, and asks
 327        #    about the next hunk, against which we say q and program
 328        #    exits.
 329        printf "%s\n" s e     q n q q |
 330        EDITOR=: git add -p &&
 331        git diff >actual &&
 332        ! grep "^+15" actual
 333'
 334
 335test_expect_failure 'split hunk "add -p (no, yes, edit)"' '
 336        cat >test <<-\EOF &&
 337        5
 338        10
 339        20
 340        21
 341        30
 342        31
 343        40
 344        50
 345        60
 346        EOF
 347        git reset &&
 348        # test sequence is s(plit), n(o), y(es), e(dit)
 349        # q n q q is there to make sure we exit at the end.
 350        printf "%s\n" s n y e   q n q q |
 351        EDITOR=: git add -p 2>error &&
 352        test_must_be_empty error &&
 353        git diff >actual &&
 354        ! grep "^+31" actual
 355'
 356
 357test_expect_success 'patch mode ignores unmerged entries' '
 358        git reset --hard &&
 359        test_commit conflict &&
 360        test_commit non-conflict &&
 361        git checkout -b side &&
 362        test_commit side conflict.t &&
 363        git checkout master &&
 364        test_commit master conflict.t &&
 365        test_must_fail git merge side &&
 366        echo changed >non-conflict.t &&
 367        echo y | git add -p >output &&
 368        ! grep a/conflict.t output &&
 369        cat >expected <<-\EOF &&
 370        * Unmerged path conflict.t
 371        diff --git a/non-conflict.t b/non-conflict.t
 372        index f766221..5ea2ed4 100644
 373        --- a/non-conflict.t
 374        +++ b/non-conflict.t
 375        @@ -1 +1 @@
 376        -non-conflict
 377        +changed
 378        EOF
 379        git diff --cached >diff &&
 380        test_cmp expected diff
 381'
 382
 383test_expect_success 'diffs can be colorized' '
 384        git reset --hard &&
 385
 386        # force color even though the test script has no terminal
 387        test_config color.ui always &&
 388
 389        echo content >test &&
 390        printf y | git add -p >output 2>&1 &&
 391
 392        # We do not want to depend on the exact coloring scheme
 393        # git uses for diffs, so just check that we saw some kind of color.
 394        grep "$(printf "\\033")" output
 395'
 396
 397test_expect_success 'patch-mode via -i prompts for files' '
 398        git reset --hard &&
 399
 400        echo one >file &&
 401        echo two >test &&
 402        git add -i <<-\EOF &&
 403        patch
 404        test
 405
 406        y
 407        quit
 408        EOF
 409
 410        echo test >expect &&
 411        git diff --cached --name-only >actual &&
 412        test_cmp expect actual
 413'
 414
 415test_expect_success 'add -p handles globs' '
 416        git reset --hard &&
 417
 418        mkdir -p subdir &&
 419        echo base >one.c &&
 420        echo base >subdir/two.c &&
 421        git add "*.c" &&
 422        git commit -m base &&
 423
 424        echo change >one.c &&
 425        echo change >subdir/two.c &&
 426        git add -p "*.c" <<-\EOF &&
 427        y
 428        y
 429        EOF
 430
 431        cat >expect <<-\EOF &&
 432        one.c
 433        subdir/two.c
 434        EOF
 435        git diff --cached --name-only >actual &&
 436        test_cmp expect actual
 437'
 438
 439test_expect_success 'add -p handles relative paths' '
 440        git reset --hard &&
 441
 442        echo base >relpath.c &&
 443        git add "*.c" &&
 444        git commit -m relpath &&
 445
 446        echo change >relpath.c &&
 447        mkdir -p subdir &&
 448        git -C subdir add -p .. 2>error <<-\EOF &&
 449        y
 450        EOF
 451
 452        test_must_be_empty error &&
 453
 454        cat >expect <<-\EOF &&
 455        relpath.c
 456        EOF
 457        git diff --cached --name-only >actual &&
 458        test_cmp expect actual
 459'
 460
 461test_expect_success 'add -p does not expand argument lists' '
 462        git reset --hard &&
 463
 464        echo content >not-changed &&
 465        git add not-changed &&
 466        git commit -m "add not-changed file" &&
 467
 468        echo change >file &&
 469        GIT_TRACE=$(pwd)/trace.out git add -p . <<-\EOF &&
 470        y
 471        EOF
 472
 473        # we know that "file" must be mentioned since we actually
 474        # update it, but we want to be sure that our "." pathspec
 475        # was not expanded into the argument list of any command.
 476        # So look only for "not-changed".
 477        ! grep not-changed trace.out
 478'
 479
 480test_expect_success 'hunk-editing handles custom comment char' '
 481        git reset --hard &&
 482        echo change >>file &&
 483        test_config core.commentChar "\$" &&
 484        echo e | GIT_EDITOR=true git add -p &&
 485        git diff --exit-code
 486'
 487
 488test_done