diff options
author | Vicent Marti <tanoku@gmail.com> | 2013-04-17 04:46:37 +0200 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2013-04-17 04:46:37 +0200 |
commit | a442ed687d4c01a68de9aa7b0e50902f17a1ea84 (patch) | |
tree | 0f0aa7855addf766a8d22fcf04a4728c606f1989 | |
parent | f124ebd457bfbf43de3516629aaba5a279636e04 (diff) | |
download | libgit2-a442ed687d4c01a68de9aa7b0e50902f17a1ea84.tar.gz |
repository: Add `git_repository_open_bare`vmg/bare-open
-rw-r--r-- | include/git2/repository.h | 15 | ||||
-rw-r--r-- | src/repository.c | 31 |
2 files changed, 46 insertions, 0 deletions
diff --git a/include/git2/repository.h b/include/git2/repository.h index e75c8b136..e3320975c 100644 --- a/include/git2/repository.h +++ b/include/git2/repository.h @@ -124,6 +124,21 @@ GIT_EXTERN(int) git_repository_open_ext( const char *ceiling_dirs); /** + * Open a bare repository on the serverside. + * + * This is a fast open for bare repositories that will come in handy + * if you're e.g. hosting git repositories and need to access them + * efficiently + * + * @param out Pointer to the repo which will be opened. + * @param bare_path Direct path to the bare repository + * @return 0 on success, or an error code + */ +GIT_EXTERN(int) git_repository_open_bare( + git_repository **out, + const char *bare_path); + +/** * Free a previously allocated repository * * Note that after a repository is free'd, all the objects it has spawned diff --git a/src/repository.c b/src/repository.c index 0ad7449ba..64ab2f4db 100644 --- a/src/repository.c +++ b/src/repository.c @@ -368,6 +368,37 @@ static int find_repo( return error; } +int git_repository_open_bare( + git_repository **repo_ptr, + const char *bare_path) +{ + int error; + git_buf path = GIT_BUF_INIT; + git_repository *repo = NULL; + + if ((error = git_path_prettify_dir(&path, bare_path, NULL)) < 0) + return error; + + if (!valid_repository_path(&path)) { + git_buf_free(&path); + giterr_set(GITERR_REPOSITORY, "Path is not a repository: %s", bare_path); + return GIT_ENOTFOUND; + } + + repo = repository_alloc(); + GITERR_CHECK_ALLOC(repo); + + repo->path_repository = git_buf_detach(&path); + GITERR_CHECK_ALLOC(repo->path_repository); + + /* of course we're bare! */ + repo->is_bare = 1; + repo->workdir = NULL; + + *repo_ptr = repo; + return 0; +} + int git_repository_open_ext( git_repository **repo_ptr, const char *start_path, |