1#!/bin/sh 2# 3# Copyright (C) 2006 Martin Waitz <tali@admingilde.org> 4# 5 6test_description='test transitive info/alternate entries' 7. ./test-lib.sh 8 9test_expect_success 'preparing first repository'' 10 test_create_repo A && ( 11 cd A && 12 echo "Hello World" > file1 && 13 git add file1 && 14 git commit -m "Initial commit" file1 && 15 git repack -a -d && 16 git prune 17 ) 18' 19 20test_expect_success 'preparing second repository'' 21 git clone -l -s A B && ( 22 cd B && 23 echo "foo bar" > file2 && 24 git add file2 && 25 git commit -m "next commit" file2 && 26 git repack -a -d -l && 27 git prune 28 ) 29' 30 31test_expect_success 'preparing third repository'' 32 git clone -l -s B C && ( 33 cd C && 34 echo "Goodbye, cruel world" > file3 && 35 git add file3 && 36 git commit -m "one more" file3 && 37 git repack -a -d -l && 38 git prune 39 ) 40' 41 42test_expect_success 'count-objects shows the alternates'' 43 cat >expect <<-EOF && 44 alternate:$(pwd)/B/.git/objects 45 alternate:$(pwd)/A/.git/objects 46 EOF 47 git -C C count-objects -v >actual && 48 grep ^alternate: actual >actual.alternates && 49 test_cmp expect actual.alternates 50' 51 52# Note: These tests depend on the hard-coded value of 5 as the maximum depth 53# we will follow recursion. We start the depth at 0 and count links, not 54# repositories. This means that in a chain like: 55# 56# A --> B --> C --> D --> E --> F --> G --> H 57# 0 1 2 3 4 5 6 58# 59# we are OK at "G", but break at "H", even though "H" is actually the 8th 60# repository, not the 6th, which you might expect. Counting the links allows 61# N+1 repositories, and counting from 0 to 5 inclusive allows 6 links. 62# 63# Note also that we must use "--bare -l" to make the link to H. The "-l" 64# ensures we do not do a connectivity check, and the "--bare" makes sure 65# we do not try to checkout the result (which needs objects), either of 66# which would cause the clone to fail. 67test_expect_success 'creating too deep nesting'' 68 git clone -l -s C D && 69 git clone -l -s D E && 70 git clone -l -s E F && 71 git clone -l -s F G && 72 git clone --bare -l -s G H 73' 74 75test_expect_success 'validity of seventh repository'' 76 git -C G fsck 77' 78 79test_expect_success 'invalidity of eighth repository'' 80 test_must_fail git -C H fsck 81' 82 83test_expect_success 'breaking of loops'' 84 echo "$(pwd)"/B/.git/objects >>A/.git/objects/info/alternates && 85 git -C C fsck 86' 87 88test_expect_success 'that info/alternates is necessary'' 89 rm -f C/.git/objects/info/alternates && 90 test_must_fail git -C C fsck 91' 92 93test_expect_success 'that relative alternate is possible for current dir'' 94 echo "../../../B/.git/objects" >C/.git/objects/info/alternates && 95 git fsck 96' 97 98test_expect_success 'that relative alternate is only possible for current dir'' 99 test_must_fail git -C D fsck 100' 101 102test_done