master
1import { Commit, define } from '#src'
2
3export default define({
4 url: import.meta.url,
5 tiers: true,
6 badges: [
7 'fix-2',
8 'fix-3',
9 'fix-4',
10 'fix-5',
11 'fix-6',
12 'fix-6+', // For more than 6
13 ] as const,
14 present(data, grant) {
15 for (const repo of data.repos) {
16 const sequences: Commit[][] = []
17 let previousCommitDate = null
18 let evidence: Commit[] = []
19
20 for (const commit of repo.commits) {
21 const currentCommitDate = new Date(commit.committedDate)
22
23 const isFix = /^fix/i.test(commit.message)
24 const isSequential =
25 previousCommitDate === null ||
26 currentCommitDate.getTime() - previousCommitDate.getTime() <=
27 15 * 60 * 1000
28
29 if (isFix && isSequential) {
30 evidence.push(commit)
31 } else {
32 sequences.push(evidence)
33 evidence = isFix ? [commit] : []
34 }
35
36 previousCommitDate = currentCommitDate
37 }
38
39 if (evidence.length > 0) {
40 sequences.push(evidence)
41 }
42
43 sequences.sort((a, b) => a.length - b.length)
44
45 for (const sec of sequences) {
46 const count = sec.length
47 const description = `I did ${count} sequential fixes.`
48
49 if (count === 2)
50 grant('fix-2', description)
51 .evidenceCommitsWithMessage(...sec)
52 .tier(1)
53 else if (count === 3)
54 grant('fix-3', description)
55 .evidenceCommitsWithMessage(...sec)
56 .tier(2)
57 else if (count === 4)
58 grant('fix-4', description)
59 .evidenceCommitsWithMessage(...sec)
60 .tier(3)
61 else if (count === 5)
62 grant('fix-5', description)
63 .evidenceCommitsWithMessage(...sec)
64 .tier(4)
65 else if (count === 6)
66 grant('fix-6', description)
67 .evidenceCommitsWithMessage(...sec)
68 .tier(5)
69 else if (count > 6)
70 grant('fix-6+', description)
71 .evidenceCommitsWithMessage(...sec)
72 .tier(6)
73 }
74 }
75 },
76})