diff --git a/include/git2/reflog.h b/include/git2/reflog.h index 9d04688e2..ae8bb8657 100644 --- a/include/git2/reflog.h +++ b/include/git2/reflog.h @@ -23,6 +23,10 @@ GIT_BEGIN_DECL /** * Read the reflog for the given reference * + * If there is no reflog file for the given + * reference yet, an empty reflog object will + * be returned. + * * The reflog must be freed manually by using * git_reflog_free(). * diff --git a/src/reflog.c b/src/reflog.c index dbac28aff..9007bd379 100644 --- a/src/reflog.c +++ b/src/reflog.c @@ -217,22 +217,29 @@ int git_reflog_read(git_reflog **reflog, git_reference *ref) *reflog = NULL; + assert(reflog && ref); + if (reflog_init(&log, ref) < 0) return -1; - error = retrieve_reflog_path(&log_path, ref); + if (retrieve_reflog_path(&log_path, ref) < 0) + goto cleanup; - if (!error) - error = git_futils_readbuffer(&log_file, log_path.ptr); + error = git_futils_readbuffer(&log_file, git_buf_cstr(&log_path)); + if (error < 0 && error != GIT_ENOTFOUND) + goto cleanup; - if (!error) - error = reflog_parse(log, log_file.ptr, log_file.size); + if ((error = reflog_parse(log, + git_buf_cstr(&log_file), git_buf_len(&log_file))) < 0) + goto cleanup; - if (!error) - *reflog = log; - else - git_reflog_free(log); + *reflog = log; + goto success; +cleanup: + git_reflog_free(log); + +success: git_buf_free(&log_file); git_buf_free(&log_path);