3 # Copyright (c) 2005 Junio C Hamano
6 test_description
='Test the very basics part #1.
8 The rest of the test suite does not check the basic operation of git
9 plumbing commands to work very carefully. Their job is to concentrate
10 on tricky features that caused bugs in the past to detect regression.
12 This test runs very basic features, like registering things in cache,
15 Note that this test *deliberately* hard-codes many expected object
16 IDs. When object ID computation changes, like in the previous case of
17 swapping compression and hashing order, the person who is making the
18 modification *should* take notice and update the test vectors here.
23 ################################################################
24 # git init has been done in an empty repository.
25 # make sure it is empty.
27 test_expect_success
'.git/objects should be empty after git init in an empty repo' '
28 find .git/objects -type f -print >should-be-empty &&
29 test_line_count = 0 should-be-empty
32 # also it should have 2 subdirectories; no fan-out anymore, pack, and info.
33 # 3 is counting "objects" itself
34 test_expect_success
'.git/objects should have 3 subdirectories' '
35 find .git/objects -type d -print >full-of-directories &&
36 test_line_count = 3 full-of-directories
39 ################################################################
41 test_expect_success
'success is reported like this' '
44 test_expect_failure
'pretend we have a known breakage' '
48 test_expect_success
'pretend we have fixed a known breakage (run in sub test-lib)' "
51 cat >passing-todo.sh <<-EOF &&
54 test_description='A passing TODO test
56 This is run in a sub test-lib so that we do not get incorrect
60 # Point to the t/test-lib.sh, which isn't in ../ as usual
61 TEST_DIRECTORY=\"$TEST_DIRECTORY\"
62 . \"\$TEST_DIRECTORY\"/test-lib.sh
64 test_expect_failure 'pretend we have fixed a known breakage' '
70 chmod +x passing-todo.sh &&
71 ./passing-todo.sh >out 2>err &&
73 sed -e 's/^> //' >expect <<-\\EOF &&
74 > ok 1 - pretend we have fixed a known breakage # TODO known breakage
75 > # fixed 1 known breakage(s)
76 > # passed all 1 test(s)
81 test_set_prereq HAVEIT
83 test_expect_success HAVEIT
'test runs if prerequisite is satisfied' '
84 test_have_prereq HAVEIT &&
88 test_expect_success DONTHAVEIT
'unmet prerequisite causes test to be skipped' '
91 if test $haveit$donthaveit != yesyes
93 say
"bug in test framework: prerequisite tags do not work reliably"
97 test_set_prereq HAVETHIS
99 test_expect_success HAVETHIS
,HAVEIT
'test runs if prerequisites are satisfied' '
100 test_have_prereq HAVEIT &&
101 test_have_prereq HAVETHIS &&
105 test_expect_success HAVEIT
,DONTHAVEIT
'unmet prerequisites causes test to be skipped' '
109 test_expect_success DONTHAVEIT
,HAVEIT
'unmet prerequisites causes test to be skipped' '
112 if test $haveit$donthaveit$donthaveiteither != yesyesyes
114 say
"bug in test framework: multiple prerequisite tags do not work reliably"
119 test_expect_success
'tests clean up after themselves' '
120 test_when_finished clean=yes
123 if test $clean != yes
125 say
"bug in test framework: basic cleanup command does not work reliably"
129 test_expect_success
'tests clean up even on failures' "
130 mkdir failing-cleanup &&
132 cd failing-cleanup &&
134 cat >failing-cleanup.sh <<-EOF &&
137 test_description='Failing tests with cleanup commands'
139 # Point to the t/test-lib.sh, which isn't in ../ as usual
140 TEST_DIRECTORY=\"$TEST_DIRECTORY\"
141 . \"\$TEST_DIRECTORY\"/test-lib.sh
143 test_expect_success 'tests clean up even after a failure' '
144 touch clean-after-failure &&
145 test_when_finished rm clean-after-failure &&
148 test_expect_success 'failure to clean up causes the test to fail' '
149 test_when_finished \"(exit 2)\"
155 chmod +x failing-cleanup.sh &&
156 test_must_fail ./failing-cleanup.sh >out 2>err &&
158 ! test -f \"trash directory.failing-cleanup/clean-after-failure\" &&
159 sed -e 's/Z$//' -e 's/^> //' >expect <<-\\EOF &&
160 > not ok - 1 tests clean up even after a failure
162 > # touch clean-after-failure &&
163 > # test_when_finished rm clean-after-failure &&
166 > not ok - 2 failure to clean up causes the test to fail
168 > # test_when_finished \"(exit 2)\"
170 > # failed 2 among 2 test(s)
177 ################################################################
178 # Basics of the basics
180 # updating a new file without --add should fail.
181 test_expect_success
'git update-index without --add should fail adding' '
182 test_must_fail git update-index should-be-empty
185 # and with --add it should succeed, even if it is empty (it used to fail).
186 test_expect_success
'git update-index with --add should succeed' '
187 git update-index --add should-be-empty
190 test_expect_success
'writing tree out with git write-tree' '
191 tree=$(git write-tree)
194 # we know the shape and contents of the tree and know the object ID for it.
195 test_expect_success
'validate object ID of a known tree' '
196 test "$tree" = 7bb943559a305bdd6bdee2cef6e5df2413c3d30a
200 test_expect_success
'git update-index without --remove should fail removing' '
201 rm -f should-be-empty full-of-directories &&
202 test_must_fail git update-index should-be-empty
205 test_expect_success
'git update-index with --remove should be able to remove' '
206 git update-index --remove should-be-empty
209 # Empty tree can be written with recent write-tree.
210 test_expect_success
'git write-tree should be able to write an empty tree' '
211 tree=$(git write-tree)
214 test_expect_success
'validate object ID of a known tree' '
215 test "$tree" = 4b825dc642cb6eb9a060e54bf8d69288fbee4904
218 # Various types of objects
220 # Some filesystems do not support symblic links; on such systems
221 # some expected values are different
222 if test_have_prereq SYMLINKS
225 expectedtree
=087704a96baf1c2d1c869a8b084481e121c88b5b
226 expectedptree1
=21ae8269cacbe57ae09138dcc3a2887f904d02b3
227 expectedptree2
=3c5e5399f3a333eddecce7a9b9465b63f65f51e2
229 expectfilter
='grep -v sym'
230 expectedtree
=8e18edf7d7edcf4371a3ac6ae5f07c2641db7c46
231 expectedptree1
=cfb8591b2f65de8b8cc1020cd7d9e67e7793b325
232 expectedptree2
=ce580448f0148b985a513b693fdf7d802cacb44f
236 test_expect_success
'adding various types of objects with git update-index --add' '
237 mkdir path2 path3 path3/subp3 &&
238 paths="path0 path2/file2 path3/file3 path3/subp3/file3" &&
242 echo "hello $p" >$p || exit 1
243 if test_have_prereq SYMLINKS
245 ln -s "hello $p" ${p}sym || exit 1
249 find path* ! -type d -print | xargs git update-index --add
252 # Show them and see that matches what we expect.
253 test_expect_success
'showing stage with git ls-files --stage' '
254 git ls-files --stage >current
257 test_expect_success
'validate git ls-files output for a known tree' '
258 $expectfilter >expected <<-\EOF &&
259 100644 f87290f8eb2cbbea7857214459a0739927eab154 0 path0
260 120000 15a98433ae33114b085f3eb3bb03b832b3180a01 0 path0sym
261 100644 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 0 path2/file2
262 120000 d8ce161addc5173867a3c3c730924388daedbc38 0 path2/file2sym
263 100644 0aa34cae68d0878578ad119c86ca2b5ed5b28376 0 path3/file3
264 120000 8599103969b43aff7e430efea79ca4636466794f 0 path3/file3sym
265 100644 00fb5908cb97c2564a9783c0c64087333b3b464f 0 path3/subp3/file3
266 120000 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c 0 path3/subp3/file3sym
268 test_cmp expected current
271 test_expect_success
'writing tree out with git write-tree' '
272 tree=$(git write-tree)
275 test_expect_success
'validate object ID for a known tree' '
276 test "$tree" = "$expectedtree"
279 test_expect_success
'showing tree with git ls-tree' '
280 git ls-tree $tree >current
283 test_expect_success SYMLINKS
'git ls-tree output for a known tree' '
284 cat >expected <<-\EOF &&
285 100644 blob f87290f8eb2cbbea7857214459a0739927eab154 path0
286 120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01 path0sym
287 040000 tree 58a09c23e2ca152193f2786e06986b7b6712bdbe path2
288 040000 tree 21ae8269cacbe57ae09138dcc3a2887f904d02b3 path3
290 test_cmp expected current
293 # This changed in ls-tree pathspec change -- recursive does
294 # not show tree nodes anymore.
295 test_expect_success
'showing tree with git ls-tree -r' '
296 git ls-tree -r $tree >current
299 test_expect_success
'git ls-tree -r output for a known tree' '
300 $expectfilter >expected <<-\EOF &&
301 100644 blob f87290f8eb2cbbea7857214459a0739927eab154 path0
302 120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01 path0sym
303 100644 blob 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 path2/file2
304 120000 blob d8ce161addc5173867a3c3c730924388daedbc38 path2/file2sym
305 100644 blob 0aa34cae68d0878578ad119c86ca2b5ed5b28376 path3/file3
306 120000 blob 8599103969b43aff7e430efea79ca4636466794f path3/file3sym
307 100644 blob 00fb5908cb97c2564a9783c0c64087333b3b464f path3/subp3/file3
308 120000 blob 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c path3/subp3/file3sym
310 test_cmp expected current
313 # But with -r -t we can have both.
314 test_expect_success
'showing tree with git ls-tree -r -t' '
315 git ls-tree -r -t $tree >current
318 test_expect_success SYMLINKS
'git ls-tree -r output for a known tree' '
319 cat >expected <<-\EOF &&
320 100644 blob f87290f8eb2cbbea7857214459a0739927eab154 path0
321 120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01 path0sym
322 040000 tree 58a09c23e2ca152193f2786e06986b7b6712bdbe path2
323 100644 blob 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 path2/file2
324 120000 blob d8ce161addc5173867a3c3c730924388daedbc38 path2/file2sym
325 040000 tree 21ae8269cacbe57ae09138dcc3a2887f904d02b3 path3
326 100644 blob 0aa34cae68d0878578ad119c86ca2b5ed5b28376 path3/file3
327 120000 blob 8599103969b43aff7e430efea79ca4636466794f path3/file3sym
328 040000 tree 3c5e5399f3a333eddecce7a9b9465b63f65f51e2 path3/subp3
329 100644 blob 00fb5908cb97c2564a9783c0c64087333b3b464f path3/subp3/file3
330 120000 blob 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c path3/subp3/file3sym
332 test_cmp expected current
335 test_expect_success
'writing partial tree out with git write-tree --prefix' '
336 ptree=$(git write-tree --prefix=path3)
339 test_expect_success
'validate object ID for a known tree' '
340 test "$ptree" = "$expectedptree1"
343 test_expect_success
'writing partial tree out with git write-tree --prefix' '
344 ptree=$(git write-tree --prefix=path3/subp3)
347 test_expect_success
'validate object ID for a known tree' '
348 test "$ptree" = "$expectedptree2"
351 test_expect_success
'put invalid objects into the index' '
353 cat >badobjects <<-\EOF &&
354 100644 blob 1000000000000000000000000000000000000000 dir/file1
355 100644 blob 2000000000000000000000000000000000000000 dir/file2
356 100644 blob 3000000000000000000000000000000000000000 dir/file3
357 100644 blob 4000000000000000000000000000000000000000 dir/file4
358 100644 blob 5000000000000000000000000000000000000000 dir/file5
360 git update-index --index-info <badobjects
363 test_expect_success
'writing this tree without --missing-ok' '
364 test_must_fail git write-tree
367 test_expect_success
'writing this tree with --missing-ok' '
368 git write-tree --missing-ok
372 ################################################################
373 test_expect_success
'git read-tree followed by write-tree should be idempotent' '
375 git read-tree $tree &&
376 test -f .git/index &&
377 newtree=$(git write-tree) &&
378 test "$newtree" = "$tree"
381 test_expect_success
'validate git diff-files output for a know cache/work tree state' '
382 $expectfilter >expected <<\EOF &&
383 :100644 100644 f87290f8eb2cbbea7857214459a0739927eab154 0000000000000000000000000000000000000000 M path0
384 :120000 120000 15a98433ae33114b085f3eb3bb03b832b3180a01 0000000000000000000000000000000000000000 M path0sym
385 :100644 100644 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 0000000000000000000000000000000000000000 M path2/file2
386 :120000 120000 d8ce161addc5173867a3c3c730924388daedbc38 0000000000000000000000000000000000000000 M path2/file2sym
387 :100644 100644 0aa34cae68d0878578ad119c86ca2b5ed5b28376 0000000000000000000000000000000000000000 M path3/file3
388 :120000 120000 8599103969b43aff7e430efea79ca4636466794f 0000000000000000000000000000000000000000 M path3/file3sym
389 :100644 100644 00fb5908cb97c2564a9783c0c64087333b3b464f 0000000000000000000000000000000000000000 M path3/subp3/file3
390 :120000 120000 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c 0000000000000000000000000000000000000000 M path3/subp3/file3sym
392 git diff-files >current &&
393 test_cmp current expected
396 test_expect_success
'git update-index --refresh should succeed' '
397 git update-index --refresh
400 test_expect_success
'no diff after checkout and git update-index --refresh' '
401 git diff-files >current &&
402 cmp -s current /dev/null
405 ################################################################
408 test_expect_success
'git commit-tree records the correct tree in a commit' '
409 commit0=$(echo NO | git commit-tree $P) &&
410 tree=$(git show --pretty=raw $commit0 |
411 sed -n -e "s/^tree //p" -e "/^author /q") &&
412 test "z$tree" = "z$P"
415 test_expect_success
'git commit-tree records the correct parent in a commit' '
416 commit1=$(echo NO | git commit-tree $P -p $commit0) &&
417 parent=$(git show --pretty=raw $commit1 |
418 sed -n -e "s/^parent //p" -e "/^author /q") &&
419 test "z$commit0" = "z$parent"
422 test_expect_success
'git commit-tree omits duplicated parent in a commit' '
423 commit2=$(echo NO | git commit-tree $P -p $commit0 -p $commit0) &&
424 parent=$(git show --pretty=raw $commit2 |
425 sed -n -e "s/^parent //p" -e "/^author /q" |
427 test "z$commit0" = "z$parent" &&
428 numparent=$(git show --pretty=raw $commit2 |
429 sed -n -e "s/^parent //p" -e "/^author /q" |
434 test_expect_success
'update-index D/F conflict' '
438 git update-index --add --replace path2 path0/file2 &&
439 numpath0=$(git ls-files path0 | wc -l) &&
443 test_expect_success SYMLINKS
'real path works as expected' '
445 ln -s ../.git first/.git &&
447 ln -s ../first second/other &&
449 dir="$(cd .git; pwd -P)" &&
450 dir2=third/../second/other/.git &&
451 test "$dir" = "$(test-path-utils real_path $dir2)" &&
453 test "$file" = "$(test-path-utils real_path $dir2/index)" &&
455 test "$dir/$basename" = "$(cd .git && test-path-utils real_path "$basename")" &&
456 ln -s ../first/file .git/syml &&
457 sym="$(cd first; pwd -P)"/file &&
458 test "$sym" = "$(test-path-utils real_path "$dir2/syml")"
461 test_expect_success
'very long name in the index handled sanely' '
464 a=$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a && # 16
465 a=$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a && # 256
466 a=$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a && # 4096
470 git update-index --add path4 &&
472 git ls-files -s path4 |
476 ) | git update-index --index-info &&
477 len=$(git ls-files "a*" | wc -c) &&