Files snapshot from main
0
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
f72d85 Tucker McKnight
b8a3bb Tucker McKnight
268685 Tucker McKnight
fb82fe Tucker McKnight
b8a3bb Tucker McKnight
268685 Tucker McKnight
268685 Tucker McKnight
b8a3bb Tucker McKnight
268685 Tucker McKnight
b8a3bb Tucker McKnight
268685 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
383520 Tucker McKnight
268685 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
31332f Tucker McKnight
31332f Tucker McKnight
b8a3bb Tucker McKnight
f72d85 Tucker McKnight
f72d85 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
f72d85 Tucker McKnight
31332f Tucker McKnight
383520 Tucker McKnight
383520 Tucker McKnight
383520 Tucker McKnight
383520 Tucker McKnight
31332f Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
f72d85 Tucker McKnight
31332f Tucker McKnight
383520 Tucker McKnight
383520 Tucker McKnight
383520 Tucker McKnight
383520 Tucker McKnight
31332f Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
268685 Tucker McKnight
b8a3bb Tucker McKnight
268685 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
2ecee5 Tucker McKnight
2ecee5 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
import escape from 'escape-html'
import * as Diff from 'diff'
import {type Repository} from './dataTypes.ts'
import { type ReposConfiguration } from './configTypes.ts'
type Diffs = ReturnType<Repository['commits']['get']>['diffs']
const getGitDiffsFromPatchText = (patchText: string): Diffs => {
const lines = patchText.split("\n")
const hunks: Diffs = []
let previousHunk = -1
const filenameRegex = RegExp(/diff --git a\/(.*?) b\/(.*?)/)
const lineNumberRegex = RegExp(/@@ -(.*?)[,| ].*/)
let previousFilename = ''
let currentFilename = ''
let skipFourStartingAt = -1
lines.forEach((line, index) => {
if (line.startsWith("diff")) {
previousFilename = currentFilename
currentFilename = line.match(filenameRegex)[1]
if (previousHunk !== -1) {
skipFourStartingAt = index
}
}
if (line.startsWith("@@") || index == lines.length - 1) {
if (previousHunk === -1) {
previousHunk = index
return
}
let hunkEndIndex = index + 1
if (skipFourStartingAt !== -1 && skipFourStartingAt < hunkEndIndex) {
hunkEndIndex = skipFourStartingAt
skipFourStartingAt = -1
}
const lastHunk = lines.slice(previousHunk, hunkEndIndex)
let lastHunkBefore = lastHunk.filter((line) => {
return line.startsWith("-") || line.startsWith(" ")
}).map((str) => {
if (str.startsWith('-')) { return str.replace("-", "") }
if (str.startsWith(' ')) { return str.replace(" ", "") }
}).join("\n")
let lastHunkAfter = lastHunk.filter((line) => {
return line.startsWith("+") || line.startsWith(" ")
}).map((str) => {
if (str.startsWith('+')) { return str.replace("+", "") }
if (str.startsWith(' ')) { return str.replace(" ", "") }
}).join("\n")
const changeObject = Diff.diffWordsWithSpace(lastHunkBefore, lastHunkAfter)
let beforeText = ""
let afterText = ""
changeObject.forEach((obj) => {
const numNewLines = obj.value.split('').filter(char => char === '\n').length
if (!obj.added && !obj.removed) {
beforeText = beforeText + escape(obj.value)
afterText = afterText + escape(obj.value)
}
if (obj.added) {
afterText = afterText + "<mark>" + escape(obj.value) + "</mark>"
if (numNewLines > 0) {
let insertAt = beforeText.lastIndexOf("\n")
insertAt = insertAt === -1 ? 0 : insertAt
beforeText = beforeText.slice(0, insertAt + 1) + (new Array(numNewLines).fill('\u{2063}\n', 0).join('')) + beforeText.slice(insertAt + 1)
}
}
if (obj.removed) {
beforeText = beforeText + "<mark>" + escape(obj.value) + "</mark>"
if (numNewLines > 0) {
let insertAt = afterText.lastIndexOf("\n")
insertAt = insertAt === -1 ? 0 : insertAt
afterText = afterText.slice(0, insertAt + 1) + (new Array(numNewLines).fill('\u{2063}\n', 0).join('')) + afterText.slice(insertAt + 1)
}
}
})
hunks.push({
fileName: previousFilename !== '' ? previousFilename : currentFilename,
lineNumber: parseInt(lines[previousHunk].match(lineNumberRegex)[1]),
beforeText,
afterText,
})
previousFilename = ''
previousHunk = index
}
})
return hunks
}
const getLocation = (reposConfig: ReposConfiguration, outputDir: string, repoName: string): string => {
return outputDir + (reposConfig.path || "") + "/" + repoName + ".git"
}
export {
getGitDiffsFromPatchText,
getLocation,
}