aboutsummaryrefslogtreecommitdiffstats
path: root/blame/blame_test.go
blob: 81c02f07b873527f0f07dbe2c102dd730bfc3465 (plain) (blame)
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
package blame

import (
	"bytes"
	"fmt"
	"os"
	"testing"

	. "gopkg.in/check.v1"
	"gopkg.in/src-d/go-git.v2"
	"gopkg.in/src-d/go-git.v2/core"
	"gopkg.in/src-d/go-git.v2/formats/packfile"
)

func Test(t *testing.T) { TestingT(t) }

type SuiteCommon struct {
	repos map[string]*git.Repository
}

var _ = Suite(&SuiteCommon{})

var fixtureRepos = [...]struct {
	url      string
	packfile string
}{
	{"https://github.com/tyba/git-fixture.git", "../formats/packfile/fixtures/git-fixture.ofs-delta"},
	{"https://github.com/spinnaker/spinnaker.git", "../formats/packfile/fixtures/spinnaker-spinnaker.pack"},
}

// create the repositories of the fixtures
func (s *SuiteCommon) SetUpSuite(c *C) {
	s.repos = make(map[string]*git.Repository, 0)
	for _, fixRepo := range fixtureRepos {
		s.repos[fixRepo.url] = git.NewPlainRepository()

		d, err := os.Open(fixRepo.packfile)
		defer func() {
			c.Assert(d.Close(), IsNil)
		}()
		c.Assert(err, IsNil)

		r := packfile.NewReader(d)
		r.Format = packfile.OFSDeltaFormat // TODO: how to know the format of a pack file ahead of time?

		_, err = r.Read(s.repos[fixRepo.url].Storage)
		c.Assert(err, IsNil)
	}
}

