From 30fd17779ed3e009bb7c27a1b38c21d0e4fd7b54 Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Thu, 25 Apr 2019 13:08:21 +0200 Subject: [PATCH] fix(nuget): better metadata fetching logic --- lib/datasource/nuget/v3.js | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/datasource/nuget/v3.js b/lib/datasource/nuget/v3.js index 1b5a3073aa..a43313f53a 100644 --- a/lib/datasource/nuget/v3.js +++ b/lib/datasource/nuget/v3.js @@ -1,4 +1,5 @@ const parse = require('github-url-from-git'); +const semver = require('semver'); const { XmlDocument } = require('xmldoc'); const got = require('../../util/got'); @@ -94,12 +95,31 @@ async function getPkgReleases(registryUrl, feedUrl, pkgName) { try { // For nuget.org we have a way to get nuspec file + const sanitizedVersions = dep.releases + .map(release => semver.valid(release.version)) + .filter(Boolean) + .filter(version => !semver.prerelease(version)); + let lastVersion; + // istanbul ignore else + if (sanitizedVersions.length) { + // Use the last stable version we found + lastVersion = sanitizedVersions.pop(); + } else { + // Just use the last one from the list and hope for the best + lastVersion = [...dep.releases].pop().version; + } if (registryUrl.toLowerCase() === defaultNugetFeed.toLowerCase()) { - const nugetOrgApi = `https://api.nuget.org/v3-flatcontainer/${pkgName.toLowerCase()}/${ - [...dep.releases].pop().version - }/${pkgName.toLowerCase()}.nuspec`; - const result = await got(nugetOrgApi, { platform: 'nuget' }); - const nuspec = new XmlDocument(result.body); + const nugetOrgApi = `https://api.nuget.org/v3-flatcontainer/${pkgName.toLowerCase()}/${lastVersion}/${pkgName.toLowerCase()}.nuspec`; + let metaresult; + try { + metaresult = await got(nugetOrgApi, { platform: 'nuget' }); + } catch (err) /* istanbul ignore next */ { + logger.debug( + `Cannot fetch metadata for ${pkgName} using popped version ${lastVersion}` + ); + return dep; + } + const nuspec = new XmlDocument(metaresult.body); if (nuspec) { const sourceUrl = parse( nuspec.valueWithPath('metadata.repository@url') -- GitLab