#!/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