diff options
author | Simon Knox <psimyn@gmail.com> | 2018-11-09 19:51:08 +1100 |
---|---|---|
committer | Simon Knox <psimyn@gmail.com> | 2018-11-09 20:46:42 +1100 |
commit | cf90f6b4b4b2088500f89a4410d6a00ae1299142 (patch) | |
tree | 2ca70068fe2f797ac8ae28e289448f3a946bc773 | |
parent | 593f6e0a1037dc86d752819284b745dac011cbc2 (diff) | |
download | gitlab-ce-50290-diff-lines-frontend.tar.gz |
Move parallel_diff calculation to frontend50290-diff-lines-frontend
-rw-r--r-- | app/assets/javascripts/diffs/store/utils.js | 74 |
1 files changed, 61 insertions, 13 deletions
diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js index a935b9b1ffa..cb85f5c0eb1 100644 --- a/app/assets/javascripts/diffs/store/utils.js +++ b/app/assets/javascripts/diffs/store/utils.js @@ -198,6 +198,63 @@ export function trimFirstCharOfLineContent(line = {}) { return parsedLine; } +function unchanged(line) { + return !line.type || ['match', 'new-nonewline', 'old-nonewline'].includes(line.type); +} + +function added(line) { + return ['new', 'new-nonewline'].includes(line.type); +} + +function removed(line) { + return ['old', 'old-nonewline'].includes(line.type); +} + +function parallelize(diffFile) { + let i = 0; + const lines = []; + let freeRightIndex = null; + + if (!diffFile.highlightedDiffLines) return; + + diffFile.highlightedDiffLines.forEach(line => { + if (removed(line)) { + lines.push({ + left: line, + right: null, + }); + + freeRightIndex = i; // TODO: this was ||= in ruby + i += 1; + } else if (added(line)) { + if (freeRightIndex) { + lines[freeRightIndex].right = line; + + let nextFreeRightIndex = freeRightIndex + 1 + freeRightIndex = nextFreeRightIndex < i ? nextFreeRightIndex : null; + } else { + lines.push({ + left: null, + right: line, + }); + + freeRightIndex = null; + i += 1; + } + } else if (unchanged(line)) { + lines.push({ + left: line, + right: line, + }); + + freeRightIndex = null; + i += 1; + } + }) + + return lines; +} + // This prepares and optimizes the incoming diff data from the server // by setting up incremental rendering and removing unneeded data export function prepareDiffData(diffData) { @@ -206,25 +263,16 @@ export function prepareDiffData(diffData) { for (let i = 0; i < filesLength; i += 1) { const file = diffData.diffFiles[i]; - if (file.parallelDiffLines) { - const linesLength = file.parallelDiffLines.length; - for (let u = 0; u < linesLength; u += 1) { - const line = file.parallelDiffLines[u]; - if (line.left) { - line.left = trimFirstCharOfLineContent(line.left); - } - if (line.right) { - line.right = trimFirstCharOfLineContent(line.right); - } - } - } - if (file.highlightedDiffLines) { const linesLength = file.highlightedDiffLines.length; for (let u = 0; u < linesLength; u += 1) { const line = file.highlightedDiffLines[u]; Object.assign(line, { ...trimFirstCharOfLineContent(line) }); } + } + + file.parallelDiffLines = parallelize(file); + if (file.parallelDiffLines) { showingLines += file.parallelDiffLines.length; } |