Let core.attributesfile default to $XDG_CONFIG_HOME/git/attributes
authorHuynh Khoi Nguyen Nguyen <Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr>
Fri, 22 Jun 2012 09:03:25 +0000 (11:03 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 25 Jun 2012 16:06:15 +0000 (09:06 -0700)
This gives the default value for the core.attributesfile variable
following the exact same logic of the previous change for the
core.excludesfile setting.

Signed-off-by: Huynh Khoi Nguyen Nguyen <Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr>
Signed-off-by: Valentin Duperray <Valentin.Duperray@ensimag.imag.fr>
Signed-off-by: Franck Jonas <Franck.Jonas@ensimag.imag.fr>
Signed-off-by: Lucien Kong <Lucien.Kong@ensimag.imag.fr>
Signed-off-by: Thomas Nguy <Thomas.Nguy@ensimag.imag.fr>
Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
Documentation/gitattributes.txt
attr.c
t/t1306-xdg-files.sh

index 20e95318f3d998306d0ccbb174edc3e25ea87cf5..db07459bbb3380fb0af1b403227a95ec67f4d6f6 100644 (file)
@@ -500,7 +500,9 @@ core.attributesfile::
        In addition to '.gitattributes' (per-directory) and
        '.git/info/attributes', git looks into this file for attributes
        (see linkgit:gitattributes[5]). Path expansions are made the same
-       way as for `core.excludesfile`.
+       way as for `core.excludesfile`. Its default value is
+       $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME is either not
+       set or empty, $HOME/.config/git/attributes is used instead.
 
 core.editor::
        Commands such as `commit` and `tag` that lets you edit
index 80120ea14f1ccd2784405c2bf2d54863bb52e8d3..e16f3e175bd8915d139961c649be209b0afc535f 100644 (file)
@@ -75,6 +75,8 @@ repositories (i.e., attributes of interest to all users) should go into
 `.gitattributes` files. Attributes that should affect all repositories
 for a single user should be placed in a file specified by the
 `core.attributesfile` configuration option (see linkgit:git-config[1]).
+Its default value is $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME
+is either not set or empty, $HOME/.config/git/attributes is used instead.
 Attributes for all users on a system should be placed in the
 `$(prefix)/etc/gitattributes` file.
 
diff --git a/attr.c b/attr.c
index 303751f6c2bd4d558cffbb928c636581efb2b310..aef93d896f7e72ec534c0c2c576e418bedc5cb30 100644 (file)
--- a/attr.c
+++ b/attr.c
@@ -497,6 +497,7 @@ static int git_attr_system(void)
 static void bootstrap_attr_stack(void)
 {
        struct attr_stack *elem;
+       char *xdg_attributes_file;
 
        if (attr_stack)
                return;
@@ -515,13 +516,15 @@ static void bootstrap_attr_stack(void)
                }
        }
 
-       if (git_attributes_file) {
-               elem = read_attr_from_file(git_attributes_file, 1);
-               if (elem) {
-                       elem->origin = NULL;
-                       elem->prev = attr_stack;
-                       attr_stack = elem;
-               }
+       if (!git_attributes_file) {
+               home_config_paths(NULL, &xdg_attributes_file, "attributes");
+               git_attributes_file = xdg_attributes_file;
+       }
+       elem = read_attr_from_file(git_attributes_file, 1);
+       if (elem) {
+               elem->origin = NULL;
+               elem->prev = attr_stack;
+               attr_stack = elem;
        }
 
        if (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
index 05103f54addde966b4c450101fba3403571ec737..e8cd78a48d9824bc0bb4b99a7bb30ad407f40ddb 100755 (executable)
@@ -96,4 +96,33 @@ test_expect_success 'Exclusion in a non-XDG global ignore file' '
 '
 
 
+test_expect_success 'Checking attributes in the XDG attributes file' '
+       echo foo >f &&
+       git check-attr -a f >actual &&
+       test_line_count -eq 0 actual &&
+       echo "f attr_f" >"$HOME"/.config/git/attributes &&
+       echo "f: attr_f: set" >expected &&
+       git check-attr -a f >actual &&
+       test_cmp expected actual
+'
+
+
+test_expect_success 'Checking attributes in both XDG and local attributes files' '
+       echo "f -attr_f" >.gitattributes &&
+       echo "f: attr_f: unset" >expected &&
+       git check-attr -a f >actual &&
+       test_cmp expected actual
+'
+
+
+test_expect_success 'Checking attributes in a non-XDG global attributes file' '
+       test_might_fail rm .gitattributes &&
+       echo "f attr_f=test" >"$HOME"/my_gitattributes &&
+       git config core.attributesfile "$HOME"/my_gitattributes &&
+       echo "f: attr_f: test" >expected &&
+       git check-attr -a f >actual &&
+       test_cmp expected actual
+'
+
+
 test_done