|  | #!/bin/sh | 
|  | # | 
|  | # Copyright (c) 2007 Carl D. Worth | 
|  | # | 
|  |  | 
|  | test_description='git ls-files test (--with-tree). | 
|  |  | 
|  | This test runs git ls-files --with-tree and in particular in | 
|  | a scenario known to trigger a crash with some versions of git. | 
|  | ' | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success setup ' | 
|  |  | 
|  | # The bug we are exercising requires a fair number of entries | 
|  | # in a sub-directory so that add_index_entry will trigger a | 
|  | # realloc. | 
|  |  | 
|  | echo file >expected && | 
|  | mkdir sub && | 
|  | for n in 0 1 2 3 4 5 | 
|  | do | 
|  | for m in 0 1 2 3 4 5 6 7 8 9 | 
|  | do | 
|  | num=00$n$m && | 
|  | >sub/file-$num && | 
|  | echo file-$num >>expected || | 
|  | return 1 | 
|  | done | 
|  | done && | 
|  | git add . && | 
|  | git commit -m "add a bunch of files" && | 
|  |  | 
|  | # We remove them all so that we will have something to add | 
|  | # back with --with-tree and so that we will definitely be | 
|  | # under the realloc size to trigger the bug. | 
|  | rm -rf sub && | 
|  | git commit -a -m "remove them all" && | 
|  |  | 
|  | # The bug also requires some entry before our directory so that | 
|  | # prune_path will modify the_index.cache | 
|  |  | 
|  | mkdir a_directory_that_sorts_before_sub && | 
|  | >a_directory_that_sorts_before_sub/file && | 
|  | mkdir sub && | 
|  | >sub/file && | 
|  | git add . | 
|  | ' | 
|  |  | 
|  | test_expect_success 'usage' ' | 
|  | test_expect_code 128 git ls-files --with-tree=HEAD -u && | 
|  | test_expect_code 128 git ls-files --with-tree=HEAD -s && | 
|  | test_expect_code 128 git ls-files --recurse-submodules --with-tree=HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'git ls-files --with-tree should succeed from subdir' ' | 
|  | # We have to run from a sub-directory to trigger prune_path | 
|  | # Then we finally get to run our --with-tree test | 
|  | ( | 
|  | cd sub && | 
|  | git ls-files --with-tree=HEAD~1 >../output | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success \ | 
|  | 'git ls-files --with-tree should add entries from named tree.' \ | 
|  | 'test_cmp expected output' | 
|  |  | 
|  | test_expect_success 'no duplicates in --with-tree output' ' | 
|  | git ls-files --with-tree=HEAD >actual && | 
|  | sort -u actual >expected && | 
|  | test_cmp expected actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'setup: output in a conflict' ' | 
|  | test_create_repo conflict && | 
|  | test_commit -C conflict BASE file && | 
|  | test_commit -C conflict A file foo && | 
|  | git -C conflict reset --hard BASE && | 
|  | test_commit -C conflict B file bar | 
|  | ' | 
|  |  | 
|  | test_expect_success 'output in a conflict' ' | 
|  | test_must_fail git -C conflict merge A B && | 
|  | cat >expected <<-\EOF && | 
|  | file | 
|  | file | 
|  | file | 
|  | file | 
|  | EOF | 
|  | git -C conflict ls-files --with-tree=HEAD >actual && | 
|  | test_cmp expected actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'output with removed .git/index' ' | 
|  | cat >expected <<-\EOF && | 
|  | file | 
|  | EOF | 
|  | rm conflict/.git/index && | 
|  | git -C conflict ls-files --with-tree=HEAD >actual && | 
|  | test_cmp expected actual | 
|  | ' | 
|  |  | 
|  | test_done |