1#!/bin/sh
2#
3# Copyright (c) 2006 Junio C Hamano
4#
5
6test_description='Try various core-level commands in subdirectory.
7'
8
9. ./test-lib.sh
10. "$TEST_DIRECTORY"/lib-read-tree.sh
11
12test_expect_success setup '
13	long="a b c d e f g h i j k l m n o p q r s t u v w x y z" &&
14	for c in $long; do echo $c; done >one &&
15	mkdir dir &&
16	for c in x y z $long a b c; do echo $c; done >dir/two &&
17	cp one original.one &&
18	cp dir/two original.two
19'
20
21test_expect_success 'update-index and ls-files' '
22	git update-index --add one &&
23	case "$(git ls-files)" in
24	one) echo pass one ;;
25	*) echo bad one; exit 1 ;;
26	esac &&
27	(
28		cd dir &&
29		git update-index --add two &&
30		case "$(git ls-files)" in
31		two) echo pass two ;;
32		*) echo bad two; exit 1 ;;
33		esac
34	) &&
35	case "$(git ls-files)" in
36	dir/two"$LF"one) echo pass both ;;
37	*) echo bad; exit 1 ;;
38	esac
39'
40
41test_expect_success 'cat-file' '
42	two=$(git ls-files -s dir/two) &&
43	two=$(expr "$two" : "[0-7]* \\([0-9a-f]*\\)") &&
44	echo "$two" &&
45	git cat-file -p "$two" >actual &&
46	cmp dir/two actual &&
47	(
48		cd dir &&
49		git cat-file -p "$two" >actual &&
50		cmp two actual
51	)
52'
53rm -f actual dir/actual
54
55test_expect_success 'diff-files' '
56	echo a >>one &&
57	echo d >>dir/two &&
58	case "$(git diff-files --name-only)" in
59	dir/two"$LF"one) echo pass top ;;
60	*) echo bad top; exit 1 ;;
61	esac &&
62	# diff should not omit leading paths
63	(
64		cd dir &&
65		case "$(git diff-files --name-only)" in
66		dir/two"$LF"one) echo pass subdir ;;
67		*) echo bad subdir; exit 1 ;;
68		esac &&
69		case "$(git diff-files --name-only .)" in
70		dir/two) echo pass subdir limited ;;
71		*) echo bad subdir limited; exit 1 ;;
72		esac
73	)
74'
75
76test_expect_success 'write-tree' '
77	top=$(git write-tree) &&
78	echo $top &&
79	(
80		cd dir &&
81		sub=$(git write-tree) &&
82		echo $sub &&
83		test "z$top" = "z$sub"
84	)
85'
86
87test_expect_success 'checkout-index' '
88	git checkout-index -f -u one &&
89	cmp one original.one &&
90	(
91		cd dir &&
92		git checkout-index -f -u two &&
93		cmp two ../original.two
94	)
95'
96
97test_expect_success 'read-tree' '
98	rm -f one dir/two &&
99	tree=$(git write-tree) &&
100	read_tree_u_must_succeed --reset -u "$tree" &&
101	cmp one original.one &&
102	cmp dir/two original.two &&
103	(
104		cd dir &&
105		rm -f two &&
106		read_tree_u_must_succeed --reset -u "$tree" &&
107		cmp two ../original.two &&
108		cmp ../one ../original.one
109	)
110'
111
112test_expect_success 'alias expansion' '
113	(
114		git config alias.test-status-alias status &&
115		cd dir &&
116		git status &&
117		git test-status-alias
118	)
119'
120
121test_expect_success !MINGW '!alias expansion' '
122	pwd >expect &&
123	(
124		git config alias.test-alias-directory !pwd &&
125		cd dir &&
126		git test-alias-directory >../actual
127	) &&
128	test_cmp expect actual
129'
130
131test_expect_success 'GIT_PREFIX for !alias' '
132	printf "dir/" >expect &&
133	(
134		git config alias.test-alias-directory "!sh -c \"printf \$GIT_PREFIX\"" &&
135		cd dir &&
136		git test-alias-directory >../actual
137	) &&
138	test_cmp expect actual
139'
140
141test_expect_success 'GIT_PREFIX for built-ins' '
142	# Use GIT_EXTERNAL_DIFF to test that the "diff" built-in
143	# receives the GIT_PREFIX variable.
144	echo "dir/" >expect &&
145	write_script diff <<-\EOF &&
146	printf "%s\n" "$GIT_PREFIX"
147	EOF
148	(
149		cd dir &&
150		echo "change" >two &&
151		GIT_EXTERNAL_DIFF=./diff git diff >../actual &&
152		git checkout -- two
153	) &&
154	test_cmp expect actual
155'
156
157test_expect_success 'no file/rev ambiguity check inside .git' '
158	git commit -a -m 1 &&
159	(
160		cd .git &&
161		git show -s HEAD
162	)
163'
164
165test_expect_success 'no file/rev ambiguity check inside a bare repo (explicit GIT_DIR)' '
166	test_when_finished "rm -fr foo.git" &&
167	git clone -s --bare .git foo.git &&
168	(
169		cd foo.git &&
170		# older Git needed help by exporting GIT_DIR=.
171		# to realize that it is inside a bare repository.
172		# We keep this test around for regression testing.
173		GIT_DIR=. git show -s HEAD
174	)
175'
176
177test_expect_success 'no file/rev ambiguity check inside a bare repo' '
178	test_when_finished "rm -fr foo.git" &&
179	git clone -s --bare .git foo.git &&
180	(
181		cd foo.git &&
182		git show -s HEAD
183	)
184'
185
186test_expect_success SYMLINKS 'detection should not be fooled by a symlink' '
187	git clone -s .git another &&
188	ln -s another yetanother &&
189	(
190		cd yetanother/.git &&
191		git show -s HEAD
192	)
193'
194
195test_done
196