]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t3701-add-interactive.sh
Merge branch 'js/builtin-add-i-cmds' into maint
[thirdparty/git.git] / t / t3701-add-interactive.sh
index b02fe73631dc9e56827caa7a90e2b38ba4eb7c4c..2182b1c030b81ea45e439510a452d3e74250cae0 100755 (executable)
@@ -23,6 +23,17 @@ diff_cmp () {
        test_cmp "$1.filtered" "$2.filtered"
 }
 
+# This function uses a trick to manipulate the interactive add to use color:
+# the `want_color()` function special-cases the situation where a pager was
+# spawned and Git now wants to output colored text: to detect that situation,
+# the environment variable `GIT_PAGER_IN_USE` is set. However, color is
+# suppressed despite that environment variable if the `TERM` variable
+# indicates a dumb terminal, so we set that variable, too.
+
+force_color () {
+       env GIT_PAGER_IN_USE=true TERM=vt100 "$@"
+}
+
 test_expect_success 'setup (initial)' '
        echo content >file &&
        git add file &&
@@ -103,7 +114,6 @@ test_expect_success 'revert works (commit)' '
        grep "unchanged *+3/-0 file" output
 '
 
-
 test_expect_success 'setup expected' '
        cat >expected <<-\EOF
        EOF
@@ -272,6 +282,35 @@ test_expect_success FILEMODE 'stage mode and hunk' '
 
 # end of tests disabled when filemode is not usable
 
+test_expect_success 'different prompts for mode change/deleted' '
+       git reset --hard &&
+       >file &&
+       >deleted &&
+       git add --chmod=+x file deleted &&
+       echo changed >file &&
+       rm deleted &&
+       test_write_lines n n n |
+       git -c core.filemode=true add -p >actual &&
+       sed -n "s/^\(([0-9/]*) Stage .*?\).*/\1/p" actual >actual.filtered &&
+       cat >expect <<-\EOF &&
+       (1/1) Stage deletion [y,n,q,a,d,?]?
+       (1/2) Stage mode change [y,n,q,a,d,j,J,g,/,?]?
+       (2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]?
+       EOF
+       test_cmp expect actual.filtered
+'
+
+test_expect_success 'correct message when there is nothing to do' '
+       git reset --hard &&
+       git add -p 2>err &&
+       test_i18ngrep "No changes" err &&
+       printf "\\0123" >binary &&
+       git add binary &&
+       printf "\\0abc" >binary &&
+       git add -p 2>err &&
+       test_i18ngrep "Only binary files changed" err
+'
+
 test_expect_success 'setup again' '
        git reset --hard &&
        test_chmod +x file &&
@@ -383,6 +422,36 @@ test_expect_success 'split hunk setup' '
        test_write_lines 10 15 20 21 22 23 24 30 40 50 60 >test
 '
 
+test_expect_success 'goto hunk' '
+       test_when_finished "git reset" &&
+       tr _ " " >expect <<-EOF &&
+       (2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? + 1:  -1,2 +1,3          +15
+       _ 2:  -2,4 +3,8          +21
+       go to which hunk? @@ -1,2 +1,3 @@
+       _10
+       +15
+       _20
+       (1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?_
+       EOF
+       test_write_lines s y g 1 | git add -p >actual &&
+       tail -n 7 <actual >actual.trimmed &&
+       test_cmp expect actual.trimmed
+'
+
+test_expect_success 'navigate to hunk via regex' '
+       test_when_finished "git reset" &&
+       tr _ " " >expect <<-EOF &&
+       (2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? @@ -1,2 +1,3 @@
+       _10
+       +15
+       _20
+       (1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?_
+       EOF
+       test_write_lines s y /1,2 | git add -p >actual &&
+       tail -n 5 <actual >actual.trimmed &&
+       test_cmp expect actual.trimmed
+'
+
 test_expect_success 'split hunk "add -p (edit)"' '
        # Split, say Edit and do nothing.  Then:
        #
@@ -412,6 +481,40 @@ test_expect_failure 'split hunk "add -p (no, yes, edit)"' '
        ! grep "^+31" actual
 '
 
+test_expect_success 'split hunk with incomplete line at end' '
+       git reset --hard &&
+       printf "missing LF" >>test &&
+       git add test &&
+       test_write_lines before 10 20 30 40 50 60 70 >test &&
+       git grep --cached missing &&
+       test_write_lines s n y q | git add -p &&
+       test_must_fail git grep --cached missing &&
+       git grep before &&
+       test_must_fail git grep --cached before
+'
+
+test_expect_failure 'edit, adding lines to the first hunk' '
+       test_write_lines 10 11 20 30 40 50 51 60 >test &&
+       git reset &&
+       tr _ " " >patch <<-EOF &&
+       @@ -1,5 +1,6 @@
+       _10
+       +11
+       +12
+       _20
+       +21
+       +22
+       _30
+       EOF
+       # test sequence is s(plit), e(dit), n(o)
+       # q n q q is there to make sure we exit at the end.
+       printf "%s\n" s e n   q n q q |
+       EDITOR=./fake_editor.sh git add -p 2>error &&
+       test_must_be_empty error &&
+       git diff --cached >actual &&
+       grep "^+22" actual
+'
+
 test_expect_success 'patch mode ignores unmerged entries' '
        git reset --hard &&
        test_commit conflict &&
@@ -438,35 +541,48 @@ test_expect_success 'patch mode ignores unmerged entries' '
        diff_cmp expected diff
 '
 
-test_expect_success TTY 'diffs can be colorized' '
+test_expect_success 'diffs can be colorized' '
        git reset --hard &&
 
        echo content >test &&
-       printf y | test_terminal git add -p >output 2>&1 &&
+       printf y >y &&
+       force_color git add -p >output 2>&1 <y &&
 
        # We do not want to depend on the exact coloring scheme
        # git uses for diffs, so just check that we saw some kind of color.
        grep "$(printf "\\033")" output
 '
 
-test_expect_success TTY 'diffFilter filters diff' '
+test_expect_success 'diffFilter filters diff' '
        git reset --hard &&
 
        echo content >test &&
        test_config interactive.diffFilter "sed s/^/foo:/" &&
-       printf y | test_terminal git add -p >output 2>&1 &&
+       printf y >y &&
+       force_color git add -p >output 2>&1 <y &&
 
        # avoid depending on the exact coloring or content of the prompts,
        # and just make sure we saw our diff prefixed
        grep foo:.*content output
 '
 
-test_expect_success TTY 'detect bogus diffFilter output' '
+test_expect_success 'detect bogus diffFilter output' '
        git reset --hard &&
 
        echo content >test &&
        test_config interactive.diffFilter "echo too-short" &&
-       printf y | test_must_fail test_terminal git add -p
+       printf y >y &&
+       test_must_fail force_color git add -p <y
+'
+
+test_expect_success 'diff.algorithm is passed to `git diff-files`' '
+       git reset --hard &&
+
+       >file &&
+       git add file &&
+       echo changed >file &&
+       test_must_fail git -c diff.algorithm=bogus add -p 2>err &&
+       test_i18ngrep "error: option diff-algorithm accepts " err
 '
 
 test_expect_success 'patch-mode via -i prompts for files' '
@@ -676,7 +792,7 @@ test_expect_success 'show help from add--helper' '
        <BOLD;BLUE>What now<RESET>>$SP
        Bye.
        EOF
-       test_write_lines h | GIT_PAGER_IN_USE=true TERM=vt100 git add -i >actual.colored &&
+       test_write_lines h | force_color git add -i >actual.colored &&
        test_decode_color <actual.colored >actual &&
        test_i18ncmp expect actual
 '