Skip to content

Commit ea9c1fe

Browse files
committed
feature: new diffMaxChanges in parser config
If `diffMaxChanges` is set in parser config, and its value is exceeded for a given file diff, then parsing for this file is stopped, and `isTooBig` is set to `true` in the `DiffFile`
1 parent f046d18 commit ea9c1fe

File tree

3 files changed

+158
-0
lines changed

3 files changed

+158
-0
lines changed

src/__tests__/diff-parser-tests.ts

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,5 +1975,149 @@ describe('DiffParser', () => {
19751975
]
19761976
`);
19771977
});
1978+
1979+
it('should stop parsing file and mark it as `isTooBig` if `diffMaxChanges` is set and excedeed', () => {
1980+
const diff =
1981+
'diff --git a/src/core/init.js b/src/core/init.js\n' +
1982+
'index e49196a..50f310c 100644\n' +
1983+
'--- a/src/core/init.js\n' +
1984+
'+++ b/src/core/init.js\n' +
1985+
'@@ -101,7 +101,7 @@ var rootjQuery,\n' +
1986+
' // HANDLE: $(function)\n' +
1987+
' // Shortcut for document ready\n' +
1988+
' } else if ( jQuery.isFunction( selector ) ) {\n' +
1989+
'- return typeof rootjQuery.ready !== "undefined" ?\n' +
1990+
'+ return rootjQuery.ready !== undefined ?\n' +
1991+
' rootjQuery.ready( selector ) :\n' +
1992+
' // Execute immediately if ready is not present\n' +
1993+
' selector( jQuery );\n' +
1994+
'diff --git a/src/event.js b/src/event.js\n' +
1995+
'index 7336f4d..6183f70 100644\n' +
1996+
'--- a/src/event.js\n' +
1997+
'+++ b/src/event.js\n' +
1998+
'@@ -1,6 +1,5 @@\n' +
1999+
' define([\n' +
2000+
' "./core",\n' +
2001+
'- "./var/strundefined",\n' +
2002+
' "./var/rnotwhite",\n' +
2003+
' "./var/hasOwn",\n' +
2004+
' "./var/slice",\n';
2005+
const result = parse(diff, { diffMaxChanges: 1 });
2006+
expect(result).toMatchInlineSnapshot(`
2007+
Array [
2008+
Object {
2009+
"addedLines": 1,
2010+
"blocks": Array [
2011+
Object {
2012+
"header": "@@ -101,7 +101,7 @@ var rootjQuery,",
2013+
"lines": Array [
2014+
Object {
2015+
"content": " // HANDLE: $(function)",
2016+
"newNumber": 101,
2017+
"oldNumber": 101,
2018+
"type": "context",
2019+
},
2020+
Object {
2021+
"content": " // Shortcut for document ready",
2022+
"newNumber": 102,
2023+
"oldNumber": 102,
2024+
"type": "context",
2025+
},
2026+
Object {
2027+
"content": " } else if ( jQuery.isFunction( selector ) ) {",
2028+
"newNumber": 103,
2029+
"oldNumber": 103,
2030+
"type": "context",
2031+
},
2032+
Object {
2033+
"content": "- return typeof rootjQuery.ready !== \\"undefined\\" ?",
2034+
"newNumber": undefined,
2035+
"oldNumber": 104,
2036+
"type": "delete",
2037+
},
2038+
Object {
2039+
"content": "+ return rootjQuery.ready !== undefined ?",
2040+
"newNumber": 104,
2041+
"oldNumber": undefined,
2042+
"type": "insert",
2043+
},
2044+
],
2045+
"newStartLine": 101,
2046+
"oldStartLine": 101,
2047+
"oldStartLine2": null,
2048+
},
2049+
],
2050+
"checksumAfter": "50f310c",
2051+
"checksumBefore": "e49196a",
2052+
"deletedLines": 1,
2053+
"isCombined": false,
2054+
"isGitDiff": true,
2055+
"isTooBig": true,
2056+
"language": "js",
2057+
"mode": "100644",
2058+
"newName": "src/core/init.js",
2059+
"oldName": "src/core/init.js",
2060+
},
2061+
Object {
2062+
"addedLines": 0,
2063+
"blocks": Array [
2064+
Object {
2065+
"header": "@@ -1,6 +1,5 @@",
2066+
"lines": Array [
2067+
Object {
2068+
"content": " define([",
2069+
"newNumber": 1,
2070+
"oldNumber": 1,
2071+
"type": "context",
2072+
},
2073+
Object {
2074+
"content": " \\"./core\\",",
2075+
"newNumber": 2,
2076+
"oldNumber": 2,
2077+
"type": "context",
2078+
},
2079+
Object {
2080+
"content": "- \\"./var/strundefined\\",",
2081+
"newNumber": undefined,
2082+
"oldNumber": 3,
2083+
"type": "delete",
2084+
},
2085+
Object {
2086+
"content": " \\"./var/rnotwhite\\",",
2087+
"newNumber": 3,
2088+
"oldNumber": 4,
2089+
"type": "context",
2090+
},
2091+
Object {
2092+
"content": " \\"./var/hasOwn\\",",
2093+
"newNumber": 4,
2094+
"oldNumber": 5,
2095+
"type": "context",
2096+
},
2097+
Object {
2098+
"content": " \\"./var/slice\\",",
2099+
"newNumber": 5,
2100+
"oldNumber": 6,
2101+
"type": "context",
2102+
},
2103+
],
2104+
"newStartLine": 1,
2105+
"oldStartLine": 1,
2106+
"oldStartLine2": null,
2107+
},
2108+
],
2109+
"checksumAfter": "6183f70",
2110+
"checksumBefore": "7336f4d",
2111+
"deletedLines": 1,
2112+
"isCombined": false,
2113+
"isGitDiff": true,
2114+
"language": "js",
2115+
"mode": "100644",
2116+
"newName": "src/event.js",
2117+
"oldName": "src/event.js",
2118+
},
2119+
]
2120+
`);
2121+
});
19782122
});
19792123
});

src/diff-parser.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { escapeForRegExp } from './utils';
44
export interface DiffParserConfig {
55
srcPrefix?: string;
66
dstPrefix?: string;
7+
diffMaxChanges?: number;
78
}
89

910
function getExtension(filename: string, language: string): string {
@@ -225,6 +226,13 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
225226
currentLine.newNumber = newLine++;
226227
}
227228
currentBlock.lines.push(currentLine);
229+
if (
230+
typeof config.diffMaxChanges === 'number' &&
231+
currentFile.addedLines + currentFile.deletedLines > config.diffMaxChanges
232+
) {
233+
currentFile.isTooBig = true;
234+
currentFile.blocks = [];
235+
}
228236
}
229237

230238
/*
@@ -299,6 +307,11 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
299307
startFile();
300308
}
301309

310+
// Ignore remaining diff for current file if marked as too big
311+
if (currentFile?.isTooBig) {
312+
return;
313+
}
314+
302315
/*
303316
* We need to make sure that we have the three lines of the header.
304317
* This avoids cases like the ones described in:

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export interface DiffFile extends DiffFileName {
6262
isCopy?: boolean;
6363
isRename?: boolean;
6464
isBinary?: boolean;
65+
isTooBig?: boolean;
6566
unchangedPercentage?: number;
6667
changedPercentage?: number;
6768
checksumBefore?: string | string[];

0 commit comments

Comments
 (0)