1#!/bin/sh
2#
3# Copyright (c) 2012 Valentin Duperray, Lucien Kong, Franck Jonas,
4#		     Thomas Nguy, Khoi Nguyen
5#		     Grenoble INP Ensimag
6#
7
8test_description='Compatibility with $XDG_CONFIG_HOME/git/ files'
9
10. ./test-lib.sh
11
12test_expect_success 'read config: xdg file exists and ~/.gitconfig doesn'\''t' '
13	mkdir -p .config/git &&
14	echo "[alias]" >.config/git/config &&
15	echo "	myalias = !echo in_config" >>.config/git/config &&
16	echo in_config >expected &&
17	git myalias >actual &&
18	test_cmp expected actual
19'
20
21
22test_expect_success 'read config: xdg file exists and ~/.gitconfig exists' '
23	>.gitconfig &&
24	echo "[alias]" >.gitconfig &&
25	echo "	myalias = !echo in_gitconfig" >>.gitconfig &&
26	echo in_gitconfig >expected &&
27	git myalias >actual &&
28	test_cmp expected actual
29'
30
31
32test_expect_success 'read with --get: xdg file exists and ~/.gitconfig doesn'\''t' '
33	rm .gitconfig &&
34	echo "[user]" >.config/git/config &&
35	echo "	name = read_config" >>.config/git/config &&
36	echo read_config >expected &&
37	git config --get user.name >actual &&
38	test_cmp expected actual
39'
40
41test_expect_success '"$XDG_CONFIG_HOME overrides $HOME/.config/git' '
42	mkdir -p "$HOME"/xdg/git &&
43	echo "[user]name = in_xdg" >"$HOME"/xdg/git/config &&
44	echo in_xdg >expected &&
45	XDG_CONFIG_HOME="$HOME"/xdg git config --get-all user.name >actual &&
46	test_cmp expected actual
47'
48
49test_expect_success 'read with --get: xdg file exists and ~/.gitconfig exists' '
50	>.gitconfig &&
51	echo "[user]" >.gitconfig &&
52	echo "	name = read_gitconfig" >>.gitconfig &&
53	echo read_gitconfig >expected &&
54	git config --get user.name >actual &&
55	test_cmp expected actual
56'
57
58
59test_expect_success 'read with --list: xdg file exists and ~/.gitconfig doesn'\''t' '
60	rm .gitconfig &&
61	echo user.name=read_config >expected &&
62	git config --global --list >actual &&
63	test_cmp expected actual
64'
65
66
67test_expect_success 'read with --list: xdg file exists and ~/.gitconfig exists' '
68	>.gitconfig &&
69	echo "[user]" >.gitconfig &&
70	echo "	name = read_gitconfig" >>.gitconfig &&
71	echo user.name=read_gitconfig >expected &&
72	git config --global --list >actual &&
73	test_cmp expected actual
74'
75
76
77test_expect_success 'Setup' '
78	git init git &&
79	cd git &&
80	echo foo >to_be_excluded
81'
82
83
84test_expect_success 'Exclusion of a file in the XDG ignore file' '
85	mkdir -p "$HOME"/.config/git/ &&
86	echo to_be_excluded >"$HOME"/.config/git/ignore &&
87	test_must_fail git add to_be_excluded
88'
89
90test_expect_success '$XDG_CONFIG_HOME overrides $HOME/.config/git/ignore' '
91	mkdir -p "$HOME"/xdg/git &&
92	echo content >excluded_by_xdg_only &&
93	echo excluded_by_xdg_only >"$HOME"/xdg/git/ignore &&
94	test_when_finished "git read-tree --empty" &&
95	(XDG_CONFIG_HOME="$HOME/xdg" &&
96	 export XDG_CONFIG_HOME &&
97	 git add to_be_excluded &&
98	 test_must_fail git add excluded_by_xdg_only
99	)
100'
101
102test_expect_success 'Exclusion in both XDG and local ignore files' '
103	echo to_be_excluded >.gitignore &&
104	test_must_fail git add to_be_excluded
105'
106
107
108test_expect_success 'Exclusion in a non-XDG global ignore file' '
109	rm .gitignore &&
110	echo >"$HOME"/.config/git/ignore &&
111	echo to_be_excluded >"$HOME"/my_gitignore &&
112	git config core.excludesfile "$HOME"/my_gitignore &&
113	test_must_fail git add to_be_excluded
114'
115
116test_expect_success 'Checking XDG ignore file when HOME is unset' '
117	(sane_unset HOME &&
118	 git config --unset core.excludesfile &&
119	 git ls-files --exclude-standard --ignored --others >actual) &&
120	test_must_be_empty actual
121'
122
123test_expect_success 'Checking attributes in the XDG attributes file' '
124	echo foo >f &&
125	git check-attr -a f >actual &&
126	test_line_count -eq 0 actual &&
127	echo "f attr_f" >"$HOME"/.config/git/attributes &&
128	echo "f: attr_f: set" >expected &&
129	git check-attr -a f >actual &&
130	test_cmp expected actual
131'
132
133test_expect_success 'Checking XDG attributes when HOME is unset' '
134	(sane_unset HOME &&
135	 git check-attr -a f >actual) &&
136	test_must_be_empty actual
137'
138
139test_expect_success '$XDG_CONFIG_HOME overrides $HOME/.config/git/attributes' '
140	mkdir -p "$HOME"/xdg/git &&
141	echo "f attr_f=xdg" >"$HOME"/xdg/git/attributes &&
142	echo "f: attr_f: xdg" >expected &&
143	XDG_CONFIG_HOME="$HOME/xdg" git check-attr -a f >actual &&
144	test_cmp expected actual
145'
146
147test_expect_success 'Checking attributes in both XDG and local attributes files' '
148	echo "f -attr_f" >.gitattributes &&
149	echo "f: attr_f: unset" >expected &&
150	git check-attr -a f >actual &&
151	test_cmp expected actual
152'
153
154
155test_expect_success 'Checking attributes in a non-XDG global attributes file' '
156	rm -f .gitattributes &&
157	echo "f attr_f=test" >"$HOME"/my_gitattributes &&
158	git config core.attributesfile "$HOME"/my_gitattributes &&
159	echo "f: attr_f: test" >expected &&
160	git check-attr -a f >actual &&
161	test_cmp expected actual
162'
163
164
165test_expect_success 'write: xdg file exists and ~/.gitconfig doesn'\''t' '
166	mkdir -p "$HOME"/.config/git &&
167	>"$HOME"/.config/git/config &&
168	rm -f "$HOME"/.gitconfig &&
169	git config --global user.name "write_config" &&
170	echo "[user]" >expected &&
171	echo "	name = write_config" >>expected &&
172	test_cmp expected "$HOME"/.config/git/config
173'
174
175
176test_expect_success 'write: xdg file exists and ~/.gitconfig exists' '
177	>"$HOME"/.gitconfig &&
178	git config --global user.name "write_gitconfig" &&
179	echo "[user]" >expected &&
180	echo "	name = write_gitconfig" >>expected &&
181	test_cmp expected "$HOME"/.gitconfig
182'
183
184
185test_expect_success 'write: ~/.config/git/ exists and config file doesn'\''t' '
186	rm -f "$HOME"/.gitconfig &&
187	rm -f "$HOME"/.config/git/config &&
188	git config --global user.name "write_gitconfig" &&
189	echo "[user]" >expected &&
190	echo "	name = write_gitconfig" >>expected &&
191	test_cmp expected "$HOME"/.gitconfig
192'
193
194
195test_done
196