var blameTests = [...]struct {
	// input data to revlist
	repo   string
	branch string // TODO: remove this, it is no longer needed for local packfiles
	commit string
	path   string
	// expected output data form the revlist
	blames []string
}{
	// use the blame2humantest.bash script to easily add more tests.
	{"https://github.com/tyba/git-fixture.git", "master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5", "binary.jpg", concat(&[]string{},
		repeat("35e85108805c84807bc66a02d91535e1e24b38b9", 285),
	)},
	{"https://github.com/tyba/git-fixture.git", "master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5", "CHANGELOG", concat(&[]string{},
		repeat("b8e471f58bcbca63b07bda20e428190409c2db47", 1),
	)},
	{"https://github.com/tyba/git-fixture.git", "master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5", "go/example.go", concat(&[]string{},
		repeat("918c48b83bd081e863dbe1b80f8998f058cd8294", 142),
	)},
	{"https://github.com/tyba/git-fixture.git", "master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5", "json/long.json", concat(&[]string{},
		repeat("af2d6a6954d532f8ffb47615169c8fdf9d383a1a", 6492),
	)},
	{"https://github.com/tyba/git-fixture.git", "master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5", "json/short.json", concat(&[]string{},
		repeat("af2d6a6954d532f8ffb47615169c8fdf9d383a1a", 22),
	)},
	{"https://github.com/tyba/git-fixture.git", "master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5", "LICENSE", concat(&[]string{},
		repeat("b029517f6300c2da0f4b651b8642506cd6aaf45d", 22),
	)},
	{"https://github.com/tyba/git-fixture.git", "master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5", "php/crappy.php", concat(&[]string{},
		repeat("918c48b83bd081e863dbe1b80f8998f058cd8294", 259),
	)},
	{"https://github.com/tyba/git-fixture.git", "master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5", "vendor/foo.go", concat(&[]string{},
		repeat("6ecf0ef2c2dffb796033e5a02219af86ec6584e5", 7),
	)},
	/*
		// Failed
		{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "InstallSpinnaker.sh", concat(&[]string{},
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 2),
			repeat("a47d0aaeda421f06df248ad65bd58230766bf118", 1),
			repeat("23673af3ad70b50bba7fdafadc2323302f5ba520", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 29),
			repeat("9a06d3f20eabb254d0a1e2ff7735ef007ccd595e", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 4),
			repeat("a47d0aaeda421f06df248ad65bd58230766bf118", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 5),
			repeat("0c5bb1e4392e751f884f3c57de5d4aee72c40031", 2),
			repeat("d4b48a39aba7d3bd3e8abef2274a95b112d1ae73", 3),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 7),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 2),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 5),
			repeat("d4b48a39aba7d3bd3e8abef2274a95b112d1ae73", 7),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 3),
			repeat("d4b48a39aba7d3bd3e8abef2274a95b112d1ae73", 6),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 10),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 4),
			repeat("0c5bb1e4392e751f884f3c57de5d4aee72c40031", 2),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 2),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 4),
			repeat("23673af3ad70b50bba7fdafadc2323302f5ba520", 4),
			repeat("d4b48a39aba7d3bd3e8abef2274a95b112d1ae73", 4),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("d4b48a39aba7d3bd3e8abef2274a95b112d1ae73", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 1),
			repeat("0c5bb1e4392e751f884f3c57de5d4aee72c40031", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 13),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 2),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 6),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 2),
			repeat("0c5bb1e4392e751f884f3c57de5d4aee72c40031", 1),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 4),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 3),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 2),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 4),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 3),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 15),
			repeat("b41d7c0e5b20bbe7c8eb6606731a3ff68f4e3941", 1),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 1),
			repeat("b41d7c0e5b20bbe7c8eb6606731a3ff68f4e3941", 8),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 2),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 12),
			repeat("505577dc87d300cf562dc4702a05a5615d90d855", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 5),
			repeat("370d61cdbc1f3c90db6759f1599ccbabd40ad6c1", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 4),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 1),
			repeat("b41d7c0e5b20bbe7c8eb6606731a3ff68f4e3941", 5),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 3),
			repeat("b41d7c0e5b20bbe7c8eb6606731a3ff68f4e3941", 2),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 2),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 9),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 1),
			repeat("b41d7c0e5b20bbe7c8eb6606731a3ff68f4e3941", 3),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 4),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("8eb116de9128c314ac8a6f5310ca500b8c74f5db", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 6),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 6),
			repeat("d2f6214b625db706384b378a29cc4c22237db97a", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 3),
			repeat("d2f6214b625db706384b378a29cc4c22237db97a", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 4),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 1),
			repeat("c9c2a0ec03968ab17e8b16fdec9661eb1dbea173", 1),
			repeat("d2f6214b625db706384b378a29cc4c22237db97a", 2),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 12),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 5),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 3),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("01e65d67eed8afcb67a6bdf1c962541f62b299c9", 5),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 3),
			repeat("a47d0aaeda421f06df248ad65bd58230766bf118", 5),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 5),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("01e65d67eed8afcb67a6bdf1c962541f62b299c9", 2),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("01e65d67eed8afcb67a6bdf1c962541f62b299c9", 1),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("b2c7142082d52b09ca20228606c31c7479c0833e", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("495c7118e7cf757aa04eab410b64bfb5b5149ad2", 1),
			repeat("d4b48a39aba7d3bd3e8abef2274a95b112d1ae73", 1),
			repeat("495c7118e7cf757aa04eab410b64bfb5b5149ad2", 3),
			repeat("d4b48a39aba7d3bd3e8abef2274a95b112d1ae73", 1),
			repeat("495c7118e7cf757aa04eab410b64bfb5b5149ad2", 1),
			repeat("50d0556563599366f29cb286525780004fa5a317", 1),
			repeat("dd2d03c19658ff96d371aef00e75e2e54702da0e", 1),
			repeat("d4b48a39aba7d3bd3e8abef2274a95b112d1ae73", 1),
			repeat("dd2d03c19658ff96d371aef00e75e2e54702da0e", 2),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 2),
			repeat("01e65d67eed8afcb67a6bdf1c962541f62b299c9", 1),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("b5c6053a46993b20d1b91e7b7206bffa54669ad7", 1),
			repeat("9e74d009894d73dd07773ea6b3bdd8323db980f7", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("d4b48a39aba7d3bd3e8abef2274a95b112d1ae73", 4),
			repeat("01e65d67eed8afcb67a6bdf1c962541f62b299c9", 1),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
			repeat("d2f6214b625db706384b378a29cc4c22237db97a", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 3),
			repeat("b41d7c0e5b20bbe7c8eb6606731a3ff68f4e3941", 2),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 2),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 4),
			repeat("d2f6214b625db706384b378a29cc4c22237db97a", 1),
			repeat("b7015a5d36990d69a054482556127b9c7404a24a", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 5),
			repeat("b41d7c0e5b20bbe7c8eb6606731a3ff68f4e3941", 2),
			repeat("d2f6214b625db706384b378a29cc4c22237db97a", 1),
			repeat("ce9f123d790717599aaeb76bc62510de437761be", 5),
			repeat("ba486de7c025457963701114c683dcd4708e1dee", 4),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("01e65d67eed8afcb67a6bdf1c962541f62b299c9", 1),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("01e65d67eed8afcb67a6bdf1c962541f62b299c9", 3),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 1),
			repeat("01e65d67eed8afcb67a6bdf1c962541f62b299c9", 3),
			repeat("6328ee836affafc1b52127147b5ca07300ac78e6", 2),
			repeat("01e65d67eed8afcb67a6bdf1c962541f62b299c9", 3),
			repeat("3de4f77c105f700f50d9549d32b9a05a01b46c4b", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 2),
			repeat("370d61cdbc1f3c90db6759f1599ccbabd40ad6c1", 6),
			repeat("dd7e66c862209e8b912694a582a09c0db3227f0d", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 2),
			repeat("dd7e66c862209e8b912694a582a09c0db3227f0d", 3),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("dd7e66c862209e8b912694a582a09c0db3227f0d", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 3),
		)},
	*/
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/spinnaker/reconfigure_spinnaker.py", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 22),
		repeat("c89dab0d42f1856d157357e9010f8cc6a12f5b1f", 7),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/spinnaker/validate_configuration.py", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 29),
		repeat("1e3d328a2cabda5d0aaddc5dec65271343e0dc37", 19),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 15),
		repeat("b5d999e2986e190d81767cd3cfeda0260f9f6fb8", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 12),
		repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
		repeat("b5d999e2986e190d81767cd3cfeda0260f9f6fb8", 8),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("b5d999e2986e190d81767cd3cfeda0260f9f6fb8", 4),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 46),
		repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
		repeat("1e3d328a2cabda5d0aaddc5dec65271343e0dc37", 42),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("1e3d328a2cabda5d0aaddc5dec65271343e0dc37", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("1e3d328a2cabda5d0aaddc5dec65271343e0dc37", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 8),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("1e3d328a2cabda5d0aaddc5dec65271343e0dc37", 3),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 12),
		repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 10),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 69),
		repeat("b5d999e2986e190d81767cd3cfeda0260f9f6fb8", 7),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/spinnaker/run.py", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 185),
	)},
	/*
		// Fail by 3
		{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/spinnaker/configurator.py", concat(&[]string{},
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 53),
			repeat("c89dab0d42f1856d157357e9010f8cc6a12f5b1f", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
			repeat("e805183c72f0426fb073728c01901c2fd2db1da6", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 6),
			repeat("023d4fb17b76e0fe0764971df8b8538b735a1d67", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 36),
			repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
			repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 3),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
			repeat("c89dab0d42f1856d157357e9010f8cc6a12f5b1f", 13),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
			repeat("c89dab0d42f1856d157357e9010f8cc6a12f5b1f", 18),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
			repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 1),
			repeat("023d4fb17b76e0fe0764971df8b8538b735a1d67", 17),
			repeat("c89dab0d42f1856d157357e9010f8cc6a12f5b1f", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 43),
		)},
	*/
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/spinnaker/fetch.py", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 140),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/spinnaker/yaml_util.py", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 68),
		repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 8),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("023d4fb17b76e0fe0764971df8b8538b735a1d67", 3),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 7),
		repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 12),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 5),
		repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 33),
		repeat("bb6325e4e629fc7348a6d0e6842280d5304160ff", 40),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("b5d999e2986e190d81767cd3cfeda0260f9f6fb8", 7),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 5),
		repeat("b5d999e2986e190d81767cd3cfeda0260f9f6fb8", 4),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/spinnaker/spinnaker_runner.py", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 235),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 13),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 7),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 20),
		repeat("707bcdce04eabdb0549868ad1a8efa2d76b9bdf1", 7),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 21),
		repeat("2b28ea424acc8f2817d3298c143fae68bcad91a7", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 15),
		repeat("d73f9cee49a5ad27a42a6e18af7c49a8f28ad8a8", 17),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 336),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/spinnaker/transform_old_config.py", concat(&[]string{},
		repeat("a596972a661d9a7deca8abd18b52ce1a39516e89", 43),
		repeat("4584fab37e93d66fd1896d07fa3427f8056711bc", 1),
		repeat("a596972a661d9a7deca8abd18b52ce1a39516e89", 12),
		repeat("bb6325e4e629fc7348a6d0e6842280d5304160ff", 1),
		repeat("a596972a661d9a7deca8abd18b52ce1a39516e89", 16),
		repeat("0777fadf4ca6f458d7071de414f9bd5417911037", 1),
		repeat("a596972a661d9a7deca8abd18b52ce1a39516e89", 1),
		repeat("0777fadf4ca6f458d7071de414f9bd5417911037", 1),
		repeat("a596972a661d9a7deca8abd18b52ce1a39516e89", 8),
		repeat("0777fadf4ca6f458d7071de414f9bd5417911037", 1),
		repeat("a596972a661d9a7deca8abd18b52ce1a39516e89", 31),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/spinnaker/__init__.py", []string{}},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "pylib/yaml/LICENSE", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 19),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "settings.gradle", concat(&[]string{},
		repeat("ce9f123d790717599aaeb76bc62510de437761be", 1),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "gradle/wrapper/gradle-wrapper.jar", concat(&[]string{},
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 1),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 7),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 2),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 2),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 3),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 1),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 10),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 11),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 29),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 7),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 58),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 1),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 1),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 2),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 2),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 13),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 4),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 3),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 13),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 2),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 9),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 3),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 1),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 17),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 3),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 6),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 6),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 3),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 5),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 4),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 3),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 2),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 6),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 55),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "gradle/wrapper/gradle-wrapper.properties", concat(&[]string{},
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
		repeat("11d6c1020b1765e236ca65b2709d37b5bfdba0f4", 4),
		repeat("bc02440df2ff95a014a7b3cb11b98c3a2bded777", 1),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "gradle/buildViaTravis.sh", concat(&[]string{},
		repeat("7ecc2ad58e24a5b52504985467a10c6a3bb85b9b", 24),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "config/settings.js", concat(&[]string{},
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 17),
		repeat("99534ecc895fe17a1d562bb3049d4168a04d0865", 1),
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 43),
		repeat("d2838db9f6ef9628645e7d04cd9658a83e8708ea", 1),
		repeat("637ba49300f701cfbd859c1ccf13c4f39a9ba1c8", 1),
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 13),
	)},
	/*
		// fail a few lines
		{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "config/default-spinnaker-local.yml", concat(&[]string{},
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 9),
			repeat("5e09821cbd7d710405b61cab0a795c2982a71b9c", 2),
			repeat("99534ecc895fe17a1d562bb3049d4168a04d0865", 1),
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 2),
			repeat("a596972a661d9a7deca8abd18b52ce1a39516e89", 1),
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 5),
			repeat("5e09821cbd7d710405b61cab0a795c2982a71b9c", 2),
			repeat("a596972a661d9a7deca8abd18b52ce1a39516e89", 1),
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 5),
			repeat("5e09821cbd7d710405b61cab0a795c2982a71b9c", 1),
			repeat("8980daf661408a3faa1f22c225702a5c1d11d5c9", 1),
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 25),
			repeat("caf6d62e8285d4681514dd8027356fb019bc97ff", 1),
			repeat("eaf7614cad81e8ab5c813dd4821129d0c04ea449", 1),
			repeat("caf6d62e8285d4681514dd8027356fb019bc97ff", 1),
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 24),
			repeat("974b775a8978b120ff710cac93a21c7387b914c9", 2),
			repeat("3ce7b902a51bac2f10994f7d1f251b616c975e54", 1),
			repeat("5a2a845bc08974a36d599a4a4b7e25be833823b0", 6),
			repeat("41e96c54a478e5d09dd07ed7feb2d8d08d8c7e3c", 14),
			repeat("7c8d9a6081d9cb7a56c479bfe64d70540ea32795", 5),
			repeat("5a2a845bc08974a36d599a4a4b7e25be833823b0", 2),
		)},
	*/
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "config/igor.yml", concat(&[]string{},
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 15),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "config/echo.yml", concat(&[]string{},
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 15),
		repeat("5a2a845bc08974a36d599a4a4b7e25be833823b0", 1),
		repeat("7c8d9a6081d9cb7a56c479bfe64d70540ea32795", 4),
		repeat("5a2a845bc08974a36d599a4a4b7e25be833823b0", 24),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "config/orca.yml", concat(&[]string{},
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 40),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "config/rosco.yml", concat(&[]string{},
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 9),
		repeat("24dc2d465c85cb242262ab6bc236bde3ffbb93e0", 3),
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 3),
		repeat("caf6d62e8285d4681514dd8027356fb019bc97ff", 2),
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 3),
		repeat("974b775a8978b120ff710cac93a21c7387b914c9", 2),
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 1),
		repeat("974b775a8978b120ff710cac93a21c7387b914c9", 1),
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 2),
		repeat("974b775a8978b120ff710cac93a21c7387b914c9", 2),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "config/rush.yml", concat(&[]string{},
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 18),
	)},
	/*
		// fail one line
		{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "config/spinnaker.yml", concat(&[]string{},
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 32),
			repeat("41e96c54a478e5d09dd07ed7feb2d8d08d8c7e3c", 2),
			repeat("5a2a845bc08974a36d599a4a4b7e25be833823b0", 1),
			repeat("41e96c54a478e5d09dd07ed7feb2d8d08d8c7e3c", 6),
			repeat("5a2a845bc08974a36d599a4a4b7e25be833823b0", 2),
			repeat("41e96c54a478e5d09dd07ed7feb2d8d08d8c7e3c", 2),
			repeat("5a2a845bc08974a36d599a4a4b7e25be833823b0", 2),
			repeat("41e96c54a478e5d09dd07ed7feb2d8d08d8c7e3c", 3),
			repeat("7c8d9a6081d9cb7a56c479bfe64d70540ea32795", 3),
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 50),
			repeat("974b775a8978b120ff710cac93a21c7387b914c9", 2),
			repeat("d4553dac205023fa77652308af1a2d1cf52138fb", 1),
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 9),
			repeat("caf6d62e8285d4681514dd8027356fb019bc97ff", 1),
			repeat("eaf7614cad81e8ab5c813dd4821129d0c04ea449", 1),
			repeat("caf6d62e8285d4681514dd8027356fb019bc97ff", 1),
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 39),
			repeat("079e42e7c979541b6fab7343838f7b9fd4a360cd", 6),
			repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 15),
		)},
	*/
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "config/gate.yml", concat(&[]string{},
		repeat("ae904e8d60228c21c47368f6a10f1cc9ca3aeebf", 29),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/run_dev.sh", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 23),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/build_google_image.sh", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 16),
		repeat("f66196ceed7d6aeca313b0632657ab762487ced3", 18),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/refresh_source.py", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 21),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 14),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 1),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 12),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 35),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 10),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 34),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 11),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 17),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 8),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 1),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 1),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 23),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 8),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 5),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 5),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 6),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 7),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 1),
		repeat("ba10a5d5615f68eb9115cada1d639066a53ddc4d", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 7),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 1),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 9),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 2),
		repeat("a80d310d9ca42c3422627f2ecca7ee1dbefa602a", 13),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 11),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 6),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 3),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 5),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("b192881117651465df2385ef89344dd5dd4810f3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 5),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 2),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 12),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 11),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("1e14f94bcf82694fdc7e2dcbbfdbbed58db0f4d9", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 14),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 2),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 12),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 5),
		repeat("13ad4df676a16caf2ff1ca216be615d5aee37db3", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 36),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 7),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 4),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 21),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 3),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 6),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 19),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 8),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 14),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 1),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("3d3819741bada73fb950f14309c97e1f63492ec6", 2),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 5),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("e3620408a7776039f7853a21748921ea2a281953", 1),
	)},
	/*
		{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/install_development.sh", concat(&[]string{},
			repeat("99534ecc895fe17a1d562bb3049d4168a04d0865", 1),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 71),
		)},
	*/
	/*
		// FAIL two lines interchanged
		{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/bootstrap_dev.sh", concat(&[]string{},
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 95),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 10),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 7),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 3),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 12),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 2),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 6),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 1),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 4),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
			repeat("376599177551c3f04ccc94d71bbb4d037dec0c3f", 2),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 17),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 2),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 2),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 5),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 5),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 8),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 4),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 1),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 6),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 4),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 10),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 2),
			repeat("fc28a378558cdb5bbc08b6dcb96ee77c5b716760", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 8),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 1),
			repeat("fc28a378558cdb5bbc08b6dcb96ee77c5b716760", 1),
			repeat("d1ff4e13e9e0b500821aa558373878f93487e34b", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 4),
			repeat("24551a5d486969a2972ee05e87f16444890f9555", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
			repeat("24551a5d486969a2972ee05e87f16444890f9555", 1),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 8),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 13),
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 5),
			repeat("24551a5d486969a2972ee05e87f16444890f9555", 1),
			repeat("838aed816872c52ed435e4876a7b64dba0bed500", 8),
		)},
	*/
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/build_release.sh", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 17),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/stop_dev.sh", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 23),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/build_google_image.packer", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
		repeat("8fe3f13ad04ee25fde0add4ed19d29acd49a5916", 1),
		repeat("f66196ceed7d6aeca313b0632657ab762487ced3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 1),
		repeat("f66196ceed7d6aeca313b0632657ab762487ced3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 2),
		repeat("8fe3f13ad04ee25fde0add4ed19d29acd49a5916", 1),
		repeat("f66196ceed7d6aeca313b0632657ab762487ced3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 14),
		repeat("f66196ceed7d6aeca313b0632657ab762487ced3", 1),
		repeat("0d9c9cef53af38cefcb6801bb492aaed3f2c9a42", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
		repeat("f66196ceed7d6aeca313b0632657ab762487ced3", 8),
		repeat("6eb5d9c5225224bfe59c401182a2939d6c27fc00", 1),
		repeat("f66196ceed7d6aeca313b0632657ab762487ced3", 1),
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 3),
	)},
	{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/refresh_source.sh", concat(&[]string{},
		repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 17),
	)},
	/*
		// FAIL move?
		{"https://github.com/spinnaker/spinnaker.git", "master", "f39d86f59a0781f130e8de6b2115329c1fbe9545", "dev/create_google_dev_vm.sh", concat(&[]string{},
			repeat("a24001f6938d425d0e7504bdf5d27fc866a85c3d", 20),
		)},
	*/
}

