Merge branch 'pt/xdg-config-path'
authorJunio C Hamano <gitster@pobox.com>
Mon, 11 May 2015 21:24:01 +0000 (14:24 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 11 May 2015 21:24:01 +0000 (14:24 -0700)
Code clean-up for xdg configuration path support.

* pt/xdg-config-path:
path.c: remove home_config_paths()
git-config: replace use of home_config_paths()
git-commit: replace use of home_config_paths()
credential-store.c: replace home_config_paths() with xdg_config_home()
dir.c: replace home_config_paths() with xdg_config_home()
attr.c: replace home_config_paths() with xdg_config_home()
path.c: implement xdg_config_home()

attr.c
builtin/commit.c
builtin/config.c
cache.h
config.c
credential-store.c
dir.c
path.c
diff --git a/attr.c b/attr.c
index 7f445965c1886fe8cb53966969b48f4b0bde4826..8f2ac6c88c8c2f7cff514981a7c01c136f734892 100644 (file)
--- a/attr.c
+++ b/attr.c
@@ -493,7 +493,6 @@ static int git_attr_system(void)
 static void bootstrap_attr_stack(void)
 {
        struct attr_stack *elem;
-       char *xdg_attributes_file;
 
        if (attr_stack)
                return;
@@ -512,10 +511,8 @@ static void bootstrap_attr_stack(void)
                }
        }
 
