summaryrefslogtreecommitdiff
path: root/src/revparse.c
diff options
context:
space:
mode:
authorBen Straub <bstraub@github.com>2012-05-10 15:05:19 -0700
committerBen Straub <bstraub@github.com>2012-05-11 11:35:50 -0700
commit7e79d389a400952a24a5619a8bee88b7b40bee72 (patch)
tree7ee3f735cd11a39da1fbdb703a1d9969bd90d41e /src/revparse.c
parentb41384b473e9ea4cfaea6f42b106e805bae8ab93 (diff)
downloadlibgit2-7e79d389a400952a24a5619a8bee88b7b40bee72.tar.gz
Rev-parse: regex check for "git describe" output.
Diffstat (limited to 'src/revparse.c')
-rw-r--r--src/revparse.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/revparse.c b/src/revparse.c
index 5f527443c..0fea5ce8d 100644
--- a/src/revparse.c
+++ b/src/revparse.c
@@ -37,6 +37,22 @@ static int revparse_lookup_fully_qualifed_ref(git_object **out, git_repository *
return git_object_lookup(out, repo, &resolved, GIT_OBJ_ANY);
}
+/* Returns non-zero if yes */
+static int spec_looks_like_describe_output(const char *spec)
+{
+ regex_t regex;
+ int regex_error, retcode;
+
+ regex_error = regcomp(&regex, ".+-[0-9]+-g[0-9a-fA-F]+", REG_EXTENDED);
+ if (regex_error != 0) {
+ giterr_set_regex(&regex, regex_error);
+ return 1; /* To be safe */
+ }
+ retcode = regexec(&regex, spec, 0, NULL, 0);
+ regfree(&regex);
+ return retcode == 0;
+}
+
static int revparse_lookup_object(git_object **out, git_repository *repo, const char *spec)
{
size_t speclen = strlen(spec);
@@ -57,6 +73,7 @@ static int revparse_lookup_object(git_object **out, git_repository *repo, const
/* "git describe" output; snip everything before/including "-g" */
substr = strstr(spec, "-g");
if (substr &&
+ spec_looks_like_describe_output(spec) &&
!revparse_lookup_object(out, repo, substr+2)) {
return 0;
}