// run a blame on all the suite's tests
func (s *SuiteCommon) TestBlame(c *C) {
	for _, t := range blameTests {
		fmt.Println("Blamming", t.repo, t.branch, t.commit, t.path)
		repo, ok := s.repos[t.repo]
		c.Assert(ok, Equals, true)

		commit, err := repo.Commit(core.NewHash(t.commit))
		c.Assert(err, IsNil)

		blames, err := Blame(repo, commit, t.path)
		c.Assert(err, IsNil)

		c.Assert(len(blames), Equals, len(t.blames), Commentf("\nrepo=%s, branch=%s, commit=%s, path=%s",
			t.repo, t.branch, t.commit, t.path))
		c.Assert(blames, DeepEquals, s.commits(c, t.repo, t.blames...), Commentf("\nrepo=%s, branch=%s, commit=%s, path=%s, \n%s",
			t.repo, t.branch, t.commit, t.path, compareSideBySide2(t.blames, blames)))
	}
}

// TODO: duplicated from revlist/revlist_test.go
// returns the commits from a slice of hashes
func (s *SuiteCommon) commits(cc *C, repo string, hs ...string) []*git.Commit {
	r, ok := s.repos[repo]
	cc.Assert(ok, Equals, true)
	result := make([]*git.Commit, 0, len(hs))
	for _, h := range hs {
		c, err := r.Commit(core.NewHash(h))
		cc.Assert(err, IsNil)
		result = append(result, c)
	}
	return result
}

// TODO: duplicated from revlist/revlist_test.go
// same length is assumed
func compareSideBySide2(a []string, b []*git.Commit) string {
	var buf bytes.Buffer
	buf.WriteString("\t              EXPECTED                                          OBTAINED        ")
	var sep string
	var obtained string
	for i := range a {
		obtained = b[i].Hash.String()
		if a[i] != obtained {
			sep = "------"
		} else {
			sep = "      "
		}
		buf.WriteString(fmt.Sprintf("\n%d", i+1))
		buf.WriteString(sep)
		buf.WriteString(a[i])
		buf.WriteString(sep)
		buf.WriteString(obtained)
	}
	return buf.String()
}

// utility function to avoid writing so many repeated commits
func repeat(s string, n int) []string {
	if n < 0 {
		panic("repeat: n < 0")
	}
	r := make([]string, 0, n)
	for i := 0; i < n; i++ {
		r = append(r, s)
	}
	return r
}

// utility function to concat slices
func concat(dst *[]string, vargs ...[]string) []string {
	for _, ss := range vargs {
		for _, s := range ss {
			*dst = append(*dst, s)
		}
	}
	return *dst
}