Commit fe9bfec46b90443d8c64990858e5b31fbd4a7a2f

yuangli 2022-07-11T15:35:15

tag: refactor tag name validity checks

diff --git a/src/tag.c b/src/tag.c
index ee91e50..f9b6474 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -244,6 +244,15 @@ on_error:
 	return -1;
 }
 
+static bool tag_name_follows_pattern(const char *tag_name)
+{
+	/*
+	 * Discourage tag name starting with dash,
+	 * https://github.com/git/git/commit/4f0accd638b8d2
+	 */
+	return tag_name[0] != '-';
+}
+
 static int git_tag_create__internal(
 		git_oid *oid,
 		git_repository *repo,
@@ -269,6 +278,11 @@ static int git_tag_create__internal(
 		return -1;
 	}
 
+	if (!tag_name_follows_pattern(tag_name)) {
+		git_error_set(GIT_ERROR_TAG, "'%s' is not a valid tag name", tag_name);
+		return -1;
+	}
+
 	error = retrieve_tag_reference_oid(oid, &ref_name, repo, tag_name);
 	if (error < 0 && error != GIT_ENOTFOUND)
 		goto cleanup;
@@ -540,11 +554,7 @@ int git_tag_name_is_valid(int *valid, const char *name)
 
 	GIT_ASSERT(valid);
 
-	/*
-	 * Discourage tag name starting with dash,
-	 * https://github.com/git/git/commit/4f0accd638b8d2
-	 */
-	if (!name || name[0] == '-')
+	if (!name || !tag_name_follows_pattern(name))
 		goto done;
 
 	if ((error = git_buf_puts(&ref_name, GIT_REFS_TAGS_DIR)) < 0 ||