(line string, oldNum, newNum *int)
| 62 | } |
| 63 | |
| 64 | func parseDiffLine(line string, oldNum, newNum *int) *DiffLine { |
| 65 | switch { |
| 66 | case strings.HasPrefix(line, "diff --git"), |
| 67 | strings.HasPrefix(line, "index "), |
| 68 | strings.HasPrefix(line, "new file"), |
| 69 | strings.HasPrefix(line, "deleted file"), |
| 70 | strings.HasPrefix(line, "similarity"), |
| 71 | strings.HasPrefix(line, "rename"), |
| 72 | strings.HasPrefix(line, "old mode"), |
| 73 | strings.HasPrefix(line, "new mode"), |
| 74 | strings.HasPrefix(line, "--- "), |
| 75 | strings.HasPrefix(line, "+++ "): |
| 76 | // Skip raw git headers — we show a clean file banner instead |
| 77 | return nil |
| 78 | case strings.HasPrefix(line, "@@"): |
| 79 | parseHunkHeader(line, oldNum, newNum) |
| 80 | content := extractHunkContext(line) |
| 81 | return &DiffLine{Type: LineHunkHeader, Content: content, OldNum: -1, NewNum: -1} |
| 82 | case strings.HasPrefix(line, "+"): |
| 83 | dl := &DiffLine{Type: LineAdded, Content: line[1:], OldNum: -1, NewNum: *newNum} |
| 84 | *newNum++ |
| 85 | return dl |
| 86 | case strings.HasPrefix(line, "-"): |
| 87 | dl := &DiffLine{Type: LineRemoved, Content: line[1:], OldNum: *oldNum, NewNum: -1} |
| 88 | *oldNum++ |
| 89 | return dl |
| 90 | case strings.HasPrefix(line, `\`): |
| 91 | return nil |
| 92 | case line == "": |
| 93 | return nil |
| 94 | default: |
| 95 | content := line |
| 96 | if strings.HasPrefix(line, " ") { |
| 97 | content = line[1:] |
| 98 | } |
| 99 | dl := &DiffLine{Type: LineContext, Content: content, OldNum: *oldNum, NewNum: *newNum} |
| 100 | *oldNum++ |
| 101 | *newNum++ |
| 102 | return dl |
| 103 | } |
| 104 | } |
| 105 | |
| 106 | // extractHunkContext pulls the function/context part from a hunk header. |
| 107 | // "@@ -13,6 +13,7 @@ func main() {" → "func main() {" |
no test coverage detected