Skip to content

Commit 1cfa39f

Browse files
[release/9.0] Update NuGetRepack to only update version of dependencies from the build (#15811)
Since merging roslyn-analyzers into the roslyn repo, Roslyn packages have been generated that include a dependency on Microsoft.CodeAnalysis.Analyzers (a roslyn-analyzer package) with the wrong version. The packages should depend on version 3.11.0 of the M.CA.Analyzers package but the nuspec is being rewritten to require a M.CA.Analyzers package from the same build. This behavior is due to NuGetRepack only using the package name to determine whether to update a dependency version. This PR additionally validates that the dependency version is from the current build prior to updating. Co-authored-by: Joey Robichaud <[email protected]>
1 parent dba2627 commit 1cfa39f

9 files changed

+70
-11
lines changed

src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetVersionUpdater.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ private static void LoadPackages(IEnumerable<string> packagePaths, Dictionary<st
240240
{
241241
package.PackageProperties.Version = newPackageVersion.ToFullString();
242242
}
243-
243+
244244
packageInfo = new PackageInfo(package, packageId, packageVersion, newPackageVersion, tempPathOpt, nuspecStream, nuspecXml, nuspecXmlns);
245245
}
246246
finally
@@ -319,6 +319,16 @@ private static void UpdateDependencies(Dictionary<string, PackageInfo> packages,
319319
throw new InvalidDataException($"Unexpected dependency version range: '{id}, {versionRangeAttribute.Value}'");
320320
}
321321

322+
var dependencyVersion = versionRange.MinVersion ?? versionRange.MaxVersion;
323+
var oldVersion = ToNuGetVersion(dependentPackage.OldVersion);
324+
325+
if (dependencyVersion != oldVersion)
326+
{
327+
// The dependency version being referenced was not from
328+
// this build so it does not need to be updated.
329+
continue;
330+
}
331+
322332
var newVersion = ToNuGetVersion(dependentPackage.NewVersion);
323333

324334
var newRange = exactVersions ?
@@ -356,7 +366,7 @@ private static void SavePackages(Dictionary<string, PackageInfo> packages, strin
356366
package.SpecificationXml.Save(package.SpecificationStream);
357367

358368
package.Package.Close();
359-
369+
360370
string finalPath = Path.Combine(outDirectory, package.Id + "." + package.NewVersion + ".nupkg");
361371

362372
try

src/Microsoft.DotNet.NuGetRepack/tests/Microsoft.DotNet.NuGetRepack.Tests.csproj

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
<EmbeddedResource Include="Resources\TestPackageF.1.0.0-beta.12345.1.nupkg">
3030
<LogicalName>TestPackageF.1.0.0-beta.12345.1.nupkg</LogicalName>
3131
</EmbeddedResource>
32+
<EmbeddedResource Include="Resources\TestPackageG.1.0.0-beta-12345-01.nupkg">
33+
<LogicalName>TestPackageG.1.0.0-beta-12345-01.nupkg</LogicalName>
34+
</EmbeddedResource>
3235
<EmbeddedResource Include="Resources\TestPackageA.1.0.0-beta-final.nupkg">
3336
<LogicalName>TestPackageA.1.0.0-beta-final.nupkg</LogicalName>
3437
</EmbeddedResource>
@@ -47,6 +50,9 @@
4750
<EmbeddedResource Include="Resources\TestPackageF.1.0.0-beta.final.nupkg">
4851
<LogicalName>TestPackageF.1.0.0-beta.final.nupkg</LogicalName>
4952
</EmbeddedResource>
53+
<EmbeddedResource Include="Resources\TestPackageG.1.0.0-beta-final.nupkg">
54+
<LogicalName>TestPackageG.1.0.0-beta-final.nupkg</LogicalName>
55+
</EmbeddedResource>
5056
<EmbeddedResource Include="Resources\TestPackageA.1.0.0.nupkg">
5157
<LogicalName>TestPackageA.1.0.0.nupkg</LogicalName>
5258
</EmbeddedResource>
@@ -65,6 +71,9 @@
6571
<EmbeddedResource Include="Resources\TestPackageF.1.0.0.nupkg">
6672
<LogicalName>TestPackageF.1.0.0.nupkg</LogicalName>
6773
</EmbeddedResource>
74+
<EmbeddedResource Include="Resources\TestPackageG.1.0.0.nupkg">
75+
<LogicalName>TestPackageG.1.0.0.nupkg</LogicalName>
76+
</EmbeddedResource>
6877
<EmbeddedResource Include="Resources\Signed.1.2.3.nupkg">
6978
<LogicalName>Signed.1.2.3.nupkg</LogicalName>
7079
</EmbeddedResource>

src/Microsoft.DotNet.NuGetRepack/tests/ReplacePackagePartsTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace Microsoft.DotNet.Tools.Tests
1212
{
1313
public class ReplacePackagePartsTests
1414
{
15-
[Fact(Skip = "https://github.com/dotnet/arcade/issues/3794")]
15+
[Fact()]
1616
public static void ReplaceFile()
1717
{
1818
var dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
Binary file not shown.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0"?>
2+
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
3+
<metadata>
4+
<id>TestPackageG</id>
5+
<version>1.0.0-beta-12345-01</version>
6+
<authors>Microsoft</authors>
7+
<owners>Microsoft</owners>
8+
<requireLicenseAcceptance>false</requireLicenseAcceptance>
9+
<description>G</description>
10+
<dependencies>
11+
<group targetFramework="portable-net45+win8">
12+
<dependency id="TestPackageA" version="0.9.0-beta1" />
13+
<dependency id="TestPackageB" version="[1.0.0-beta-12345-01,)" />
14+
<dependency id="TestPackageC" version="(,1.0.0-beta-12345-01]" />
15+
</group>
16+
<group targetFramework="netstandard1.1">
17+
<dependency id="TestPackageA" version="0.9.0-beta1" />
18+
<dependency id="TestPackageB" version="1.0.0-beta-12345-01" />
19+
<dependency id="TestPackageC" version="[0.9.0-beta1]" />
20+
</group>
21+
</dependencies>
22+
</metadata>
23+
</package>

src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/TestResources.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ public static class ReleasePackages
3030
private static byte[] s_F;
3131
public static byte[] TestPackageF => ResourceLoader.GetOrCreateResource(ref s_F, NameF);
3232
public const string NameF = nameof(TestPackageF) + "." + Version + ".nupkg";
33+
34+
private static byte[] s_G;
35+
public static byte[] TestPackageG => ResourceLoader.GetOrCreateResource(ref s_G, NameG);
36+
public const string NameG = nameof(TestPackageG) + "." + Version + ".nupkg";
3337
}
3438

3539
public static class PreReleasePackages
@@ -60,6 +64,10 @@ public static class PreReleasePackages
6064
private static byte[] s_F;
6165
public static byte[] TestPackageF => ResourceLoader.GetOrCreateResource(ref s_F, NameF);
6266
public const string NameF = nameof(TestPackageF) + "." + SemVer2 + ".nupkg";
67+
68+
private static byte[] s_G;
69+
public static byte[] TestPackageG => ResourceLoader.GetOrCreateResource(ref s_G, NameG);
70+
public const string NameG = nameof(TestPackageG) + "." + SemVer1 + ".nupkg";
6371
}
6472

6573
public static class DailyBuildPackages
@@ -90,6 +98,10 @@ public static class DailyBuildPackages
9098
private static byte[] s_F;
9199
public static byte[] TestPackageF => ResourceLoader.GetOrCreateResource(ref s_F, NameF);
92100
public const string NameF = nameof(TestPackageF) + "." + SemVer2 + ".nupkg";
101+
102+
private static byte[] s_G;
103+
public static byte[] TestPackageG => ResourceLoader.GetOrCreateResource(ref s_G, NameG);
104+
public const string NameG = nameof(TestPackageG) + "." + SemVer1 + ".nupkg";
93105
}
94106

95107
public static class MiscPackages

src/Microsoft.DotNet.NuGetRepack/tests/VersionUpdaterTests.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,46 +52,51 @@ private static void AssertPackagesEqual(byte[] expected, byte[] actual)
5252
// change to match the platform that is executing. The reference packages that we use to validate
5353
// the SemVer tests were built on Windows which makes these test only valid for Windows.
5454
//
55-
// This can be removed when https://github.com/dotnet/corefx/issues/39931 is fixed.
56-
[WindowsOnlyFact(Skip = "https://github.com/dotnet/arcade/issues/3794")]
55+
// This can be removed when https://github.com/dotnet/corefx/issues/39931 is fixed.
56+
[WindowsOnlyFact()]
5757
public void TestPackagesSemVer1()
5858
{
5959
var dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
6060
Directory.CreateDirectory(dir);
6161

62-
string a_daily, b_daily, c_daily, d_daily;
62+
string a_daily, b_daily, c_daily, d_daily, g_daily;
6363
File.WriteAllBytes(a_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameA), TestResources.DailyBuildPackages.TestPackageA);
6464
File.WriteAllBytes(b_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameB), TestResources.DailyBuildPackages.TestPackageB);
6565
File.WriteAllBytes(c_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameC), TestResources.DailyBuildPackages.TestPackageC);
6666
File.WriteAllBytes(d_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameD), TestResources.DailyBuildPackages.TestPackageD);
67+
File.WriteAllBytes(g_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameG), TestResources.DailyBuildPackages.TestPackageG);
6768

