stash: strip "refs/heads/" with skip_prefix
When generating a message for a stash, "git stash" only records the part of the branch name to the right of the last "/". e.g. if HEAD is at "foo/bar/baz", "git stash" generates a message prefixed with "WIP on baz:" instead of "WIP on foo/bar/baz:". Fix this by using skip_prefix() to skip "refs/heads/" instead of looking for the last instance of "/". Reported-by: Kraymer <kraymer@gmail.com> Reported-by: Daniel Hahler <git@thequod.de> Helped-by: Jeff King <peff@peff.net> Signed-off-by: Glen Choo <chooglen@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Glen Choo committed
Jan 24, 2022 at 12:53 UTC
ceaf037f617eb774bb8a451c1779dd9b8b12152a
2 files changed
+12
-1
builtin/stash.c
+1
-1
@@ -1327,7 +1327,7 @@ static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_b
1327
1328
branch_ref = resolve_ref_unsafe("HEAD", 0, NULL, &flags);
1329
if (flags & REF_ISSYMREF)
1330
- branch_name = strrchr(branch_ref, '/') + 1;
1330
+ skip_prefix(branch_ref, "refs/heads/", &branch_name);
1331
head_short_sha1 = find_unique_abbrev(&head_commit->object.oid,
1332
DEFAULT_ABBREV);
1333
strbuf_addf(&msg, "%s: %s ", branch_name, head_short_sha1);
t/t3903-stash.sh
+11
@@ -1042,6 +1042,17 @@ test_expect_success 'create stores correct message' '
1042
test_cmp expect actual
1043
'
1044
1045
+test_expect_success 'create when branch name has /' '
1046
+ test_when_finished "git checkout main" &&
1047
+ git checkout -b some/topic &&
1048
+ >foo &&
1049
+ git add foo &&
1050
+ STASH_ID=$(git stash create "create test message") &&
1051
+ echo "On some/topic: create test message" >expect &&
1052
+ git show --pretty=%s -s ${STASH_ID} >actual &&
1053
+ test_cmp expect actual
1054
+'
1055
+
1056
test_expect_success 'create with multiple arguments for the message' '
1057
>foo &&
1058
git add foo &&