From 7fbca880aa5c011257ef734d0b5bfd5545dbaf6b Mon Sep 17 00:00:00 2001 From: Russell Belfer Date: Fri, 24 Aug 2012 14:32:45 -0700 Subject: [PATCH] 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. --- src/attr.c | 26 ++++++++++++++++---------- src/attr.h | 1 + src/config.c | 7 ++++++- src/config.h | 1 + 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/attr.c b/src/attr.c index 8a7ff28c5..993220667 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 78cfb57c6..7589bb10a 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 277daaafe..e62dccf51 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 82e98ce51..5475ef384 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