Files snapshot from 0.1.2
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
330625 Tucker McKnight
f72d85 Tucker McKnight
b8a3bb Tucker McKnight
56955e Tucker McKnight
90eb8e Tucker McKnight
b8a3bb Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
068b58 Tucker McKnight
068b58 Tucker McKnight
068b58 Tucker McKnight
068b58 Tucker McKnight
068b58 Tucker McKnight
068b58 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
db73e2 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
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
268685 Tucker McKnight
b8a3bb Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
068b58 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
3d77c2 Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
3d77c2 Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
56955e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
330625 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
56955e Tucker McKnight
b8a3bb Tucker McKnight
330625 Tucker McKnight
b8a3bb Tucker McKnight
import childProcess from 'child_process'
import escape from 'escape-html'
import * as Diff from 'diff'
import {type Repository, ParsedDiff} from './dataTypes.ts'
import { type ReposConfigurationWithDefaultsApplied } from './configTypes.ts'
const getGitDiffsFromPatchText = (lines: string[]): Array<ParsedDiff> => {
const hunks: Array<ParsedDiff> = []
let previousHunk = -1
const filenameRegex = RegExp(/diff --git a\/(.*?) b\/(.*?)/)
const lineNumberRegex = RegExp(/@@ -(.*?)[,| ].*/)
let previousFilename = ''
let currentFilename = ''
let skipFourStartingAt = -1
let index = -1
// lines is an array of each line that would be in `git show` output
for (const line of lines) {
index = index + 1
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
continue
}
let hunkEndIndex = index + 1
if (skipFourStartingAt !== -1 && skipFourStartingAt < hunkEndIndex) {
hunkEndIndex = skipFourStartingAt
skipFourStartingAt = -1
}
const lastHunk = lines.slice(previousHunk, hunkEndIndex)
let lastHunkBeforeLength = lastHunk.filter((line) => {
return line.startsWith("-")
}).length
let lastHunkAfterLength = lastHunk.filter((line) => {
return line.startsWith("+")
}).length
hunks.push({
fileName: previousFilename !== '' ? previousFilename : currentFilename,
lineNumber: parseInt(lines[previousHunk].match(lineNumberRegex)[1]),
unifiedDiff: lastHunk,
added: lastHunkAfterLength,
removed: lastHunkBeforeLength,
})
previousFilename = ''
previousHunk = index
}
}
return hunks
}
const getDiffHtmlMarkup = (unifiedDiff: string[]): { beforeText: string, afterText: string } => {
let lastHunkBefore = unifiedDiff.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 = unifiedDiff.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 = (lastHunkBefore.length > 50000 || lastHunkAfter.length > 50000)
? []
: Diff.diffWordsWithSpace(lastHunkBefore, lastHunkAfter)
let beforeText = ""
let afterText = ""
for (const obj of changeObject) {
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)
}
}
}
return {
beforeText,
afterText
}
}
const getLocation = (reposConfig: ReposConfigurationWithDefaultsApplied, outputDir: string, repoName: string, slugify: Function): string => {
return outputDir + (reposConfig.path) + "/" + slugify(repoName) + ".git"
}
const readChunkedCommandOutput = async (executable, args): Promise<string> => {
return new Promise((resolve) => {
const cmd = childProcess.spawn(executable, args, {
stdio: [0, "pipe", "inherit"],
})
let output = ""
cmd.stdout.on('data', (data) => {
output = output + data
})
cmd.on('close', () => {
resolve(output)
})
})
}
export {
getGitDiffsFromPatchText,
getDiffHtmlMarkup,
getLocation,
readChunkedCommandOutput,
}