6869
var a_pre = Path.Combine(dir, TestResources.PreReleasePackages.NameA);
6970
var b_pre = Path.Combine(dir, TestResources.PreReleasePackages.NameB);
7071
var c_pre = Path.Combine(dir, TestResources.PreReleasePackages.NameC);
7172
var d_pre = Path.Combine(dir, TestResources.PreReleasePackages.NameD);
73+
var g_pre = Path.Combine(dir, TestResources.PreReleasePackages.NameG);
7274

7375
var a_rel = Path.Combine(dir, TestResources.ReleasePackages.NameA);
7476
var b_rel = Path.Combine(dir, TestResources.ReleasePackages.NameB);
7577
var c_rel = Path.Combine(dir, TestResources.ReleasePackages.NameC);
7678
var d_rel = Path.Combine(dir, TestResources.ReleasePackages.NameD);
79+
var g_rel = Path.Combine(dir, TestResources.ReleasePackages.NameG);
7780

78-
NuGetVersionUpdater.Run(new[] { a_daily, b_daily, c_daily, d_daily }, dir, VersionTranslation.Release, exactVersions: false);
79-
NuGetVersionUpdater.Run(new[] { a_daily, b_daily, c_daily, d_daily }, dir, VersionTranslation.PreRelease, exactVersions: false);
81+
NuGetVersionUpdater.Run(new[] { a_daily, b_daily, c_daily, d_daily, g_daily }, dir, VersionTranslation.Release, exactVersions: false);
82+
NuGetVersionUpdater.Run(new[] { a_daily, b_daily, c_daily, d_daily, g_daily }, dir, VersionTranslation.PreRelease, exactVersions: false);
8083

