• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ggilder / codecoverage / 14650332767

24 Apr 2025 07:45PM UTC coverage: 70.68% (-11.1%) from 81.763%
14650332767

push

github

web-flow
Update dependencies (#24)

72 of 110 branches covered (65.45%)

Branch coverage included in aggregate %.

5 of 13 new or added lines in 4 files covered. (38.46%)

13 existing lines in 3 files now uncovered.

292 of 405 relevant lines covered (72.1%)

3.16 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.25
/src/utils/diff.ts
1
interface FileDiff {
2
  filename: string
3
  addedLines: number[]
4
  deletedLines: number[]
5
}
6

7
export function parseGitDiff(diffOutput: string): FileDiff[] {
1✔
8
  const fileDiffs: FileDiff[] = []
1✔
9
  const lines = diffOutput.split('\n')
1✔
10

11
  let currentFileDiff: FileDiff | undefined
1✔
12
  let currentAddedLines: number[] = []
1✔
13
  let currentDeletedLines: number[] = []
1✔
14
  let seenHeaderLine = false
1✔
15
  let deletionCurrentLineNumber = 0
1✔
16
  let additionCurrentLineNumber = 0
1✔
17

18
  for (const line of lines) {
1✔
19
    if (line.startsWith('diff --git')) {
25✔
20
      // New file diff starts
21
      if (currentFileDiff) {
2✔
22
        currentFileDiff.addedLines = currentAddedLines
1✔
23
        currentFileDiff.deletedLines = currentDeletedLines
1✔
24
        fileDiffs.push(currentFileDiff)
1✔
25
      }
1✔
26

27
      currentFileDiff = {
2✔
28
        filename: getFilenameFromDiffHeader(line),
2✔
29
        addedLines: [],
2✔
30
        deletedLines: []
2✔
31
      }
2✔
32
      currentAddedLines = []
2✔
33
      currentDeletedLines = []
2✔
34
      seenHeaderLine = false
2✔
35
    } else if (line.startsWith('@@')) {
25✔
36
      // Header line
37
      seenHeaderLine = true
3✔
38
      const lineInfo = getLineInfoFromHeaderLine(line)
3✔
39
      deletionCurrentLineNumber = lineInfo.deletionStartingLineNumber
3✔
40
      additionCurrentLineNumber = lineInfo.additionStartingLineNumber
3✔
41
    } else if (line.startsWith('+') && seenHeaderLine) {
23✔
42
      // Added line
43
      currentAddedLines.push(additionCurrentLineNumber)
5✔
44
      additionCurrentLineNumber++
5✔
45
    } else if (line.startsWith('-') && seenHeaderLine) {
20✔
46
      // Deleted line
47
      currentDeletedLines.push(deletionCurrentLineNumber)
2✔
48
      deletionCurrentLineNumber++
2✔
49
    } else if (seenHeaderLine) {
15✔
50
      // Context line
51
      deletionCurrentLineNumber++
7✔
52
      additionCurrentLineNumber++
7✔
53
    }
7✔
54
  }
25✔
55

56
  // Add the last file diff
57
  if (currentFileDiff) {
1✔
58
    currentFileDiff.addedLines = currentAddedLines
1✔
59
    currentFileDiff.deletedLines = currentDeletedLines
1✔
60
    fileDiffs.push(currentFileDiff)
1✔
61
  }
1✔
62

63
  return fileDiffs
1✔
64
}
1✔
65

66
function getFilenameFromDiffHeader(header: string): string {
2✔
67
  // Extract the filename from the diff header
68
  const startIndex = header.indexOf(' a/') + 3
2✔
69
  const endIndex = header.indexOf(' b/', startIndex)
2✔
70
  const filename = header.substring(startIndex, endIndex)
2✔
71
  return filename
2✔
72
}
2✔
73

74
function getLineInfoFromHeaderLine(line: string): {
3✔
75
  deletionStartingLineNumber: number
76
  additionStartingLineNumber: number
77
} {
3✔
78
  // Extract the starting line numbers for each side of the diff
79
  const matches = line.match(/-(\d+),?(\d+)? \+(\d+),?(\d+)? @@/)
3✔
80
  if (matches && matches.length === 5) {
3✔
81
    const deletionStartingLineNumber = parseInt(matches[1], 10)
3✔
82
    const additionStartingLineNumber = parseInt(matches[3], 10)
3✔
83
    return {deletionStartingLineNumber, additionStartingLineNumber}
3✔
84
  }
3!
85
  return {deletionStartingLineNumber: 0, additionStartingLineNumber: 0}
×
UNCOV
86
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc