Previous round is at:
http://public-inbox.org/git/20170121200804.19009-1-t.gumme...@gmail.com/.
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

Reply via email to