diff options
author | Ben Straub <bs@github.com> | 2013-07-17 20:08:15 -0700 |
---|---|---|
committer | Ben Straub <bs@github.com> | 2013-07-17 20:08:15 -0700 |
commit | 99a9c86cb654eb37bc77b31b76619e843d89de09 (patch) | |
tree | 544bc1c9d5f3fb614e80b57a91f44ad672ff3345 /src/revparse.c | |
parent | d2db351cf6b597bf3eaddaa4660ae426a4b4228d (diff) | |
parent | 80fd31faf773f3f50e2b5547b7171063f38dac17 (diff) | |
download | libgit2-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.c | 13 |
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; |