diff options
| author | Russell Belfer <rb@github.com> | 2013-05-24 11:09:04 -0700 |
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2013-05-24 11:09:04 -0700 |
| commit | 7a5ee3dc923caf2b3b9b5e9b2408340f6ae32d7d (patch) | |
| tree | b0bac0291ac788c6771b02e4ed59e970d2c669c7 /src | |
| parent | d20b044961352348855ee82dcc77615f605ac832 (diff) | |
| download | libgit2-7a5ee3dc923caf2b3b9b5e9b2408340f6ae32d7d.tar.gz | |
Add ~ expansion to global attributes and excludes
This adds ~/ prefix expansion for the value of core.attributesfile
and core.excludesfile, plus it fixes the fact that the attributes
cache was holding on to the string data from the config for a long
time (instead of making its own strdup) which could have caused a
problem if the config was refreshed. Adds a test for the new
expansion capability.
Diffstat (limited to 'src')
| -rw-r--r-- | src/attr.c | 29 | ||||
| -rw-r--r-- | src/attrcache.h | 8 |
2 files changed, 25 insertions, 12 deletions
diff --git a/src/attr.c b/src/attr.c index 9fe4471f6..6cdff29f9 100644 --- a/src/attr.c +++ b/src/attr.c @@ -596,26 +596,33 @@ static int collect_attr_files( } static int attr_cache__lookup_path( - const char **out, git_config *cfg, const char *key, const char *fallback) + char **out, git_config *cfg, const char *key, const char *fallback) { git_buf buf = GIT_BUF_INIT; int error; + const char *cfgval = NULL; - if (!(error = git_config_get_string(out, cfg, key))) - return 0; + *out = NULL; + + if (!(error = git_config_get_string(&cfgval, cfg, key))) { + + /* expand leading ~/ as needed */ + if (cfgval && cfgval[0] == '~' && cfgval[1] == '/' && + !git_futils_find_global_file(&buf, &cfgval[2])) + *out = git_buf_detach(&buf); + else if (cfgval) + *out = git__strdup(cfgval); - if (error == GIT_ENOTFOUND) { + } else if (error == GIT_ENOTFOUND) { giterr_clear(); error = 0; if (!git_futils_find_xdg_file(&buf, fallback)) *out = git_buf_detach(&buf); - else - *out = NULL; - - git_buf_free(&buf); } + git_buf_free(&buf); + return error; } @@ -696,6 +703,12 @@ void git_attr_cache_flush( git_pool_clear(&cache->pool); + git__free(cache->cfg_attr_file); + cache->cfg_attr_file = NULL; + + git__free(cache->cfg_excl_file); + cache->cfg_excl_file = NULL; + cache->initialized = 0; } diff --git a/src/attrcache.h b/src/attrcache.h index 12cec4bfb..077633b87 100644 --- a/src/attrcache.h +++ b/src/attrcache.h @@ -13,10 +13,10 @@ typedef struct { int initialized; git_pool pool; - git_strmap *files; /* hash path to git_attr_file of rules */ - git_strmap *macros; /* hash name to vector<git_attr_assignment> */ - const char *cfg_attr_file; /* cached value of core.attributesfile */ - const char *cfg_excl_file; /* cached value of core.excludesfile */ + git_strmap *files; /* hash path to git_attr_file of rules */ + git_strmap *macros; /* hash name to vector<git_attr_assignment> */ + char *cfg_attr_file; /* cached value of core.attributesfile */ + char *cfg_excl_file; /* cached value of core.excludesfile */ } git_attr_cache; extern int git_attr_cache__init(git_repository *repo); |
