Merge branch 'js/hashmap-update-sample'
[git] / t / t1050-large.sh
1 #!/bin/sh
2 # Copyright (c) 2011, Google Inc.
3
4 test_description='adding and checking out large blobs'
5
6 . ./test-lib.sh
7
8 # This should be moved to test-lib.sh together with the
9 # copy in t0021 after both topics have graduated to 'master'.
10 file_size () {
11         perl -e 'print -s $ARGV[0]' "$1"
12 }
13
14 test_expect_success setup '
15         # clone does not allow us to pass core.bigfilethreshold to
16         # new repos, so set core.bigfilethreshold globally
17         git config --global core.bigfilethreshold 200k &&
18         printf "%2000000s" X >large1 &&
19         cp large1 large2 &&
20         cp large1 large3 &&
21         printf "%2500000s" Y >huge &&
22         GIT_ALLOC_LIMIT=1500k &&
23         export GIT_ALLOC_LIMIT
24 '
25
26 # add a large file with different settings
27 while read expect config
28 do
29         test_expect_success "add with $config" '
30                 test_when_finished "rm -f .git/objects/pack/pack-*.* .git/index" &&
31                 git $config add large1 &&
32                 sz=$(file_size .git/objects/pack/pack-*.pack) &&
33                 case "$expect" in
34                 small) test "$sz" -le 100000 ;;
35                 large) test "$sz" -ge 100000 ;;
36                 esac
37         '
38 done <<\EOF
39 large -c core.compression=0
40 small -c core.compression=9
41 large -c core.compression=0 -c pack.compression=0
42 large -c core.compression=9 -c pack.compression=0
43 small -c core.compression=0 -c pack.compression=9
44 small -c core.compression=9 -c pack.compression=9
45 large -c pack.compression=0
46 small -c pack.compression=9
47 EOF
48
49 test_expect_success 'add a large file or two' '
50         git add large1 huge large2 &&
51         # make sure we got a single packfile and no loose objects
52         bad= count=0 idx= &&
53         for p in .git/objects/pack/pack-*.pack
54         do
55                 count=$(( $count + 1 ))
56                 if test -f "$p" && idx=${p%.pack}.idx && test -f "$idx"
57                 then
58                         continue
59                 fi
60                 bad=t
61         done &&
62         test -z "$bad" &&
63         test $count = 1 &&
64         cnt=$(git show-index <"$idx" | wc -l) &&
65         test $cnt = 2 &&
66         for l in .git/objects/??/??????????????????????????????????????
67         do
68                 test -f "$l" || continue
69                 bad=t
70         done &&
71         test -z "$bad" &&
72
73         # attempt to add another copy of the same
74         git add large3 &&
75         bad= count=0 &&
76         for p in .git/objects/pack/pack-*.pack
77         do
78                 count=$(( $count + 1 ))
79                 if test -f "$p" && idx=${p%.pack}.idx && test -f "$idx"
80                 then
81                         continue
82                 fi
83                 bad=t
84         done &&
85         test -z "$bad" &&
86         test $count = 1
87 '
88
89 test_expect_success 'checkout a large file' '
90         large1=$(git rev-parse :large1) &&
91         git update-index --add --cacheinfo 100644 $large1 another &&
92         git checkout another &&
93         test_cmp large1 another
94 '
95
96 test_expect_success 'packsize limit' '
97         test_create_repo mid &&
98         (
99                 cd mid &&
100                 git config core.bigfilethreshold 64k &&
101                 git config pack.packsizelimit 256k &&
102
103                 # mid1 and mid2 will fit within 256k limit but
104                 # appending mid3 will bust the limit and will
105                 # result in a separate packfile.
106                 test-genrandom "a" $(( 66 * 1024 )) >mid1 &&
107                 test-genrandom "b" $(( 80 * 1024 )) >mid2 &&
108                 test-genrandom "c" $(( 128 * 1024 )) >mid3 &&
109                 git add mid1 mid2 mid3 &&
110
111                 count=0
112                 for pi in .git/objects/pack/pack-*.idx
113                 do
114                         test -f "$pi" && count=$(( $count + 1 ))
115                 done &&
116                 test $count = 2 &&
117
118                 (
119                         git hash-object --stdin <mid1
120                         git hash-object --stdin <mid2
121                         git hash-object --stdin <mid3
122                 ) |
123                 sort >expect &&
124
125                 for pi in .git/objects/pack/pack-*.idx
126                 do
127                         git show-index <"$pi"
128                 done |
129                 sed -e "s/^[0-9]* \([0-9a-f]*\) .*/\1/" |
130                 sort >actual &&
131
132                 test_cmp expect actual
133         )
134 '
135
136 test_expect_success 'diff --raw' '
137         git commit -q -m initial &&
138         echo modified >>large1 &&
139         git add large1 &&
140         git commit -q -m modified &&
141         git diff --raw HEAD^
142 '
143
144 test_expect_success 'diff --stat' '
145         git diff --stat HEAD^ HEAD
146 '
147
148 test_expect_success 'diff' '
149         git diff HEAD^ HEAD >actual &&
150         grep "Binary files.*differ" actual
151 '
152
153 test_expect_success 'diff --cached' '
154         git diff --cached HEAD^ >actual &&
155         grep "Binary files.*differ" actual
156 '
157
158 test_expect_success 'hash-object' '
159         git hash-object large1
160 '
161
162 test_expect_success 'cat-file a large file' '
163         git cat-file blob :large1 >/dev/null
164 '
165
166 test_expect_success 'cat-file a large file from a tag' '
167         git tag -m largefile largefiletag :large1 &&
168         git cat-file blob largefiletag >/dev/null
169 '
170
171 test_expect_success 'git-show a large file' '
172         git show :large1 >/dev/null
173
174 '
175
176 test_expect_success 'index-pack' '
177         git clone file://"$(pwd)"/.git foo &&
178         GIT_DIR=non-existent git index-pack --strict --verify foo/.git/objects/pack/*.pack
179 '
180
181 test_expect_success 'repack' '
182         git repack -ad
183 '
184
185 test_expect_success 'pack-objects with large loose object' '
186         SHA1=$(git hash-object huge) &&
187         test_create_repo loose &&
188         echo $SHA1 | git pack-objects --stdout |
189                 GIT_ALLOC_LIMIT=0 GIT_DIR=loose/.git git unpack-objects &&
190         echo $SHA1 | GIT_DIR=loose/.git git pack-objects pack &&
191         test_create_repo packed &&
192         mv pack-* packed/.git/objects/pack &&
193         GIT_DIR=packed/.git git cat-file blob $SHA1 >actual &&
194         test_cmp huge actual
195 '
196
197 test_expect_success 'tar achiving' '
198         git archive --format=tar HEAD >/dev/null
199 '
200
201 test_expect_success 'zip achiving, store only' '
202         git archive --format=zip -0 HEAD >/dev/null
203 '
204
205 test_expect_success 'zip achiving, deflate' '
206         git archive --format=zip HEAD >/dev/null
207 '
208
209 test_expect_success 'fsck large blobs' '
210         git fsck 2>err &&
211         test_must_be_empty err
212 '
213
214 test_done