From bc305347656158778cc7b08f03ac81ab1ca9f2d4 Mon Sep 17 00:00:00 2001
From: Jonathan Pobst <jonathan.pobst@microsoft.com>
Date: Tue, 25 Jul 2023 14:27:57 -0500
Subject: [PATCH] Add support for exact version NuGet dependencies based on
 Maven dependency info from POM.

---
 Directory.Build.targets       | 18 ++++++++++++++++++
 source/AndroidXProject.cshtml |  3 ++-
 2 files changed, 20 insertions(+), 1 deletion(-)
 create mode 100644 Directory.Build.targets

diff --git a/Directory.Build.targets b/Directory.Build.targets
new file mode 100644
index 000000000..6e47fc572
--- /dev/null
+++ b/Directory.Build.targets
@@ -0,0 +1,18 @@
+<Project>
+  <!-- Enables "ExactVersion" attribute on "ProjectReference" to allow an exact NuGet reference version to be used.
+       https://github.com/NuGet/Home/issues/5556#issuecomment-1179526189  -->
+  <Target Name="UseExplicitPackageVersions" BeforeTargets="GenerateNuspec">
+    <ItemGroup>
+      <_ProjectReferenceWithExplicitPackageVersion Include="@(ProjectReference->'%(FullPath)')" Condition="'%(ProjectReference.PackageVersion)' != ''" />
+      <_ProjectReferenceWithExactPackageVersion Include="@(ProjectReference->'%(FullPath)')" Condition="'%(ProjectReference.ExactVersion)' == 'true'" />
+      <_ProjectReferenceWithReassignedVersion Include="@(_ProjectReferencesWithVersions)" Condition="'%(Identity)' != '' And '@(_ProjectReferenceWithExplicitPackageVersion)' == '@(_ProjectReferencesWithVersions)'">
+        <ProjectVersion>@(_ProjectReferenceWithExplicitPackageVersion->'%(PackageVersion)')</ProjectVersion>
+      </_ProjectReferenceWithReassignedVersion>
+      <_ProjectReferenceWithReassignedVersion Include="@(_ProjectReferencesWithVersions)" Condition="'%(Identity)' != '' And '@(_ProjectReferenceWithExactPackageVersion)' == '@(_ProjectReferencesWithVersions)'">
+        <ProjectVersion>[@(_ProjectReferencesWithVersions->'%(ProjectVersion)')]</ProjectVersion>
+      </_ProjectReferenceWithReassignedVersion>
+      <_ProjectReferencesWithVersions Remove="@(_ProjectReferenceWithReassignedVersion)" />
+      <_ProjectReferencesWithVersions Include="@(_ProjectReferenceWithReassignedVersion)" />
+    </ItemGroup>
+  </Target>
+</Project>
diff --git a/source/AndroidXProject.cshtml b/source/AndroidXProject.cshtml
index 1305f8892..6eb6f7a8a 100644
--- a/source/AndroidXProject.cshtml
+++ b/source/AndroidXProject.cshtml
@@ -172,7 +172,8 @@
     <!-- ProjectReference -->
     @foreach (var dep in @Model.NuGetDependencies) {
       if (dep.IsProjectReference) {
-        <ProjectReference Include="..\..\generated\@(dep.MavenArtifact.MavenGroupId).@(dep.MavenArtifact.MavenArtifactId)\@(dep.MavenArtifact.MavenGroupId).@(dep.MavenArtifact.MavenArtifactId).csproj" PrivateAssets="none" />
+        var exact_version = dep.MavenArtifact.MavenArtifactVersion.StartsWith('[').ToString();
+        <ProjectReference Include="..\..\generated\@(dep.MavenArtifact.MavenGroupId).@(dep.MavenArtifact.MavenArtifactId)\@(dep.MavenArtifact.MavenGroupId).@(dep.MavenArtifact.MavenArtifactId).csproj" PrivateAssets="none" ExactVersion="@(exact_version)" />
 
       }
     }