Add more testcases to test fast-import of notes
This patch adds testcases verifying correct behaviour in several scenarios regarding fast-import of notes: - using a mixture of 'N' and 'M' commands - updating existing notes - concatenation of notes - 'deleteall' also removes notes - fanout schemes is added/removed when needed - git-fast-import's branch unload/reload preserves notes - non-notes are not clobbered in the presence of notes Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Johan Herland committed
Dec 7, 2009 at 12:27 UTC
a8b59ef578df2b06a89fecd46f3d379895e77e8f
1 file changed
+623
t/t9301-fast-import-notes.sh
new
+623
@@ -0,0 +1,623 @@
1
+#!/bin/sh
2
+#
3
+# Copyright (c) 2009 Johan Herland
4
+#
5
+
6
+test_description='test git fast-import of notes objects'
7
+. ./test-lib.sh
8
+
9
+
10
+test_tick
11
+cat >input <<INPUT_END
12
+commit refs/heads/master
13
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
14
+data <<COMMIT
15
+first commit
16
+COMMIT
17
+
18
+M 644 inline foo
19
+data <<EOF
20
+file foo in first commit
21
+EOF
22
+
23
+M 755 inline bar
24
+data <<EOF
25
+file bar in first commit
26
+EOF
27
+
28
+M 644 inline baz/xyzzy
29
+data <<EOF
30
+file baz/xyzzy in first commit
31
+EOF
32
+
33
+commit refs/heads/master
34
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
35
+data <<COMMIT
36
+second commit
37
+COMMIT
38
+
39
+M 644 inline foo
40
+data <<EOF
41
+file foo in second commit
42
+EOF
43
+
44
+M 755 inline baz/xyzzy
45
+data <<EOF
46
+file baz/xyzzy in second commit
47
+EOF
48
+
49
+commit refs/heads/master
50
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
51
+data <<COMMIT
52
+third commit
53
+COMMIT
54
+
55
+M 644 inline foo
56
+data <<EOF
57
+file foo in third commit
58
+EOF
59
+
60
+commit refs/heads/master
61
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
62
+data <<COMMIT
63
+fourth commit
64
+COMMIT
65
+
66
+M 755 inline bar
67
+data <<EOF
68
+file bar in fourth commit
69
+EOF
70
+
71
+INPUT_END
72
+
73
+test_expect_success 'set up master branch' '
74
+
75
+ git fast-import <input &&
76
+ git whatchanged master
77
+'
78
+
79
+commit4=$(git rev-parse refs/heads/master)
80
+commit3=$(git rev-parse "$commit4^")
81
+commit2=$(git rev-parse "$commit4~2")
82
+commit1=$(git rev-parse "$commit4~3")
83
+
84
+test_tick
85
+cat >input <<INPUT_END
86
+commit refs/notes/test
87
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
88
+data <<COMMIT
89
+first notes commit
90
+COMMIT
91
+
92
+M 644 inline $commit1
93
+data <<EOF
94
+first note for first commit
95
+EOF
96
+
97
+M 755 inline $commit2
98
+data <<EOF
99
+first note for second commit
100
+EOF
101
+
102
+INPUT_END
103
+
104
+cat >expect <<EXPECT_END
105
+ fourth commit
106
+ third commit
107
+ second commit
108
+ first note for second commit
109
+ first commit
110
+ first note for first commit
111
+EXPECT_END
112
+
113
+test_expect_success 'add notes with simple M command' '
114
+
115
+ git fast-import <input &&
116
+ GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
117
+ test_cmp expect actual
118
+
119
+'
120
+
121
+test_tick
122
+cat >input <<INPUT_END
123
+commit refs/notes/test
124
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
125
+data <<COMMIT
126
+second notes commit
127
+COMMIT
128
+
129
+from refs/notes/test^0
130
+N inline $commit3
131
+data <<EOF
132
+first note for third commit
133
+EOF
134
+
135
+N inline $commit4
136
+data <<EOF
137
+first note for fourth commit
138
+EOF
139
+
140
+INPUT_END
141
+
142
+cat >expect <<EXPECT_END
143
+ fourth commit
144
+ first note for fourth commit
145
+ third commit
146
+ first note for third commit
147
+ second commit
148
+ first note for second commit
149
+ first commit
150
+ first note for first commit
151
+EXPECT_END
152
+
153
+test_expect_success 'add notes with simple N command' '
154
+
155
+ git fast-import <input &&
156
+ GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
157
+ test_cmp expect actual
158
+
159
+'
160
+
161
+test_tick
162
+cat >input <<INPUT_END
163
+commit refs/notes/test
164
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
165
+data <<COMMIT
166
+third notes commit
167
+COMMIT
168
+
169
+from refs/notes/test^0
170
+N inline $commit1
171
+data <<EOF
172
+second note for first commit
173
+EOF
174
+
175
+N inline $commit2
176
+data <<EOF
177
+second note for second commit
178
+EOF
179
+
180
+N inline $commit3
181
+data <<EOF
182
+second note for third commit
183
+EOF
184
+
185
+N inline $commit4
186
+data <<EOF
187
+second note for fourth commit
188
+EOF
189
+
190
+INPUT_END
191
+
192
+cat >expect <<EXPECT_END
193
+ fourth commit
194
+ second note for fourth commit
195
+ third commit
196
+ second note for third commit
197
+ second commit
198
+ second note for second commit
199
+ first commit
200
+ second note for first commit
201
+EXPECT_END
202
+
203
+test_expect_success 'update existing notes with N command' '
204
+
205
+ git fast-import <input &&
206
+ GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
207
+ test_cmp expect actual
208
+
209
+'
210
+
211
+test_tick
212
+cat >input <<INPUT_END
213
+commit refs/notes/test
214
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
215
+data <<COMMIT
216
+fourth notes commit
217
+COMMIT
218
+
219
+from refs/notes/test^0
220
+M 644 inline $(echo "$commit3" | sed "s|^..|&/|")
221
+data <<EOF
222
+prefix of note for third commit
223
+EOF
224
+
225
+M 644 inline $(echo "$commit4" | sed "s|^..|&/|")
226
+data <<EOF
227
+prefix of note for fourth commit
228
+EOF
229
+
230
+M 644 inline $(echo "$commit4" | sed "s|^\(..\)\(..\)|\1/\2/|")
231
+data <<EOF
232
+pre-prefix of note for fourth commit
233
+EOF
234
+
235
+N inline $commit1
236
+data <<EOF
237
+third note for first commit
238
+EOF
239
+
240
+N inline $commit2
241
+data <<EOF
242
+third note for second commit
243
+EOF
244
+
245
+N inline $commit3
246
+data <<EOF
247
+third note for third commit
248
+EOF
249
+
250
+N inline $commit4
251
+data <<EOF
252
+third note for fourth commit
253
+EOF
254
+
255
+
256
+INPUT_END
257
+
258
+cat >expect <<EXPECT_END
259
+ fourth commit
260
+ pre-prefix of note for fourth commit
261
+ prefix of note for fourth commit
262
+ third note for fourth commit
263
+ third commit
264
+ prefix of note for third commit
265
+ third note for third commit
266
+ second commit
267
+ third note for second commit
268
+ first commit
269
+ third note for first commit
270
+EXPECT_END
271
+
272
+test_expect_success 'add concatentation notes with M command' '
273
+
274
+ git fast-import <input &&
275
+ GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
276
+ test_cmp expect actual
277
+
278
+'
279
+
280
+test_tick
281
+cat >input <<INPUT_END
282
+commit refs/notes/test
283
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
284
+data <<COMMIT
285
+fifth notes commit
286
+COMMIT
287
+
288
+from refs/notes/test^0
289
+deleteall
290
+
291
+INPUT_END
292
+
293
+cat >expect <<EXPECT_END
294
+ fourth commit
295
+ third commit
296
+ second commit
297
+ first commit
298
+EXPECT_END
299
+
300
+test_expect_success 'verify that deleteall also removes notes' '
301
+
302
+ git fast-import <input &&
303
+ GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
304
+ test_cmp expect actual
305
+
306
+'
307
+
308
+test_tick
309
+cat >input <<INPUT_END
310
+commit refs/notes/test
311
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
312
+data <<COMMIT
313
+sixth notes commit
314
+COMMIT
315
+
316
+from refs/notes/test^0
317
+M 644 inline $commit1
318
+data <<EOF
319
+third note for first commit
320
+EOF
321
+
322
+M 644 inline $commit3
323
+data <<EOF
324
+third note for third commit
325
+EOF
326
+
327
+N inline $commit1
328
+data <<EOF
329
+fourth note for first commit
330
+EOF
331
+
332
+N inline $commit3
333
+data <<EOF
334
+fourth note for third commit
335
+EOF
336
+
337
+INPUT_END
338
+
339
+cat >expect <<EXPECT_END
340
+ fourth commit
341
+ third commit
342
+ fourth note for third commit
343
+ second commit
344
+ first commit
345
+ fourth note for first commit
346
+EXPECT_END
347
+
348
+test_expect_success 'verify that later N commands override earlier M commands' '
349
+
350
+ git fast-import <input &&
351
+ GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
352
+ test_cmp expect actual
353
+
354
+'
355
+
356
+# Write fast-import commands to create the given number of commits
357
+fast_import_commits () {
358
+ my_ref=$1
359
+ my_num_commits=$2
360
+ my_append_to_file=$3
361
+ my_i=0
362
+ while test $my_i -lt $my_num_commits
363
+ do
364
+ my_i=$(($my_i + 1))
365
+ test_tick
366
+ cat >>"$my_append_to_file" <<INPUT_END
367
+commit $my_ref
368
+mark :$my_i
369
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
370
+data <<COMMIT
371
+commit #$my_i
372
+COMMIT
373
+
374
+M 644 inline file
375
+data <<EOF
376
+file contents in commit #$my_i
377
+EOF
378
+
379
+INPUT_END
380
+ done
381
+}
382
+
383
+# Write fast-import commands to create the given number of notes annotating
384
+# the commits created by fast_import_commits()
385
+fast_import_notes () {
386
+ my_notes_ref=$1
387
+ my_num_commits=$2
388
+ my_append_to_file=$3
389
+ my_note_append=$4
390
+ test_tick
391
+ cat >>"$my_append_to_file" <<INPUT_END
392
+commit $my_notes_ref
393
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
394
+data <<COMMIT
395
+committing $my_num_commits notes
396
+COMMIT
397
+
398
+INPUT_END
399
+
400
+ my_i=0
401
+ while test $my_i -lt $my_num_commits
402
+ do
403
+ my_i=$(($my_i + 1))
404
+ cat >>"$my_append_to_file" <<INPUT_END
405
+N inline :$my_i
406
+data <<EOF
407
+note for commit #$my_i$my_note_append
408
+EOF
409
+
410
+INPUT_END
411
+ done
412
+}
413
+
414
+
415
+rm input expect
416
+num_commits=400
417
+# Create lots of commits
418
+fast_import_commits "refs/heads/many_commits" $num_commits input
419
+# Create one note per above commit
420
+fast_import_notes "refs/notes/many_notes" $num_commits input
421
+# Add a couple of non-notes as well
422
+test_tick
423
+cat >>input <<INPUT_END
424
+commit refs/notes/many_notes
425
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
426
+data <<COMMIT
427
+committing some non-notes to the notes tree
428
+COMMIT
429
+
430
+M 755 inline foobar/non-note.txt
431
+data <<EOF
432
+This is not a note, but rather a regular file residing in a notes tree
433
+EOF
434
+
435
+M 644 inline deadbeef
436
+data <<EOF
437
+Non-note file
438
+EOF
439
+
440
+M 644 inline de/adbeef
441
+data <<EOF
442
+Another non-note file
443
+EOF
444
+
445
+INPUT_END
446
+# Finally create the expected output from all these notes and commits
447
+i=$num_commits
448
+while test $i -gt 0
449
+do
450
+ cat >>expect <<EXPECT_END
451
+ commit #$i
452
+ note for commit #$i
453
+EXPECT_END
454
+ i=$(($i - 1))
455
+done
456
+
457
+test_expect_success 'add lots of commits and notes' '
458
+
459
+ git fast-import <input &&
460
+ GIT_NOTES_REF=refs/notes/many_notes git log refs/heads/many_commits |
461
+ grep "^ " > actual &&
462
+ test_cmp expect actual
463
+
464
+'
465
+
466
+test_expect_success 'verify that lots of notes trigger a fanout scheme' '
467
+
468
+ # None of the entries in the top-level notes tree should be a full SHA1
469
+ git ls-tree --name-only refs/notes/many_notes |
470
+ while read path
471
+ do
472
+ if test $(expr length "$path") -ge 40
473
+ then
474
+ return 1
475
+ fi
476
+ done
477
+
478
+'
479
+
480
+cat >>expect_non-note1 << EOF
481
+This is not a note, but rather a regular file residing in a notes tree
482
+EOF
483
+
484
+cat >>expect_non-note2 << EOF
485
+Non-note file
486
+EOF
487
+
488
+cat >>expect_non-note3 << EOF
489
+Another non-note file
490
+EOF
491
+
492
+test_expect_success 'verify that non-notes are untouched by a fanout change' '
493
+
494
+ git cat-file -p refs/notes/many_notes:foobar/non-note.txt > actual &&
495
+ test_cmp expect_non-note1 actual &&
496
+ git cat-file -p refs/notes/many_notes:deadbeef > actual &&
497
+ test_cmp expect_non-note2 actual &&
498
+ git cat-file -p refs/notes/many_notes:de/adbeef > actual &&
499
+ test_cmp expect_non-note3 actual
500
+
501
+'
502
+remaining_notes=10
503
+test_tick
504
+cat >>input <<INPUT_END
505
+commit refs/notes/many_notes
506
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
507
+data <<COMMIT
508
+removing all notes but $remaining_notes
509
+COMMIT
510
+from refs/notes/many_notes^0
511
+INPUT_END
512
+
513
+i=$remaining_notes
514
+while test $i -lt $num_commits
515
+do
516
+ i=$(($i + 1))
517
+ cat >>input <<INPUT_END
518
+N 0000000000000000000000000000000000000000 :$i
519
+INPUT_END
520
+done
521
+
522
+i=$num_commits
523
+rm expect
524
+while test $i -gt 0
525
+do
526
+ cat >>expect <<EXPECT_END
527
+ commit #$i
528
+EXPECT_END
529
+ if test $i -le $remaining_notes
530
+ then
531
+ cat >>expect <<EXPECT_END
532
+ note for commit #$i
533
+EXPECT_END
534
+ fi
535
+ i=$(($i - 1))
536
+done
537
+
538
+test_expect_success 'remove lots of notes' '
539
+
540
+ git fast-import <input &&
541
+ GIT_NOTES_REF=refs/notes/many_notes git log refs/heads/many_commits |
542
+ grep "^ " > actual &&
543
+ test_cmp expect actual
544
+
545
+'
546
+
547
+test_expect_success 'verify that removing notes trigger fanout consolidation' '
548
+
549
+ # All entries in the top-level notes tree should be a full SHA1
550
+ git ls-tree --name-only -r refs/notes/many_notes |
551
+ while read path
552
+ do
553
+ # Explicitly ignore the non-note paths
554
+ test "$path" = "foobar/non-note.txt" && continue
555
+ test "$path" = "deadbeef" && continue
556
+ test "$path" = "de/adbeef" && continue
557
+
558
+ if test $(expr length "$path") -ne 40
559
+ then
560
+ return 1
561
+ fi
562
+ done
563
+
564
+'
565
+
566
+test_expect_success 'verify that non-notes are untouched by a fanout change' '
567
+
568
+ git cat-file -p refs/notes/many_notes:foobar/non-note.txt > actual &&
569
+ test_cmp expect_non-note1 actual &&
570
+ git cat-file -p refs/notes/many_notes:deadbeef > actual &&
571
+ test_cmp expect_non-note2 actual &&
572
+ git cat-file -p refs/notes/many_notes:de/adbeef > actual &&
573
+ test_cmp expect_non-note3 actual
574
+
575
+'
576
+
577
+
578
+rm input expect
579
+num_notes_refs=10
580
+num_commits=16
581
+some_commits=8
582
+# Create commits
583
+fast_import_commits "refs/heads/more_commits" $num_commits input
584
+# Create one note per above commit per notes ref
585
+i=0
586
+while test $i -lt $num_notes_refs
587
+do
588
+ i=$(($i + 1))
589
+ fast_import_notes "refs/notes/more_notes_$i" $num_commits input
590
+done
591
+# Trigger branch reloading in git-fast-import by repeating the note creation
592
+i=0
593
+while test $i -lt $num_notes_refs
594
+do
595
+ i=$(($i + 1))
596
+ fast_import_notes "refs/notes/more_notes_$i" $some_commits input " (2)"
597
+done
598
+# Finally create the expected output from the notes in refs/notes/more_notes_1
599
+i=$num_commits
600
+while test $i -gt 0
601
+do
602
+ note_data="note for commit #$i"
603
+ if test $i -le $some_commits
604
+ then
605
+ note_data="$note_data (2)"
606
+ fi
607
+ cat >>expect <<EXPECT_END
608
+ commit #$i
609
+ $note_data
610
+EXPECT_END
611
+ i=$(($i - 1))
612
+done
613
+
614
+test_expect_success "add notes to $num_commits commits in each of $num_notes_refs refs" '
615
+
616
+ git fast-import --active-branches=5 <input &&
617
+ GIT_NOTES_REF=refs/notes/more_notes_1 git log refs/heads/more_commits |
618
+ grep "^ " > actual &&
619
+ test_cmp expect actual
620
+
621
+'
622
+
623
+test_done