Commit 7fbca880aa5c011257ef734d0b5bfd5545dbaf6b

Russell Belfer 2012-08-24T14:32:45

Support new config locations As of git v1.7.12, $HOME/.config/git/ is supported as a new location for "config", "attributes", and "ignore" files.

diff --git a/src/attr.c b/src/attr.c
index 8a7ff28..9932206 100644
--- a/src/attr.c
+++ b/src/attr.c
@@ -590,6 +590,18 @@ static int collect_attr_files(
 	return error;
 }
 
+static char *try_global_default(const char *relpath)
+{
+	git_buf dflt = GIT_BUF_INIT;
+	char *rval = NULL;
+
+	if (!git_futils_find_global_file(&dflt, relpath))
+		rval = git_buf_detach(&dflt);
+
+	git_buf_free(&dflt);
+
+	return rval;
+}
 
 int git_attr_cache__init(git_repository *repo)
 {
@@ -607,20 +619,14 @@ int git_attr_cache__init(git_repository *repo)
 	ret = git_config_get_string(&cache->cfg_attr_file, cfg, GIT_ATTR_CONFIG);
 	if (ret < 0 && ret != GIT_ENOTFOUND)
 		return ret;
+	if (ret == GIT_ENOTFOUND)
+		cache->cfg_attr_file = try_global_default(GIT_ATTR_CONFIG_DEFAULT);
 
 	ret = git_config_get_string(&cache->cfg_excl_file, cfg, GIT_IGNORE_CONFIG);
 	if (ret < 0 && ret != GIT_ENOTFOUND)
 		return ret;
-
-	if (ret == GIT_ENOTFOUND) {
-		git_buf dflt = GIT_BUF_INIT;
-
-		ret = git_futils_find_global_file(&dflt, GIT_IGNORE_CONFIG_DEFAULT);
-		if (!ret)
-			cache->cfg_excl_file = git_buf_detach(&dflt);
-
-		git_buf_free(&dflt);
-	}
+	if (ret == GIT_ENOTFOUND)
+		cache->cfg_excl_file = try_global_default(GIT_IGNORE_CONFIG_DEFAULT);
 
 	giterr_clear();
 
diff --git a/src/attr.h b/src/attr.h
index 78cfb57..7589bb1 100644
--- a/src/attr.h
+++ b/src/attr.h
@@ -11,6 +11,7 @@
 #include "strmap.h"
 
 #define GIT_ATTR_CONFIG   "core.attributesfile"
+#define GIT_ATTR_CONFIG_DEFAULT ".config/git/attributes"
 #define GIT_IGNORE_CONFIG "core.excludesfile"
 #define GIT_IGNORE_CONFIG_DEFAULT ".config/git/ignore"
 
diff --git a/src/config.c b/src/config.c
index 277daaa..e62dccf 100644
--- a/src/config.c
+++ b/src/config.c
@@ -449,7 +449,12 @@ int git_config_set_multivar(git_config *cfg, const char *name, const char *regex
 
 int git_config_find_global_r(git_buf *path)
 {
-	return git_futils_find_global_file(path, GIT_CONFIG_FILENAME);
+	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_global(char *global_config_path, size_t length)
diff --git a/src/config.h b/src/config.h
index 82e98ce..5475ef3 100644
--- a/src/config.h
+++ b/src/config.h
@@ -13,6 +13,7 @@
 #include "repository.h"
 
 #define GIT_CONFIG_FILENAME ".gitconfig"
+#define GIT_CONFIG_FILENAME_ALT ".config/git/config"
 #define GIT_CONFIG_FILENAME_INREPO "config"
 #define GIT_CONFIG_FILENAME_SYSTEM "gitconfig"
 #define GIT_CONFIG_FILE_MODE 0666