diff --git a/lib/manager/bundler/extract.js b/lib/manager/bundler/extract.js index 9346a3c13ea92ecb193b4502243f30b8dde42157..79675b82d0170423dcb2898ab50fc07c1d941d71 100644 --- a/lib/manager/bundler/extract.js +++ b/lib/manager/bundler/extract.js @@ -10,31 +10,41 @@ async function extractPackageFile(content, fileName) { registryUrls: [], deps: [], }; - const delimeter = - content.split('"').length > content.split("'").length ? '"' : "'"; - if (fileName) { - logger.debug( - { fileName }, - 'Using delimeter ' + delimeter + ' to parse ' + fileName - ); - } const lines = content.split('\n'); + const delimiters = ['"', "'"]; for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) { const line = lines[lineNumber]; - const sourceMatch = line.match( - new RegExp(`^source ${delimeter}([^${delimeter}]+)${delimeter}\\s*$`) - ); + let sourceMatch; + for (const delimiter of delimiters) { + sourceMatch = + sourceMatch || + line.match( + new RegExp(`^source ${delimiter}([^${delimiter}]+)${delimiter}\\s*$`) + ); + } if (sourceMatch) { res.registryUrls.push(sourceMatch[1]); } - const rubyMatch = line.match( - new RegExp(`^ruby ${delimeter}([^${delimeter}]+)${delimeter}`) - ); + let rubyMatch; + for (const delimiter of delimiters) { + rubyMatch = + rubyMatch || + line.match( + new RegExp(`^ruby ${delimiter}([^${delimiter}]+)${delimiter}`) + ); + } if (rubyMatch) { res.compatibility = { ruby: rubyMatch[1] }; } - const gemMatchRegex = `^gem ${delimeter}([^${delimeter}]+)${delimeter}(,\\s+${delimeter}([^${delimeter}]+)${delimeter}){0,2}`; - const gemMatch = line.match(new RegExp(gemMatchRegex)); + let gemMatch; + let gemDelimiter; + for (const delimiter of delimiters) { + const gemMatchRegex = `^gem ${delimiter}([^${delimiter}]+)${delimiter}(,\\s+${delimiter}([^${delimiter}]+)${delimiter}){0,2}`; + if (line.match(new RegExp(gemMatchRegex))) { + gemDelimiter = delimiter; + gemMatch = gemMatch || line.match(new RegExp(gemMatchRegex)); + } + } if (gemMatch) { const dep = { depName: gemMatch[1], @@ -42,8 +52,8 @@ async function extractPackageFile(content, fileName) { }; if (gemMatch[3]) { dep.currentValue = gemMatch[0] - .substring(`gem ${delimeter}${dep.depName}${delimeter},`.length) - .replace(new RegExp(delimeter, 'g'), '') + .substring(`gem ${gemDelimiter}${dep.depName}${gemDelimiter},`.length) + .replace(new RegExp(gemDelimiter, 'g'), '') .trim(); if (!isValid(dep.currentValue)) { dep.skipReason = 'invalid-value'; @@ -83,30 +93,32 @@ async function extractPackageFile(content, fileName) { ); } } - const sourceBlockMatch = line.match( - new RegExp(`^source\\s+${delimeter}(.*?)${delimeter}\\s+do`) - ); - if (sourceBlockMatch) { - const repositoryUrl = sourceBlockMatch[1]; - const sourceLineNumber = lineNumber; - let sourceContent = ''; - let sourceLine = ''; - while (lineNumber < lines.length && sourceLine !== 'end') { - lineNumber += 1; - sourceLine = lines[lineNumber]; - if (sourceLine !== 'end') { - sourceContent += sourceLine.replace(/^ {2}/, '') + '\n'; + for (const delimiter of delimiters) { + const sourceBlockMatch = line.match( + new RegExp(`^source\\s+${delimiter}(.*?)${delimiter}\\s+do`) + ); + if (sourceBlockMatch) { + const repositoryUrl = sourceBlockMatch[1]; + const sourceLineNumber = lineNumber; + let sourceContent = ''; + let sourceLine = ''; + while (lineNumber < lines.length && sourceLine !== 'end') { + lineNumber += 1; + sourceLine = lines[lineNumber]; + if (sourceLine !== 'end') { + sourceContent += sourceLine.replace(/^ {2}/, '') + '\n'; + } + } + const sourceRes = await extractPackageFile(sourceContent); + if (sourceRes) { + res.deps = res.deps.concat( + sourceRes.deps.map(dep => ({ + ...dep, + registryUrls: [repositoryUrl], + lineNumber: dep.lineNumber + sourceLineNumber + 1, + })) + ); } - } - const sourceRes = await extractPackageFile(sourceContent); - if (sourceRes) { - res.deps = res.deps.concat( - sourceRes.deps.map(dep => ({ - ...dep, - registryUrls: [repositoryUrl], - lineNumber: dep.lineNumber + sourceLineNumber + 1, - })) - ); } } const platformsMatch = line.match(/^platforms\s+(.*?)\s+do/); diff --git a/test/manager/bundler/_fixtures/Gemfile.sourceGroup b/test/manager/bundler/_fixtures/Gemfile.sourceGroup index 0ba9edb79a09a56f704ee8f90aa03923bbfd4150..f5fe900d31752681027558c55e898555197b4f6a 100644 --- a/test/manager/bundler/_fixtures/Gemfile.sourceGroup +++ b/test/manager/bundler/_fixtures/Gemfile.sourceGroup @@ -1,9 +1,9 @@ source "https://rubygems.org" -ruby "~> 1.5.3" +ruby '~> 1.5.3' -source "https://gems.example.com" do +source 'https://gems.example.com' do gem "some_internal_gem" - gem "another_internal_gem" + gem 'another_internal_gem' end platforms :ruby do @@ -12,6 +12,6 @@ platforms :ruby do end group :development, :optional => true do - gem "wirble" + gem 'wirble' gem "faker" end