builtin/stash: factor out revision parsing into a function

We allow several special forms of stash names in this code.  In the
future, we'll want to allow these same forms without parsing a stash
commit, so let's refactor this code out into a function for reuse.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
brian m. carlson 2025-06-12 01:12:18 +00:00 committed by Junio C Hamano
parent 393bbb21c9
commit 7572e59b3d

View File

@ -169,6 +169,25 @@ static void assert_stash_like(struct stash_info *info, const char *revision)
die(_("'%s' is not a stash-like commit"), revision);
}
static int parse_stash_revision(struct strbuf *revision, const char *commit, int quiet)
{
strbuf_reset(revision);
if (!commit) {
if (!refs_ref_exists(get_main_ref_store(the_repository), ref_stash)) {
if (!quiet)
fprintf_ln(stderr, _("No stash entries found."));
return -1;
}
strbuf_addf(revision, "%s@{0}", ref_stash);
} else if (strspn(commit, "0123456789") == strlen(commit)) {
strbuf_addf(revision, "%s@{%s}", ref_stash, commit);
} else {
strbuf_addstr(revision, commit);
}
return 0;
}
static int get_stash_info(struct stash_info *info, int argc, const char **argv)
{
int ret;
@ -196,17 +215,9 @@ static int get_stash_info(struct stash_info *info, int argc, const char **argv)
if (argc == 1)
commit = argv[0];
if (!commit) {
if (!refs_ref_exists(get_main_ref_store(the_repository), ref_stash)) {
fprintf_ln(stderr, _("No stash entries found."));
return -1;
}
strbuf_addf(&info->revision, "%s@{0}", ref_stash);
} else if (strspn(commit, "0123456789") == strlen(commit)) {
strbuf_addf(&info->revision, "%s@{%s}", ref_stash, commit);
} else {
strbuf_addstr(&info->revision, commit);
strbuf_init(&info->revision, 0);
if (parse_stash_revision(&info->revision, commit, 0)) {
return -1;
}
revision = info->revision.buf;