dependabot-nuget 0.287.0 → 0.289.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/.gitignore +1 -0
  3. data/helpers/lib/NuGetUpdater/Directory.Build.targets +17 -0
  4. data/helpers/lib/NuGetUpdater/Directory.Packages.props +26 -17
  5. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +0 -1
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +7 -3
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +3 -1
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +88 -47
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +31 -16
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +1 -1
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementArrayConverter.cs +39 -0
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +1 -1
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/ShellGitCommandHandler.cs +1 -1
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.props +7 -0
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.targets +10 -0
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +64 -53
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DotNetToolsJsonDiscovery.cs +2 -2
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/GlobalJsonDiscovery.cs +2 -2
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +17 -5
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscoveryResult.cs +3 -1
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +3 -0
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +429 -12
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/WorkspaceDiscoveryResult.cs +0 -1
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +12 -2
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/JsonBuildFile.cs +1 -1
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/CompatabilityChecker.cs +2 -2
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +7 -2
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +23 -0
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +43 -58
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/TargetFrameworkReporter.targets +13 -0
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +13 -43
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs +4 -4
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs +5 -5
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +3 -10
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +40 -33
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +12 -11
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +16 -12
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/CollectionExtensions.cs +17 -0
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ConsoleLogger.cs +1 -1
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +19 -19
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ILogger.cs +11 -1
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +74 -20
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +1 -17
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathComparer.cs +31 -0
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +46 -10
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +96 -0
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +135 -3
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +71 -38
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +66 -4
  51. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Proj.cs +11 -5
  52. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +808 -222
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +477 -97
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +5 -9
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +494 -0
  56. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +46 -1
  57. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +0 -1
  58. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +401 -77
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +35 -2
  60. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +60 -2
  61. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +3 -2
  62. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestLogger.cs +1 -1
  63. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/BindingRedirectsTests.cs +1 -1
  64. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +8 -4
  65. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +40 -0
  66. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -1
  67. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/AssertEx.cs +1 -1
  68. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/LinuxOnlyAttribute.cs +12 -0
  69. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +8 -5
  70. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +49 -3
  71. data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +3 -1
  72. data/lib/dependabot/nuget/file_fetcher.rb +12 -393
  73. data/lib/dependabot/nuget/file_parser.rb +23 -54
  74. data/lib/dependabot/nuget/file_updater.rb +21 -16
  75. data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +2 -9
  76. data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +183 -80
  77. data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +25 -3
  78. data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +1 -11
  79. data/lib/dependabot/nuget/native_helpers.rb +13 -4
  80. data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +17 -4
  81. metadata +15 -12
  82. data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Packages.props +0 -29
  83. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +0 -17
  84. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscovery.cs +0 -69
  85. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscoveryResult.cs +0 -11
  86. data/lib/dependabot/nuget/file_fetcher/import_paths_finder.rb +0 -73
  87. data/lib/dependabot/nuget/file_fetcher/sln_project_paths_finder.rb +0 -60
  88. data/lib/dependabot/nuget/native_discovery/native_directory_packages_props_discovery.rb +0 -44
@@ -10,21 +10,17 @@ public record ExpectedWorkspaceDiscoveryResult : NativeResult
10
10
  public bool IsSuccess { get; init; } = true;
11
11
  public ImmutableArray<ExpectedSdkProjectDiscoveryResult> Projects { get; init; }
12
12
  public int? ExpectedProjectCount { get; init; }
13
- public ExpectedDirectoryPackagesPropsDiscovertyResult? DirectoryPackagesProps { get; init; }
14
13
  public ExpectedDependencyDiscoveryResult? GlobalJson { get; init; }
15
14
  public ExpectedDependencyDiscoveryResult? DotNetToolsJson { get; init; }
16
15
  }
17
16
 
18
- public record ExpectedDirectoryPackagesPropsDiscovertyResult : ExpectedDependencyDiscoveryResult
19
- {
20
- public bool IsTransitivePinningEnabled { get; init; }
21
- }
22
-
23
17
  public record ExpectedSdkProjectDiscoveryResult : ExpectedDependencyDiscoveryResult
