summaryrefslogtreecommitdiff
path: root/t/t5613-info-alternate.sh
blob: 895f46bb9118bbf15d32f594ce79f0e638d25b6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/bin/sh
#
# Copyright (C) 2006 Martin Waitz <tali@admingilde.org>
#

test_description='test transitive info/alternate entries'
. ./test-lib.sh

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
	)
'

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
	)
'

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
	)
'

test_expect_success 'count-objects shows the alternates' '
	cat >expect <<-EOF &&
	alternate: $(pwd)/B/.git/objects
	alternate: $(pwd)/A/.git/objects
	EOF
	git -C C count-objects -v >actual &&
	grep ^alternate: actual >actual.alternates &&
	test_cmp expect actual.alternates
'

# Note: These tests depend on the hard-coded value of 5 as the maximum depth
# we will follow recursion. We start the depth at 0 and count links, not
# repositories. This means that in a chain like:
#
#   A --> B --> C --> D --> E --> F --> G --> H
#      0     1     2     3     4     5     6
#
# we are OK at "G", but break at "H", even though "H" is actually the 8th
# repository, not the 6th, which you might expect. Counting the links allows
# N+1 repositories, and counting from 0 to 5 inclusive allows 6 links.
#
# Note also that we must use "--bare -l" to make the link to H. The "-l"
# ensures we do not do a connectivity check, and the "--bare" makes sure
# we do not try to checkout the result (which needs objects), either of
# which would cause the clone to fail.
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 --bare -l -s G H
'

test_expect_success 'validity of seventh repository' '
	git -C G fsck
'

test_expect_success 'invalidity of eighth repository' '
	test_must_fail git -C H fsck
'

test_expect_success 'breaking of loops' '
	echo "$(pwd)"/B/.git/objects >>A/.git/objects/info/alternates &&
	git -C C fsck
'

test_expect_success 'that info/alternates is necessary' '
	rm -f C/.git/objects/info/alternates &&
	test_must_fail git -C C fsck
'

test_expect_success 'that relative alternate is possible for current dir' '
	echo "../../../B/.git/objects" >C/.git/objects/info/alternates &&
	git fsck
'

test_expect_success 'that relative alternate is recursive' '
	git -C D fsck
'

# we can reach "A" from our new repo both directly, and via "C".
# The deep/subdir is there to make sure we are not doing a stupid
# pure-text comparison of the alternate names.
test_expect_success 'relative duplicates are eliminated' '
	mkdir -p deep/subdir &&
	git init --bare deep/subdir/duplicate.git &&
	cat >deep/subdir/duplicate.git/objects/info/alternates <<-\EOF &&
	../../../../C/.git/objects
	../../../../A/.git/objects
	EOF
	cat >expect <<-EOF &&
	alternate: $(pwd)/C/.git/objects
	alternate: $(pwd)/B/.git/objects
	alternate: $(pwd)/A/.git/objects
	EOF
	git -C deep/subdir/duplicate.git count-objects -v >actual &&
	grep ^alternate: actual >actual.alternates &&
	test_cmp expect actual.alternates
'

test_expect_success CASE_INSENSITIVE_FS 'dup finding can be case-insensitive' '
	git init --bare insensitive.git &&
	# the previous entry for "A" will have used uppercase
	cat >insensitive.git/objects/info/alternates <<-\EOF &&
	../../C/.git/objects
	../../a/.git/objects
	EOF
	cat >expect <<-EOF &&
	alternate: $(pwd)/C/.git/objects
	alternate: $(pwd)/B/.git/objects
	alternate: $(pwd)/A/.git/objects
	EOF
	git -C insensitive.git count-objects -v >actual &&
	grep ^alternate: actual >actual.alternates &&
	test_cmp expect actual.alternates
'

test_done