summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Strickroth <email@cs-ware.de>2012-09-24 18:59:00 +0200
committerSven Strickroth <email@cs-ware.de>2012-09-24 18:59:00 +0200
commit8b4f9b17580c52ac2b1f2f42f5c53116fb763436 (patch)
tree1f23fd905408276cd436957e11db401f1f93ad05
parent6605f51d81a9ccfb1b5a1c1689a57cf3f5b2f5b3 (diff)
downloadlibgit2-8b4f9b17580c52ac2b1f2f42f5c53116fb763436.tar.gz
Correctly read xdr compatible %HOME%/.config/git/config config file
This file is not just read if the global config file (%HOME%/.gitconfig) is not found, however, it is used everytime but with lower priority. Signed-off-by: Sven Strickroth <email@cs-ware.de>
-rw-r--r--include/git2/config.h20
-rw-r--r--src/config.c8
-rw-r--r--src/repository.c18
3 files changed, 40 insertions, 6 deletions
diff --git a/include/git2/config.h b/include/git2/config.h
index 21d8a0b05..a3202c2b1 100644
--- a/include/git2/config.h
+++ b/include/git2/config.h
@@ -61,6 +61,9 @@ typedef struct {
* may be used on any `git_config` call to load the
* global configuration file.
*
+ * This method will not guess the path to the xdr compatible
+ * config file (.config/git/config).
+ *
* @param global_config_path Buffer of GIT_PATH_MAX length to store the path
* @return 0 if a global configuration file has been
* found. Its path will be stored in `buffer`.
@@ -68,6 +71,23 @@ typedef struct {
GIT_EXTERN(int) git_config_find_global(char *global_config_path, size_t length);
/**
+ * Locate the path to the global xdr compatible configuration file
+ *
+ * The xdr compatible configuration file is usually
+ * located in `$HOME/.config/git/config`.
+ *
+ * This method will try to guess the full path to that
+ * file, if the file exists. The returned path
+ * may be used on any `git_config` call to load the
+ * global configuration file.
+ *
+ * @param global_config_path Buffer of GIT_PATH_MAX length to store the path
+ * @return 0 if a global configuration file has been
+ * found. Its path will be stored in `buffer`.
+ */
+GIT_EXTERN(int) git_config_find_xdr(char *global_config_path, size_t length);
+
+/**
* Locate the path to the system configuration file
*
* If /etc/gitconfig doesn't exist, it will look for
diff --git a/src/config.c b/src/config.c
index e62dccf51..b3d6fc69a 100644
--- a/src/config.c
+++ b/src/config.c
@@ -451,8 +451,12 @@ int git_config_find_global_r(git_buf *path)
{
int error = git_futils_find_global_file(path, GIT_CONFIG_FILENAME);
- if (error == GIT_ENOTFOUND)
- error = git_futils_find_global_file(path, GIT_CONFIG_FILENAME_ALT);
+ return error;
+}
+
+int git_config_find_xdr_r(git_buf *path)
+{
+ int error = git_futils_find_global_file(path, GIT_CONFIG_FILENAME_ALT);
return error;
}
diff --git a/src/repository.c b/src/repository.c
index 1a46db0a5..3906cb388 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -445,6 +445,7 @@ static int load_config(
git_config **out,
git_repository *repo,
const char *global_config_path,
+ const char *xdr_config_path,
const char *system_config_path)
{
git_buf config_path = GIT_BUF_INIT;
@@ -459,13 +460,18 @@ static int load_config(
&config_path, repo->path_repository, GIT_CONFIG_FILENAME_INREPO) < 0)
goto on_error;
- if (git_config_add_file_ondisk(cfg, config_path.ptr, 3) < 0)
+ if (git_config_add_file_ondisk(cfg, config_path.ptr, 4) < 0)
goto on_error;
git_buf_free(&config_path);
if (global_config_path != NULL) {
- if (git_config_add_file_ondisk(cfg, global_config_path, 2) < 0)
+ if (git_config_add_file_ondisk(cfg, global_config_path, 3) < 0)
+ goto on_error;
+ }
+
+ if (xdr_config_path != NULL) {
+ if (git_config_add_file_ondisk(cfg, xdr_config_path, 3) < 0)
goto on_error;
}
@@ -487,19 +493,23 @@ on_error:
int git_repository_config__weakptr(git_config **out, git_repository *repo)
{
if (repo->_config == NULL) {
- git_buf global_buf = GIT_BUF_INIT, system_buf = GIT_BUF_INIT;
+ git_buf global_buf = GIT_BUF_INIT, xdr_buf = GIT_BUF_INIT, system_buf = GIT_BUF_INIT;
int res;
const char *global_config_path = NULL;
+ const char *xdr_config_path = NULL;
const char *system_config_path = NULL;
if (git_config_find_global_r(&global_buf) == 0)
global_config_path = global_buf.ptr;
+ if (git_config_find_xdr_r(&xdr_buf) == 0)
+ xdr_config_path = xdr_buf.ptr;
+
if (git_config_find_system_r(&system_buf) == 0)
system_config_path = system_buf.ptr;
- res = load_config(&repo->_config, repo, global_config_path, system_config_path);
+ res = load_config(&repo->_config, repo, global_config_path, xdr_config_path, system_config_path);
git_buf_free(&global_buf);
git_buf_free(&system_buf);