From 9b72623c750c51a0a6fb1dc99b4a3265d764f20d Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Mon, 8 Jun 2020 22:38:53 -0600 Subject: [PATCH 1/3] Add a UUID to each raw diff file as it's processed --- app/assets/javascripts/diffs/store/utils.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js index d261be1b550919..732b5850626d10 100644 --- a/app/assets/javascripts/diffs/store/utils.js +++ b/app/assets/javascripts/diffs/store/utils.js @@ -16,6 +16,7 @@ import { INLINE_DIFF_VIEW_TYPE, PARALLEL_DIFF_VIEW_TYPE, } from '../constants'; +import { uuids } from '../utils/uuids'; export function findDiffFile(files, match, matchKey = 'file_hash') { return files.find(file => file[matchKey] === match); @@ -403,8 +404,26 @@ function deduplicateFilesList(files) { return Object.values(dedupedFiles); } +function prepareDiffFile(file) { + Object.assign(file, { + uuid: uuids({ + seeds: [ + file.blob.id, + file.diff_refs.base_sha, + file.diff_refs.start_sha, + file.diff_refs.head_sha, + file.file_identifier_hash, + Number(file.blob.mode), + ], + })[0], + }); + + return file; +} + export function prepareDiffData(diff, priorFiles = []) { const cleanedFiles = (diff.diff_files || []) + .map(prepareDiffFile) .map(ensureBasicDiffFileLines) .map(prepareDiffFileLines) .map(finalizeDiffFile); -- GitLab From bae7eddfbf8aad72139e552272731d99df1dee55 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Mon, 8 Jun 2020 22:39:40 -0600 Subject: [PATCH 2/3] Update existing tests with requirements for diff file UUIDs --- spec/frontend/diffs/mock_data/diff_file.js | 1 + spec/frontend/diffs/store/mutations_spec.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/spec/frontend/diffs/mock_data/diff_file.js b/spec/frontend/diffs/mock_data/diff_file.js index 27428197c1c9d2..e4b2fdf6ededb9 100644 --- a/spec/frontend/diffs/mock_data/diff_file.js +++ b/spec/frontend/diffs/mock_data/diff_file.js @@ -13,6 +13,7 @@ export default { blob_name: 'CHANGELOG', blob_icon: '', file_hash: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a', + file_identifier_hash: '928f8286952bda02d674b692addcbe077084663a', file_path: 'CHANGELOG', new_file: false, deleted_file: false, diff --git a/spec/frontend/diffs/store/mutations_spec.js b/spec/frontend/diffs/store/mutations_spec.js index c24d406fef319a..f48321467082eb 100644 --- a/spec/frontend/diffs/store/mutations_spec.js +++ b/spec/frontend/diffs/store/mutations_spec.js @@ -243,6 +243,8 @@ describe('DiffsStoreMutations', () => { const data = { diff_files: [ { + blob: {}, + diff_refs: {}, content_sha: 'abc', file_hash: fileHash, extra_field: 1, -- GitLab From 865fba783ba79e34cbea3e1b29dfc4c4ea91c2a2 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Mon, 8 Jun 2020 22:40:10 -0600 Subject: [PATCH 3/3] Test that preparing (raw) diff files properly adds the correct UUID --- spec/frontend/diffs/store/utils_spec.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js index 296069afa2ca48..9879b4dd3f6fa4 100644 --- a/spec/frontend/diffs/store/utils_spec.js +++ b/spec/frontend/diffs/store/utils_spec.js @@ -1,5 +1,6 @@ import { clone } from 'lodash'; import * as utils from '~/diffs/store/utils'; +import { uuids } from '~/diffs/utils/uuids'; import { LINE_POSITION_LEFT, LINE_POSITION_RIGHT, @@ -430,6 +431,7 @@ describe('DiffsStoreUtils', () => { }); describe('prepareDiffData', () => { + let fileId; let mock; let preparedDiff; let splitInlineDiff; @@ -438,6 +440,17 @@ describe('DiffsStoreUtils', () => { beforeEach(() => { mock = getDiffFileMock(); + [fileId] = uuids({ + seeds: [ + mock.blob.id, + mock.diff_refs.base_sha, + mock.diff_refs.start_sha, + mock.diff_refs.head_sha, + mock.file_identifier_hash, + Number(mock.blob.mode), + ], + }); + preparedDiff = { diff_files: [mock] }; splitInlineDiff = { diff_files: [{ ...mock, parallel_diff_lines: undefined }], @@ -455,6 +468,13 @@ describe('DiffsStoreUtils', () => { completedDiff.diff_files = utils.prepareDiffData(completedDiff, [mock]); }); + it('adds a universally unique identifier to each diff file', () => { + expect(preparedDiff.diff_files[0].uuid).toBe(fileId); + expect(splitInlineDiff.diff_files[0].uuid).toBe(fileId); + expect(splitParallelDiff.diff_files[0].uuid).toBe(fileId); + expect(completedDiff.diff_files[0].uuid).toBe(fileId); + }); + it('sets the renderIt and collapsed attribute on files', () => { const firstParallelDiffLine = preparedDiff.diff_files[0].parallel_diff_lines[2]; -- GitLab