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