-       if (!git_attributes_file) {
-               home_config_paths(NULL, &xdg_attributes_file, "attributes");
-               git_attributes_file = xdg_attributes_file;
-       }
+       if (!git_attributes_file)
+               git_attributes_file = xdg_config_home("attributes");
        if (git_attributes_file) {
                elem = read_attr_from_file(git_attributes_file, 1);
                if (elem) {
index 310674cfd0f25c52b9952678eeb3ee164fd97fea..d6515a2a50e78e9376f1b55fa6fe79b1e867f25c 100644 (file)
@@ -1398,12 +1398,10 @@ int cmd_status(int argc, const char **argv, const char *prefix)
 
 static const char *implicit_ident_advice(void)
 {
-       char *user_config = NULL;
-       char *xdg_config = NULL;
-       int config_exists;
+       char *user_config = expand_user_path("~/.gitconfig");
+       char *xdg_config = xdg_config_home("config");
+       int config_exists = file_exists(user_config) || file_exists(xdg_config);
 
-       home_config_paths(&user_config, &xdg_config, "config");
-       config_exists = file_exists(user_config) || file_exists(xdg_config);
        free(user_config);
        free(xdg_config);
 
index 28f57c8fb96c61151042a670ee70722eb8ead143..7188405f7ef587d7b09b1cf2c6e422c8385ed794 100644 (file)
@@ -488,10 +488,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        }
 
        if (use_global_config) {
-               char *user_config = NULL;
-               char *xdg_config = NULL;
-
-               home_config_paths(&user_config, &xdg_config, "config");
+               char *user_config = expand_user_path("~/.gitconfig");
+               char *xdg_config = xdg_config_home("config");
 
                if (!user_config)
                        /*
diff --git a/cache.h b/cache.h
index 5970940743618fcee3490a2d082b46e934ee2e3d..54f108a28fc0442c7c4c053f5ad2a24c40037bd0 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -851,7 +851,6 @@ enum scld_error safe_create_leading_directories(char *path);
 enum scld_error safe_create_leading_directories_const(const char *path);
 
 int mkdir_in_gitdir(const char *path);
-extern void home_config_paths(char **global, char **xdg, char *file);
 extern char *expand_user_path(const char *path);
 const char *enter_repo(const char *path, int strict);
 static inline int is_absolute_path(const char *path)
@@ -871,6 +870,13 @@ char *strip_path_suffix(const char *path, const char *suffix);
 int daemon_avoid_alias(const char *path);
 extern int is_ntfs_dotgit(const char *name);
 
+/**
+ * Return a newly allocated string with the evaluation of
+ * "$XDG_CONFIG_HOME/git/$filename" if $XDG_CONFIG_HOME is non-empty, otherwise
+ * "$HOME/.config/git/$filename". Return NULL upon error.
+ */
+extern char *xdg_config_home(const char *filename);
+
 /* object replacement */
 #define LOOKUP_REPLACE_OBJECT 1
 extern void *read_sha1_file_extended(const unsigned char *sha1, enum object_type *type, unsigned long *size, unsigned flag);
index 6d0098fc80df01ce9df4701119557472430b0619..ab46462e151dd5cd9d1e5a1fecd23fe5c6607c5d 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1187,10 +1187,8 @@ int git_config_system(void)
 int git_config_early(config_fn_t fn, void *data, const char *repo_config)
 {
        int ret = 0, found = 0;
-       char *xdg_config = NULL;
-       char *user_config = NULL;
-
-       home_config_paths(&user_config, &xdg_config, "config");
+       char *xdg_config = xdg_config_home("config");
+       char *user_config = expand_user_path("~/.gitconfig");
 
        if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0)) {
                ret += git_config_from_file(fn, git_etc_gitconfig(),
index 8b222513cb9ad2b4519c89019566cd2c2080a3a6..f6925096ffa7e036b4e63f65ce372c596c9e1b70 100644 (file)
@@ -170,7 +170,7 @@ int main(int argc, char **argv)
        } else {
                if ((file = expand_user_path("~/.git-credentials")))
                        string_list_append_nodup(&fns, file);
-               home_config_paths(NULL, &file, "credentials");
+               file = xdg_config_home("credentials");
                if (file)
                        string_list_append_nodup(&fns, file);
        }
diff --git a/dir.c b/dir.c
index a3e70734004e5da22dce9ba4062c0d6684061855..0c38d8601448053f94eca534833d47a975580856 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -1671,14 +1671,11 @@ int remove_dir_recursively(struct strbuf *path, int flag)
 void setup_standard_excludes(struct dir_struct *dir)
 {
        const char *path;
-       char *xdg_path;
 
        dir->exclude_per_dir = ".gitignore";
        path = git_path("info/exclude");
-       if (!excludes_file) {
-               home_config_paths(NULL, &xdg_path, "ignore");
-               excludes_file = xdg_path;
-       }
+       if (!excludes_file)
+               excludes_file = xdg_config_home("ignore");
        if (!access_or_warn(path, R_OK, 0))
                add_excludes_from_file(dir, path);
        if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
diff --git a/path.c b/path.c
index 586f2c90a3c0def34016a692a14e335a46c015ed..10f4cbf6b78607870461f21dd1cd0f7a2776bc49 100644 (file)
--- a/path.c
+++ b/path.c
@@ -224,34 +224,6 @@ const char *mkpath(const char *fmt, ...)
        return cleanup_path(pathname->buf);
 }
 
-void home_config_paths(char **global, char **xdg, char *file)
-{
-       char *xdg_home = getenv("XDG_CONFIG_HOME");
-       char *home = getenv("HOME");
-       char *to_free = NULL;
-
-       if (!home) {
-               if (global)
-                       *global = NULL;
-       } else {
-               if (!xdg_home) {
-                       to_free = mkpathdup("%s/.config", home);
-                       xdg_home = to_free;
-               }
-               if (global)
-                       *global = mkpathdup("%s/.gitconfig", home);
-       }
-
-       if (xdg) {
-               if (!xdg_home)
-                       *xdg = NULL;
-               else
-                       *xdg = mkpathdup("%s/git/%s", xdg_home, file);
-       }
-
-       free(to_free);
-}
-
 const char *git_path_submodule(const char *path, const char *fmt, ...)
 {
        struct strbuf *buf = get_pathname();
@@ -931,3 +903,18 @@ int is_ntfs_dotgit(const char *name)
                        len = -1;
                }
 }
+
+char *xdg_config_home(const char *filename)
+{
+       const char *home, *config_home;
+
+       assert(filename);
+       config_home = getenv("XDG_CONFIG_HOME");
+       if (config_home && *config_home)
+               return mkpathdup("%s/git/%s", config_home, filename);
+
+       home = getenv("HOME");
+       if (home)
+               return mkpathdup("%s/.config/git/%s", home, filename);
+       return NULL;
+}