summaryrefslogtreecommitdiff
path: root/src/revparse.c
diff options
context:
space:
mode:
authorBen Straub <bs@github.com>2013-07-17 20:08:15 -0700
committerBen Straub <bs@github.com>2013-07-17 20:08:15 -0700
commit99a9c86cb654eb37bc77b31b76619e843d89de09 (patch)
tree544bc1c9d5f3fb614e80b57a91f44ad672ff3345 /src/revparse.c
parentd2db351cf6b597bf3eaddaa4660ae426a4b4228d (diff)
parent80fd31faf773f3f50e2b5547b7171063f38dac17 (diff)
downloadlibgit2-99a9c86cb654eb37bc77b31b76619e843d89de09.tar.gz
Merge pull request #1722 from libgit2/ntk/fix/issue_1722
git_revparse_ext: should return a NULL reference when the revparse expression doesn't lead to a reference
Diffstat (limited to 'src/revparse.c')
-rw-r--r--src/revparse.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/revparse.c b/src/revparse.c
index bcfb0843f..d21f08b53 100644
--- a/src/revparse.c
+++ b/src/revparse.c
@@ -685,6 +685,8 @@ int revparse__ext(
git_reference *reference = NULL;
git_object *base_rev = NULL;
+ bool should_return_reference = true;
+
assert(object_out && reference_out && repo && spec);
*object_out = NULL;
@@ -693,6 +695,8 @@ int revparse__ext(
while (spec[pos]) {
switch (spec[pos]) {
case '^':
+ should_return_reference = false;
+
if ((error = ensure_base_rev_loaded(&base_rev, &reference, spec, identifier_len, repo, false)) < 0)
goto cleanup;
@@ -725,6 +729,8 @@ int revparse__ext(
{
git_object *temp_object = NULL;
+ should_return_reference = false;
+
if ((error = extract_how_many(&n, spec, &pos)) < 0)
goto cleanup;
@@ -743,6 +749,8 @@ int revparse__ext(
{
git_object *temp_object = NULL;
+ should_return_reference = false;
+
if ((error = extract_path(&buf, spec, &pos)) < 0)
goto cleanup;
@@ -807,6 +815,11 @@ int revparse__ext(
if ((error = ensure_base_rev_loaded(&base_rev, &reference, spec, identifier_len, repo, false)) < 0)
goto cleanup;
+ if (!should_return_reference) {
+ git_reference_free(reference);
+ reference = NULL;
+ }
+
*object_out = base_rev;
*reference_out = reference;
*identifier_len_out = identifier_len;