diff options
author | Sven Strickroth <email@cs-ware.de> | 2020-09-08 21:05:18 +0200 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2020-10-25 16:33:28 +0000 |
commit | fe11160c724853fe8469a9788c5992420e4638de (patch) | |
tree | e3d68202742a4b018ee351c098c2b358fe90963e | |
parent | c7143d7ce4f4386ca5b024876177f915c39ff86e (diff) | |
download | libgit2-fe11160c724853fe8469a9788c5992420e4638de.tar.gz |
Add git_branch_name_is_valid
Signed-off-by: Sven Strickroth <email@cs-ware.de>
-rw-r--r-- | include/git2/branch.h | 12 | ||||
-rw-r--r-- | src/branch.c | 29 | ||||
-rw-r--r-- | tests/refs/branches/name.c | 17 |
3 files changed, 58 insertions, 0 deletions
diff --git a/include/git2/branch.h b/include/git2/branch.h index ba6235900..0c0cc7ff7 100644 --- a/include/git2/branch.h +++ b/include/git2/branch.h @@ -304,6 +304,18 @@ GIT_EXTERN(int) git_branch_remote_name( */ GIT_EXTERN(int) git_branch_upstream_remote(git_buf *buf, git_repository *repo, const char *refname); +/** + * Determine whether a branch name is valid, meaning that (when prefixed + * with `refs/heads/`) that it is a valid reference name, and that any + * additional branch name restrictions are imposed (eg, it cannot start + * with a `-`). + * + * @param valid output pointer to set with validity of given branch name + * @param name a branch name to test + * @return 0 on success or an error code + */ +GIT_EXTERN(int) git_branch_name_is_valid(int *valid, const char *name); + /** @} */ GIT_END_DECL #endif diff --git a/src/branch.c b/src/branch.c index 715f6cf99..000a63ad8 100644 --- a/src/branch.c +++ b/src/branch.c @@ -723,3 +723,32 @@ int git_branch_is_head( return is_same; } + +int git_branch_name_is_valid(int *valid, const char *name) +{ + git_buf ref_name = GIT_BUF_INIT; + int error = 0; + + GIT_ASSERT(valid); + + *valid = 0; + + /* + * Discourage branch name starting with dash, + * https://github.com/git/git/commit/6348624010888b + * and discourage HEAD as branch name, + * https://github.com/git/git/commit/a625b092cc5994 + */ + if (!name || name[0] == '-' || !git__strcmp(name, "HEAD")) + goto done; + + if ((error = git_buf_puts(&ref_name, GIT_REFS_HEADS_DIR)) < 0 || + (error = git_buf_puts(&ref_name, name)) < 0) + goto done; + + error = git_reference_name_is_valid(valid, ref_name.ptr); + +done: + git_buf_dispose(&ref_name); + return error; +} diff --git a/tests/refs/branches/name.c b/tests/refs/branches/name.c index 176f836a4..290916eec 100644 --- a/tests/refs/branches/name.c +++ b/tests/refs/branches/name.c @@ -43,3 +43,20 @@ void test_refs_branches_name__error_when_ref_is_no_branch(void) cl_git_pass(git_reference_lookup(&ref,repo,"refs/notes/fanout")); cl_git_fail(git_branch_name(&name,ref)); } + +static int name_is_valid(const char *name) +{ + int valid; + cl_git_pass(git_branch_name_is_valid(&valid, name)); + return valid; +} + +void test_refs_branches_is_name_valid(void) +{ + cl_assert_equal_i(true, name_is_valid("master")); + cl_assert_equal_i(true, name_is_valid("test/master")); + + cl_assert_equal_i(false, name_is_valid("")); + cl_assert_equal_i(false, name_is_valid("HEAD")); + cl_assert_equal_i(false, name_is_valid("-dash")); +} |