Skip to content

Commit a7c0607

Browse files
committed
fix: CodeEditor - incorrect diff for very large files fix
1 parent db32d23 commit a7c0607

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

src/Common/CodeMirror/CodeEditorRenderer.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { Progressing } from '@Common/Progressing'
2323

2424
import { useCodeEditorContext } from './CodeEditor.context'
2525
import { CodeEditorRendererProps } from './types'
26-
import { getCodeEditorHeight, getRevertControlButton, updateDiffMinimapValues } from './utils'
26+
import { getCodeEditorHeight, getRevertControlButton, getScanLimit, updateDiffMinimapValues } from './utils'
2727
import { DiffMinimap } from './Extensions'
2828

2929
export const CodeEditorRenderer = ({
@@ -180,6 +180,8 @@ export const CodeEditorRenderer = ({
180180
useEffect(() => {
181181
// DIFF VIEW INITIALIZATION
182182
if (!loading && codeMirrorMergeParentRef.current) {
183+
const scanLimit = getScanLimit(lhsValue, value)
184+
183185
codeMirrorMergeInstance?.destroy()
184186

185187
const codeMirrorMergeView = new MergeView({
@@ -192,7 +194,7 @@ export const CodeEditorRenderer = ({
192194
extensions: [...modifiedViewExtensions, modifiedUpdateListener],
193195
},
194196
...(!readOnly ? { revertControls: 'a-to-b', renderRevertControl: getRevertControlButton } : {}),
195-
diffConfig: { scanLimit: 5000 },
197+
diffConfig: { scanLimit, timeout: 5000 },
196198
parent: codeMirrorMergeParentRef.current,
197199
})
198200
setCodeMirrorMergeInstance(codeMirrorMergeView)
@@ -212,7 +214,7 @@ export const CodeEditorRenderer = ({
212214
extensions: diffMinimapExtensions,
213215
},
214216
gutter: false,
215-
diffConfig: { scanLimit: 5000 },
217+
diffConfig: { scanLimit, timeout: 5000 },
216218
parent: diffMinimapParentRef.current,
217219
})
218220

@@ -272,6 +274,11 @@ export const CodeEditorRenderer = ({
272274

273275
return diffMode ? (
274276
<div className={`flexbox w-100 ${componentSpecificThemeClass} ${codeEditorParentClassName}`}>
277+
{!codeMirrorMergeInstance && (
278+
<div className="flex h-100 w-100">
279+
<p>Calculating diff for large file. Please wait...</p>
280+
</div>
281+
)}
275282
<div
276283
ref={codeMirrorMergeParentRef}
277284
className={`cm-merge-theme flex-grow-1 h-100 dc__overflow-hidden ${readOnly ? 'code-editor__read-only' : ''}`}

src/Common/CodeMirror/codeEditor.scss

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,13 +267,13 @@
267267
&.cm-merge-a .cm-changedText,
268268
.cm-deletedChunk .cm-deletedText,
269269
&.cm-merge-a .cm-changedLineGutter {
270-
background: var(--R300);
270+
background: var(--R500);
271271
}
272272

273273
&.cm-merge-b .cm-changedLine,
274274
&.cm-merge-b .cm-changedText,
275275
&.cm-merge-b .cm-changedLineGutter {
276-
background: var(--G300);
276+
background: var(--G500);
277277
}
278278
}
279279

src/Common/CodeMirror/utils.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,28 @@ export const updateDiffMinimapValues = (view: MergeView, transactions: readonly
168168
})
169169
}
170170

171+
export const getScanLimit = (lhsValue: string, value: string) => {
172+
const numberOfLines = Math.max((lhsValue ?? '').split('\n').length, (value ?? '').split('\n').length)
173+
174+
if (numberOfLines <= 5000) {
175+
return 5000
176+
}
177+
178+
if (numberOfLines > 5000 && numberOfLines <= 10000) {
179+
return 10000
180+
}
181+
182+
if (numberOfLines > 10000 && numberOfLines <= 15000) {
183+
return 15000
184+
}
185+
186+
if (numberOfLines > 15000 && numberOfLines <= 20000) {
187+
return 20000
188+
}
189+
190+
return 500
191+
}
192+
171193
// DOM HELPERS
172194
export const getFoldGutterElement = (open: boolean) => {
173195
const icon = document.createElement('span')

0 commit comments

Comments
 (0)