diff --git a/include/git2/refspec.h b/include/git2/refspec.h index 16ebd1ddf..49d5f89f7 100644 --- a/include/git2/refspec.h +++ b/include/git2/refspec.h @@ -78,6 +78,15 @@ GIT_EXTERN(int) git_refspec_force(const git_refspec *refspec); */ GIT_EXTERN(git_direction) git_refspec_direction(const git_refspec *spec); +/** + * Check if a refspec's source descriptor matches a negative reference + * + * @param refspec the refspec + * @param refname the name of the reference to check + * @return 1 if the refspec matches, 0 otherwise + */ +GIT_EXTERN(int) git_refspec_src_matches_negative(const git_refspec *refspec, const char *refname); + /** * Check if a refspec's source descriptor matches a reference * diff --git a/src/libgit2/refspec.c b/src/libgit2/refspec.c index f0a0c2bfb..18ece6b70 100644 --- a/src/libgit2/refspec.c +++ b/src/libgit2/refspec.c @@ -225,6 +225,14 @@ int git_refspec_force(const git_refspec *refspec) return refspec->force; } +int git_refspec_src_matches_negative(const git_refspec *refspec, const char *refname) +{ + if (refspec == NULL || refspec->src == NULL || !git_refspec_is_negative(refspec)) + return false; + + return (wildmatch(refspec->src + 1, refname, 0) == 0); +} + int git_refspec_src_matches(const git_refspec *refspec, const char *refname) { if (refspec == NULL || refspec->src == NULL) @@ -340,6 +348,14 @@ int git_refspec_is_wildcard(const git_refspec *spec) return (spec->src[strlen(spec->src) - 1] == '*'); } +int git_refspec_is_negative(const git_refspec *spec) +{ + GIT_ASSERT_ARG(spec); + GIT_ASSERT_ARG(spec->src); + + return (spec->src[0] == '^' && spec->dst == NULL); +} + git_direction git_refspec_direction(const git_refspec *spec) { GIT_ASSERT_ARG(spec); diff --git a/src/libgit2/refspec.h b/src/libgit2/refspec.h index bf4f7fcfb..37612216c 100644 --- a/src/libgit2/refspec.h +++ b/src/libgit2/refspec.h @@ -45,6 +45,14 @@ int git_refspec__serialize(git_str *out, const git_refspec *refspec); */ int git_refspec_is_wildcard(const git_refspec *spec); +/** + * Determines if a refspec is a negative refspec. + * + * @param spec the refspec + * @return 1 if the refspec is a negative, 0 otherwise + */ +int git_refspec_is_negative(const git_refspec *spec); + /** * DWIM `spec` with `refs` existing on the remote, append the dwim'ed * result in `out`.