Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 0 additions & 24 deletions __tests__/fixtures/test.diff

This file was deleted.

12 changes: 1 addition & 11 deletions __tests__/utils/diff.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
import {test, expect} from 'vitest'
import {parseGitDiff, parsePatch} from '../../src/utils/diff'
import {getFixturePath} from '../fixtures/util'
import * as fs from 'fs'

test('should parse Git diff', async function () {
const path = getFixturePath('test.diff')
const diffOutput = fs.readFileSync(path, 'utf8')
const output = parseGitDiff(diffOutput)

expect(output).toMatchSnapshot()
})
import {parsePatch} from '../../src/utils/diff'

test('parsePatch should return empty array for empty patch', () => {
expect(parsePatch('')).toEqual([])
Expand Down
64 changes: 0 additions & 64 deletions dist/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/index.js.map

Large diffs are not rendered by default.

73 changes: 0 additions & 73 deletions src/utils/diff.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
interface FileDiff {
filename: string
addedLines: number[]
deletedLines: number[]
}

/**
* Parse a single file's patch (from GitHub's listFiles API) to extract added line numbers.
* The patch format contains only hunk headers (@@) and changes, not the full diff header.
Expand Down Expand Up @@ -33,73 +27,6 @@ export function parsePatch(patch: string): number[] {
return addedLines
}

export function parseGitDiff(diffOutput: string): FileDiff[] {
const fileDiffs: FileDiff[] = []
const lines = diffOutput.split('\n')

let currentFileDiff: FileDiff | undefined
let currentAddedLines: number[] = []
let currentDeletedLines: number[] = []
let seenHeaderLine = false
let deletionCurrentLineNumber = 0
let additionCurrentLineNumber = 0

for (const line of lines) {
if (line.startsWith('diff --git')) {
// New file diff starts
if (currentFileDiff) {
currentFileDiff.addedLines = currentAddedLines
currentFileDiff.deletedLines = currentDeletedLines
fileDiffs.push(currentFileDiff)
}

currentFileDiff = {
filename: getFilenameFromDiffHeader(line),
addedLines: [],
deletedLines: []
}
currentAddedLines = []
currentDeletedLines = []
seenHeaderLine = false
} else if (line.startsWith('@@')) {
// Header line
seenHeaderLine = true
const lineInfo = getLineInfoFromHeaderLine(line)
deletionCurrentLineNumber = lineInfo.deletionStartingLineNumber
additionCurrentLineNumber = lineInfo.additionStartingLineNumber
} else if (line.startsWith('+') && seenHeaderLine) {
// Added line
currentAddedLines.push(additionCurrentLineNumber)
additionCurrentLineNumber++
} else if (line.startsWith('-') && seenHeaderLine) {
// Deleted line
currentDeletedLines.push(deletionCurrentLineNumber)
deletionCurrentLineNumber++
} else if (seenHeaderLine) {
// Context line
deletionCurrentLineNumber++
additionCurrentLineNumber++
}
}

// Add the last file diff
if (currentFileDiff) {
currentFileDiff.addedLines = currentAddedLines
currentFileDiff.deletedLines = currentDeletedLines
fileDiffs.push(currentFileDiff)
}

return fileDiffs
}

function getFilenameFromDiffHeader(header: string): string {
// Extract the filename from the diff header
const startIndex = header.indexOf(' a/') + 3
const endIndex = header.indexOf(' b/', startIndex)
const filename = header.substring(startIndex, endIndex)
return filename
}

function getLineInfoFromHeaderLine(line: string): {
deletionStartingLineNumber: number
additionStartingLineNumber: number
Expand Down