]> git.ipfire.org Git - thirdparty/git.git/commitdiff
stash: fix incorrect branch name in stash message
authorK Jayatheerth <jayatheerthkulkarni2005@gmail.com>
Wed, 11 Jun 2025 01:42:03 +0000 (07:12 +0530)
committerJunio C Hamano <gitster@pobox.com>
Wed, 11 Jun 2025 15:59:32 +0000 (08:59 -0700)
When creating a stash, Git uses the current branch name
of the superproject to construct the stash commit message.
However, in repositories with submodules,
the message may mistakenly display the submodule branch name instead.

This is because `refs_resolve_ref_unsafe()` returns a pointer to a static buffer.
Subsequent calls to the same function overwrite the buffer,
corrupting the originally fetched `branch_name` used for the stash message.

Use `xstrdup()` to duplicate the branch name immediately after resolving it,
so that later buffer overwrites do not affect the stash message.

Signed-off-by: K Jayatheerth <jayatheerthkulkarni2005@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/stash.c
t/t3903-stash.sh

index dbaa999cf171a7606f8629912777538925d6ae34..9c0dde0b2e36df4f6d95c297d00bc97cafb3564f 100644 (file)
@@ -1373,6 +1373,7 @@ static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_b
        const char *head_short_sha1 = NULL;
        const char *branch_ref = NULL;
        const char *branch_name = "(no branch)";
+       char *branch_name_buf = NULL;
        struct commit *head_commit = NULL;
        struct commit_list *parents = NULL;
        struct strbuf msg = STRBUF_INIT;
@@ -1405,8 +1406,12 @@ static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_b
 
        branch_ref = refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
                                             "HEAD", 0, NULL, &flags);
-       if (flags & REF_ISSYMREF)
-               skip_prefix(branch_ref, "refs/heads/", &branch_name);
+
+       if (flags & REF_ISSYMREF) {
+               if (skip_prefix(branch_ref, "refs/heads/", &branch_name))
+                       branch_name = branch_name_buf = xstrdup(branch_name);
+       }
+
        head_short_sha1 = repo_find_unique_abbrev(the_repository,
                                                  &head_commit->object.oid,
                                                  DEFAULT_ABBREV);
@@ -1496,6 +1501,7 @@ done:
        strbuf_release(&msg);
        strbuf_release(&untracked_files);
        free_commit_list(parents);
+       free(branch_name_buf);
        return ret;
 }
 
index 74666ff3e4b2b8fa5aa9651e85dc7c82621bd304..5678223cfb2a4e535dad6569ca56ddf7a278d9f3 100755 (executable)
@@ -1592,4 +1592,36 @@ test_expect_success 'stash apply reports a locked index' '
        )
 '
 
+test_expect_success 'submodules does not affect the branch recorded in stash message' '
+       git init sub_project &&
+       (
+               cd sub_project &&
+               echo "Initial content in sub_project" >sub_file.txt &&
+               git add sub_file.txt &&
+               git commit -m "Initial commit in sub_project"
+       ) &&
+
+       git init main_project &&
+       (
+               cd main_project &&
+               echo "Initial content in main_project" >main_file.txt &&
+               git add main_file.txt &&
+               git commit -m "Initial commit in main_project" &&
+
+               git -c protocol.file.allow=always submodule add ../sub_project sub &&
+               git commit -m "Added submodule sub_project" &&
+
+               git checkout -b feature_main &&
+               git -C sub checkout -b feature_sub &&
+
+               git checkout -b work_branch &&
+               echo "Important work to be stashed" >work_item.txt &&
+               git add work_item.txt &&
+               git stash push -m "custom stash for work_branch" &&
+
+               git stash list >../actual_stash_list.txt &&
+               grep "On work_branch: custom stash for work_branch" ../actual_stash_list.txt
+       )
+'
+
 test_done