| #!/bin/sh |
| # |
| # Copyright (C) 2006 Martin Waitz <tali@admingilde.org> |
| # |
| |
| test_description='test transitive info/alternate entries' |
| . ./test-lib.sh |
| |
| # test that a file is not reachable in the current repository |
| # but that it is after creating a info/alternate entry |
| reachable_via() { |
| alternate="$1" |
| file="$2" |
| if git cat-file -e "HEAD:$file"; then return 1; fi |
| echo "$alternate" >> .git/objects/info/alternate |
| git cat-file -e "HEAD:$file" |
| } |
| |
| test_valid_repo() { |
| git fsck --full > fsck.log && |
| test `wc -l < fsck.log` = 0 |
| } |
| |
| base_dir=`pwd` |
| |
| test_expect_success 'preparing first repository' \ |
| 'test_create_repo A && cd A && |
| echo "Hello World" > file1 && |
| git add file1 && |
| git commit -m "Initial commit" file1 && |
| git repack -a -d && |
| git prune' |
| |
| cd "$base_dir" |
| |
| test_expect_success 'preparing second repository' \ |
| 'git clone -l -s A B && cd B && |
| echo "foo bar" > file2 && |
| git add file2 && |
| git commit -m "next commit" file2 && |
| git repack -a -d -l && |
| git prune' |
| |
| cd "$base_dir" |
| |
| test_expect_success 'preparing third repository' \ |
| 'git clone -l -s B C && cd C && |
| echo "Goodbye, cruel world" > file3 && |
| git add file3 && |
| git commit -m "one more" file3 && |
| git repack -a -d -l && |
| git prune' |
| |
| cd "$base_dir" |
| |
| test_expect_success 'creating too deep nesting' \ |
| 'git clone -l -s C D && |
| git clone -l -s D E && |
| git clone -l -s E F && |
| git clone -l -s F G && |
| git clone -l -s G H' |
| |
| test_expect_success 'invalidity of deepest repository' \ |
| 'cd H && { |
| test_valid_repo |
| test $? -ne 0 |
| }' |
| |
| cd "$base_dir" |
| |
| test_expect_success 'validity of third repository' \ |
| 'cd C && |
| test_valid_repo' |
| |
| cd "$base_dir" |
| |
| test_expect_success 'validity of fourth repository' \ |
| 'cd D && |
| test_valid_repo' |
| |
| cd "$base_dir" |
| |
| test_expect_success 'breaking of loops' \ |
| 'echo "$base_dir"/B/.git/objects >> "$base_dir"/A/.git/objects/info/alternates&& |
| cd C && |
| test_valid_repo' |
| |
| cd "$base_dir" |
| |
| test_expect_success 'that info/alternates is necessary' \ |
| 'cd C && |
| rm -f .git/objects/info/alternates && |
| ! (test_valid_repo)' |
| |
| cd "$base_dir" |
| |
| test_expect_success 'that relative alternate is possible for current dir' \ |
| 'cd C && |
| echo "../../../B/.git/objects" > .git/objects/info/alternates && |
| test_valid_repo' |
| |
| cd "$base_dir" |
| |
| test_expect_success \ |
| 'that relative alternate is only possible for current dir' ' |
| cd D && |
| ! (test_valid_repo) |
| ' |
| |
| cd "$base_dir" |
| |
| test_done |