Browse Source

stash: avoid recursive hard reset on submodules

git stash push does not recursively stash submodules, but if
submodule.recurse is set, it may recursively reset --hard them. Having
only the destructive action recurse is likely to be surprising
behaviour, and unlikely to be desirable, so the easiest fix should be to
ensure that the call to git reset --hard never recurses into submodules.

This matches the behavior of check_changes_tracked_files, which ignores
submodules.

Signed-off-by: Jakob Jarmar <jakob@jarmar.se>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jakob Jarmar 5 years ago committed by Junio C Hamano
parent
commit
556895d0c8
  1. 2
      builtin/stash.c
  2. 2
      git-legacy-stash.sh
  3. 42
      t/t3906-stash-submodule.sh

2
builtin/stash.c

@ -1383,7 +1383,7 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q @@ -1383,7 +1383,7 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
struct child_process cp = CHILD_PROCESS_INIT;
cp.git_cmd = 1;
argv_array_pushl(&cp.args, "reset", "--hard", "-q",
NULL);
"--no-recurse-submodules", NULL);
if (run_command(&cp)) {
ret = -1;
goto done;

2
git-legacy-stash.sh

@ -370,7 +370,7 @@ push_stash () { @@ -370,7 +370,7 @@ push_stash () {
git diff-index -p --cached --binary HEAD -- "$@" |
git apply --index -R
else
git reset --hard -q
git reset --hard -q --no-recurse-submodules
fi

if test "$keep_index" = "t" && test -n "$i_tree"

42
t/t3906-stash-submodule.sh

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
#!/bin/sh

test_description='stash apply can handle submodules'
test_description='stash can handle submodules'

. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-submodule-update.sh
@ -21,4 +21,44 @@ KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1 @@ -21,4 +21,44 @@ KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1
KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
test_submodule_switch "git_stash"

setup_basic () {
test_when_finished "rm -rf main sub" &&
git init sub &&
(
cd sub &&
test_commit sub_file
) &&
git init main &&
(
cd main &&
git submodule add ../sub &&
test_commit main_file
)
}

test_expect_success 'stash push with submodule.recurse=true preserves dirty submodule worktree' '
setup_basic &&
(
cd main &&
git config submodule.recurse true &&
echo "x" >main_file.t &&
echo "y" >sub/sub_file.t &&
git stash push &&
test_must_fail git -C sub diff --quiet
)
'

test_expect_success 'stash push and pop with submodule.recurse=true preserves dirty submodule worktree' '
setup_basic &&
(
cd main &&
git config submodule.recurse true &&
echo "x" >main_file.t &&
echo "y" >sub/sub_file.t &&
git stash push &&
git stash pop &&
test_must_fail git -C sub diff --quiet
)
'

test_done

Loading…
Cancel
Save