diff options
| author | Carlos Martín Nieto <cmn@elego.de> | 2011-06-28 13:55:00 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <cmn@elego.de> | 2011-06-28 16:59:51 +0200 |
| commit | 35502d2ec420fe2e58e79b653e44aa4a16300d30 (patch) | |
| tree | 1ad2e3acf46f5339bafd4f312e63baf14cf4461b /src | |
| parent | 0b10c9ea6ef5d85d862edd044d96561c4fd16e9b (diff) | |
| download | libgit2-35502d2ec420fe2e58e79b653e44aa4a16300d30.tar.gz | |
Add git_repository_is_detached, git_repository_is_orphan
Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
Diffstat (limited to 'src')
| -rw-r--r-- | src/repository.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/repository.c b/src/repository.c index 1fef73907..acc9b977f 100644 --- a/src/repository.c +++ b/src/repository.c @@ -752,6 +752,47 @@ cleanup: return git__rethrow(error, "Failed to (re)init the repository `%s`", path); } +int git_repository_is_detached(git_repository *repo) +{ + git_reference *ref; + int error; + size_t GIT_UNUSED(_size); + git_otype type; + + error = git_reference_lookup(&ref, repo, GIT_HEAD_FILE); + if (error < GIT_SUCCESS) + return error; + + if (git_reference_type(ref) == GIT_REF_SYMBOLIC) + return 0; + + error = git_odb_read_header(&_size, &type, repo->db, git_reference_oid(ref)); + if (error < GIT_SUCCESS) + return error; + + if (type != GIT_OBJ_COMMIT) + return git__throw(GIT_EOBJCORRUPTED, "HEAD is not a commit"); + + return 1; +} + +int git_repository_is_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); + + return error == GIT_ENOTFOUND ? 1 : error; +} + int git_repository_is_empty(git_repository *repo) { git_reference *head, *branch; |
