diff --git a/lib/modules/manager/haskell-cabal/extract.spec.ts b/lib/modules/manager/haskell-cabal/extract.spec.ts index 7625c210396a08..d4f680e75f74c0 100644 --- a/lib/modules/manager/haskell-cabal/extract.spec.ts +++ b/lib/modules/manager/haskell-cabal/extract.spec.ts @@ -2,10 +2,19 @@ import { countPackageNameLength, countPrecedingIndentation, extractNamesAndRanges, + findDepends, findExtents, splitSingleDependency, } from './extract'; +const commentCabalFile = `build-depends: + -- leading + base, +-- middle + other, + -- trailing + other2`; + describe('modules/manager/haskell-cabal/extract', () => { describe('countPackageNameLength', () => { it.each` @@ -91,4 +100,14 @@ describe('modules/manager/haskell-cabal/extract', () => { ]); }); }); + + describe('findDepends()', () => { + it('strips comments', () => { + const res = findDepends(commentCabalFile + '\na: b'); + expect(res).toEqual({ + buildDependsContent: '\n base,\n other,\n other2', + lengthProcessed: commentCabalFile.length, + }); + }); + }); }); diff --git a/lib/modules/manager/haskell-cabal/extract.ts b/lib/modules/manager/haskell-cabal/extract.ts index 80231c3e5c7a93..7abeee0c78e6db 100644 --- a/lib/modules/manager/haskell-cabal/extract.ts +++ b/lib/modules/manager/haskell-cabal/extract.ts @@ -3,6 +3,7 @@ import { regEx } from '../../../util/regex'; const buildDependsRegex = regEx( /(?build-depends[ \t]*:)/i, ); +const commentRegex = regEx(/^[ \t]*--/); function isNonASCII(str: string): boolean { for (let i = 0; i < str.length; i++) { if (str.charCodeAt(i) > 127) { @@ -86,6 +87,11 @@ export function findExtents(indent: number, content: string): number { break; } if (thisIndent < indent) { + if (content.slice(blockIdx - 1, blockIdx + 1) === '--') { + // not enough indention, but the line is a comment, so include it + mode = 'finding-newline'; + continue; + } // go back to before the newline for (;;) { if (content[blockIdx--] === '\n') { @@ -125,7 +131,8 @@ export function countPrecedingIndentation( * * @returns {{buildDependsContent: string, lengthProcessed: number}} * buildDependsContent: - * the contents of the field, excluding the field name and the colon. + * the contents of the field, excluding the field name and the colon, + * and any comments within * * lengthProcessed: * points to after the end of the field. Note that the field does _not_ @@ -143,10 +150,19 @@ export function findDepends( const indent = countPrecedingIndentation(content, matchObj.index); const ourIdx: number = matchObj.index + matchObj.groups['buildDependsFieldName'].length; - const extent: number = findExtents(indent + 1, content.slice(ourIdx)); + const extentLength: number = findExtents(indent + 1, content.slice(ourIdx)); + const extent = content.slice(ourIdx, ourIdx + extentLength); + const lines = []; + // Windows-style line breaks are fine because + // carriage returns are before the line feed. + for (const maybeCommentLine of extent.split('\n')) { + if (!commentRegex.test(maybeCommentLine)) { + lines.push(maybeCommentLine); + } + } return { - buildDependsContent: content.slice(ourIdx, ourIdx + extent), - lengthProcessed: ourIdx + extent, + buildDependsContent: lines.join('\n'), + lengthProcessed: ourIdx + extentLength, }; }