@matheusbsbs / matheus-bagliano / commits / 59d418fe10
Fork 0

stash: fix accidental apply of non-existent stashes

Once upon a time, "git rev-parse ref@{9999999}" did not generate an error. Therefore when we got an invalid stash reference in "stash apply", we could end up not noticing until quite late. Commit b0f0ecd (detached-stash: work around git rev-parse failure to detect bad log refs, 2010-08-21) handled this by checking for the "Log for stash has only %d entries" warning on stderr when we validated the ref. A few days later, e6eedc3 (rev-parse: exit with non-zero status if ref@{n} is not valid., 2010-08-24) fixed the original issue. That made the extra stderr test superfluous, but also introduced a new bug. Now the early call to: git rev-parse --symbolic "$@" fails, but we don't notice the exit code. Worse, its empty output means we think the user didn't provide us a ref, and we try to apply stash@{0}. This patch checks the rev-parse exit code and fails early in the revision parsing process. We can also get rid of the stderr test; as a bonus, this means that "stash apply" can now run under GIT_TRACE=1 properly. Signed-off-by: Jeff King <peff@peff.net> Acked-by: Jon Seymour <jon.seymour@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Apr 5, 2011 at 17:20 UTC 59d418fe10c207a510672d17a854697a8abc1e0b
2 files changed +7 -11
git-stash.sh
+1 -11
@@ -264,7 +264,7 @@ parse_flags_and_rev()
264 b_tree=
265 i_tree=
266
267 - REV=$(git rev-parse --no-flags --symbolic "$@" 2>/dev/null)
267 + REV=$(git rev-parse --no-flags --symbolic "$@") || exit 1
268
269 FLAGS=
270 for opt
@@ -310,16 +310,6 @@ parse_flags_and_rev()
310 IS_STASH_LIKE=t &&
311 test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" &&
312 IS_STASH_REF=t
313 -
314 - if test "${REV}" != "${REV%{*\}}"
315 - then
316 - # maintainers: it would be better if git rev-parse indicated
317 - # this condition with a non-zero status code but as of 1.7.2.1 it
318 - # it did not. So, we use non-empty stderr output as a proxy for the
319 - # condition of interest.
320 - test -z "$(git rev-parse "$REV" 2>&1 >/dev/null)" || die "$REV does not exist in the stash log"
321 - fi
322 -
313 }
314
315 is_stash_like()
t/t3903-stash.sh
+6
@@ -37,6 +37,12 @@ test_expect_success 'parents of stash' '
37 test_cmp output expect
38 '
39
40 +test_expect_success 'applying bogus stash does nothing' '
41 + test_must_fail git stash apply stash@{1} &&
42 + echo 1 >expect &&
43 + test_cmp expect file
44 +'
45 +
46 test_expect_success 'apply needs clean working directory' '
47 echo 4 > other-file &&
48 git add other-file &&