diff options
author | cynecx <me@cynecx.net> | 2018-02-07 22:30:27 +0100 |
---|---|---|
committer | cynecx <me@cynecx.net> | 2018-06-22 13:19:40 +0200 |
commit | 630a67366eb475003b46bf56dc06b90197458259 (patch) | |
tree | bae222f4a514b067f0c83c81f33bab6b97023029 | |
parent | b121b7ac972156cdc67b25be075fd62450b57f29 (diff) | |
download | libgit2-630a67366eb475003b46bf56dc06b90197458259.tar.gz |
refspec: add public parsing api
Fix typo
Fix some type issues
More fixes
Address requested changes
Add test
Fix naming
Fix condition and tests
Address requested changes
Fix typo
-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); +} |