t / t3904-stash-patch.shon commit Merge branch 'jc/merge-refuse-new-root' (d04aa7e)
   1#!/bin/sh
   2
   3test_description='stash -p'
   4. ./lib-patch-mode.sh
   5
   6if ! test_have_prereq PERL
   7then
   8        skip_all='skipping stash -p tests, perl not available'
   9        test_done
  10fi
  11
  12test_expect_success 'setup' '
  13        mkdir dir &&
  14        echo parent > dir/foo &&
  15        echo dummy > bar &&
  16        echo committed > HEAD &&
  17        git add bar dir/foo HEAD &&
  18        git commit -m initial &&
  19        test_tick &&
  20        test_commit second dir/foo head &&
  21        echo index > dir/foo &&
  22        git add dir/foo &&
  23        set_and_save_state bar bar_work bar_index &&
  24        save_head
  25'
  26
  27# note: order of files with unstaged changes: HEAD bar dir/foo
  28
  29test_expect_success 'saying "n" does nothing' '
  30        set_state HEAD HEADfile_work HEADfile_index &&
  31        set_state dir/foo work index &&
  32        (echo n; echo n; echo n) | test_must_fail git stash save -p &&
  33        verify_state HEAD HEADfile_work HEADfile_index &&
  34        verify_saved_state bar &&
  35        verify_state dir/foo work index
  36'
  37
  38test_expect_success 'git stash -p' '
  39        (echo y; echo n; echo y) | git stash save -p &&
  40        verify_state HEAD committed HEADfile_index &&
  41        verify_saved_state bar &&
  42        verify_state dir/foo head index &&
  43        git reset --hard &&
  44        git stash apply &&
  45        verify_state HEAD HEADfile_work committed &&
  46        verify_state bar dummy dummy &&
  47        verify_state dir/foo work head
  48'
  49
  50test_expect_success 'git stash -p --no-keep-index' '
  51        set_state HEAD HEADfile_work HEADfile_index &&
  52        set_state bar bar_work bar_index &&
  53        set_state dir/foo work index &&
  54        (echo y; echo n; echo y) | git stash save -p --no-keep-index &&
  55        verify_state HEAD committed committed &&
  56        verify_state bar bar_work dummy &&
  57        verify_state dir/foo head head &&
  58        git reset --hard &&
  59        git stash apply --index &&
  60        verify_state HEAD HEADfile_work HEADfile_index &&
  61        verify_state bar dummy bar_index &&
  62        verify_state dir/foo work index
  63'
  64
  65test_expect_success 'git stash --no-keep-index -p' '
  66        set_state HEAD HEADfile_work HEADfile_index &&
  67        set_state bar bar_work bar_index &&
  68        set_state dir/foo work index &&
  69        (echo y; echo n; echo y) | git stash save --no-keep-index -p &&
  70        verify_state HEAD committed committed &&
  71        verify_state dir/foo head head &&
  72        verify_state bar bar_work dummy &&
  73        git reset --hard &&
  74        git stash apply --index &&
  75        verify_state HEAD HEADfile_work HEADfile_index &&
  76        verify_state bar dummy bar_index &&
  77        verify_state dir/foo work index
  78'
  79
  80test_expect_success 'none of this moved HEAD' '
  81        verify_saved_head
  82'
  83
  84test_expect_failure 'stash -p with split hunk' '
  85        git reset --hard &&
  86        cat >test <<-\EOF &&
  87        aaa
  88        bbb
  89        ccc
  90        EOF
  91        git add test &&
  92        git commit -m "initial" &&
  93        cat >test <<-\EOF &&
  94        aaa
  95        added line 1
  96        bbb
  97        added line 2
  98        ccc
  99        EOF
 100        printf "%s\n" s n y q |
 101        test_might_fail git stash -p 2>error &&
 102        ! test_must_be_empty error &&
 103        grep "added line 1" test &&
 104        ! grep "added line 2" test
 105'
 106
 107test_done