1#!/bin/sh 2 3test_description='git checkout --patch' 4 5. ./lib-patch-mode.sh 6 7test_expect_success PERL 'setup'' 8 mkdir dir && 9 echo parent > dir/foo && 10 echo dummy > bar && 11 git add bar dir/foo && 12 git commit -m initial && 13 test_tick && 14 test_commit second dir/foo head && 15 set_and_save_state bar bar_work bar_index && 16 save_head 17' 18 19# note: bar sorts before dir/foo, so the first 'n' is always to skip 'bar' 20 21test_expect_success PERL 'saying "n" does nothing'' 22 set_and_save_state dir/foo work head && 23 (echo n; echo n) | git checkout -p && 24 verify_saved_state bar && 25 verify_saved_state dir/foo 26' 27 28test_expect_success PERL 'git checkout -p'' 29 (echo n; echo y) | git checkout -p && 30 verify_saved_state bar && 31 verify_state dir/foo head head 32' 33 34test_expect_success PERL 'git checkout -p with staged changes'' 35 set_state dir/foo work index 36 (echo n; echo y) | git checkout -p && 37 verify_saved_state bar && 38 verify_state dir/foo index index 39' 40 41test_expect_success PERL 'git checkout -p HEAD with NO staged changes: abort'' 42 set_and_save_state dir/foo work head && 43 (echo n; echo y; echo n) | git checkout -p HEAD && 44 verify_saved_state bar && 45 verify_saved_state dir/foo 46' 47 48test_expect_success PERL 'git checkout -p HEAD with NO staged changes: apply'' 49 (echo n; echo y; echo y) | git checkout -p HEAD && 50 verify_saved_state bar && 51 verify_state dir/foo head head 52' 53 54test_expect_success PERL 'git checkout -p HEAD with change already staged'' 55 set_state dir/foo index index 56 # the third n is to get out in case it mistakenly does not apply 57 (echo n; echo y; echo n) | git checkout -p HEAD && 58 verify_saved_state bar && 59 verify_state dir/foo head head 60' 61 62test_expect_success PERL 'git checkout -p HEAD^'' 63 # the third n is to get out in case it mistakenly does not apply 64 (echo n; echo y; echo n) | git checkout -p HEAD^ && 65 verify_saved_state bar && 66 verify_state dir/foo parent parent 67' 68 69test_expect_success PERL 'git checkout -p handles deletion'' 70 set_state dir/foo work index && 71 rm dir/foo && 72 (echo n; echo y) | git checkout -p && 73 verify_saved_state bar && 74 verify_state dir/foo index index 75' 76 77# The idea in the rest is that bar sorts first, so we always say 'y' 78# first and if the path limiter fails it'll apply to bar instead of 79# dir/foo. There's always an extra 'n' to reject edits to dir/foo in 80# the failure case (and thus get out of the loop). 81 82test_expect_success PERL 'path limiting works: dir'' 83 set_state dir/foo work head && 84 (echo y; echo n) | git checkout -p dir && 85 verify_saved_state bar && 86 verify_state dir/foo head head 87' 88 89test_expect_success PERL 'path limiting works: -- dir'' 90 set_state dir/foo work head && 91 (echo y; echo n) | git checkout -p -- dir && 92 verify_saved_state bar && 93 verify_state dir/foo head head 94' 95 96test_expect_success PERL 'path limiting works: HEAD^ -- dir'' 97 # the third n is to get out in case it mistakenly does not apply 98 (echo y; echo n; echo n) | git checkout -p HEAD^ -- dir && 99 verify_saved_state bar && 100 verify_state dir/foo parent parent 101' 102 103test_expect_success PERL 'path limiting works: foo inside dir'' 104 set_state dir/foo work head && 105 # the third n is to get out in case it mistakenly does not apply 106 (echo y; echo n; echo n) | (cd dir && git checkout -p foo) && 107 verify_saved_state bar && 108 verify_state dir/foo head head 109' 110 111test_expect_success PERL 'none of this moved HEAD'' 112 verify_saved_head 113' 114 115test_done