Skip to content

Commit

Permalink
stash: be careful what we store
Browse files Browse the repository at this point in the history
"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 <[email protected]>
  • Loading branch information
gitster committed Oct 11, 2023
1 parent 0d1bd1d commit d9b6634
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 0 deletions.
6 changes: 6 additions & 0 deletions builtin/stash.c
Original file line number Diff line number Diff line change
Expand Up @@ -977,6 +977,12 @@ static int show_stash(int argc, const char **argv, const char *prefix)
static int do_store_stash(const struct object_id *w_commit, const char *stash_msg,
int quiet)
{
struct stash_info info;
char revision[GIT_MAX_HEXSZ];

oid_to_hex_r(revision, w_commit);
assert_stash_like(&info, revision);

if (!stash_msg)
stash_msg = "Created via \"git stash store\".";

Expand Down
4 changes: 4 additions & 0 deletions t/t3903-stash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,10 @@ test_expect_success 'store called with invalid commit' '
test_must_fail git stash store foo
'

test_expect_success 'store called with non-stash commit' '
test_must_fail git stash store HEAD
'

test_expect_success 'store updates stash ref and reflog' '
git stash clear &&
git reset --hard &&
Expand Down

0 comments on commit d9b6634

Please sign in to comment.