t / t2071-restore-patch.shon commit Merge branch 'js/visual-studio' (c62bc49)
   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