8184
AssertPackagesEqual(TestResources.ReleasePackages.TestPackageA, File.ReadAllBytes(a_rel));
8285
AssertPackagesEqual(TestResources.ReleasePackages.TestPackageB, File.ReadAllBytes(b_rel));
8386
AssertPackagesEqual(TestResources.ReleasePackages.TestPackageC, File.ReadAllBytes(c_rel));
8487
AssertPackagesEqual(TestResources.ReleasePackages.TestPackageD, File.ReadAllBytes(d_rel));
88+
AssertPackagesEqual(TestResources.ReleasePackages.TestPackageG, File.ReadAllBytes(g_rel));
8589

8690
AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageA, File.ReadAllBytes(a_pre));
8791
AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageB, File.ReadAllBytes(b_pre));
8892
AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageC, File.ReadAllBytes(c_pre));
8993
AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageD, File.ReadAllBytes(d_pre));
94+
AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageG, File.ReadAllBytes(g_pre));
9095

9196
Directory.Delete(dir, recursive: true);
9297
}
9398

94-
[WindowsOnlyFact(Skip = "https://github.com/dotnet/arcade/issues/3794")]
99+
[WindowsOnlyFact()]
95100
public void TestPackagesSemVer2()
96101
{
97102
var dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
@@ -119,7 +124,7 @@ public void TestPackagesSemVer2()
119124
Directory.Delete(dir, recursive: true);
120125
}
121126

122-
[WindowsOnlyFact(Skip = "https://github.com/dotnet/arcade/issues/3794")]
127+
[WindowsOnlyFact()]
123128
public void TestValidation()
124129
{
125130
var dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
@@ -158,7 +163,7 @@ public void TestValidation()
158163
Directory.Delete(dir, recursive: true);
159164
}
160165

161-
[WindowsOnlyFact(Skip = "https://github.com/dotnet/arcade/issues/3794")]
166+
[WindowsOnlyFact()]
162167
public void TestDotnetToolValidation()
163168
{
164169
var dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());

0 commit comments

Comments
 (0)