Merge branch 'jk/stash-require-clean-index' into maint

"git stash pop/apply" forgot to make sure that not just the working
tree is clean but also the index is clean. The latter is important
as a stash application can conflict and the index will be used for
conflict resolution.

* jk/stash-require-clean-index:
  stash: require a clean index to apply
  t3903: avoid applying onto dirty index
  t3903: stop hard-coding commit sha1s
This commit is contained in:
Junio C Hamano 2015-05-26 13:49:19 -07:00
commit cb9ec8e23e
2 changed files with 16 additions and 7 deletions

View file

@ -442,6 +442,8 @@ apply_stash () {
assert_stash_like "$@" assert_stash_like "$@"
git update-index -q --refresh || die "$(gettext "unable to refresh index")" git update-index -q --refresh || die "$(gettext "unable to refresh index")"
git diff-index --cached --quiet --ignore-submodules HEAD -- ||
die "$(gettext "Cannot apply stash: Your index contains uncommitted changes.")"
# current index state # current index state
c_tree=$(git write-tree) || c_tree=$(git write-tree) ||

View file

@ -10,6 +10,8 @@ test_description='Test git stash'
test_expect_success 'stash some dirty working directory' ' test_expect_success 'stash some dirty working directory' '
echo 1 > file && echo 1 > file &&
git add file && git add file &&
echo unrelated >other-file &&
git add other-file &&
test_tick && test_tick &&
git commit -m initial && git commit -m initial &&
echo 2 > file && echo 2 > file &&
@ -43,10 +45,15 @@ test_expect_success 'applying bogus stash does nothing' '
test_cmp expect file test_cmp expect file
' '
test_expect_success 'apply requires a clean index' '
test_when_finished "git reset --hard" &&
echo changed >other-file &&
git add other-file &&
test_must_fail git stash apply
'
test_expect_success 'apply does not need clean working directory' ' test_expect_success 'apply does not need clean working directory' '
echo 4 >other-file && echo 4 >other-file &&
git add other-file &&
echo 5 >other-file &&
git stash apply && git stash apply &&
echo 3 >expect && echo 3 >expect &&
test_cmp expect file test_cmp expect file
@ -695,8 +702,8 @@ test_expect_success 'setup stash with index and worktree changes' '
' '
test_expect_success 'stash list implies --first-parent -m' ' test_expect_success 'stash list implies --first-parent -m' '
cat >expect <<-\EOF && cat >expect <<-EOF &&
stash@{0}: WIP on master: b27a2bc subdir stash@{0}
diff --git a/file b/file diff --git a/file b/file
index 257cc56..d26b33d 100644 index 257cc56..d26b33d 100644
@ -706,13 +713,13 @@ test_expect_success 'stash list implies --first-parent -m' '
-foo -foo
+working +working
EOF EOF
git stash list -p >actual && git stash list --format=%gd -p >actual &&
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'stash list --cc shows combined diff' ' test_expect_success 'stash list --cc shows combined diff' '
cat >expect <<-\EOF && cat >expect <<-\EOF &&
stash@{0}: WIP on master: b27a2bc subdir stash@{0}
diff --cc file diff --cc file
index 257cc56,9015a7a..d26b33d index 257cc56,9015a7a..d26b33d
@ -723,7 +730,7 @@ test_expect_success 'stash list --cc shows combined diff' '
-index -index
++working ++working
EOF EOF
git stash list -p --cc >actual && git stash list --format=%gd -p --cc >actual &&
test_cmp expect actual test_cmp expect actual
' '