t / t3701-add-interactive.shon commit Merge branch 'ak/maint-for-each-ref-no-lookup' into maint (a69f8c9)
   1#!/bin/sh
   2
   3test_description='add -i basic tests'
   4. ./test-lib.sh
   5
   6if ! test_have_prereq PERL; then
   7        say 'skipping git add -i tests, perl not available'
   8        test_done
   9fi
  10
  11test_expect_success 'setup (initial)' '
  12        echo content >file &&
  13        git add file &&
  14        echo more >>file &&
  15        echo lines >>file
  16'
  17test_expect_success 'status works (initial)' '
  18        git add -i </dev/null >output &&
  19        grep "+1/-0 *+2/-0 file" output
  20'
  21cat >expected <<EOF
  22new file mode 100644
  23index 0000000..d95f3ad
  24--- /dev/null
  25+++ b/file
  26@@ -0,0 +1 @@
  27+content
  28EOF
  29test_expect_success 'diff works (initial)' '
  30        (echo d; echo 1) | git add -i >output &&
  31        sed -ne "/new file/,/content/p" <output >diff &&
  32        test_cmp expected diff
  33'
  34test_expect_success 'revert works (initial)' '
  35        git add file &&
  36        (echo r; echo 1) | git add -i &&
  37        git ls-files >output &&
  38        ! grep . output
  39'
  40
  41test_expect_success 'setup (commit)' '
  42        echo baseline >file &&
  43        git add file &&
  44        git commit -m commit &&
  45        echo content >>file &&
  46        git add file &&
  47        echo more >>file &&
  48        echo lines >>file
  49'
  50test_expect_success 'status works (commit)' '
  51        git add -i </dev/null >output &&
  52        grep "+1/-0 *+2/-0 file" output
  53'
  54cat >expected <<EOF
  55index 180b47c..b6f2c08 100644
  56--- a/file
  57+++ b/file
  58@@ -1 +1,2 @@
  59 baseline
  60+content
  61EOF
  62test_expect_success 'diff works (commit)' '
  63        (echo d; echo 1) | git add -i >output &&
  64        sed -ne "/^index/,/content/p" <output >diff &&
  65        test_cmp expected diff
  66'
  67test_expect_success 'revert works (commit)' '
  68        git add file &&
  69        (echo r; echo 1) | git add -i &&
  70        git add -i </dev/null >output &&
  71        grep "unchanged *+3/-0 file" output
  72'
  73
  74cat >expected <<EOF
  75EOF
  76cat >fake_editor.sh <<EOF
  77EOF
  78chmod a+x fake_editor.sh
  79test_set_editor "$(pwd)/fake_editor.sh"
  80test_expect_success 'dummy edit works' '
  81        (echo e; echo a) | git add -p &&
  82        git diff > diff &&
  83        test_cmp expected diff
  84'
  85
  86cat >patch <<EOF
  87@@ -1,1 +1,4 @@
  88 this
  89+patch
  90-doesn't
  91 apply
  92EOF
  93echo "#!$SHELL_PATH" >fake_editor.sh
  94cat >>fake_editor.sh <<\EOF
  95mv -f "$1" oldpatch &&
  96mv -f patch "$1"
  97EOF
  98chmod a+x fake_editor.sh
  99test_set_editor "$(pwd)/fake_editor.sh"
 100test_expect_success 'bad edit rejected' '
 101        git reset &&
 102        (echo e; echo n; echo d) | git add -p >output &&
 103        grep "hunk does not apply" output
 104'
 105
 106cat >patch <<EOF
 107this patch
 108is garbage
 109EOF
 110test_expect_success 'garbage edit rejected' '
 111        git reset &&
 112        (echo e; echo n; echo d) | git add -p >output &&
 113        grep "hunk does not apply" output
 114'
 115
 116cat >patch <<EOF
 117@@ -1,0 +1,0 @@
 118 baseline
 119+content
 120+newcontent
 121+lines
 122EOF
 123cat >expected <<EOF
 124diff --git a/file b/file
 125index b5dd6c9..f910ae9 100644
 126--- a/file
 127+++ b/file
 128@@ -1,4 +1,4 @@
 129 baseline
 130 content
 131-newcontent
 132+more
 133 lines
 134EOF
 135test_expect_success 'real edit works' '
 136        (echo e; echo n; echo d) | git add -p &&
 137        git diff >output &&
 138        test_cmp expected output
 139'
 140
 141if test "$(git config --bool core.filemode)" = false
 142then
 143        say 'skipping filemode tests (filesystem does not properly support modes)'
 144else
 145        test_set_prereq FILEMODE
 146fi
 147
 148test_expect_success FILEMODE 'patch does not affect mode' '
 149        git reset --hard &&
 150        echo content >>file &&
 151        chmod +x file &&
 152        printf "n\\ny\\n" | git add -p &&
 153        git show :file | grep content &&
 154        git diff file | grep "new mode"
 155'
 156
 157test_expect_success FILEMODE 'stage mode but not hunk' '
 158        git reset --hard &&
 159        echo content >>file &&
 160        chmod +x file &&
 161        printf "y\\nn\\n" | git add -p &&
 162        git diff --cached file | grep "new mode" &&
 163        git diff          file | grep "+content"
 164'
 165
 166# end of tests disabled when filemode is not usable
 167
 168test_expect_success 'setup again' '
 169        git reset --hard &&
 170        test_chmod +x file &&
 171        echo content >>file
 172'
 173
 174# Write the patch file with a new line at the top and bottom
 175cat >patch <<EOF
 176index 180b47c..b6f2c08 100644
 177--- a/file
 178+++ b/file
 179@@ -1,2 +1,4 @@
 180+firstline
 181 baseline
 182 content
 183+lastline
 184EOF
 185# Expected output, similar to the patch but w/ diff at the top
 186cat >expected <<EOF
 187diff --git a/file b/file
 188index b6f2c08..61b9053 100755
 189--- a/file
 190+++ b/file
 191@@ -1,2 +1,4 @@
 192+firstline
 193 baseline
 194 content
 195+lastline
 196EOF
 197# Test splitting the first patch, then adding both
 198test_expect_success 'add first line works' '
 199        git commit -am "clear local changes" &&
 200        git apply patch &&
 201        (echo s; echo y; echo y) | git add -p file &&
 202        git diff --cached > diff &&
 203        test_cmp expected diff
 204'
 205
 206test_done