From 90a724f2aaaf8542f8ab61549181e4e8f2596751 Mon Sep 17 00:00:00 2001
From: bjuraga <boris.juraga@live.com>
Date: Tue, 27 Sep 2022 07:35:30 +0200
Subject: [PATCH] feat(nuget): implement missing packageFileVersion (#17995)

---
 .../multiple-package-files/two/two.csproj     |  2 +-
 lib/modules/manager/nuget/extract.spec.ts     | 22 +++++++++++++++++++
 lib/modules/manager/nuget/extract.ts          |  4 +++-
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/lib/modules/manager/nuget/__fixtures__/multiple-package-files/two/two.csproj b/lib/modules/manager/nuget/__fixtures__/multiple-package-files/two/two.csproj
index d554a5fcde..4fc87c513a 100644
--- a/lib/modules/manager/nuget/__fixtures__/multiple-package-files/two/two.csproj
+++ b/lib/modules/manager/nuget/__fixtures__/multiple-package-files/two/two.csproj
@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <TargetFramework>netcoreapp1.1</TargetFramework>
-    <Version>0.1.0</Version>
+    <Version>0.2.0</Version>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/lib/modules/manager/nuget/extract.spec.ts b/lib/modules/manager/nuget/extract.spec.ts
index 5c666ccda6..dc8b8f2944 100644
--- a/lib/modules/manager/nuget/extract.spec.ts
+++ b/lib/modules/manager/nuget/extract.spec.ts
@@ -36,6 +36,20 @@ describe('modules/manager/nuget/extract', () => {
       expect(res?.deps).toHaveLength(1);
     });
 
+    it('extracts package file version', async () => {
+      const packageFile = 'sample.csproj';
+      const sample = Fixtures.get(packageFile);
+      const res = await extractPackageFile(sample, packageFile, config);
+      expect(res?.packageFileVersion).toBe('0.1.0');
+    });
+
+    it('does not fail on package file without version', async () => {
+      const packageFile = 'single-project-file/single.csproj';
+      const sample = Fixtures.get(packageFile);
+      const res = await extractPackageFile(sample, packageFile, config);
+      expect(res?.packageFileVersion).toBeUndefined();
+    });
+
     it('extracts all dependencies', async () => {
       const packageFile = 'sample.csproj';
       const sample = Fixtures.get(packageFile);
@@ -68,6 +82,7 @@ describe('modules/manager/nuget/extract', () => {
             ],
           },
         ],
+        packageFileVersion: '0.1.0',
       });
     });
 
@@ -88,6 +103,7 @@ describe('modules/manager/nuget/extract', () => {
             ],
           },
         ],
+        packageFileVersion: '0.1.0',
       });
     });
 
@@ -108,6 +124,7 @@ describe('modules/manager/nuget/extract', () => {
             ],
           },
         ],
+        packageFileVersion: '0.1.0',
       });
     });
 
@@ -124,6 +141,7 @@ describe('modules/manager/nuget/extract', () => {
             depType: 'nuget',
           },
         ],
+        packageFileVersion: '0.1.0',
       });
     });
 
@@ -140,6 +158,7 @@ describe('modules/manager/nuget/extract', () => {
             depType: 'nuget',
           },
         ],
+        packageFileVersion: '0.1.0',
       });
     });
 
@@ -176,6 +195,7 @@ describe('modules/manager/nuget/extract', () => {
             registryUrls: ['https://contoso.com/packages/'],
           },
         ],
+        packageFileVersion: '0.1.0',
       });
     });
 
@@ -197,6 +217,7 @@ describe('modules/manager/nuget/extract', () => {
             ],
           },
         ],
+        packageFileVersion: '0.1.0',
       });
       expect(
         await extractPackageFile(otherContents, otherPackageFile, config)
@@ -213,6 +234,7 @@ describe('modules/manager/nuget/extract', () => {
             ],
           },
         ],
+        packageFileVersion: '0.2.0',
       });
     });
 
diff --git a/lib/modules/manager/nuget/extract.ts b/lib/modules/manager/nuget/extract.ts
index bd17f2b7bc..d5b8c2422d 100644
--- a/lib/modules/manager/nuget/extract.ts
+++ b/lib/modules/manager/nuget/extract.ts
@@ -119,16 +119,18 @@ export async function extractPackageFile(
   }
 
   let deps: PackageDependency[] = [];
+  let packageFileVersion = undefined;
   try {
     const parsedXml = new XmlDocument(content);
     deps = extractDepsFromXml(parsedXml).map((dep) => ({
       ...dep,
       ...(registryUrls && { registryUrls }),
     }));
+    packageFileVersion = parsedXml.valueWithPath('PropertyGroup.Version');
   } catch (err) {
     logger.debug({ err }, `Failed to parse ${packageFile}`);
   }
-  const res: PackageFile = { deps };
+  const res: PackageFile = { deps, packageFileVersion };
   const lockFileName = getSiblingFileName(packageFile, 'packages.lock.json');
   // istanbul ignore if
   if (await localPathExists(lockFileName)) {
-- 
GitLab