t / t2016-checkout-patch.shon commit init: use strbufs to store paths (9c28390)
   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