24
18
  {
25
- public ImmutableArray<Property> Properties { get; init; } = [];
26
- public ImmutableArray<string> TargetFrameworks { get; init; } = [];
27
- public ImmutableArray<string> ReferencedProjectPaths { get; init; } = [];
19
+ public required ImmutableArray<Property> Properties { get; init; }
20
+ public required ImmutableArray<string> TargetFrameworks { get; init; }
21
+ public required ImmutableArray<string> ReferencedProjectPaths { get; init; }
22
+ public required ImmutableArray<string> ImportedFiles { get; init; }
23
+ public required ImmutableArray<string> AdditionalFiles { get; init; }
28
24
  }
29
25
 
30
26
  public record ExpectedDependencyDiscoveryResult : IDiscoveryResultWithDependencies
@@ -0,0 +1,494 @@
1
+ using System.Collections.Immutable;
2
+
3
+ using NuGetUpdater.Core.Discover;
4
+ using NuGetUpdater.Core.Test.Update;
5
+
6
+ using Xunit;
7
+
8
+ using TestFile = (string Path, string Content);
9
+
10
+ namespace NuGetUpdater.Core.Test.Discover;
11
+
12
+ public class SdkProjectDiscoveryTests : DiscoveryWorkerTestBase
13
+ {
14
+ [Fact]
15
+ public async Task DiscoveryInSingleProject_TopLevelAndTransitive()
16
+ {
17
+ await TestDiscoverAsync(
18
+ packages:
19
+ [
20
+ MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.2.3", "net8.0", [("net8.0", [("Transitive.Dependency", "4.5.6")])]),
21
+ MockNuGetPackage.CreateSimplePackage("Transitive.Dependency", "4.5.6", "net8.0"),
22
+ ],
23
+ startingDirectory: "src",
24
+ projectPath: "src/library.csproj",
25
+ files:
26
+ [
27
+ ("src/library.csproj", """
28
+ <Project Sdk="Microsoft.NET.Sdk">
29
+ <PropertyGroup>
30
+ <TargetFramework>net8.0</TargetFramework>
31
+ </PropertyGroup>
32
+ <ItemGroup>
33
+ <PackageReference Include="Top.Level.Package" Version="1.2.3" />
34
+ </ItemGroup>
35
+ </Project>
36
+ """)
37
+ ],
38
+ expectedProjects:
39
+ [
40
+ new()
41
+ {
42
+ FilePath = "library.csproj",
43
+ Dependencies =
44
+ [
45
+ new("Top.Level.Package", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
46
+ new("Transitive.Dependency", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
47
+ ],
48
+ ImportedFiles = [],
49
+ Properties =
50
+ [
51
+ new("TargetFramework", "net8.0", "src/library.csproj"),
52
+ ],
53
+ TargetFrameworks = ["net8.0"],
54
+ ReferencedProjectPaths = [],
55
+ AdditionalFiles = [],
56
+ }
57
+ ]
58
+ );
59
+ }
60
+
61
+ [Fact]
62
+ public async Task DiscoveryInSingleProject_PackageAddedInTargetsFile()
63
+ {
64
+ await TestDiscoverAsync(
65
+ packages:
66
+ [
67
+ MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.2.3", "net8.0", [("net8.0", [("Transitive.Dependency", "4.5.6")])]),
68
+ MockNuGetPackage.CreateSimplePackage("Transitive.Dependency", "4.5.6", "net8.0"),
69
+ ],
70
+ startingDirectory: "src",
71
+ projectPath: "src/library.csproj",
72
+ files:
73
+ [
74
+ ("src/library.csproj", """
75
+ <Project Sdk="Microsoft.NET.Sdk">
76
+ <PropertyGroup>
77
+ <TargetFramework>net8.0</TargetFramework>
78
+ </PropertyGroup>
79
+ </Project>
80
+ """),
81
+ ("Directory.Build.targets", """
82
+ <Project>
83
+ <ItemGroup>
84
+ <PackageReference Include="Top.Level.Package" Version="1.2.3" />
85
+ </ItemGroup>
86
+ </Project>
87
+ """)
88
+ ],
89
+ expectedProjects:
90
+ [
91
+ new()
92
+ {
93
+ FilePath = "library.csproj",
94
+ Dependencies =
95
+ [
96
+ // dependencies come from `Directory.Build.targets`, but it's through the evaluation of `src/library.csproj` that it's found
97
+ new("Top.Level.Package", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
98
+ new("Transitive.Dependency", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
99
+ ],
100
+ Properties =
101
+ [
102
+ new("TargetFramework", "net8.0", "src/library.csproj"),
103
+ ],
104
+ TargetFrameworks = ["net8.0"],
105
+ ReferencedProjectPaths = [],
106
+ ImportedFiles = [
107
+ "../Directory.Build.targets"
108
+ ],
109
+ AdditionalFiles = [],
110
+ }
111
+ ]
112
+ );
113
+ }
114
+
115
+ [Fact]
116
+ public async Task DiscoveryThroughProjectReference()
117
+ {
118
+ await TestDiscoverAsync(
119
+ packages:
120
+ [
121
+ MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.2.3", "net8.0"),
122
+ MockNuGetPackage.CreateSimplePackage("Dependency.From.Other.Project", "4.5.6", "net8.0"),
123
+ ],
124
+ startingDirectory: "src/library1",
125
+ projectPath: "src/library1/library1.csproj",
126
+ files:
127
+ [
128
+ ("src/library1/library1.csproj", """
129
+ <Project Sdk="Microsoft.NET.Sdk">
130
+ <PropertyGroup>
131
+ <TargetFramework>net8.0</TargetFramework>
132
+ </PropertyGroup>
133
+ <ItemGroup>
134
+ <ProjectReference Include="../library2/library2.csproj" />
135
+ </ItemGroup>
136
+ <ItemGroup>
137
+ <PackageReference Include="Top.Level.Package" Version="1.2.3" />
138
+ </ItemGroup>
139
+ </Project>
140
+ """),
141
+ ("src/library2/library2.csproj", """
142
+ <Project Sdk="Microsoft.NET.Sdk">
143
+ <PropertyGroup>
144
+ <TargetFramework>net8.0</TargetFramework>
145
+ </PropertyGroup>
146
+ <ItemGroup>
147
+ <PackageReference Include="Dependency.From.Other.Project" Version="4.5.6" />
148
+ </ItemGroup>
149
+ </Project>
150
+ """),
151
+ ],
152
+ expectedProjects:
153
+ [
154
+ new()
155
+ {
156
+ FilePath = "library1.csproj",
157
+ Dependencies =
158
+ [
159
+ new("Top.Level.Package", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
160
+ new("Dependency.From.Other.Project", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
161
+ ],
162
+ ImportedFiles = [],
163
+ ReferencedProjectPaths = [
164
+ "../library2/library2.csproj"
165
+ ],
166
+ Properties =
167
+ [
168
+ new("TargetFramework", "net8.0", "src/library1/library1.csproj"),
169
+ ],
170
+ TargetFrameworks = ["net8.0"],
171
+ AdditionalFiles = [],
172
+ },
173
+ new()
174
+ {
175
+ FilePath = "../library2/library2.csproj",
176
+ Dependencies =
177
+ [
178
+ new("Dependency.From.Other.Project", "4.5.6", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true)
179
+ ],
180
+ Properties =
181
+ [
182
+ new("TargetFramework", "net8.0", "src/library2/library2.csproj"),
183
+ ],
184
+ TargetFrameworks = ["net8.0"],
185
+ ReferencedProjectPaths = [],
186
+ ImportedFiles = [],
187
+ AdditionalFiles = [],
188
+ }
189
+ ]
190
+ );
191
+ }
192
+
193
+ [Fact]
194
+ public async Task DiscoveryThroughProjectReferenceThroughTransitiveDependency()
195
+ {
196
+ await TestDiscoverAsync(
197
+ packages:
198
+ [
199
+ MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.2.3", "net8.0", [("net8.0", [("Transitive.Dependency", "4.5.6")])]),
200
+ MockNuGetPackage.CreateSimplePackage("Transitive.Dependency", "4.5.6", "net8.0"),
201
+ ],
202
+ startingDirectory: "src/library1",
203
+ projectPath: "src/library1/library1.csproj",
204
+ files:
205
+ [
206
+ ("src/library1/library1.csproj", """
207
+ <Project Sdk="Microsoft.NET.Sdk">
208
+ <PropertyGroup>
209
+ <TargetFramework>net8.0</TargetFramework>
210
+ </PropertyGroup>
211
+ <ItemGroup>
212
+ <ProjectReference Include="../library2/library2.csproj" />
213
+ </ItemGroup>
214
+ </Project>
215
+ """),
216
+ ("src/library2/library2.csproj", """
217
+ <Project Sdk="Microsoft.NET.Sdk">
218
+ <PropertyGroup>
219
+ <TargetFramework>net8.0</TargetFramework>
220
+ </PropertyGroup>
221
+ <ItemGroup>
222
+ <PackageReference Include="Top.Level.Package" Version="1.2.3" />
223
+ </ItemGroup>
224
+ </Project>
225
+ """),
226
+ ],
227
+ expectedProjects:
228
+ [
229
+ new()
230
+ {
231
+ FilePath = "library1.csproj",
232
+ Dependencies =
233
+ [
234
+ // these are all transitive through the ProjectReference
235
+ new("Top.Level.Package", "1.2.3", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true),
236
+ new("Transitive.Dependency", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
237
+ ],
238
+ ImportedFiles = [],
239
+ ReferencedProjectPaths = [
240
+ "../library2/library2.csproj",
241
+ ],
242
+ Properties =
243
+ [
244
+ new("TargetFramework", "net8.0", "src/library1/library1.csproj"),
245
+ ],
246
+ TargetFrameworks = ["net8.0"],
247
+ AdditionalFiles = [],
248
+ },
249
+ new()
250
+ {
251
+ FilePath = "../library2/library2.csproj",
252
+ Dependencies =
253
+ [
254
+ new("Top.Level.Package", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
255
+ new("Transitive.Dependency", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
256
+ ],
257
+ ImportedFiles = [],
258
+ Properties =
259
+ [
260
+ new("TargetFramework", "net8.0", "src/library2/library2.csproj"),
261
+ ],
262
+ TargetFrameworks = ["net8.0"],
263
+ ReferencedProjectPaths = [],
264
+ AdditionalFiles = [],
265
+ }
266
+ ]
267
+ );
268
+ }
269
+
270
+ [Fact]
271
+ public async Task DiscoverWithMultipleTargetFrameworks()
272
+ {
273
+ await TestDiscoverAsync(
274
+ packages:
275
+ [
276
+ MockNuGetPackage.CreateSimplePackage("Some.Dependency", "1.2.3", "net7.0"),
277
+ ],
278
+ startingDirectory: "src",
279
+ projectPath: "src/library.csproj",
280
+ files:
281
+ [
282
+ ("src/library.csproj", """
283
+ <Project Sdk="Microsoft.NET.Sdk">
284
+ <PropertyGroup>
285
+ <TargetFrameworks>net7.0;net8.0</TargetFrameworks>
286
+ </PropertyGroup>
287
+ <ItemGroup>
288
+ <PackageReference Include="Some.Dependency" Version="1.2.3" />
289
+ </ItemGroup>
290
+ </Project>
291
+ """),
292
+ ],
293
+ expectedProjects:
294
+ [
295
+ new()
296
+ {
297
+ FilePath = "library.csproj",
298
+ Dependencies =
299
+ [
300
+ new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net7.0"], IsDirect: true),
301
+ new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
302
+ ],
303
+ ImportedFiles = [],
304
+ Properties =
305
+ [
306
+ new("TargetFrameworks", "net7.0;net8.0", "src/library.csproj"),
307
+ ],
308
+ TargetFrameworks = ["net7.0", "net8.0"],
309
+ ReferencedProjectPaths = [],
310
+ AdditionalFiles = [],
311
+ },
312
+ ]
313
+ );
314
+ }
315
+
316
+ [Fact]
317
+ public async Task DiscoveryIgnoresNetStandardLibrary()
318
+ {
319
+ await TestDiscoverAsync(
320
+ packages:
321
+ [
322
+ MockNuGetPackage.CreateSimplePackage("Some.Dependency", "1.2.3", "netstandard2.0"),
323
+ ],
324
+ startingDirectory: "src",
325
+ projectPath: "src/library.csproj",
326
+ files:
327
+ [
328
+ ("src/library.csproj", """
329
+ <Project Sdk="Microsoft.NET.Sdk">
330
+ <PropertyGroup>
331
+ <TargetFramework>netstandard2.0</TargetFramework>
332
+ </PropertyGroup>
333
+ <ItemGroup>
334
+ <PackageReference Include="Some.Dependency" Version="1.2.3" />
335
+ </ItemGroup>
336
+ </Project>
337
+ """),
338
+ ],
339
+ expectedProjects:
340
+ [
341
+ new()
342
+ {
343
+ FilePath = "library.csproj",
344
+ Dependencies =
345
+ [
346
+ new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["netstandard2.0"], IsDirect: true),
347
+ ],
348
+ ImportedFiles = [],
349
+ Properties =
350
+ [
351
+ new("TargetFramework", "netstandard2.0", "src/library.csproj"),
352
+ ],
353
+ TargetFrameworks = ["netstandard2.0"],
354
+ ReferencedProjectPaths = [],
355
+ AdditionalFiles = [],
356
+ },
357
+ ]
358
+ );
359
+ }
360
+
361
+ [Fact]
362
+ public async Task GlobalPackages()
363
+ {
364
+ await TestDiscoverAsync(
365
+ packages:
366
+ [
367
+ MockNuGetPackage.CreateSimplePackage("Some.Dependency", "1.2.3", "netstandard2.0"),
368
+ ],
369
+ startingDirectory: "src",
370
+ projectPath: "src/library.csproj",
371
+ files:
372
+ [
373
+ ("src/library.csproj", """
374
+ <Project Sdk="Microsoft.NET.Sdk">
375
+ <PropertyGroup>
376
+ <TargetFramework>net8.0</TargetFramework>
377
+ <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
378
+ </PropertyGroup>
379
+ </Project>
380
+ """),
381
+ ("src/Directory.Build.props", """
382
+ <Project>
383
+ <ItemGroup>
384
+ <GlobalPackageReference Include="Some.Dependency" Version="1.2.3" />
385
+ </ItemGroup>
386
+ </Project>
387
+ """)
388
+ ],
389
+ expectedProjects:
390
+ [
391
+ new()
392
+ {
393
+ FilePath = "library.csproj",
394
+ Dependencies =
395
+ [
396
+ new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
397
+ ],
398
+ ImportedFiles =
399
+ [
400
+ "Directory.Build.props",
401
+ ],
402
+ Properties =
403
+ [
404
+ new("ManagePackageVersionsCentrally", "true", "src/library.csproj"),
405
+ new("TargetFramework", "net8.0", "src/library.csproj"),
406
+ ],
407
+ TargetFrameworks = ["net8.0"],
408
+ ReferencedProjectPaths = [],
409
+ AdditionalFiles = [],
410
+ },
411
+ ]
412
+ );
413
+ }
414
+
415
+ [Fact]
416
+ public async Task CentralPackageManagementAlternatePackagesPropsLocation()
417
+ {
418
+ // when using central package management, the well-known file `Directory.Packages.props` can be overridden with
419
+ // the `$(DirectoryPackagesPropsPath)` property
420
+ await TestDiscoverAsync(
421
+ packages:
422
+ [
423
+ MockNuGetPackage.CreateSimplePackage("Some.Dependency", "1.2.3", "netstandard2.0"),
424
+ ],
425
+ startingDirectory: "src",
426
+ projectPath: "src/library.csproj",
427
+ files:
428
+ [
429
+ ("src/library.csproj", """
430
+ <Project Sdk="Microsoft.NET.Sdk">
431
+ <PropertyGroup>
432
+ <TargetFramework>net8.0</TargetFramework>
433
+ <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
434
+ </PropertyGroup>
435
+ <ItemGroup>
436
+ <PackageReference Include="Some.Dependency" />
437
+ </ItemGroup>
438
+ </Project>
439
+ """),
440
+ ("src/Directory.Build.props", """
441
+ <Project>
442
+ <PropertyGroup>
443
+ <DirectoryPackagesPropsPath>$(MSBuildThisFileDirectory)..\NonStandardPackages.props</DirectoryPackagesPropsPath>
444
+ </PropertyGroup>
445
+ </Project>
446
+ """),
447
+ ("NonStandardPackages.props", """
448
+ <Project>
449
+ <ItemGroup>
450
+ <PackageVersion Include="Some.Dependency" Version="1.2.3" />
451
+ </ItemGroup>
452
+ </Project>
453
+ """)
454
+ ],
455
+ expectedProjects:
456
+ [
457
+ new()
458
+ {
459
+ FilePath = "library.csproj",
460
+ Dependencies =
461
+ [
462
+ new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
463
+ ],
464
+ ImportedFiles =
465
+ [
466
+ "../NonStandardPackages.props",
467
+ "Directory.Build.props",
468
+ ],
469
+ Properties =
470
+ [
471
+ new("ManagePackageVersionsCentrally", "true", "src/library.csproj"),
472
+ new("TargetFramework", "net8.0", "src/library.csproj"),
473
+ ],
474
+ TargetFrameworks = ["net8.0"],
475
+ ReferencedProjectPaths = [],
476
+ AdditionalFiles = [],
477
+ },
478
+ ]
479
+ );
480
+ }
481
+
482
+ private static async Task TestDiscoverAsync(string startingDirectory, string projectPath, TestFile[] files, ImmutableArray<ExpectedSdkProjectDiscoveryResult> expectedProjects, MockNuGetPackage[]? packages = null)
483
+ {
484
+ using var testDirectory = await TemporaryDirectory.CreateWithContentsAsync(files);
485
+
486
+ await UpdateWorkerTestBase.MockNuGetPackagesInDirectory(packages, testDirectory.DirectoryPath);
487
+
488
+ var logger = new TestLogger();
489
+ var fullProjectPath = Path.Combine(testDirectory.DirectoryPath, projectPath);
490
+ var experimentsManager = new ExperimentsManager() { UseDirectDiscovery = true }; // the following method is direct discovery; this just makes the call to Validate... happy
491
+ var projectDiscovery = await SdkProjectDiscovery.DiscoverWithBinLogAsync(testDirectory.DirectoryPath, Path.GetDirectoryName(fullProjectPath)!, fullProjectPath, logger);
492
+ ValidateProjectResults(expectedProjects, projectDiscovery, experimentsManager);
493
+ }
494
+ }
@@ -291,9 +291,12 @@ namespace NuGetUpdater.Core.Test
291
291
  <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
292
292
  <!-- this is a simplified version of this package used for testing -->
293
293
  <PropertyGroup>
294
- <CentralPackagesFile Condition=" '$(CentralPackagesFile)' == '' ">$([MSBuild]::GetPathOfFileAbove('Packages.props', $(MSBuildProjectDirectory)))</CentralPackagesFile>
294
+ <CentralPackagesFile Condition=" '$(CentralPackagesFile)' == '' ">$([MSBuild]::GetPathOfFileAbove('Packages.props', $(MSBuildProjectDirectory)))</CentralPackagesFile>
295
295
  </PropertyGroup>
296
296
  <Import Project="$(CentralPackagesFile)" Condition="Exists('$(CentralPackagesFile)')" />
297
+ <ItemGroup Condition=" '$(EnableGlobalPackageReferences)' != 'false' ">
298
+ <PackageReference Include="@(GlobalPackageReference)" Condition=" '$(EnableGlobalPackageReferences)' != 'false' " />
299
+ </ItemGroup>
297
300
  </Project>
298
301
  """
299
302
  );
@@ -384,6 +387,47 @@ namespace NuGetUpdater.Core.Test
384
387
  return WellKnownPackages[key];
385
388
  }
386
389
 
390
+ public static MockNuGetPackage WellKnownHostPackage(string packageName, string targetFramework, (string Path, byte[] Content)[]? files = null)
391
+ {
392
+ string key = $"{packageName}/{targetFramework}";
393
+ if (!WellKnownPackages.ContainsKey(key))
394
+ {
395
+ // for the current SDK, the file `Microsoft.NETCoreSdk.BundledVersions.props` contains the version of the
396
+ // `Microsoft.WindowsDesktop.App.Ref` package that will be needed to build, so we find it by TFM
397
+ XDocument propsDocument = XDocument.Load(BundledVersionsPropsPath.Value);
398
+ XElement? ridElement = propsDocument.XPathSelectElement("/Project/PropertyGroup/NETCoreSdkRuntimeIdentifier");
399
+ if (ridElement is null)
400
+ {
401
+ throw new Exception($"Unable to find RID property.");
402
+ }
403
+
404
+ string expectedRid = ridElement.Value.Trim();
405
+
406
+ XElement? matchingAppHostPack = propsDocument.XPathSelectElement(
407
+ $"""
408
+ /Project/ItemGroup/KnownAppHostPack
409
+ [
410
+ @Include='{packageName}' and
411
+ @AppHostPackNamePattern='{packageName}.Host.**RID**' and
412
+ @TargetFramework='{targetFramework}'
413
+ ]
414
+ """);
415
+ if (matchingAppHostPack is null)
416
+ {
417
+ throw new Exception($"Unable to find {packageName}.Host.**RID** version for target framework '{targetFramework}'");
418
+ }
419
+
420
+ string expectedVersion = matchingAppHostPack.Attribute("AppHostPackVersion")!.Value;
421
+ return new(
422
+ $"{packageName}.Host.{expectedRid}",
423
+ expectedVersion,
424
+ Files: files
425
+ );
426
+ }
427
+
428
+ return WellKnownPackages[key];
429
+ }
430
+
387
431
  public static MockNuGetPackage[] CommonPackages { get; } =
388
432
  [
389
433
  CreateSimplePackage("NETStandard.Library", "2.0.3", "netstandard2.0"),
@@ -424,6 +468,7 @@ namespace NuGetUpdater.Core.Test
424
468
  WellKnownReferencePackage("Microsoft.WindowsDesktop.App", "net7.0"),
425
469
  WellKnownReferencePackage("Microsoft.WindowsDesktop.App", "net8.0"),
426
470
  WellKnownReferencePackage("Microsoft.WindowsDesktop.App", "net9.0"),
471
+ WellKnownHostPackage("Microsoft.NETCore.App", "net8.0"),
427
472
  ];
428
473
  }
429
474
  }
@@ -11,7 +11,6 @@
11
11
  </ItemGroup>
12
12
 
13
13
  <ItemGroup>
14
- <PackageReference Include="DiffPlex" />
15
14
  <PackageReference Include="Microsoft.CodeAnalysis.CSharp" />
16
15
  <PackageReference Include="Microsoft.NET.Test.Sdk" />
17
16
  <PackageReference Include="xunit" />