diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js index 307c41a98f83a62910e6137cbff438ba3c9e0450..15d2ab71bc891c5995a858d945207a5abcb1bc78 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 24cb8158739c8e41719c8798f159aefe01d4eaa0..720b72f4965142721defa497bfd6fbd0c42b8bfc 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); });