refs: move ref name helpers around

strbuf_branchname(), strbuf_check_{branch,tag}_ref() are helper functions to deal with branch and tag names, and the fact that they happen to use strbuf to hold the name of a branch or a tag is not essential. These functions fit better in the refs API than strbuf API, the latter of which is about string manipulations. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Dec 3, 2024 at 11:32 UTC 5bcbde9e49c14f4e47a0ed5fc60470f3d4447efd
5 files changed +76 -69
builtin/tag.c
-11
@@ -447,17 +447,6 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset)
447 return 0;
448 }
449
450 -static int strbuf_check_tag_ref(struct strbuf *sb, const char *name)
451 -{
452 - if (name[0] == '-')
453 - return -1;
454 -
455 - strbuf_reset(sb);
456 - strbuf_addf(sb, "refs/tags/%s", name);
457 -
458 - return check_refname_format(sb->buf, 0);
459 -}
460 -
450 int cmd_tag(int argc,
451 const char **argv,
452 const char *prefix,
object-name.c
-36
@@ -1734,42 +1734,6 @@ int repo_interpret_branch_name(struct repository *r,
1734 return -1;
1735 }
1736
1737 -void strbuf_branchname(struct strbuf *sb, const char *name, unsigned allowed)
1738 -{
1739 - int len = strlen(name);
1740 - struct interpret_branch_name_options options = {
1741 - .allowed = allowed
1742 - };
1743 - int used = repo_interpret_branch_name(the_repository, name, len, sb,
1744 - &options);
1745 -
1746 - if (used < 0)
1747 - used = 0;
1748 - strbuf_add(sb, name + used, len - used);
1749 -}
1750 -
1751 -int strbuf_check_branch_ref(struct strbuf *sb, const char *name)
1752 -{
1753 - if (startup_info->have_repository)
1754 - strbuf_branchname(sb, name, INTERPRET_BRANCH_LOCAL);
1755 - else
1756 - strbuf_addstr(sb, name);
1757 -
1758 - /*
1759 - * This splice must be done even if we end up rejecting the
1760 - * name; builtin/branch.c::copy_or_rename_branch() still wants
1761 - * to see what the name expanded to so that "branch -m" can be
1762 - * used as a tool to correct earlier mistakes.
1763 - */
1764 - strbuf_splice(sb, 0, 0, "refs/heads/", 11);
1765 -
1766 - if (*name == '-' ||
1767 - !strcmp(sb->buf, "refs/heads/HEAD"))
1768 - return -1;
1769 -
1770 - return check_refname_format(sb->buf, 0);
1771 -}
1772 -
1737 void object_context_release(struct object_context *ctx)
1738 {
1739 free(ctx->path);
refs.c
+47
@@ -697,6 +697,53 @@ static char *substitute_branch_name(struct repository *r,
697 return NULL;
698 }
699
700 +void strbuf_branchname(struct strbuf *sb, const char *name, unsigned allowed)
701 +{
702 + int len = strlen(name);
703 + struct interpret_branch_name_options options = {
704 + .allowed = allowed
705 + };
706 + int used = repo_interpret_branch_name(the_repository, name, len, sb,
707 + &options);
708 +
709 + if (used < 0)
710 + used = 0;
711 + strbuf_add(sb, name + used, len - used);
712 +}
713 +
714 +int strbuf_check_branch_ref(struct strbuf *sb, const char *name)
715 +{
716 + if (startup_info->have_repository)
717 + strbuf_branchname(sb, name, INTERPRET_BRANCH_LOCAL);
718 + else
719 + strbuf_addstr(sb, name);
720 +
721 + /*
722 + * This splice must be done even if we end up rejecting the
723 + * name; builtin/branch.c::copy_or_rename_branch() still wants
724 + * to see what the name expanded to so that "branch -m" can be
725 + * used as a tool to correct earlier mistakes.
726 + */
727 + strbuf_splice(sb, 0, 0, "refs/heads/", 11);
728 +
729 + if (*name == '-' ||
730 + !strcmp(sb->buf, "refs/heads/HEAD"))
731 + return -1;
732 +
733 + return check_refname_format(sb->buf, 0);
734 +}
735 +
736 +int strbuf_check_tag_ref(struct strbuf *sb, const char *name)
737 +{
738 + if (name[0] == '-')
739 + return -1;
740 +
741 + strbuf_reset(sb);
742 + strbuf_addf(sb, "refs/tags/%s", name);
743 +
744 + return check_refname_format(sb->buf, 0);
745 +}
746 +
747 int repo_dwim_ref(struct repository *r, const char *str, int len,
748 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
749 {
refs.h
+29
@@ -180,6 +180,35 @@ int repo_dwim_log(struct repository *r, const char *str, int len, struct object_
180 */
181 char *repo_default_branch_name(struct repository *r, int quiet);
182
183 +/*
184 + * Copy "name" to "sb", expanding any special @-marks as handled by
185 + * repo_interpret_branch_name(). The result is a non-qualified branch name
186 + * (so "foo" or "origin/master" instead of "refs/heads/foo" or
187 + * "refs/remotes/origin/master").
188 + *
189 + * Note that the resulting name may not be a syntactically valid refname.
190 + *
191 + * If "allowed" is non-zero, restrict the set of allowed expansions. See
192 + * repo_interpret_branch_name() for details.
193 + */
194 +void strbuf_branchname(struct strbuf *sb, const char *name,
195 + unsigned allowed);
196 +
197 +/*
198 + * Like strbuf_branchname() above, but confirm that the result is
199 + * syntactically valid to be used as a local branch name in refs/heads/.
200 + *
201 + * The return value is "0" if the result is valid, and "-1" otherwise.
202 + */
203 +int strbuf_check_branch_ref(struct strbuf *sb, const char *name);
204 +
205 +/*
206 + * Similar for a tag name in refs/tags/.
207 + *
208 + * The return value is "0" if the result is valid, and "-1" otherwise.
209 + */
210 +int strbuf_check_tag_ref(struct strbuf *sb, const char *name);
211 +
212 /*
213 * A ref_transaction represents a collection of reference updates that
214 * should succeed or fail together.
strbuf.h
-22
@@ -637,28 +637,6 @@ static inline void strbuf_complete_line(struct strbuf *sb)
637 strbuf_complete(sb, '\n');
638 }
639
640 -/*
641 - * Copy "name" to "sb", expanding any special @-marks as handled by
642 - * repo_interpret_branch_name(). The result is a non-qualified branch name
643 - * (so "foo" or "origin/master" instead of "refs/heads/foo" or
644 - * "refs/remotes/origin/master").
645 - *
646 - * Note that the resulting name may not be a syntactically valid refname.
647 - *
648 - * If "allowed" is non-zero, restrict the set of allowed expansions. See
649 - * repo_interpret_branch_name() for details.
650 - */
651 -void strbuf_branchname(struct strbuf *sb, const char *name,
652 - unsigned allowed);
653 -
654 -/*
655 - * Like strbuf_branchname() above, but confirm that the result is
656 - * syntactically valid to be used as a local branch name in refs/heads/.
657 - *
658 - * The return value is "0" if the result is valid, and "-1" otherwise.
659 - */
660 -int strbuf_check_branch_ref(struct strbuf *sb, const char *name);
661 -
640 typedef int (*char_predicate)(char ch);
641
642 void strbuf_addstr_urlencode(struct strbuf *sb, const char *name,