From be640437b28ed0032bf9a3c28bccb936a3acc72f Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Wed, 20 Sep 2023 15:27:32 -0600 Subject: [PATCH] Use a more robust extraction function to get the file hash As a result, we don't need to test the ID against a (broken) SHA1 regular expression any more. Changelog: fixed --- app/assets/javascripts/diffs/store/utils.js | 15 +++++------ spec/frontend/diffs/store/utils_spec.js | 28 +++++++++++---------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js index 307c41a98f83a6..15d2ab71bc891c 100644 --- a/app/assets/javascripts/diffs/store/utils.js +++ b/app/assets/javascripts/diffs/store/utils.js @@ -18,8 +18,7 @@ import { EXPANDED_LINE_TYPE, } from '../constants'; import { prepareRawDiffFile } from '../utils/diff_file'; - -const SHA1 = /\b([a-f0-9]{40})\b/; +import { extractFileHash } from '../utils/merge_request'; export const isAdded = (line) => ['new', 'new-nonewline'].includes(line.type); export const isRemoved = (line) => ['old', 'old-nonewline'].includes(line.type); @@ -571,14 +570,16 @@ export function isUrlHashFileHeader(urlHash = '') { } export function parseUrlHashAsFileHash(urlHash = '', currentDiffFileId = '') { - const isNoteLink = isUrlHashNoteLink(urlHash); - let id = urlHash.replace(/^#/, ''); + const hashless = urlHash.replace(/^#/, ''); + const isNoteLink = isUrlHashNoteLink(hashless); + const extractedSha1 = extractFileHash({ input: hashless }); + let id = extractedSha1; if (isNoteLink && currentDiffFileId) { id = currentDiffFileId; - } else if (isUrlHashFileHeader(urlHash)) { - id = id.replace('diff-content-', ''); - } else if (!SHA1.test(id) || isNoteLink) { + } else if (isUrlHashFileHeader(hashless)) { + id = hashless.replace('diff-content-', ''); + } else if (!extractedSha1 || isNoteLink) { id = null; } diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js index 24cb8158739c8e..720b72f4965142 100644 --- a/spec/frontend/diffs/store/utils_spec.js +++ b/spec/frontend/diffs/store/utils_spec.js @@ -927,19 +927,21 @@ describe('DiffsStoreUtils', () => { describe('parseUrlHashAsFileHash', () => { it.each` - input | currentDiffId | resultId - ${'#note_12345'} | ${'1A2B3C'} | ${'1A2B3C'} - ${'note_12345'} | ${'1A2B3C'} | ${'1A2B3C'} - ${'#note_12345'} | ${undefined} | ${null} - ${'note_12345'} | ${undefined} | ${null} - ${'#diff-content-12345'} | ${undefined} | ${'12345'} - ${'diff-content-12345'} | ${undefined} | ${'12345'} - ${'#diff-content-12345'} | ${'98765'} | ${'12345'} - ${'diff-content-12345'} | ${'98765'} | ${'12345'} - ${'#e334a2a10f036c00151a04cea7938a5d4213a818'} | ${undefined} | ${'e334a2a10f036c00151a04cea7938a5d4213a818'} - ${'e334a2a10f036c00151a04cea7938a5d4213a818'} | ${undefined} | ${'e334a2a10f036c00151a04cea7938a5d4213a818'} - ${'#Z334a2a10f036c00151a04cea7938a5d4213a818'} | ${undefined} | ${null} - ${'Z334a2a10f036c00151a04cea7938a5d4213a818'} | ${undefined} | ${null} + input | currentDiffId | resultId + ${'#note_12345'} | ${'1A2B3C'} | ${'1A2B3C'} + ${'note_12345'} | ${'1A2B3C'} | ${'1A2B3C'} + ${'#note_12345'} | ${undefined} | ${null} + ${'note_12345'} | ${undefined} | ${null} + ${'#diff-content-12345'} | ${undefined} | ${'12345'} + ${'diff-content-12345'} | ${undefined} | ${'12345'} + ${'#diff-content-12345'} | ${'98765'} | ${'12345'} + ${'diff-content-12345'} | ${'98765'} | ${'12345'} + ${'#e334a2a10f036c00151a04cea7938a5d4213a818'} | ${undefined} | ${'e334a2a10f036c00151a04cea7938a5d4213a818'} + ${'e334a2a10f036c00151a04cea7938a5d4213a818'} | ${undefined} | ${'e334a2a10f036c00151a04cea7938a5d4213a818'} + ${'#Z334a2a10f036c00151a04cea7938a5d4213a818'} | ${undefined} | ${null} + ${'Z334a2a10f036c00151a04cea7938a5d4213a818'} | ${undefined} | ${null} + ${'#e334a2a10f036c00151a04cea7938a5d4213a818_0_42'} | ${undefined} | ${'e334a2a10f036c00151a04cea7938a5d4213a818'} + ${'e334a2a10f036c00151a04cea7938a5d4213a818_0_42'} | ${undefined} | ${'e334a2a10f036c00151a04cea7938a5d4213a818'} `('returns $resultId for $input and $currentDiffId', ({ input, currentDiffId, resultId }) => { expect(utils.parseUrlHashAsFileHash(input, currentDiffId)).toBe(resultId); }); -- GitLab