diff options
author | Vicent Marti <tanoku@gmail.com> | 2014-09-05 03:24:43 +0200 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2014-09-05 03:25:53 +0200 |
commit | 1e71354e34f360b19285ca108cd07903122a0a62 (patch) | |
tree | faeb9c2e8cd9ce1ce583e96c081bc22cb876370e | |
parent | 0972443c47ba67d63d346c2775b501fc7063aaa8 (diff) | |
download | libgit2-1e71354e34f360b19285ca108cd07903122a0a62.tar.gz |
reflog: Error handling on empty reflog
-rw-r--r-- | src/revparse.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/src/revparse.c b/src/revparse.c index 60872e187..e0ec3941d 100644 --- a/src/revparse.c +++ b/src/revparse.c @@ -205,7 +205,6 @@ cleanup: static int retrieve_oid_from_reflog(git_oid *oid, git_reference *ref, size_t identifier) { git_reflog *reflog; - int error = -1; size_t numentries; const git_reflog_entry *entry; bool search_by_pos = (identifier <= 100000000); @@ -216,21 +215,11 @@ static int retrieve_oid_from_reflog(git_oid *oid, git_reference *ref, size_t ide numentries = git_reflog_entrycount(reflog); if (search_by_pos) { - if (numentries < identifier + 1) { - giterr_set( - GITERR_REFERENCE, - "Reflog for '%s' has only %"PRIuZ" entries, asked for %"PRIuZ, - git_reference_name(ref), numentries, identifier); - - error = GIT_ENOTFOUND; - goto cleanup; - } + if (numentries < identifier + 1) + goto notfound; entry = git_reflog_entry_byindex(reflog, identifier); git_oid_cpy(oid, git_reflog_entry_id_new(entry)); - error = 0; - goto cleanup; - } else { size_t i; git_time commit_time; @@ -243,16 +232,24 @@ static int retrieve_oid_from_reflog(git_oid *oid, git_reference *ref, size_t ide continue; git_oid_cpy(oid, git_reflog_entry_id_new(entry)); - error = 0; - goto cleanup; + break; } - error = GIT_ENOTFOUND; + if (i == numentries) + goto notfound; } -cleanup: git_reflog_free(reflog); - return error; + return 0; + +notfound: + giterr_set( + GITERR_REFERENCE, + "Reflog for '%s' has only %"PRIuZ" entries, asked for %"PRIuZ, + git_reference_name(ref), numentries, identifier); + + git_reflog_free(reflog); + return GIT_ENOTFOUND; } static int retrieve_revobject_from_reflog(git_object **out, git_reference **base_ref, git_repository *repo, const char *identifier, size_t position) |