t / t3701-add-interactive.shon commit ref_transaction_commit(): fix atomicity and avoid fd exhaustion (cf018ee)
   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        for a in s e     q n q q
 330        do
 331                echo $a
 332        done |
 333        EDITOR=: git add -p &&
 334        git diff >actual &&
 335        ! grep "^+15" actual
 336'
 337
 338test_expect_success 'patch mode ignores unmerged entries' '
 339        git reset --hard &&
 340        test_commit conflict &&
 341        test_commit non-conflict &&
 342        git checkout -b side &&
 343        test_commit side conflict.t &&
 344        git checkout master &&
 345        test_commit master conflict.t &&
 346        test_must_fail git merge side &&
 347        echo changed >non-conflict.t &&
 348        echo y | git add -p >output &&
 349        ! grep a/conflict.t output &&
 350        cat >expected <<-\EOF &&
 351        * Unmerged path conflict.t
 352        diff --git a/non-conflict.t b/non-conflict.t
 353        index f766221..5ea2ed4 100644
 354        --- a/non-conflict.t
 355        +++ b/non-conflict.t
 356        @@ -1 +1 @@
 357        -non-conflict
 358        +changed
 359        EOF
 360        git diff --cached >diff &&
 361        test_cmp expected diff
 362'
 363
 364test_done