1#!/bin/sh 2 3test_description='git restore --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 19test_expect_success PERL 'restore -p without pathspec is fine'' 20 echo q >cmd && 21 git restore -p <cmd 22' 23 24# note: bar sorts before dir/foo, so the first 'n' is always to skip 'bar' 25 26test_expect_success PERL 'saying "n" does nothing'' 27 set_and_save_state dir/foo work head && 28 test_write_lines n n | git restore -p && 29 verify_saved_state bar && 30 verify_saved_state dir/foo 31' 32 33test_expect_success PERL 'git restore -p'' 34 set_and_save_state dir/foo work head && 35 test_write_lines n y | git restore -p && 36 verify_saved_state bar && 37 verify_state dir/foo head head 38' 39 40test_expect_success PERL 'git restore -p with staged changes'' 41 set_state dir/foo work index && 42 test_write_lines n y | git restore -p && 43 verify_saved_state bar && 44 verify_state dir/foo index index 45' 46 47test_expect_success PERL 'git restore -p --source=HEAD'' 48 set_state dir/foo work index && 49 # the third n is to get out in case it mistakenly does not apply 50 test_write_lines n y n | git restore -p --source=HEAD && 51 verify_saved_state bar && 52 verify_state dir/foo head index 53' 54 55test_expect_success PERL 'git restore -p --source=HEAD^'' 56 set_state dir/foo work index && 57 # the third n is to get out in case it mistakenly does not apply 58 test_write_lines n y n | git restore -p --source=HEAD^ && 59 verify_saved_state bar && 60 verify_state dir/foo parent index 61' 62 63test_expect_success PERL 'git restore -p handles deletion'' 64 set_state dir/foo work index && 65 rm dir/foo && 66 test_write_lines n y | git restore -p && 67 verify_saved_state bar && 68 verify_state dir/foo index index 69' 70 71# The idea in the rest is that bar sorts first, so we always say 'y' 72# first and if the path limiter fails it'll apply to bar instead of 73# dir/foo. There's always an extra 'n' to reject edits to dir/foo in 74# the failure case (and thus get out of the loop). 75 76test_expect_success PERL 'path limiting works: dir'' 77 set_state dir/foo work head && 78 test_write_lines y n | git restore -p dir && 79 verify_saved_state bar && 80 verify_state dir/foo head head 81' 82 83test_expect_success PERL 'path limiting works: -- dir'' 84 set_state dir/foo work head && 85 test_write_lines y n | git restore -p -- dir && 86 verify_saved_state bar && 87 verify_state dir/foo head head 88' 89 90test_expect_success PERL 'path limiting works: HEAD^ -- dir'' 91 set_state dir/foo work head && 92 # the third n is to get out in case it mistakenly does not apply 93 test_write_lines y n n | git restore -p --source=HEAD^ -- dir && 94 verify_saved_state bar && 95 verify_state dir/foo parent head 96' 97 98test_expect_success PERL 'path limiting works: foo inside dir'' 99 set_state dir/foo work head && 100 # the third n is to get out in case it mistakenly does not apply 101 test_write_lines y n n | (cd dir && git restore -p foo) && 102 verify_saved_state bar && 103 verify_state dir/foo head head 104' 105 106test_expect_success PERL 'none of this moved HEAD'' 107 verify_saved_head 108' 109 110test_done