Thanks Junio for more comments on the last round, and Peff for reading through it as well. Changes since v6: - If no --include-untracked option is given to git stash push, and a pathspec is not in the repository, error out instead of ignoring it. This brings it in line with things like checkout, and also allows us to simplify the code internally. - Simplify the code for rolling back the changes from the working tree. This is enabled by the changes to the pathspec handling. - There's no more "xargs -0", so there should be no more portability concerns. - Adjust the tests and improve some of the titles a bit Interdiff: diff --git a/git-stash.sh b/git-stash.sh index 18aba1346f..28d0624c75 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -278,12 +278,15 @@ push_stash () { die "$(gettext "Can't use --patch and --include-untracked or --all at the same time")" fi + test -n "$untracked" || git ls-files --error-unmatch -- "$@" >/dev/null || exit 1 + git update-index -q --refresh if no_changes "$@" then say "$(gettext "No local changes to save")" exit 0 fi + git reflog exists $ref_stash || clear_stash || die "$(gettext "Cannot initialize stash")" @@ -296,23 +299,9 @@ push_stash () { then if test $# != 0 then - saved_untracked= - if test -n "$(git ls-files --others -- "$@")" - then - saved_untracked=$( - git ls-files -z --others -- "$@" | - xargs -0 git stash create -u all --) - fi - git ls-files -z -- "$@" | xargs -0 git reset ${GIT_QUIET:+-q} -- - git ls-files -z --modified -- "$@" | xargs -0 git checkout ${GIT_QUIET:+-q} HEAD -- - if test -n "$(git ls-files -z --others -- "$@")" - then - git ls-files -z --others -- "$@" | xargs -0 git clean --force -d ${GIT_QUIET:+-q} -- - fi - if test -n "$saved_untracked" - then - git stash pop -q $saved_untracked - fi + git reset ${GIT_QUIET:+-q} -- "$@" + git checkout ${GIT_QUIET:+-q} HEAD -- $(git ls-files -z --modified "$@") + git clean --force ${GIT_QUIET:+-q} -d -- "$@" else git reset --hard ${GIT_QUIET:+-q} fi diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index c0ae41e724..f7733b4dd4 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -800,7 +800,7 @@ test_expect_success 'create with multiple arguments for the message' ' test_cmp expect actual ' -test_expect_success 'stash -- <filename> stashes and restores the file' ' +test_expect_success 'stash -- <pathspec> stashes and restores the file' ' >foo && >bar && git add foo bar && @@ -812,7 +812,7 @@ test_expect_success 'stash -- <filename> stashes and restores the file' ' test_path_is_file bar ' -test_expect_success 'stash with multiple filename arguments' ' +test_expect_success 'stash with multiple pathspec arguments' ' >foo && >bar && >extra && @@ -842,25 +842,29 @@ test_expect_success 'stash with file including $IFS character' ' test_path_is_file bar ' -test_expect_success 'stash push -p with pathspec shows no changes only onece' ' - >file && - git add file && - git stash push -p not-file >actual && +test_expect_success 'stash push -p with pathspec shows no changes only once' ' + >foo && + git add foo && + git commit -m "tmp" && + git stash push -p foo >actual && echo "No local changes to save" >expect && + git reset --hard HEAD~ && test_cmp expect actual ' test_expect_success 'stash push with pathspec shows no changes when there are none' ' - >file && - git add file && - git stash push not-file >actual && + >foo && + git add foo && + git commit -m "tmp" && + git stash push foo >actual && echo "No local changes to save" >expect && + git reset --hard HEAD~ && test_cmp expect actual ' -test_expect_success 'untracked file is not removed when using pathspecs' ' +test_expect_success 'stash push with pathspec not in the repository errors out' ' >untracked && - git stash push untracked && + test_must_fail git stash push untracked && test_path_is_file untracked ' Thomas Gummerer (6): stash: introduce push verb stash: add test for the create command line arguments stash: refactor stash_create stash: teach 'push' (and 'create_stash') to honor pathspec stash: use stash_push for no verb form stash: allow pathspecs in the no verb form Documentation/git-stash.txt | 25 ++++++-- git-stash.sh | 114 +++++++++++++++++++++++++++------- t/t3903-stash.sh | 122 ++++++++++++++++++++++++++++++++++++- t/t3905-stash-include-untracked.sh | 26 ++++++++ 4 files changed, 257 insertions(+), 30 deletions(-) -- 2.11.0.301.g275aeb250c.dirty