diff --git a/Documentation/git-var.txt b/Documentation/git-var.txt
index f0f647e14a..dfbe5cb52b 100644
--- a/Documentation/git-var.txt
+++ b/Documentation/git-var.txt
@@ -74,6 +74,12 @@ GIT_DEFAULT_BRANCH::
GIT_SHELL_PATH::
The path of the binary providing the POSIX shell for commands which use the shell.
+GIT_ATTR_SYSTEM::
+ The path to the system linkgit:gitattributes[5] file, if one is enabled.
+
+GIT_ATTR_GLOBAL::
+ The path to the global (per-user) linkgit:gitattributes[5] file.
+
SEE ALSO
--------
linkgit:git-commit-tree[1]diff --git a/attr.c b/attr.c
index d45d34058d..822d214053 100644
--- a/attr.c
+++ b/attr.c
@@ -870,7 +870,7 @@ static struct attr_stack *read_attr(struct index_state *istate,
return res;
}
-static const char *git_etc_gitattributes(void)
+const char *git_etc_gitattributes(void)
{
static const char *system_wide;
if (!system_wide)@@ -878,7 +878,7 @@ static const char *git_etc_gitattributes(void)
return system_wide;
}
-static const char *get_home_gitattributes(void)
+const char *get_home_gitattributes(void)
{
if (!git_attributes_file)
git_attributes_file = xdg_config_home("attributes");@@ -886,7 +886,7 @@ static const char *get_home_gitattributes(void)
return git_attributes_file;
}
-static int git_attr_system(void)
+int git_attr_system(void)
{
return !git_env_bool("GIT_ATTR_NOSYSTEM", 0);
}diff --git a/attr.h b/attr.h
index 676bd17ce2..05a2e4c622 100644
--- a/attr.h
+++ b/attr.h
@@ -227,4 +227,8 @@ void git_attr_set_direction(enum git_attr_direction new_direction);
void attr_start(void);
+const char *git_etc_gitattributes(void);
+const char *get_home_gitattributes(void);
+int git_attr_system(void);
+
#endif /* ATTR_H */
diff --git a/builtin/var.c b/builtin/var.c
index f97178eed1..b9e2f23697 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -4,6 +4,7 @@
* Copyright (C) Eric Biederman, 2005
*/
#include "builtin.h"
+#include "attr.h"
#include "config.h"
#include "editor.h"
#include "ident.h"
@@ -41,18 +42,41 @@ static const char *shell_path(int flag)
return SHELL_PATH;
}
+static const char *git_attr_val_system(int flag)
+{
+ if (git_attr_system()) {
+ char *file = xstrdup(git_etc_gitattributes());
+ normalize_path_copy(file, file);
+ return file;
+ }
+ return NULL;
+}
+
+static const char *git_attr_val_global(int flag)
+{
+ char *file = xstrdup(get_home_gitattributes());
+ if (file) {
+ normalize_path_copy(file, file);
+ return file;
+ }
+ return NULL;
+}
+
struct git_var {
const char *name;
const char *(*read)(int);
+ int free;
};
static struct git_var git_vars[] = {
- { "GIT_COMMITTER_IDENT", git_committer_info },
- { "GIT_AUTHOR_IDENT", git_author_info },
- { "GIT_EDITOR", editor },
- { "GIT_SEQUENCE_EDITOR", sequence_editor },
- { "GIT_PAGER", pager },
- { "GIT_DEFAULT_BRANCH", default_branch },
- { "GIT_SHELL_PATH", shell_path },
+ { "GIT_COMMITTER_IDENT", git_committer_info, 0 },
+ { "GIT_AUTHOR_IDENT", git_author_info, 0 },
+ { "GIT_EDITOR", editor, 0 },
+ { "GIT_SEQUENCE_EDITOR", sequence_editor, 0 },
+ { "GIT_PAGER", pager, 0 },
+ { "GIT_DEFAULT_BRANCH", default_branch, 0 },
+ { "GIT_SHELL_PATH", shell_path, 0 },
+ { "GIT_ATTR_SYSTEM", git_attr_val_system, 1 },
+ { "GIT_ATTR_GLOBAL", git_attr_val_global, 1 },
{ "", NULL },
};
@@ -62,8 +86,11 @@ static void list_vars(void)
const char *val;
for (ptr = git_vars; ptr->read; ptr++)
- if ((val = ptr->read(0)))
+ if ((val = ptr->read(0))) {
printf("%s=%s\n", ptr->name, val);
+ if (ptr->free)
+ free((void *)val);
+ }
}
static const struct git_var *get_git_var(const char *var)@@ -110,6 +137,8 @@ int cmd_var(int argc, const char **argv, const char *prefix UNUSED)
return 1;
printf("%s\n", val);
+ if (git_var->free)
+ free((void *)val);
return 0;
}diff --git a/t/t0007-git-var.sh b/t/t0007-git-var.sh
index 270bd4e512..6a2cc94abb 100755
--- a/t/t0007-git-var.sh
+++ b/t/t0007-git-var.sh
@@ -159,6 +159,26 @@ test_expect_success MINGW 'GIT_SHELL_PATH points to a suitable shell' '
grep "sh\$" shell
'
+test_expect_success 'GIT_ATTR_SYSTEM points to the correct location' '
+ test_must_fail env GIT_ATTR_NOSYSTEM=1 git var GIT_ATTR_SYSTEM &&
+ (
+ sane_unset GIT_ATTR_NOSYSTEM &&
+ git var GIT_ATTR_SYSTEM >path &&
+ test "$(cat path)" != ""
+ )
+'
+
+test_expect_success 'GIT_ATTR_GLOBAL points to the correct location' '
+ TRASHDIR="$(test-tool path-utils normalize_path_copy "$(pwd)")" &&
+ XDG_CONFIG_HOME="$TRASHDIR/.config" git var GIT_ATTR_GLOBAL >path &&
+ test "$(cat path)" = "$TRASHDIR/.config/git/attributes" &&
+ (
+ sane_unset XDG_CONFIG_HOME &&
+ HOME="$TRASHDIR" git var GIT_ATTR_GLOBAL >path &&
+ test "$(cat path)" = "$TRASHDIR/.config/git/attributes"
+ )
+'
+
# For git var -l, we check only a representative variable;
# testing the whole output would make our test too brittle with
# respect to unrelated changes in the test suite's environment.