diff options
author | Patrick Steinhardt <ps@pks.im> | 2018-06-29 09:43:33 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-29 09:43:33 +0000 |
commit | 7192e26fb4ae56f2e20a2af4253d9dea19f38577 (patch) | |
tree | 09775d49f0ea1f049f59bb9ac9ea418420bd41e2 | |
parent | 967da2c71c5eb3ff1292ac3f479757ad51a21298 (diff) | |
parent | 630a67366eb475003b46bf56dc06b90197458259 (diff) | |
download | libgit2-7192e26fb4ae56f2e20a2af4253d9dea19f38577.tar.gz |
Merge pull request #4519 from cynecx/refspec-parsing
refspec: add public parsing api
-rw-r--r-- | include/git2/refspec.h | 17 | ||||
-rw-r--r-- | src/refspec.c | 25 | ||||
-rw-r--r-- | tests/network/refspecs.c | 12 |
3 files changed, 54 insertions, 0 deletions
diff --git a/include/git2/refspec.h b/include/git2/refspec.h index 9acdc72d5..eaf774746 100644 --- a/include/git2/refspec.h +++ b/include/git2/refspec.h @@ -22,6 +22,23 @@ GIT_BEGIN_DECL /** + * Parse a given refspec string + * + * @param refspec a pointer to hold the refspec handle + * @param input the refspec string + * @param is_fetch is this a refspec for a fetch + * @return 0 if the refspec string could be parsed, -1 otherwise + */ +GIT_EXTERN(int) git_refspec_parse(git_refspec **refspec, const char *input, int is_fetch); + +/** + * Free a refspec object which has been created by git_refspec_parse + * + * @param refspec the refspec object + */ +GIT_EXTERN(void) git_refspec_free(git_refspec *refspec); + +/** * Get the source specifier * * @param refspec the refspec diff --git a/src/refspec.c b/src/refspec.c index 8061788d1..b058d5fc1 100644 --- a/src/refspec.c +++ b/src/refspec.c @@ -160,6 +160,31 @@ void git_refspec__free(git_refspec *refspec) memset(refspec, 0x0, sizeof(git_refspec)); } +int git_refspec_parse(git_refspec **out_refspec, const char *input, int is_fetch) +{ + git_refspec *refspec; + assert(out_refspec && input); + + *out_refspec = NULL; + + refspec = git__malloc(sizeof(git_refspec)); + GITERR_CHECK_ALLOC(refspec); + + if (git_refspec__parse(refspec, input, !!is_fetch) != 0) { + git__free(refspec); + return -1; + } + + *out_refspec = refspec; + return 0; +} + +void git_refspec_free(git_refspec *refspec) +{ + git_refspec__free(refspec); + git__free(refspec); +} + const char *git_refspec_src(const git_refspec *refspec) { return refspec == NULL ? NULL : refspec->src; diff --git a/tests/network/refspecs.c b/tests/network/refspecs.c index 051802b38..16e585b9a 100644 --- a/tests/network/refspecs.c +++ b/tests/network/refspecs.c @@ -158,3 +158,15 @@ void test_network_refspecs__matching(void) git_refspec__free(&spec); } + +void test_network_refspecs__parse_free(void) +{ + git_refspec *spec = NULL; + + cl_git_fail(git_refspec_parse(&spec, "", 0)); + cl_git_fail(git_refspec_parse(&spec, ":::", 0)); + cl_git_pass(git_refspec_parse(&spec, "HEAD:", 1)); + + cl_assert(spec != NULL); + git_refspec_free(spec); +} |