diff options
| author | Carlos Martín Nieto <carlos@cmartin.tk> | 2011-06-16 17:46:06 +0200 |
|---|---|---|
| committer | Vicent Marti <tanoku@gmail.com> | 2011-06-17 22:30:29 +0200 |
| commit | b22d147986504434188218ec74f9a6531497ffe9 (patch) | |
| tree | 3b1b15f85654cf26e3f34b09745a08b28658f874 | |
| parent | b76934de6cfb920bc52c03730667fad3e0434aa4 (diff) | |
| download | libgit2-b22d147986504434188218ec74f9a6531497ffe9.tar.gz | |
Add git_repository_config API
This function puts the global and repository configurations in one
git_config object and gives it to the user.
Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
| -rw-r--r-- | include/git2/repository.h | 10 | ||||
| -rw-r--r-- | src/config.h | 1 | ||||
| -rw-r--r-- | src/repository.c | 38 |
3 files changed, 48 insertions, 1 deletions
diff --git a/include/git2/repository.h b/include/git2/repository.h index 6fd763c5f..5c7903adc 100644 --- a/include/git2/repository.h +++ b/include/git2/repository.h @@ -265,6 +265,16 @@ GIT_EXTERN(const char *) git_repository_path(git_repository *repo, git_repositor */ GIT_EXTERN(int) git_repository_is_bare(git_repository *repo); +/** + * Retrieve the relevant configuration for a repository + * + * Puts together the configuration from the global and local files. + * + * @param out the repository's configuration + * @param repo the repository for which to get the config + */ +GIT_EXTERN(int) git_repository_config(git_config **out, git_repository *repo); + /** @} */ GIT_END_DECL #endif diff --git a/src/config.h b/src/config.h index 8b521543c..673887e39 100644 --- a/src/config.h +++ b/src/config.h @@ -6,6 +6,7 @@ #include "vector.h" #define GIT_CONFIG_FILENAME ".gitconfig" +#define GIT_CONFIG_FILENAME_INREPO "config" struct git_config { git_vector files; diff --git a/src/repository.c b/src/repository.c index c9678f185..be089b54b 100644 --- a/src/repository.c +++ b/src/repository.c @@ -32,7 +32,7 @@ #include "tag.h" #include "blob.h" #include "fileops.h" - +#include "config.h" #include "refs.h" #define GIT_OBJECTS_INFO_DIR GIT_OBJECTS_DIR "info/" @@ -271,6 +271,42 @@ cleanup: return git__rethrow(error, "Failed to open repository"); } +int git_repository_config(git_config **out, git_repository *repo) +{ + git_config *cfg = NULL; + git_config_file *local = NULL; + char gitconfig[GIT_PATH_MAX]; + int error = GIT_SUCCESS; + + error = git_config_open_global(&cfg); + if (error < GIT_SUCCESS) + return git__rethrow(error, "Failed to open global config"); + + git__joinpath(gitconfig, repo->path_repository, GIT_CONFIG_FILENAME_INREPO); + error = git_config_file__ondisk(&local, gitconfig); + if (error < GIT_SUCCESS) { + error = git__rethrow(error, "Failed to open local config"); + goto cleanup; + } + + error = git_config_add_file(cfg, local, 2); + if (error < GIT_SUCCESS) { + error = git__rethrow(error, "Failed to add the local config"); + goto cleanup; + } + + *out = cfg; + +cleanup: + if (error < GIT_SUCCESS) { + git_config_free(cfg); + if (local) + local->free(local); + } + + return error; +} + static int discover_repository_dirs(git_repository *repo, const char *path) { int error; |
