Previous round is at:
http://public-inbox.org/git/[email protected]/.
Thanks Junio, Peff, Øyvind, Jakub and Johannes for your feedback on
the previous round.
Changes since the previous round:
- Re-phrased the Documentation update.
- Added missing $ in 2/3
- Added an extra patch introducing a new syntax for git stash create,
where the message can be specified with the -m flag, instead of as a
positional argument
- Filenames with $IFS in their name are now supported. Added a test
for that as well.
Interdiff below:
diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt
index 871a3b246c..8306bac397 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.txt
@@ -20,6 +20,8 @@ SYNOPSIS
[--] [<paths>...]
'git stash' clear
'git stash' create [<message>]
+'git stash' create [-m <message>] [-u|--include-untracked <untracked|all>]
+ [-- <paths>...]
'git stash' store [-m|--message <message>] [-q|--quiet] <commit>
DESCRIPTION
@@ -51,8 +53,8 @@ OPTIONS
save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all]
[-q|--quiet] [<message>]::
push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all]
[-q|--quiet] [-m|--message <message>] [--] [<paths>...]::
- Save your local modifications to a new 'stash', and revert the
- the changes in the working tree to match the index.
+ Save your local modifications to a new 'stash' and roll them
+ back both in the working tree and in the index.
The <message> part is optional and gives
the description along with the stashed state. For quickly making
a snapshot, you can omit _both_ "save" and <message>, but giving
diff --git a/git-stash.sh b/git-stash.sh
index 7dcce629bd..0072a38b4c 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -56,25 +56,57 @@ clear_stash () {
}
create_stash () {
+ stash_msg=
+ untracked=
+ new_style=
files=
while test $# != 0
do
case "$1" in
+ -m|--message)
+ shift
+ stash_msg="$1"
+ new_style=t
+ ;;
+ -u|--include-untracked)
+ shift
+ untracked="$1"
+ new_style=t
+ ;;
--)
shift
+ files="$@"
+ new_style=t
break
;;
- --files)
- ;;
*)
- files="$1 $files"
+ if test -n "$new_style"
+ then
+ echo "invalid argument"
+ option="$1"
+ # TRANSLATORS: $option is an invalid option,
like
+ # `--blah-blah'. The 7 spaces at the beginning
of the
+ # second line correspond to "error: ". So you
should line
+ # up the second line with however many
characters the
+ # translation of "error: " takes in your
language. E.g. in
+ # English this is:
+ #
+ # $ git stash save --blah-blah 2>&1 | head
-n 2
+ # error: unknown option for 'stash save':
--blah-blah
+ # To provide a message, use git stash
save -- '--blah-blah'
+ eval_gettextln "error: unknown option for
'stash create': \$option"
+ usage
+ fi
+ break
;;
esac
shift
done
- stash_msg="$1"
- untracked="$2"
+ if test -z "$new_style"
+ then
+ stash_msg="$*"
+ fi
git update-index -q --refresh
if no_changes
@@ -284,7 +316,7 @@ push_stash () {
git reflog exists $ref_stash ||
clear_stash || die "$(gettext "Cannot initialize stash")"
- create_stash --files $files -- "$stash_msg" "$untracked"
+ create_stash -m "$stash_msg" -u "$untracked" -- $files
store_stash -m "$stash_msg" -q $w_commit ||
die "$(gettext "Cannot save the current status")"
say "$(eval_gettext "Saved working directory and index state
\$stash_msg")"
@@ -293,9 +325,9 @@ push_stash () {
then
if test -n "$files"
then
- git reset -- $files
- git checkout HEAD -- $(git ls-files --modified --
$files)
- git clean --force --quiet -- $(git ls-files --others --
$files)
+ git ls-files -z -- "$@" | xargs -0 git reset --
+ git ls-files -z --modified -- "$@" | xargs -0 git
checkout HEAD --
+ git ls-files -z --others -- "$@" | xargs -0 git clean
--force --
else
git reset --hard ${GIT_QUIET:+-q}
fi
@@ -373,14 +405,9 @@ save_stash () {
shift
done
- # if test -n "$patch_mode" && test -n "$untracked"
- # then
- # die "$(gettext "Can't use --patch and --include-untracked or
--all at the same time")"
- # fi
-
stash_msg="$*"
- if test -z stash_msg
+ if test -z "$stash_msg"
then
push_stash $push_options
else
@@ -728,7 +755,7 @@ clear)
;;
create)
shift
- create_stash -- "$*" && echo "$w_commit"
+ create_stash "$@" && echo "$w_commit"
;;
store)
shift
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 3e763ff766..ca4c44aa9c 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -784,6 +784,24 @@ test_expect_success 'push -m shows right message' '
test_cmp expect actual
'
+test_expect_success 'deprecated version of stash create stores correct
message' '
+ >foo &&
+ git add foo &&
+ STASH_ID=$(git stash create "create test message") &&
+ echo "On master: create test message" >expect &&
+ git show --pretty=%s ${STASH_ID} | head -n1 >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'new style stash create stores correct message' '
+ >foo &&
+ git add foo &&
+ STASH_ID=$(git stash create -m "create test message new style") &&
+ echo "On master: create test message new style" >expect &&
+ git show --pretty=%s ${STASH_ID} | head -n1 >actual &&
+ test_cmp expect actual
+'
+
test_expect_success 'stash -- <filename> stashes and restores the file' '
>foo &&
>bar &&
@@ -811,4 +829,19 @@ test_expect_success 'stash with multiple filename
arguments' '
test_path_is_file extra
'
+test_expect_success 'stash with file including $IFS character' '
+ >"foo bar" &&
+ >foo &&
+ >untracked &&
+ git add foo* &&
+ git stash push -- foo* &&
+ test_path_is_missing "foo bar" &&
+ test_path_is_missing foo &&
+ test_path_is_file untracked &&
+ git stash pop &&
+ test_path_is_file "foo bar" &&
+ test_path_is_file foo &&
+ test_path_is_file untracked
+'
+
test_done
Thomas Gummerer (4):
Documentation/stash: remove mention of git reset --hard
stash: introduce push verb
introduce new format for git stash create
stash: support filename argument
Documentation/git-stash.txt | 14 +++-
git-stash.sh | 154 ++++++++++++++++++++++++++++++++++++++++----
t/t3903-stash.sh | 69 ++++++++++++++++++++
3 files changed, 222 insertions(+), 15 deletions(-)
--
2.11.0.297.g9a2118ac0b.dirty