dependabot-nuget 0.258.0 → 0.259.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.
- checksums.yaml +4 -4
- data/helpers/lib/NuGetUpdater/Directory.Packages.props +2 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +255 -191
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +63 -35
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +107 -14
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +9 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +18 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +6 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.DotNetToolsJson.cs +6 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.GlobalJson.cs +6 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +11 -21
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Proj.cs +95 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +204 -62
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +64 -45
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +419 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +7 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +77 -19
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DirsProj.cs +120 -91
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DotNetTools.cs +132 -97
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs +93 -75
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Mixed.cs +45 -42
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1089 -956
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Sdk.cs +1624 -1291
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +296 -293
- data/helpers/lib/NuGetUpdater/global.json +6 -0
- data/lib/dependabot/nuget/file_parser.rb +4 -5
- data/lib/dependabot/nuget/file_updater.rb +1 -1
- data/lib/dependabot/nuget/update_checker/dependency_finder.rb +7 -2
- data/lib/dependabot/nuget/update_checker/property_updater.rb +1 -0
- data/lib/dependabot/nuget/update_checker/version_finder.rb +2 -3
- data/lib/dependabot/nuget/update_checker.rb +1 -0
- metadata +8 -5
@@ -1,7 +1,4 @@
|
|
1
|
-
using System;
|
2
|
-
using System.IO;
|
3
1
|
using System.Text;
|
4
|
-
using System.Threading.Tasks;
|
5
2
|
|
6
3
|
using NuGetUpdater.Core;
|
7
4
|
using NuGetUpdater.Core.Test;
|
@@ -26,12 +23,18 @@ public partial class EntryPointTests
|
|
26
23
|
"--solution-or-project",
|
27
24
|
Path.Combine(path, "path/to/solution.sln"),
|
28
25
|
"--dependency",
|
29
|
-
"
|
26
|
+
"Some.package",
|
30
27
|
"--new-version",
|
31
28
|
"13.0.1",
|
32
29
|
"--previous-version",
|
33
30
|
"7.0.1",
|
34
31
|
],
|
32
|
+
packages:
|
33
|
+
[
|
34
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "7.0.1", "net45"),
|
35
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "13.0.1", "net45"),
|
36
|
+
],
|
37
|
+
initialFiles:
|
35
38
|
[
|
36
39
|
("path/to/solution.sln", """
|
37
40
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
@@ -66,8 +69,8 @@ public partial class EntryPointTests
|
|
66
69
|
<None Include="packages.config" />
|
67
70
|
</ItemGroup>
|
68
71
|
<ItemGroup>
|
69
|
-
<Reference Include="
|
70
|
-
<HintPath>packages\
|
72
|
+
<Reference Include="Some.Package">
|
73
|
+
<HintPath>packages\Some.Package.7.0.1\lib\net45\Some.Package.dll</HintPath>
|
71
74
|
<Private>True</Private>
|
72
75
|
</Reference>
|
73
76
|
</ItemGroup>
|
@@ -76,10 +79,11 @@ public partial class EntryPointTests
|
|
76
79
|
"""),
|
77
80
|
("path/to/packages.config", """
|
78
81
|
<packages>
|
79
|
-
<package id="
|
82
|
+
<package id="Some.Package" version="7.0.1" targetFramework="net45" />
|
80
83
|
</packages>
|
81
84
|
""")
|
82
85
|
],
|
86
|
+
expectedFiles:
|
83
87
|
[
|
84
88
|
("path/to/my.csproj", """
|
85
89
|
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
@@ -91,8 +95,8 @@ public partial class EntryPointTests
|
|
91
95
|
<None Include="packages.config" />
|
92
96
|
</ItemGroup>
|
93
97
|
<ItemGroup>
|
94
|
-
<Reference Include="
|
95
|
-
<HintPath>packages\
|
98
|
+
<Reference Include="Some.Package">
|
99
|
+
<HintPath>packages\Some.Package.13.0.1\lib\net45\Some.Package.dll</HintPath>
|
96
100
|
<Private>True</Private>
|
97
101
|
</Reference>
|
98
102
|
</ItemGroup>
|
@@ -102,10 +106,11 @@ public partial class EntryPointTests
|
|
102
106
|
("path/to/packages.config", """
|
103
107
|
<?xml version="1.0" encoding="utf-8"?>
|
104
108
|
<packages>
|
105
|
-
<package id="
|
109
|
+
<package id="Some.Package" version="13.0.1" targetFramework="net45" />
|
106
110
|
</packages>
|
107
111
|
""")
|
108
|
-
]
|
112
|
+
]
|
113
|
+
);
|
109
114
|
}
|
110
115
|
|
111
116
|
[Fact]
|
@@ -119,13 +124,19 @@ public partial class EntryPointTests
|
|
119
124
|
"--solution-or-project",
|
120
125
|
Path.Combine(path, "path/to/my.csproj"),
|
121
126
|
"--dependency",
|
122
|
-
"
|
127
|
+
"Some.Package",
|
123
128
|
"--new-version",
|
124
129
|
"13.0.1",
|
125
130
|
"--previous-version",
|
126
131
|
"7.0.1",
|
127
132
|
"--verbose"
|
128
133
|
],
|
134
|
+
packages:
|
135
|
+
[
|
136
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "7.0.1", "net45"),
|
137
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "13.0.1", "net45"),
|
138
|
+
],
|
139
|
+
initialFiles:
|
129
140
|
[
|
130
141
|
("path/to/my.csproj", """
|
131
142
|
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
@@ -137,8 +148,8 @@ public partial class EntryPointTests
|
|
137
148
|
<None Include="packages.config" />
|
138
149
|
</ItemGroup>
|
139
150
|
<ItemGroup>
|
140
|
-
<Reference Include="
|
141
|
-
<HintPath>packages\
|
151
|
+
<Reference Include="Some.Package">
|
152
|
+
<HintPath>packages\Some.Package.7.0.1\lib\net45\Some.Package.dll</HintPath>
|
142
153
|
<Private>True</Private>
|
143
154
|
</Reference>
|
144
155
|
</ItemGroup>
|
@@ -147,10 +158,11 @@ public partial class EntryPointTests
|
|
147
158
|
"""),
|
148
159
|
("path/to/packages.config", """
|
149
160
|
<packages>
|
150
|
-
<package id="
|
161
|
+
<package id="Some.Package" version="7.0.1" targetFramework="net45" />
|
151
162
|
</packages>
|
152
163
|
""")
|
153
164
|
],
|
165
|
+
expectedFiles:
|
154
166
|
[
|
155
167
|
("path/to/my.csproj", """
|
156
168
|
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
@@ -162,8 +174,8 @@ public partial class EntryPointTests
|
|
162
174
|
<None Include="packages.config" />
|
163
175
|
</ItemGroup>
|
164
176
|
<ItemGroup>
|
165
|
-
<Reference Include="
|
166
|
-
<HintPath>packages\
|
177
|
+
<Reference Include="Some.Package">
|
178
|
+
<HintPath>packages\Some.Package.13.0.1\lib\net45\Some.Package.dll</HintPath>
|
167
179
|
<Private>True</Private>
|
168
180
|
</Reference>
|
169
181
|
</ItemGroup>
|
@@ -173,10 +185,11 @@ public partial class EntryPointTests
|
|
173
185
|
("path/to/packages.config", """
|
174
186
|
<?xml version="1.0" encoding="utf-8"?>
|
175
187
|
<packages>
|
176
|
-
<package id="
|
188
|
+
<package id="Some.Package" version="13.0.1" targetFramework="net45" />
|
177
189
|
</packages>
|
178
190
|
""")
|
179
|
-
]
|
191
|
+
]
|
192
|
+
);
|
180
193
|
}
|
181
194
|
|
182
195
|
[Fact]
|
@@ -190,13 +203,18 @@ public partial class EntryPointTests
|
|
190
203
|
"--solution-or-project",
|
191
204
|
$"{path}/some-dir/dirs.proj",
|
192
205
|
"--dependency",
|
193
|
-
"
|
206
|
+
"Some.Package",
|
194
207
|
"--new-version",
|
195
208
|
"6.6.1",
|
196
209
|
"--previous-version",
|
197
210
|
"6.1.0",
|
198
211
|
"--verbose"
|
199
212
|
],
|
213
|
+
packages:
|
214
|
+
[
|
215
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "6.1.0", "net8.0"),
|
216
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "6.6.1", "net8.0"),
|
217
|
+
],
|
200
218
|
initialFiles:
|
201
219
|
[
|
202
220
|
("some-dir/dirs.proj", """
|
@@ -211,12 +229,12 @@ public partial class EntryPointTests
|
|
211
229
|
<Project Sdk="Microsoft.NET.Sdk">
|
212
230
|
<PropertyGroup>
|
213
231
|
<OutputType>Exe</OutputType>
|
214
|
-
<TargetFramework>
|
232
|
+
<TargetFramework>net8.0</TargetFramework>
|
215
233
|
<ImplicitUsings>enable</ImplicitUsings>
|
216
234
|
<Nullable>enable</Nullable>
|
217
235
|
</PropertyGroup>
|
218
236
|
<ItemGroup>
|
219
|
-
<PackageReference Include="
|
237
|
+
<PackageReference Include="Some.Package" Version="6.1.0" />
|
220
238
|
</ItemGroup>
|
221
239
|
</Project>
|
222
240
|
"""),
|
@@ -224,12 +242,12 @@ public partial class EntryPointTests
|
|
224
242
|
<Project Sdk="Microsoft.NET.Sdk">
|
225
243
|
<PropertyGroup>
|
226
244
|
<OutputType>Exe</OutputType>
|
227
|
-
<TargetFramework>
|
245
|
+
<TargetFramework>net8.0</TargetFramework>
|
228
246
|
<ImplicitUsings>enable</ImplicitUsings>
|
229
247
|
<Nullable>enable</Nullable>
|
230
248
|
</PropertyGroup>
|
231
249
|
<ItemGroup>
|
232
|
-
<PackageReference Include="
|
250
|
+
<PackageReference Include="Some.Package" Version="6.1.0" />
|
233
251
|
</ItemGroup>
|
234
252
|
</Project>
|
235
253
|
"""),
|
@@ -237,7 +255,7 @@ public partial class EntryPointTests
|
|
237
255
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
238
256
|
|
239
257
|
<ItemGroup>
|
240
|
-
<PackageReference Include="
|
258
|
+
<PackageReference Include="Some.Package" Version="6.1.0" />
|
241
259
|
</ItemGroup>
|
242
260
|
|
243
261
|
</Project>
|
@@ -258,12 +276,12 @@ public partial class EntryPointTests
|
|
258
276
|
<Project Sdk="Microsoft.NET.Sdk">
|
259
277
|
<PropertyGroup>
|
260
278
|
<OutputType>Exe</OutputType>
|
261
|
-
<TargetFramework>
|
279
|
+
<TargetFramework>net8.0</TargetFramework>
|
262
280
|
<ImplicitUsings>enable</ImplicitUsings>
|
263
281
|
<Nullable>enable</Nullable>
|
264
282
|
</PropertyGroup>
|
265
283
|
<ItemGroup>
|
266
|
-
<PackageReference Include="
|
284
|
+
<PackageReference Include="Some.Package" Version="6.6.1" />
|
267
285
|
</ItemGroup>
|
268
286
|
</Project>
|
269
287
|
"""),
|
@@ -271,12 +289,12 @@ public partial class EntryPointTests
|
|
271
289
|
<Project Sdk="Microsoft.NET.Sdk">
|
272
290
|
<PropertyGroup>
|
273
291
|
<OutputType>Exe</OutputType>
|
274
|
-
<TargetFramework>
|
292
|
+
<TargetFramework>net8.0</TargetFramework>
|
275
293
|
<ImplicitUsings>enable</ImplicitUsings>
|
276
294
|
<Nullable>enable</Nullable>
|
277
295
|
</PropertyGroup>
|
278
296
|
<ItemGroup>
|
279
|
-
<PackageReference Include="
|
297
|
+
<PackageReference Include="Some.Package" Version="6.6.1" />
|
280
298
|
</ItemGroup>
|
281
299
|
</Project>
|
282
300
|
"""),
|
@@ -284,7 +302,7 @@ public partial class EntryPointTests
|
|
284
302
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
285
303
|
|
286
304
|
<ItemGroup>
|
287
|
-
<PackageReference Include="
|
305
|
+
<PackageReference Include="Some.Package" Version="6.1.0" />
|
288
306
|
</ItemGroup>
|
289
307
|
|
290
308
|
</Project>
|
@@ -303,6 +321,14 @@ public partial class EntryPointTests
|
|
303
321
|
// test this, it must be tested in a new process where MSBuild has not been loaded yet and the runner tool
|
304
322
|
// must be started with its working directory at the test repo's root.
|
305
323
|
using var tempDir = new TemporaryDirectory();
|
324
|
+
|
325
|
+
MockNuGetPackage[] testPackages =
|
326
|
+
[
|
327
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "7.0.1", "net8.0"),
|
328
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "13.0.1", "net8.0"),
|
329
|
+
];
|
330
|
+
await MockNuGetPackagesInDirectory(testPackages, tempDir.DirectoryPath);
|
331
|
+
|
306
332
|
var globalJsonPath = Path.Join(tempDir.DirectoryPath, "global.json");
|
307
333
|
var srcGlobalJsonPath = Path.Join(tempDir.DirectoryPath, "src", "global.json");
|
308
334
|
string globalJsonContent = """
|
@@ -322,20 +348,21 @@ public partial class EntryPointTests
|
|
322
348
|
<TargetFramework>net8.0</TargetFramework>
|
323
349
|
</PropertyGroup>
|
324
350
|
<ItemGroup>
|
325
|
-
<PackageReference Include="
|
351
|
+
<PackageReference Include="Some.Package" Version="7.0.1" />
|
326
352
|
</ItemGroup>
|
327
353
|
</Project>
|
328
354
|
""");
|
329
|
-
var executableName =
|
355
|
+
var executableName = Path.Join(Path.GetDirectoryName(GetType().Assembly.Location), "NuGetUpdater.Cli.dll");
|
330
356
|
var executableArgs = string.Join(" ",
|
331
357
|
[
|
358
|
+
executableName,
|
332
359
|
"update",
|
333
360
|
"--repo-root",
|
334
361
|
tempDir.DirectoryPath,
|
335
362
|
"--solution-or-project",
|
336
363
|
projectPath,
|
337
364
|
"--dependency",
|
338
|
-
"
|
365
|
+
"Some.Package",
|
339
366
|
"--new-version",
|
340
367
|
"13.0.1",
|
341
368
|
"--previous-version",
|
@@ -350,7 +377,7 @@ public partial class EntryPointTests
|
|
350
377
|
workingDirectory = Path.Join(workingDirectory, workingDirectoryPath);
|
351
378
|
}
|
352
379
|
|
353
|
-
var (exitCode, output, error) = await ProcessEx.RunAsync(
|
380
|
+
var (exitCode, output, error) = await ProcessEx.RunAsync("dotnet", executableArgs, workingDirectory: workingDirectory);
|
354
381
|
Assert.True(exitCode == 0, $"Error running update on unsupported SDK.\nSTDOUT:\n{output}\nSTDERR:\n{error}");
|
355
382
|
|
356
383
|
// verify project update
|
@@ -366,7 +393,7 @@ public partial class EntryPointTests
|
|
366
393
|
Assert.Contains("99.99.99", updatedGlobalJsonContents);
|
367
394
|
}
|
368
395
|
|
369
|
-
private static async Task Run(Func<string, string[]> getArgs, (string Path, string Content)[] initialFiles, (string, string)[] expectedFiles)
|
396
|
+
private static async Task Run(Func<string, string[]> getArgs, (string Path, string Content)[] initialFiles, (string, string)[] expectedFiles, MockNuGetPackage[]? packages = null)
|
370
397
|
{
|
371
398
|
var actualFiles = await RunUpdate(initialFiles, async path =>
|
372
399
|
{
|
@@ -380,6 +407,7 @@ public partial class EntryPointTests
|
|
380
407
|
|
381
408
|
try
|
382
409
|
{
|
410
|
+
await MockNuGetPackagesInDirectory(packages, path);
|
383
411
|
var args = getArgs(path);
|
384
412
|
var result = await Program.Main(args);
|
385
413
|
if (result != 0)
|
@@ -2,6 +2,10 @@ using System.Collections.Immutable;
|
|
2
2
|
using System.Text.Json;
|
3
3
|
using System.Text.Json.Serialization;
|
4
4
|
|
5
|
+
using Microsoft.Build.Construction;
|
6
|
+
using Microsoft.Build.Definition;
|
7
|
+
using Microsoft.Build.Evaluation;
|
8
|
+
|
5
9
|
using NuGetUpdater.Core.Utilities;
|
6
10
|
|
7
11
|
namespace NuGetUpdater.Core.Discover;
|
@@ -28,16 +32,15 @@ public partial class DiscoveryWorker
|
|
28
32
|
{
|
29
33
|
MSBuildHelper.RegisterMSBuild(Environment.CurrentDirectory, repoRootPath);
|
30
34
|
|
31
|
-
//
|
32
|
-
if
|
33
|
-
|
34
|
-
workspacePath = Path.GetFullPath(Path.Join(repoRootPath, workspacePath));
|
35
|
-
}
|
36
|
-
else if (workspacePath == "/")
|
35
|
+
// the `workspacePath` variable is relative to a repository root, so a rooted path actually isn't rooted; the
|
36
|
+
// easy way to deal with this is to just trim the leading "/" if it exists
|
37
|
+
if (workspacePath.StartsWith("/"))
|
37
38
|
{
|
38
|
-
workspacePath =
|
39
|
+
workspacePath = workspacePath[1..];
|
39
40
|
}
|
40
41
|
|
42
|
+
workspacePath = Path.Combine(repoRootPath, workspacePath);
|
43
|
+
|
41
44
|
DotNetToolsJsonDiscoveryResult? dotNetToolsJsonDiscovery = null;
|
42
45
|
GlobalJsonDiscoveryResult? globalJsonDiscovery = null;
|
43
46
|
DirectoryPackagesPropsDiscoveryResult? directoryPackagesPropsDiscovery = null;
|
@@ -115,27 +118,117 @@ public partial class DiscoveryWorker
|
|
115
118
|
private async Task<ImmutableArray<ProjectDiscoveryResult>> RunForDirectoryAsnyc(string repoRootPath, string workspacePath)
|
116
119
|
{
|
117
120
|
_logger.Log($" Discovering projects beneath [{Path.GetRelativePath(repoRootPath, workspacePath)}].");
|
118
|
-
var
|
119
|
-
|
121
|
+
var entryPoints = FindEntryPoints(workspacePath);
|
122
|
+
var projects = ExpandEntryPointsIntoProjects(entryPoints);
|
123
|
+
if (projects.IsEmpty)
|
120
124
|
{
|
121
125
|
_logger.Log(" No project files found.");
|
122
126
|
return [];
|
123
127
|
}
|
124
128
|
|
125
|
-
return await RunForProjectPathsAsync(repoRootPath, workspacePath,
|
129
|
+
return await RunForProjectPathsAsync(repoRootPath, workspacePath, projects);
|
126
130
|
}
|
127
131
|
|
128
|
-
private static ImmutableArray<string>
|
132
|
+
private static ImmutableArray<string> FindEntryPoints(string workspacePath)
|
129
133
|
{
|
130
|
-
return Directory.EnumerateFiles(workspacePath
|
134
|
+
return Directory.EnumerateFiles(workspacePath)
|
131
135
|
.Where(path =>
|
132
136
|
{
|
133
|
-
|
134
|
-
|
137
|
+
string extension = Path.GetExtension(path).ToLowerInvariant();
|
138
|
+
switch (extension)
|
139
|
+
{
|
140
|
+
case ".sln":
|
141
|
+
case ".proj":
|
142
|
+
case ".csproj":
|
143
|
+
case ".fsproj":
|
144
|
+
case ".vbproj":
|
145
|
+
return true;
|
146
|
+
default:
|
147
|
+
return false;
|
148
|
+
}
|
135
149
|
})
|
136
150
|
.ToImmutableArray();
|
137
151
|
}
|
138
152
|
|
153
|
+
private static ImmutableArray<string> ExpandEntryPointsIntoProjects(IEnumerable<string> entryPoints)
|
154
|
+
{
|
155
|
+
HashSet<string> expandedProjects = new();
|
156
|
+
HashSet<string> seenProjects = new();
|
157
|
+
Stack<string> filesToExpand = new(entryPoints);
|
158
|
+
while (filesToExpand.Count > 0)
|
159
|
+
{
|
160
|
+
string candidateEntryPoint = filesToExpand.Pop();
|
161
|
+
if (seenProjects.Add(candidateEntryPoint))
|
162
|
+
{
|
163
|
+
string extension = Path.GetExtension(candidateEntryPoint).ToLowerInvariant();
|
164
|
+
if (extension == ".sln")
|
165
|
+
{
|
166
|
+
SolutionFile solution = SolutionFile.Parse(candidateEntryPoint);
|
167
|
+
foreach (ProjectInSolution project in solution.ProjectsInOrder)
|
168
|
+
{
|
169
|
+
filesToExpand.Push(project.AbsolutePath);
|
170
|
+
}
|
171
|
+
}
|
172
|
+
else if (extension == ".proj")
|
173
|
+
{
|
174
|
+
IEnumerable<string> foundProjects = ExpandItemGroupFilesFromProject(candidateEntryPoint, "ProjectFile", "ProjectReference");
|
175
|
+
foreach (string foundProject in foundProjects)
|
176
|
+
{
|
177
|
+
filesToExpand.Push(foundProject);
|
178
|
+
}
|
179
|
+
}
|
180
|
+
else
|
181
|
+
{
|
182
|
+
// .csproj, .fsproj, .vbproj
|
183
|
+
// keep this project and check for references
|
184
|
+
expandedProjects.Add(candidateEntryPoint);
|
185
|
+
IEnumerable<string> referencedProjects = ExpandItemGroupFilesFromProject(candidateEntryPoint, "ProjectReference");
|
186
|
+
foreach (string referencedProject in referencedProjects)
|
187
|
+
{
|
188
|
+
filesToExpand.Push(referencedProject);
|
189
|
+
}
|
190
|
+
}
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
194
|
+
return expandedProjects.ToImmutableArray();
|
195
|
+
}
|
196
|
+
|
197
|
+
private static IEnumerable<string> ExpandItemGroupFilesFromProject(string projectPath, params string[] itemTypes)
|
198
|
+
{
|
199
|
+
if (!File.Exists(projectPath))
|
200
|
+
{
|
201
|
+
return [];
|
202
|
+
}
|
203
|
+
|
204
|
+
using ProjectCollection projectCollection = new();
|
205
|
+
Project project = Project.FromFile(projectPath, new ProjectOptions
|
206
|
+
{
|
207
|
+
LoadSettings = ProjectLoadSettings.IgnoreMissingImports | ProjectLoadSettings.IgnoreEmptyImports | ProjectLoadSettings.IgnoreInvalidImports,
|
208
|
+
ProjectCollection = projectCollection,
|
209
|
+
});
|
210
|
+
|
211
|
+
HashSet<string> allowableItemTypes = new(itemTypes, StringComparer.OrdinalIgnoreCase);
|
212
|
+
List<ProjectItem> projectItems = project.Items.Where(i => allowableItemTypes.Contains(i.ItemType)).ToList();
|
213
|
+
string projectDir = Path.GetDirectoryName(projectPath)!;
|
214
|
+
HashSet<string> seenItems = new(StringComparer.OrdinalIgnoreCase);
|
215
|
+
List<string> foundItems = new();
|
216
|
+
foreach (ProjectItem projectItem in projectItems)
|
217
|
+
{
|
218
|
+
// referenced projects commonly use the Windows-style directory separator which can cause problems on Unix
|
219
|
+
// but Windows is able to handle a Unix-style path, so we normalize everything to that then normalize again
|
220
|
+
// with regards to relative paths, e.g., "some/path/" + "..\other\file" => "some/other/file"
|
221
|
+
string referencedProjectPath = Path.Join(projectDir, projectItem.EvaluatedInclude.NormalizePathToUnix());
|
222
|
+
string normalizedReferenceProjectPath = new FileInfo(referencedProjectPath).FullName;
|
223
|
+
if (seenItems.Add(normalizedReferenceProjectPath))
|
224
|
+
{
|
225
|
+
foundItems.Add(normalizedReferenceProjectPath);
|
226
|
+
}
|
227
|
+
}
|
228
|
+
|
229
|
+
return foundItems;
|
230
|
+
}
|
231
|
+
|
139
232
|
private async Task<ImmutableArray<ProjectDiscoveryResult>> RunForProjectPathsAsync(string repoRootPath, string workspacePath, IEnumerable<string> projectPaths)
|
140
233
|
{
|
141
234
|
var results = new Dictionary<string, ProjectDiscoveryResult>(StringComparer.OrdinalIgnoreCase);
|
@@ -480,11 +480,15 @@ internal static partial class MSBuildHelper
|
|
480
480
|
// We need to copy local package sources from the NuGet.Config file to the temp directory
|
481
481
|
foreach (var localSource in packageSources.Where(p => p.IsLocal))
|
482
482
|
{
|
483
|
-
|
484
|
-
|
485
|
-
if (Directory.Exists(localSource.Source))
|
483
|
+
// if the source is relative to the original location, copy it to the temp directory
|
484
|
+
if (PathHelper.IsSubdirectoryOf(nugetConfigDir!, localSource.Source))
|
486
485
|
{
|
487
|
-
|
486
|
+
string sourceRelativePath = Path.GetRelativePath(nugetConfigDir!, localSource.Source);
|
487
|
+
string destPath = Path.Join(tempDir.FullName, sourceRelativePath);
|
488
|
+
if (Directory.Exists(localSource.Source))
|
489
|
+
{
|
490
|
+
PathHelper.CopyDirectory(localSource.Source, destPath);
|
491
|
+
}
|
488
492
|
}
|
489
493
|
}
|
490
494
|
}
|
@@ -538,12 +542,12 @@ internal static partial class MSBuildHelper
|
|
538
542
|
<PropertyGroup>
|
539
543
|
<!-- For Windows-specific apps -->
|
540
544
|
<EnableWindowsTargeting>true</EnableWindowsTargeting>
|
545
|
+
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
|
541
546
|
</PropertyGroup>
|
542
547
|
</Project>
|
543
548
|
""");
|
544
549
|
|
545
550
|
await File.WriteAllTextAsync(Path.Combine(tempDir.FullName, "Directory.Build.targets"), "<Project />");
|
546
|
-
await File.WriteAllTextAsync(Path.Combine(tempDir.FullName, "Directory.Packages.props"), "<Project />");
|
547
551
|
|
548
552
|
return tempProjectPath;
|
549
553
|
}
|
@@ -111,4 +111,22 @@ internal static class PathHelper
|
|
111
111
|
CopyDirectory(subDir.FullName, newDestinationDir);
|
112
112
|
}
|
113
113
|
}
|
114
|
+
|
115
|
+
public static bool IsSubdirectoryOf(string parentDirectory, string childDirectory)
|
116
|
+
{
|
117
|
+
var parentDirInfo = new DirectoryInfo(parentDirectory);
|
118
|
+
var childDirInfo = new DirectoryInfo(childDirectory);
|
119
|
+
|
120
|
+
while (childDirInfo.Parent is not null)
|
121
|
+
{
|
122
|
+
if (childDirInfo.Parent.FullName == parentDirInfo.FullName)
|
123
|
+
{
|
124
|
+
return true;
|
125
|
+
}
|
126
|
+
|
127
|
+
childDirInfo = childDirInfo.Parent;
|
128
|
+
}
|
129
|
+
|
130
|
+
return false;
|
131
|
+
}
|
114
132
|
}
|
@@ -3,9 +3,11 @@ using System.Diagnostics.CodeAnalysis;
|
|
3
3
|
using System.Text.Json;
|
4
4
|
|
5
5
|
using NuGetUpdater.Core.Discover;
|
6
|
+
using NuGetUpdater.Core.Test.Update;
|
6
7
|
using NuGetUpdater.Core.Test.Utilities;
|
7
8
|
|
8
9
|
using Xunit;
|
10
|
+
using Xunit.Sdk;
|
9
11
|
|
10
12
|
namespace NuGetUpdater.Core.Test.Discover;
|
11
13
|
|
@@ -16,10 +18,13 @@ public class DiscoveryWorkerTestBase
|
|
16
18
|
protected static async Task TestDiscoveryAsync(
|
17
19
|
string workspacePath,
|
18
20
|
TestFile[] files,
|
19
|
-
ExpectedWorkspaceDiscoveryResult expectedResult
|
21
|
+
ExpectedWorkspaceDiscoveryResult expectedResult,
|
22
|
+
MockNuGetPackage[]? packages = null)
|
20
23
|
{
|
21
24
|
var actualResult = await RunDiscoveryAsync(files, async directoryPath =>
|
22
25
|
{
|
26
|
+
await UpdateWorkerTestBase.MockNuGetPackagesInDirectory(packages, directoryPath);
|
27
|
+
|
23
28
|
var worker = new DiscoveryWorker(new Logger(verbose: true));
|
24
29
|
await worker.RunAsync(directoryPath, workspacePath, DiscoveryWorker.DiscoveryResultFileName);
|
25
30
|
});
|
@@ -10,6 +10,7 @@ public partial class DiscoveryWorkerTests
|
|
10
10
|
public async Task DiscoversDependencies()
|
11
11
|
{
|
12
12
|
await TestDiscoveryAsync(
|
13
|
+
packages: [],
|
13
14
|
workspacePath: "",
|
14
15
|
files: [
|
15
16
|
(".config/dotnet-tools.json", """
|
@@ -45,13 +46,15 @@ public partial class DiscoveryWorkerTests
|
|
45
46
|
]
|
46
47
|
},
|
47
48
|
ExpectedProjectCount = 0,
|
48
|
-
}
|
49
|
+
}
|
50
|
+
);
|
49
51
|
}
|
50
52
|
|
51
53
|
[Fact]
|
52
54
|
public async Task ReportsFailure()
|
53
55
|
{
|
54
56
|
await TestDiscoveryAsync(
|
57
|
+
packages: [],
|
55
58
|
workspacePath: "",
|
56
59
|
files: [
|
57
60
|
(".config/dotnet-tools.json", """
|
@@ -85,7 +88,8 @@ public partial class DiscoveryWorkerTests
|
|
85
88
|
ExpectedDependencyCount = 0,
|
86
89
|
},
|
87
90
|
ExpectedProjectCount = 0,
|
88
|
-
}
|
91
|
+
}
|
92
|
+
);
|
89
93
|
}
|
90
94
|
}
|
91
95
|
}
|
data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.GlobalJson.cs
CHANGED
@@ -10,6 +10,7 @@ public partial class DiscoveryWorkerTests
|
|
10
10
|
public async Task DiscoversDependencies()
|
11
11
|
{
|
12
12
|
await TestDiscoveryAsync(
|
13
|
+
packages: [],
|
13
14
|
workspacePath: "",
|
14
15
|
files: [
|
15
16
|
("global.json", """
|
@@ -35,13 +36,15 @@ public partial class DiscoveryWorkerTests
|
|
35
36
|
]
|
36
37
|
},
|
37
38
|
ExpectedProjectCount = 0,
|
38
|
-
}
|
39
|
+
}
|
40
|
+
);
|
39
41
|
}
|
40
42
|
|
41
43
|
[Fact]
|
42
44
|
public async Task ReportsFailure()
|
43
45
|
{
|
44
46
|
await TestDiscoveryAsync(
|
47
|
+
packages: [],
|
45
48
|
workspacePath: "",
|
46
49
|
files: [
|
47
50
|
("global.json", """
|
@@ -65,7 +68,8 @@ public partial class DiscoveryWorkerTests
|
|
65
68
|
ExpectedDependencyCount = 0,
|
66
69
|
},
|
67
70
|
ExpectedProjectCount = 0,
|
68
|
-
}
|
71
|
+
}
|
72
|
+
);
|
69
73
|
}
|
70
74
|
}
|
71
75
|
}
|