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