stash: handle specifying stashes with $IFS

When trying to pop/apply a stash specified with an argument
containing IFS whitespace, git-stash will throw an error:

    $ git stash pop 'stash@{two hours ago}'
    Too many revisions specified: stash@{two hours ago}

This happens because word splitting is used to count non-option
arguments. Make use of rev-parse's --sq option to quote the arguments
for us to ensure a correct count. Add quotes where necessary.

Also add a test that verifies correct behaviour.

Helped-by: Thomas Rast <tr@thomasrast.ch>
Signed-off-by: Øystein Walle <oystwa@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Øystein Walle 2014-01-07 09:22:15 +01:00 коммит произвёл Junio C Hamano
Родитель c90d3dbe7d
Коммит 2a07e4374c
2 изменённых файлов: 19 добавлений и 7 удалений

Просмотреть файл

@ -358,7 +358,7 @@ parse_flags_and_rev()
i_tree=
u_tree=
REV=$(git rev-parse --no-flags --symbolic "$@") || exit 1
REV=$(git rev-parse --no-flags --symbolic --sq "$@") || exit 1
FLAGS=
for opt
@ -376,7 +376,7 @@ parse_flags_and_rev()
esac
done
set -- $REV
eval set -- $REV
case $# in
0)
@ -391,13 +391,13 @@ parse_flags_and_rev()
;;
esac
REV=$(git rev-parse --quiet --symbolic --verify $1 2>/dev/null) || {
REV=$(git rev-parse --quiet --symbolic --verify "$1" 2>/dev/null) || {
reference="$1"
die "$(eval_gettext "\$reference is not valid reference")"
}
i_commit=$(git rev-parse --quiet --verify $REV^2 2>/dev/null) &&
set -- $(git rev-parse $REV $REV^1 $REV: $REV^1: $REV^2: 2>/dev/null) &&
i_commit=$(git rev-parse --quiet --verify "$REV^2" 2>/dev/null) &&
set -- $(git rev-parse "$REV" "$REV^1" "$REV:" "$REV^1:" "$REV^2:" 2>/dev/null) &&
s=$1 &&
w_commit=$1 &&
b_commit=$2 &&
@ -408,8 +408,8 @@ parse_flags_and_rev()
test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" &&
IS_STASH_REF=t
u_commit=$(git rev-parse --quiet --verify $REV^3 2>/dev/null) &&
u_tree=$(git rev-parse $REV^3: 2>/dev/null)
u_commit=$(git rev-parse --quiet --verify "$REV^3" 2>/dev/null) &&
u_tree=$(git rev-parse "$REV^3:" 2>/dev/null)
}
is_stash_like()

Просмотреть файл

@ -673,4 +673,16 @@ test_expect_success 'store updates stash ref and reflog' '
grep quux bazzy
'
test_expect_success 'handle stash specification with spaces' '
git stash clear &&
echo pig >file &&
git stash &&
stamp=$(git log -g --format="%cd" -1 refs/stash) &&
test_tick &&
echo cow >file &&
git stash &&
git stash apply "stash@{$stamp}" &&
grep pig file
'
test_done