dependabot-nuget 0.285.0 → 0.287.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/NuGetProjects/Directory.Build.props +5 -1
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.CommandLine/NuGet.CommandLine.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Configuration/NuGet.Configuration.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.LibraryModel/NuGet.LibraryModel.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +8 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/UpdateCommand.cs +7 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +11 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +24 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs +15 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +9 -38
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +10 -8
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +52 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/ProjectBuildFile.cs +15 -8
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/IAnalyzeWorker.cs +9 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/IDiscoveryWorker.cs +8 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/IUpdaterWorker.cs +9 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +78 -61
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +21 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +37 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +5 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +5 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +51 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +302 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +269 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +577 -43
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +168 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestAnalyzeWorker.cs +37 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestDiscoveryWorker.cs +35 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestUpdaterWorker.cs +39 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +104 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +51 -13
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DirsProj.cs +4 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +62 -18
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +14 -0
- data/helpers/lib/NuGetUpdater/global.json +1 -1
- data/lib/dependabot/nuget/file_updater.rb +8 -3
- data/lib/dependabot/nuget/native_helpers.rb +11 -12
- metadata +12 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/DependencySolverEnvironment.cs +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3bb2d903f08322511a7917fba47df7b66208dbbaca42e52d30a1954f9ef3eaa2
|
4
|
+
data.tar.gz: f19cfed3ad2939c93812727546b53ecec603c712641a6c1d0581469cce72d584
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3fdc15bd985678106cf45f57c6af6dd4be57858f54b50abea6f4521a8aed3ab66b7ca67cb54f9e73dabe536d8c012619bbf049662207211bc92cbb5e938c321
|
7
|
+
data.tar.gz: 3542f489f10b67fe78b3bd55703cc420a58279bf5fb131da4a99be0d99a20fcd7430b124c4b49100929b74f39178b3c7e108e7bb0170baef5f5a91a16dfbd63f
|
@@ -3,7 +3,11 @@
|
|
3
3
|
<PropertyGroup>
|
4
4
|
<DefineConstants>$(DefineConstants);IS_CORECLR</DefineConstants>
|
5
5
|
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
6
|
-
<NoWarn>$(NoWarn);
|
6
|
+
<NoWarn>$(NoWarn);CA1305</NoWarn><!-- behavior of StringBuilder could vary based on user's locale -->
|
7
|
+
<NoWarn>$(NoWarn);CA2022</NoWarn><!-- avoid inexact Stream.Read() -->
|
8
|
+
<NoWarn>$(NoWarn);NU1701</NoWarn><!-- package target framework may not be compatible -->
|
9
|
+
<NoWarn>$(NoWarn);NU1903</NoWarn><!-- package has a known high severity vulnerability -->
|
10
|
+
<NoWarn>$(NoWarn);SYSLIB0014</NoWarn><!-- obsolete -->
|
7
11
|
<NuGetSourceLocation>$(MSBuildThisFileDirectory)..\..\NuGet.Client</NuGetSourceLocation>
|
8
12
|
<SharedDirectory>$(NuGetSourceLocation)\build\Shared</SharedDirectory>
|
9
13
|
<Version>6.8.0</Version>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<PropertyGroup>
|
4
4
|
<TargetFramework>$(CommonTargetFramework)</TargetFramework>
|
5
5
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
6
|
-
<NoWarn>$(NoWarn);CS0414;CS1591;CS1574;CS1573;CS1572;RS0041</NoWarn>
|
6
|
+
<NoWarn>$(NoWarn);CA1305;CS0414;CS1591;CS1574;CS1573;CS1572;RS0041</NoWarn>
|
7
7
|
</PropertyGroup>
|
8
8
|
|
9
9
|
<ItemGroup>
|
@@ -1,6 +1,8 @@
|
|
1
1
|
using System.CommandLine;
|
2
2
|
|
3
3
|
using NuGetUpdater.Core;
|
4
|
+
using NuGetUpdater.Core.Analyze;
|
5
|
+
using NuGetUpdater.Core.Discover;
|
4
6
|
using NuGetUpdater.Core.Run;
|
5
7
|
|
6
8
|
namespace NuGetUpdater.Cli.Commands;
|
@@ -31,7 +33,12 @@ internal static class RunCommand
|
|
31
33
|
command.SetHandler(async (jobPath, repoContentsPath, apiUrl, jobId, outputPath, baseCommitSha) =>
|
32
34
|
{
|
33
35
|
var apiHandler = new HttpApiHandler(apiUrl.ToString(), jobId);
|
34
|
-
var
|
36
|
+
var logger = new ConsoleLogger();
|
37
|
+
var experimentsManager = await ExperimentsManager.FromJobFileAsync(jobPath.FullName, logger);
|
38
|
+
var discoverWorker = new DiscoveryWorker(logger);
|
39
|
+
var analyzeWorker = new AnalyzeWorker(logger);
|
40
|
+
var updateWorker = new UpdaterWorker(experimentsManager, logger);
|
41
|
+
var worker = new RunWorker(apiHandler, discoverWorker, analyzeWorker, updateWorker, logger);
|
35
42
|
await worker.RunAsync(jobPath, repoContentsPath, baseCommitSha, outputPath);
|
36
43
|
}, JobPathOption, RepoContentsPathOption, ApiUrlOption, JobIdOption, OutputPathOption, BaseCommitShaOption);
|
37
44
|
|
@@ -6,6 +6,7 @@ namespace NuGetUpdater.Cli.Commands;
|
|
6
6
|
|
7
7
|
internal static class UpdateCommand
|
8
8
|
{
|
9
|
+
internal static readonly Option<FileInfo> JobPathOption = new("--job-path") { IsRequired = true };
|
9
10
|
internal static readonly Option<DirectoryInfo> RepoRootOption = new("--repo-root", () => new DirectoryInfo(Environment.CurrentDirectory)) { IsRequired = false };
|
10
11
|
internal static readonly Option<FileInfo> SolutionOrProjectFileOption = new("--solution-or-project") { IsRequired = true };
|
11
12
|
internal static readonly Option<string> DependencyNameOption = new("--dependency") { IsRequired = true };
|
@@ -18,6 +19,7 @@ internal static class UpdateCommand
|
|
18
19
|
{
|
19
20
|
Command command = new("update", "Applies the changes from an analysis report to update a dependency.")
|
20
21
|
{
|
22
|
+
JobPathOption,
|
21
23
|
RepoRootOption,
|
22
24
|
SolutionOrProjectFileOption,
|
23
25
|
DependencyNameOption,
|
@@ -29,12 +31,14 @@ internal static class UpdateCommand
|
|
29
31
|
|
30
32
|
command.TreatUnmatchedTokensAsErrors = true;
|
31
33
|
|
32
|
-
command.SetHandler(async (repoRoot, solutionOrProjectFile, dependencyName, newVersion, previousVersion, isTransitive, resultOutputPath) =>
|
34
|
+
command.SetHandler(async (jobPath, repoRoot, solutionOrProjectFile, dependencyName, newVersion, previousVersion, isTransitive, resultOutputPath) =>
|
33
35
|
{
|
34
|
-
var
|
36
|
+
var logger = new ConsoleLogger();
|
37
|
+
var experimentsManager = await ExperimentsManager.FromJobFileAsync(jobPath.FullName, logger);
|
38
|
+
var worker = new UpdaterWorker(experimentsManager, logger);
|
35
39
|
await worker.RunAsync(repoRoot.FullName, solutionOrProjectFile.FullName, dependencyName, previousVersion, newVersion, isTransitive, resultOutputPath);
|
36
40
|
setExitCode(0);
|
37
|
-
}, RepoRootOption, SolutionOrProjectFileOption, DependencyNameOption, NewVersionOption, PreviousVersionOption, IsTransitiveOption, ResultOutputPathOption);
|
41
|
+
}, JobPathOption, RepoRootOption, SolutionOrProjectFileOption, DependencyNameOption, NewVersionOption, PreviousVersionOption, IsTransitiveOption, ResultOutputPathOption);
|
38
42
|
|
39
43
|
return command;
|
40
44
|
}
|
@@ -1,3 +1,4 @@
|
|
1
|
+
using System.IO;
|
1
2
|
using System.Text;
|
2
3
|
|
3
4
|
using NuGetUpdater.Core;
|
@@ -18,6 +19,8 @@ public partial class EntryPointTests
|
|
18
19
|
await Run(path =>
|
19
20
|
[
|
20
21
|
"update",
|
22
|
+
"--job-path",
|
23
|
+
Path.Combine(path, "job.json"),
|
21
24
|
"--repo-root",
|
22
25
|
path,
|
23
26
|
"--solution-or-project",
|
@@ -119,6 +122,8 @@ public partial class EntryPointTests
|
|
119
122
|
await Run(path =>
|
120
123
|
[
|
121
124
|
"update",
|
125
|
+
"--job-path",
|
126
|
+
Path.Combine(path, "job.json"),
|
122
127
|
"--repo-root",
|
123
128
|
path,
|
124
129
|
"--solution-or-project",
|
@@ -197,6 +202,8 @@ public partial class EntryPointTests
|
|
197
202
|
await Run(path =>
|
198
203
|
[
|
199
204
|
"update",
|
205
|
+
"--job-path",
|
206
|
+
Path.Combine(path, "job.json"),
|
200
207
|
"--repo-root",
|
201
208
|
path,
|
202
209
|
"--solution-or-project",
|
@@ -325,6 +332,7 @@ public partial class EntryPointTests
|
|
325
332
|
MockNuGetPackage.CreateSimplePackage("Some.Package", "13.0.1", "net8.0"),
|
326
333
|
];
|
327
334
|
await MockNuGetPackagesInDirectory(testPackages, tempDir.DirectoryPath);
|
335
|
+
await MockJobFileInDirectory(tempDir.DirectoryPath);
|
328
336
|
|
329
337
|
var globalJsonPath = Path.Join(tempDir.DirectoryPath, "global.json");
|
330
338
|
var srcGlobalJsonPath = Path.Join(tempDir.DirectoryPath, "src", "global.json");
|
@@ -353,6 +361,8 @@ public partial class EntryPointTests
|
|
353
361
|
IEnumerable<string> executableArgs = [
|
354
362
|
executableName,
|
355
363
|
"update",
|
364
|
+
"--job-path",
|
365
|
+
Path.Combine(tempDir.DirectoryPath, "job.json"),
|
356
366
|
"--repo-root",
|
357
367
|
tempDir.DirectoryPath,
|
358
368
|
"--solution-or-project",
|
@@ -402,6 +412,7 @@ public partial class EntryPointTests
|
|
402
412
|
|
403
413
|
try
|
404
414
|
{
|
415
|
+
await MockJobFileInDirectory(path);
|
405
416
|
await MockNuGetPackagesInDirectory(packages, path);
|
406
417
|
|
407
418
|
var args = getArgs(path);
|
@@ -12,7 +12,7 @@ namespace NuGetUpdater.Core.Analyze;
|
|
12
12
|
|
13
13
|
using MultiDependency = (string PropertyName, ImmutableArray<string> TargetFrameworks, ImmutableHashSet<string> DependencyNames);
|
14
14
|
|
15
|
-
public partial class AnalyzeWorker
|
15
|
+
public partial class AnalyzeWorker : IAnalyzeWorker
|
16
16
|
{
|
17
17
|
public const string AnalysisDirectoryName = "./.dependabot/analysis";
|
18
18
|
|
@@ -50,7 +50,7 @@ public partial class AnalyzeWorker
|
|
50
50
|
when (ex.StatusCode == HttpStatusCode.Unauthorized || ex.StatusCode == HttpStatusCode.Forbidden)
|
51
51
|
{
|
52
52
|
var localPath = PathHelper.JoinPath(repoRoot, discovery.Path);
|
53
|
-
var nugetContext = new NuGetContext(localPath);
|
53
|
+
using var nugetContext = new NuGetContext(localPath);
|
54
54
|
analysisResult = new AnalysisResult
|
55
55
|
{
|
56
56
|
ErrorType = ErrorType.AuthenticationFailure,
|
@@ -24,11 +24,16 @@ internal static class CompatibilityChecker
|
|
24
24
|
ILogger logger,
|
25
25
|
CancellationToken cancellationToken)
|
26
26
|
{
|
27
|
-
var
|
27
|
+
var packageInfo = await GetPackageInfoAsync(
|
28
28
|
package,
|
29
29
|
nugetContext,
|
30
30
|
cancellationToken);
|
31
|
+
if (packageInfo is null)
|
32
|
+
{
|
33
|
+
return false;
|
34
|
+
}
|
31
35
|
|
36
|
+
var (isDevDependency, packageFrameworks) = packageInfo.GetValueOrDefault();
|
32
37
|
return PerformCheck(package, projectFrameworks, isDevDependency, packageFrameworks, logger);
|
33
38
|
}
|
34
39
|
|
@@ -70,7 +75,7 @@ internal static class CompatibilityChecker
|
|
70
75
|
return true;
|
71
76
|
}
|
72
77
|
|
73
|
-
internal static async Task<
|
78
|
+
internal static async Task<PackageReaders?> GetPackageReadersAsync(
|
74
79
|
PackageIdentity package,
|
75
80
|
NuGetContext nugetContext,
|
76
81
|
CancellationToken cancellationToken)
|
@@ -79,7 +84,21 @@ internal static class CompatibilityChecker
|
|
79
84
|
var readers = File.Exists(tempPackagePath)
|
80
85
|
? ReadPackage(tempPackagePath)
|
81
86
|
: await DownloadPackageAsync(package, nugetContext, cancellationToken);
|
87
|
+
return readers;
|
88
|
+
}
|
89
|
+
|
90
|
+
internal static async Task<PackageInfo?> GetPackageInfoAsync(
|
91
|
+
PackageIdentity package,
|
92
|
+
NuGetContext nugetContext,
|
93
|
+
CancellationToken cancellationToken)
|
94
|
+
{
|
95
|
+
var readersOption = await GetPackageReadersAsync(package, nugetContext, cancellationToken);
|
96
|
+
if (readersOption is null)
|
97
|
+
{
|
98
|
+
return null;
|
99
|
+
}
|
82
100
|
|
101
|
+
var readers = readersOption.GetValueOrDefault();
|
83
102
|
var nuspecStream = await readers.CoreReader.GetNuspecAsync(cancellationToken);
|
84
103
|
var reader = new NuspecReader(nuspecStream);
|
85
104
|
|
@@ -127,7 +146,7 @@ internal static class CompatibilityChecker
|
|
127
146
|
return (archiveReader, archiveReader);
|
128
147
|
}
|
129
148
|
|
130
|
-
internal static async Task<PackageReaders
|
149
|
+
internal static async Task<PackageReaders?> DownloadPackageAsync(
|
131
150
|
PackageIdentity package,
|
132
151
|
NuGetContext context,
|
133
152
|
CancellationToken cancellationToken)
|
@@ -179,13 +198,13 @@ internal static class CompatibilityChecker
|
|
179
198
|
var isDownloaded = await downloader.CopyNupkgFileToAsync(tempPackagePath, cancellationToken);
|
180
199
|
if (!isDownloaded)
|
181
200
|
{
|
182
|
-
|
201
|
+
continue;
|
183
202
|
}
|
184
203
|
|
185
204
|
return (downloader.CoreReader, downloader.ContentReader);
|
186
205
|
}
|
187
206
|
|
188
|
-
|
207
|
+
return null;
|
189
208
|
}
|
190
209
|
|
191
210
|
internal static string GetTempPackagePath(PackageIdentity package, NuGetContext context)
|
@@ -142,11 +142,22 @@ internal record NuGetContext : IDisposable
|
|
142
142
|
}
|
143
143
|
|
144
144
|
var metadataResource = await sourceRepository.GetResourceAsync<PackageMetadataResource>(cancellationToken);
|
145
|
-
|
146
|
-
var url = metadata.ProjectUrl ?? metadata.LicenseUrl;
|
147
|
-
if (url is not null)
|
145
|
+
if (metadataResource is not null)
|
148
146
|
{
|
149
|
-
|
147
|
+
try
|
148
|
+
{
|
149
|
+
var metadata = await metadataResource.GetMetadataAsync(packageIdentity, SourceCacheContext, Logger, cancellationToken);
|
150
|
+
var url = metadata.ProjectUrl ?? metadata.LicenseUrl;
|
151
|
+
if (url is not null)
|
152
|
+
{
|
153
|
+
return url.ToString();
|
154
|
+
}
|
155
|
+
}
|
156
|
+
catch (ArgumentException)
|
157
|
+
{
|
158
|
+
// there was an issue deserializing the package metadata; this doesn't necessarily mean the package
|
159
|
+
// is unavailable, just that we can't return a URL
|
160
|
+
}
|
150
161
|
}
|
151
162
|
}
|
152
163
|
|
@@ -151,46 +151,17 @@ internal static class VersionFinder
|
|
151
151
|
ILogger logger,
|
152
152
|
CancellationToken cancellationToken)
|
153
153
|
{
|
154
|
-
|
155
|
-
|
156
|
-
var
|
157
|
-
|
158
|
-
var sources = packageSources.Count == 0
|
159
|
-
? nugetContext.PackageSources
|
160
|
-
: nugetContext.PackageSources
|
161
|
-
.Where(p => packageSources.Contains(p.Name))
|
162
|
-
.ToImmutableArray();
|
163
|
-
|
164
|
-
foreach (var source in sources)
|
154
|
+
// if it can be downloaded, it exists
|
155
|
+
var downloader = await CompatibilityChecker.DownloadPackageAsync(new PackageIdentity(packageId, version), nugetContext, cancellationToken);
|
156
|
+
var packageAndVersionExists = downloader is not null;
|
157
|
+
if (packageAndVersionExists)
|
165
158
|
{
|
166
|
-
|
167
|
-
var
|
168
|
-
|
169
|
-
|
170
|
-
logger.Log($"Failed to get MetadataResource for [{source.Source}]");
|
171
|
-
continue;
|
172
|
-
}
|
173
|
-
|
174
|
-
try
|
175
|
-
{
|
176
|
-
// a non-compliant v2 API returning 404 can cause this to throw
|
177
|
-
var existsInFeed = await feed.Exists(
|
178
|
-
new PackageIdentity(packageId, version),
|
179
|
-
includeUnlisted: false,
|
180
|
-
nugetContext.SourceCacheContext,
|
181
|
-
NullLogger.Instance,
|
182
|
-
cancellationToken);
|
183
|
-
if (existsInFeed)
|
184
|
-
{
|
185
|
-
return true;
|
186
|
-
}
|
187
|
-
}
|
188
|
-
catch (FatalProtocolException)
|
189
|
-
{
|
190
|
-
// if anything goes wrong here, the package source obviously doesn't contain the requested package
|
191
|
-
}
|
159
|
+
// release the handles
|
160
|
+
var readers = downloader.GetValueOrDefault();
|
161
|
+
(readers.CoreReader as IDisposable)?.Dispose();
|
162
|
+
(readers.ContentReader as IDisposable)?.Dispose();
|
192
163
|
}
|
193
164
|
|
194
|
-
return
|
165
|
+
return packageAndVersionExists;
|
195
166
|
}
|
196
167
|
}
|
@@ -12,7 +12,7 @@ using NuGetUpdater.Core.Utilities;
|
|
12
12
|
|
13
13
|
namespace NuGetUpdater.Core.Discover;
|
14
14
|
|
15
|
-
public partial class DiscoveryWorker
|
15
|
+
public partial class DiscoveryWorker : IDiscoveryWorker
|
16
16
|
{
|
17
17
|
public const string DiscoveryResultFileName = "./.dependabot/discovery.json";
|
18
18
|
|
@@ -58,7 +58,7 @@ public partial class DiscoveryWorker
|
|
58
58
|
return result;
|
59
59
|
}
|
60
60
|
|
61
|
-
|
61
|
+
public async Task<WorkspaceDiscoveryResult> RunAsync(string repoRootPath, string workspacePath)
|
62
62
|
{
|
63
63
|
MSBuildHelper.RegisterMSBuild(Environment.CurrentDirectory, repoRootPath);
|
64
64
|
|
@@ -275,22 +275,24 @@ public partial class DiscoveryWorker
|
|
275
275
|
foreach (var projectPath in projectPaths)
|
276
276
|
{
|
277
277
|
// If there is some MSBuild logic that needs to run to fully resolve the path skip the project
|
278
|
-
|
278
|
+
// Ensure file existence is checked case-insensitively
|
279
|
+
var actualProjectPath = PathHelper.ResolveCaseInsensitivePathInsideRepoRoot(projectPath, repoRootPath);
|
280
|
+
if (actualProjectPath == null)
|
279
281
|
{
|
280
282
|
continue;
|
281
283
|
}
|
282
284
|
|
283
|
-
if (_processedProjectPaths.Contains(
|
285
|
+
if (_processedProjectPaths.Contains(actualProjectPath))
|
284
286
|
{
|
285
287
|
continue;
|
286
288
|
}
|
287
|
-
_processedProjectPaths.Add(
|
289
|
+
_processedProjectPaths.Add(actualProjectPath);
|
288
290
|
|
289
|
-
var relativeProjectPath = Path.GetRelativePath(workspacePath,
|
291
|
+
var relativeProjectPath = Path.GetRelativePath(workspacePath, actualProjectPath);
|
290
292
|
var packagesConfigDependencies = PackagesConfigDiscovery.Discover(workspacePath, projectPath, _logger)
|
291
293
|
?.Dependencies;
|
292
294
|
|
293
|
-
var projectResults = await SdkProjectDiscovery.DiscoverAsync(repoRootPath, workspacePath,
|
295
|
+
var projectResults = await SdkProjectDiscovery.DiscoverAsync(repoRootPath, workspacePath, actualProjectPath, _logger);
|
294
296
|
|
295
297
|
// Determine if there were unrestored MSBuildSdks
|
296
298
|
var msbuildSdks = projectResults.SelectMany(p => p.Dependencies.Where(d => d.Type == DependencyType.MSBuildSdk)).ToImmutableArray();
|
@@ -299,7 +301,7 @@ public partial class DiscoveryWorker
|
|
299
301
|
// If new SDKs were restored, then we need to rerun SdkProjectDiscovery.
|
300
302
|
if (await TryRestoreMSBuildSdksAsync(repoRootPath, workspacePath, msbuildSdks, _logger))
|
301
303
|
{
|
302
|
-
projectResults = await SdkProjectDiscovery.DiscoverAsync(repoRootPath, workspacePath,
|
304
|
+
projectResults = await SdkProjectDiscovery.DiscoverAsync(repoRootPath, workspacePath, actualProjectPath, _logger);
|
303
305
|
}
|
304
306
|
}
|
305
307
|
|
@@ -0,0 +1,52 @@
|
|
1
|
+
using System.Text.Json;
|
2
|
+
|
3
|
+
using NuGetUpdater.Core.Run;
|
4
|
+
|
5
|
+
namespace NuGetUpdater.Core;
|
6
|
+
|
7
|
+
public record ExperimentsManager
|
8
|
+
{
|
9
|
+
public bool UseLegacyDependencySolver { get; init; } = false;
|
10
|
+
|
11
|
+
public static ExperimentsManager GetExperimentsManager(Dictionary<string, object>? experiments)
|
12
|
+
{
|
13
|
+
return new ExperimentsManager()
|
14
|
+
{
|
15
|
+
UseLegacyDependencySolver = IsEnabled(experiments, "nuget_legacy_dependency_solver"),
|
16
|
+
};
|
17
|
+
}
|
18
|
+
|
19
|
+
public static async Task<ExperimentsManager> FromJobFileAsync(string jobFilePath, ILogger logger)
|
20
|
+
{
|
21
|
+
var jobFileContent = await File.ReadAllTextAsync(jobFilePath);
|
22
|
+
try
|
23
|
+
{
|
24
|
+
var jobWrapper = RunWorker.Deserialize(jobFileContent);
|
25
|
+
return GetExperimentsManager(jobWrapper.Job.Experiments);
|
26
|
+
}
|
27
|
+
catch (JsonException ex)
|
28
|
+
{
|
29
|
+
// the following message has been specifically designed to match the format of `Dependabot.logger.info(...)` from Ruby
|
30
|
+
logger.Log($"{DateTime.UtcNow:yyyy/MM/dd HH:mm:ss} INFO Error deserializing job file: {ex.ToString()}: {jobFileContent}");
|
31
|
+
return new ExperimentsManager();
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
private static bool IsEnabled(Dictionary<string, object>? experiments, string experimentName)
|
36
|
+
{
|
37
|
+
if (experiments is null)
|
38
|
+
{
|
39
|
+
return false;
|
40
|
+
}
|
41
|
+
|
42
|
+
if (experiments.TryGetValue(experimentName, out var value))
|
43
|
+
{
|
44
|
+
if ((value?.ToString() ?? "").Equals("true", StringComparison.OrdinalIgnoreCase))
|
45
|
+
{
|
46
|
+
return true;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
return false;
|
51
|
+
}
|
52
|
+
}
|
@@ -43,7 +43,7 @@ internal sealed class ProjectBuildFile : XmlBuildFile
|
|
43
43
|
{
|
44
44
|
var sdkDependencies = GetSdkDependencies();
|
45
45
|
var packageDependencies = PackageItemNodes
|
46
|
-
.
|
46
|
+
.SelectMany(e => GetPackageDependencies(e) ?? Enumerable.Empty<Dependency>())
|
47
47
|
.OfType<Dependency>();
|
48
48
|
return sdkDependencies.Concat(packageDependencies);
|
49
49
|
}
|
@@ -89,8 +89,9 @@ internal sealed class ProjectBuildFile : XmlBuildFile
|
|
89
89
|
: new Dependency(name, version, DependencyType.MSBuildSdk);
|
90
90
|
}
|
91
91
|
|
92
|
-
private static Dependency
|
92
|
+
private static IEnumerable<Dependency>? GetPackageDependencies(IXmlElementSyntax element)
|
93
93
|
{
|
94
|
+
List<Dependency> dependencies = [];
|
94
95
|
var isUpdate = false;
|
95
96
|
|
96
97
|
var name = element.GetAttributeOrSubElementValue("Include", StringComparison.OrdinalIgnoreCase)?.Trim();
|
@@ -113,12 +114,18 @@ internal sealed class ProjectBuildFile : XmlBuildFile
|
|
113
114
|
isVersionOverride = version is not null;
|
114
115
|
}
|
115
116
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
117
|
+
dependencies.AddRange(
|
118
|
+
name.Split(';', StringSplitOptions.RemoveEmptyEntries)
|
119
|
+
.Select(dep => new Dependency(
|
120
|
+
Name: dep.Trim(),
|
121
|
+
Version: string.IsNullOrEmpty(version) ? null : version,
|
122
|
+
Type: GetDependencyType(element.Name),
|
123
|
+
IsUpdate: isUpdate,
|
124
|
+
IsOverride: isVersionOverride))
|
125
|
+
);
|
126
|
+
|
127
|
+
|
128
|
+
return dependencies;
|
122
129
|
}
|
123
130
|
|
124
131
|
private static DependencyType GetDependencyType(string name)
|
@@ -0,0 +1,9 @@
|
|
1
|
+
|
2
|
+
using NuGetUpdater.Core.Updater;
|
3
|
+
|
4
|
+
namespace NuGetUpdater.Core;
|
5
|
+
|
6
|
+
public interface IUpdaterWorker
|
7
|
+
{
|
8
|
+
Task<UpdateOperationResult> RunAsync(string repoRootPath, string workspacePath, string dependencyName, string previousDependencyVersion, string newDependencyVersion, bool isTransitive);
|
9
|
+
}
|