From 3601c4bfce3df04ebfc8668e5db531ded39280a9 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Mon, 8 Aug 2011 13:40:17 +0200 Subject: [PATCH] repository: Add git_repository_head() --- include/git2/repository.h | 10 ++++++++++ src/repository.c | 28 ++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/include/git2/repository.h b/include/git2/repository.h index e4326437f..fb9b09f7e 100644 --- a/include/git2/repository.h +++ b/include/git2/repository.h @@ -218,6 +218,16 @@ GIT_EXTERN(void) git_repository_free(git_repository *repo); */ GIT_EXTERN(int) git_repository_init(git_repository **repo_out, const char *path, unsigned is_bare); +/** + * Retrieve and resolve the reference pointed at by HEAD. + * + * @param head_out pointer to the reference which will be retrieved + * @param repo a repository object + * + * @return 0 on success; error code otherwise + */ +GIT_EXTERN(int) git_repository_head(git_reference **head_out, git_repository *repo); + /** * Check if a repository's HEAD is detached * diff --git a/src/repository.c b/src/repository.c index 1b06c4f03..cbd73fe15 100644 --- a/src/repository.c +++ b/src/repository.c @@ -729,19 +729,31 @@ int git_repository_head_detached(git_repository *repo) return 1; } +int git_repository_head(git_reference **head_out, git_repository *repo) +{ + git_reference *ref; + int error; + + *head_out = NULL; + + error = git_reference_lookup(&ref, repo, GIT_HEAD_FILE); + if (error < GIT_SUCCESS) + return git__rethrow(GIT_ENOTAREPO, "Failed to locate the HEAD"); + + error = git_reference_resolve(&ref, ref); + if (error < GIT_SUCCESS) + return git__rethrow(error, "Failed to resolve the HEAD"); + + *head_out = ref; + return GIT_SUCCESS; +} + int git_repository_head_orphan(git_repository *repo) { git_reference *ref; int error; - error = git_reference_lookup(&ref, repo, GIT_HEAD_FILE); - if (error < GIT_SUCCESS) - return error; - - if (git_reference_type(ref) == GIT_REF_OID) - return 0; - - error = git_reference_resolve(&ref, ref); + error = git_repository_head(&ref, repo); return error == GIT_ENOTFOUND ? 1 : error; }