cache.h: Introduce a generic "xdg_config_home_for(…)" function

Current implementation of `xdg_config_home(filename)` returns `$XDG_CONFIG_HOME/git/$filename`, with the `git` subdirectory inserted between the `XDG_CONFIG_HOME` environment variable and the parameter. This patch introduces a `xdg_config_home_for(subdir, filename)` function which is more generic. It only concatenates "$XDG_CONFIG_HOME", or "$HOME/.config" if the former isn’t defined, with the parameters, without adding `git` in between. `xdg_config_home(filename)` is now implemented by calling `xdg_config_home_for("git", filename)` but this new generic function can be used to compute the configuration directory of other programs. Signed-off-by: Lénaïc Huard <lenaic@lhuard.fr> Acked-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Lénaïc Huard committed Sep 4, 2021 at 22:54 UTC cb7db5bbd56f587a35c1861282c46d424fee0b38
2 files changed +17 -3
cache.h
+7
@@ -1286,6 +1286,13 @@ int is_ntfs_dotmailmap(const char *name);
1286 */
1287 int looks_like_command_line_option(const char *str);
1288
1289 +/**
1290 + * Return a newly allocated string with the evaluation of
1291 + * "$XDG_CONFIG_HOME/$subdir/$filename" if $XDG_CONFIG_HOME is non-empty, otherwise
1292 + * "$HOME/.config/$subdir/$filename". Return NULL upon error.
1293 + */
1294 +char *xdg_config_home_for(const char *subdir, const char *filename);
1295 +
1296 /**
1297 * Return a newly allocated string with the evaluation of
1298 * "$XDG_CONFIG_HOME/git/$filename" if $XDG_CONFIG_HOME is non-empty, otherwise
path.c
+10 -3
@@ -1503,21 +1503,28 @@ int looks_like_command_line_option(const char *str)
1503 return str && str[0] == '-';
1504 }
1505
1506 -char *xdg_config_home(const char *filename)
1506 +char *xdg_config_home_for(const char *subdir, const char *filename)
1507 {
1508 const char *home, *config_home;
1509
1510 + assert(subdir);
1511 assert(filename);
1512 config_home = getenv("XDG_CONFIG_HOME");
1513 if (config_home && *config_home)
1513 - return mkpathdup("%s/git/%s", config_home, filename);
1514 + return mkpathdup("%s/%s/%s", config_home, subdir, filename);
1515
1516 home = getenv("HOME");
1517 if (home)
1517 - return mkpathdup("%s/.config/git/%s", home, filename);
1518 + return mkpathdup("%s/.config/%s/%s", home, subdir, filename);
1519 +
1520 return NULL;
1521 }
1522
1523 +char *xdg_config_home(const char *filename)
1524 +{
1525 + return xdg_config_home_for("git", filename);
1526 +}
1527 +
1528 char *xdg_cache_home(const char *filename)
1529 {
1530 const char *home, *cache_home;