1#!/bin/sh
2#
3# Copyright (c) 2007 Shawn Pearce
4#
5
6test_description='test git-fast-import utility'
7. ./test-lib.sh
8. ../diff-lib.sh ;# test-lib chdir's into trash
9
10file2_data='file2
11second line of EOF'
12
13file3_data='EOF
14in 3rd file
15 END'
16
17file4_data=abcd
18file4_len=4
19
20file5_data='an inline file.
21 we should see it later.'
22
23file6_data='#!/bin/sh
24echo "$@"'
25
26###
27### series A
28###
29
30test_tick
31cat >input <<INPUT_END
32blob
33mark :2
34data <<EOF
35$file2_data
36EOF
37
38blob
39mark :3
40data <<END
41$file3_data
42END
43
44blob
45mark :4
46data $file4_len
47$file4_data
48commit refs/heads/master
49mark :5
50committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
51data <<COMMIT
52initial
53COMMIT
54
55M 644 :2 file2
56M 644 :3 file3
57M 755 :4 file4
58
59INPUT_END
60test_expect_success \
61 'A: create pack from stdin' \
62 'git-fast-import --export-marks=marks.out <input &&
63 git-whatchanged master'
64test_expect_success \
65 'A: verify pack' \
66 'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
67
68cat >expect <<EOF
69author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
70committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
71
72initial
73EOF
74test_expect_success \
75 'A: verify commit' \
76 'git-cat-file commit master | sed 1d >actual &&
77 diff -u expect actual'
78
79cat >expect <<EOF
80100644 blob file2
81100644 blob file3
82100755 blob file4
83EOF
84test_expect_success \
85 'A: verify tree' \
86 'git-cat-file -p master^{tree} | sed "s/ [0-9a-f]* / /" >actual &&
87 diff -u expect actual'
88
89echo "$file2_data" >expect
90test_expect_success \
91 'A: verify file2' \
92 'git-cat-file blob master:file2 >actual && diff -u expect actual'
93
94echo "$file3_data" >expect
95test_expect_success \
96 'A: verify file3' \
97 'git-cat-file blob master:file3 >actual && diff -u expect actual'
98
99printf "$file4_data" >expect
100test_expect_success \
101 'A: verify file4' \
102 'git-cat-file blob master:file4 >actual && diff -u expect actual'
103
104cat >expect <<EOF
105:2 `git-rev-parse --verify master:file2`
106:3 `git-rev-parse --verify master:file3`
107:4 `git-rev-parse --verify master:file4`
108:5 `git-rev-parse --verify master^0`
109EOF
110test_expect_success \
111 'A: verify marks output' \
112 'diff -u expect marks.out'
113
114###
115### series B
116###
117
118test_tick
119cat >input <<INPUT_END
120commit refs/heads/branch
121mark :1
122committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
123data <<COMMIT
124corrupt
125COMMIT
126
127from refs/heads/master
128M 755 0000000000000000000000000000000000000001 zero1
129
130INPUT_END
131test_expect_failure \
132 'B: fail on invalid blob sha1' \
133 'git-fast-import <input'
134rm -f .git/objects/pack_* .git/objects/index_*
135
136###
137### series C
138###
139
140newf=`echo hi newf | git-hash-object -w --stdin`
141oldf=`git-rev-parse --verify master:file2`
142test_tick
143cat >input <<INPUT_END
144commit refs/heads/branch
145committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
146data <<COMMIT
147second
148COMMIT
149
150from refs/heads/master
151M 644 $oldf file2/oldf
152M 755 $newf file2/newf
153D file3
154
155INPUT_END
156test_expect_success \
157 'C: incremental import create pack from stdin' \
158 'git-fast-import <input &&
159 git-whatchanged branch'
160test_expect_success \
161 'C: verify pack' \
162 'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
163test_expect_success \
164 'C: validate reuse existing blob' \
165 'test $newf = `git-rev-parse --verify branch:file2/newf`
166 test $oldf = `git-rev-parse --verify branch:file2/oldf`'
167
168cat >expect <<EOF
169parent `git-rev-parse --verify master^0`
170author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
171committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
172
173second
174EOF
175test_expect_success \
176 'C: verify commit' \
177 'git-cat-file commit branch | sed 1d >actual &&
178 diff -u expect actual'
179
180cat >expect <<EOF
181:000000 100755 0000000000000000000000000000000000000000 f1fb5da718392694d0076d677d6d0e364c79b0bc A file2/newf
182:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100 file2 file2/oldf
183:100644 000000 0d92e9f3374ae2947c23aa477cbc68ce598135f1 0000000000000000000000000000000000000000 D file3
184EOF
185git-diff-tree -M -r master branch >actual
186test_expect_success \
187 'C: validate rename result' \
188 'compare_diff_raw expect actual'
189
190###
191### series D
192###
193
194test_tick
195cat >input <<INPUT_END
196commit refs/heads/branch
197committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
198data <<COMMIT
199third
200COMMIT
201
202from refs/heads/branch^0
203M 644 inline newdir/interesting
204data <<EOF
205$file5_data
206EOF
207
208M 755 inline newdir/exec.sh
209data <<EOF
210$file6_data
211EOF
212
213INPUT_END
214test_expect_success \
215 'D: inline data in commit' \
216 'git-fast-import <input &&
217 git-whatchanged branch'
218test_expect_success \
219 'D: verify pack' \
220 'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
221
222cat >expect <<EOF
223:000000 100755 0000000000000000000000000000000000000000 35a59026a33beac1569b1c7f66f3090ce9c09afc A newdir/exec.sh
224:000000 100644 0000000000000000000000000000000000000000 046d0371e9220107917db0d0e030628de8a1de9b A newdir/interesting
225EOF
226git-diff-tree -M -r branch^ branch >actual
227test_expect_success \
228 'D: validate new files added' \
229 'compare_diff_raw expect actual'
230
231echo "$file5_data" >expect
232test_expect_success \
233 'D: verify file5' \
234 'git-cat-file blob branch:newdir/interesting >actual &&
235 diff -u expect actual'
236
237echo "$file6_data" >expect
238test_expect_success \
239 'D: verify file6' \
240 'git-cat-file blob branch:newdir/exec.sh >actual &&
241 diff -u expect actual'
242
243test_done