stash: be careful what we store
"git stash store" is meant to store what "git stash create" produces, as these two are implementation details of the end-user facing "git stash save" command. Even though it is clearly documented as such, users would try silly things like "git stash store HEAD" to render their stash unusable. Worse yet, because "git stash drop" does not allow such a stash entry to be removed, "git stash clear" would be the only way to recover from such a mishap. Reuse the logic that allows "drop" to refrain from working on such a stash entry to teach "store" to avoid storing an object that is not a stash entry in the first place. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Junio C Hamano committed
Oct 11, 2023 at 13:44 UTC
d9b6634589d5c59b49fd2fc41953469173a40ff5
2 files changed
+10
builtin/stash.c
+6
@@ -977,6 +977,12 @@ usage:
977
static int do_store_stash(const struct object_id *w_commit, const char *stash_msg,
978
int quiet)
979
{
980
+ struct stash_info info;
981
+ char revision[GIT_MAX_HEXSZ];
982
+
983
+ oid_to_hex_r(revision, w_commit);
984
+ assert_stash_like(&info, revision);
985
+
986
if (!stash_msg)
987
stash_msg = "Created via \"git stash store\".";
988
t/t3903-stash.sh
+4
@@ -931,6 +931,10 @@ test_expect_success 'store called with invalid commit' '
931
test_must_fail git stash store foo
932
'
933
934
+test_expect_success 'store called with non-stash commit' '
935
+ test_must_fail git stash store HEAD
936
+'
937
+
938
test_expect_success 'store updates stash ref and reflog' '
939
git stash clear &&
940
git reset --hard &&