dependabot-nuget 0.284.0 → 0.286.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +52 -0
- 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 +104 -33
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +6 -5
- 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 +0 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +2 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +975 -57
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +168 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +53 -6
- 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 +22 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +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: 01a6eb36ac3591d016d45ddfc4fc9dbb4068bda72e8560b6453461f5019362f7
|
4
|
+
data.tar.gz: 4db4968d74f3b9bfac17cbf32a8017635b07cf5338ad0f9db53dd9a16b188874
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fce16345ed91813776f2b83b802212e466e15cf5784fcd239c8907ec3af683f0727b7a8e00df7fcb6b97035802c68023ddeb2481a28acce479db6fdfdb6674b
|
7
|
+
data.tar.gz: 59d4ac62296d157fbeb3870bcfc18313df3deac4e3f86c0c040ea0c2d2d3c73c1c8d0e84f05d32d83a9129583e6b6e38a1f5314e2cbd0df833c1657c5eb2d7f9
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
+
}
|
@@ -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
|
+
}
|
@@ -13,6 +13,9 @@ public class RunWorker
|
|
13
13
|
{
|
14
14
|
private readonly IApiHandler _apiHandler;
|
15
15
|
private readonly ILogger _logger;
|
16
|
+
private readonly IDiscoveryWorker _discoveryWorker;
|
17
|
+
private readonly IAnalyzeWorker _analyzeWorker;
|
18
|
+
private readonly IUpdaterWorker _updaterWorker;
|
16
19
|
|
17
20
|
internal static readonly JsonSerializerOptions SerializerOptions = new()
|
18
21
|
{
|
@@ -21,10 +24,13 @@ public class RunWorker
|
|
21
24
|
Converters = { new JsonStringEnumConverter() },
|
22
25
|
};
|
23
26
|
|
24
|
-
public RunWorker(IApiHandler apiHandler, ILogger logger)
|
27
|
+
public RunWorker(IApiHandler apiHandler, IDiscoveryWorker discoverWorker, IAnalyzeWorker analyzeWorker, IUpdaterWorker updateWorker, ILogger logger)
|
25
28
|
{
|
26
29
|
_apiHandler = apiHandler;
|
27
30
|
_logger = logger;
|
31
|
+
_discoveryWorker = discoverWorker;
|
32
|
+
_analyzeWorker = analyzeWorker;
|
33
|
+
_updaterWorker = updateWorker;
|
28
34
|
}
|
29
35
|
|
30
36
|
public async Task RunAsync(FileInfo jobFilePath, DirectoryInfo repoContentsPath, string baseCommitSha, FileInfo outputFilePath)
|
@@ -55,15 +61,17 @@ public class RunWorker
|
|
55
61
|
{
|
56
62
|
MSBuildHelper.RegisterMSBuild(repoContentsPath.FullName, repoContentsPath.FullName);
|
57
63
|
|
64
|
+
var experimentsManager = ExperimentsManager.GetExperimentsManager(job.Experiments);
|
58
65
|
var allDependencyFiles = new Dictionary<string, DependencyFile>();
|
59
66
|
foreach (var directory in job.GetAllDirectories())
|
60
67
|
{
|
61
68
|
var localPath = PathHelper.JoinPath(repoContentsPath.FullName, directory);
|
62
69
|
lastUsedPackageSourceUrls = NuGetContext.GetPackageSourceUrls(localPath);
|
63
|
-
var result = await RunForDirectory(job, repoContentsPath, directory, baseCommitSha);
|
70
|
+
var result = await RunForDirectory(job, repoContentsPath, directory, baseCommitSha, experimentsManager);
|
64
71
|
foreach (var dependencyFile in result.Base64DependencyFiles)
|
65
72
|
{
|
66
|
-
|
73
|
+
var uniqueKey = Path.GetFullPath(Path.Join(dependencyFile.Directory, dependencyFile.Name)).NormalizePathToUnix().EnsurePrefix("/");
|
74
|
+
allDependencyFiles[uniqueKey] = dependencyFile;
|
67
75
|
}
|
68
76
|
}
|
69
77
|
|
@@ -101,16 +109,15 @@ public class RunWorker
|
|
101
109
|
return runResult;
|
102
110
|
}
|
103
111
|
|
104
|
-
private async Task<RunResult> RunForDirectory(Job job, DirectoryInfo repoContentsPath, string repoDirectory, string baseCommitSha)
|
112
|
+
private async Task<RunResult> RunForDirectory(Job job, DirectoryInfo repoContentsPath, string repoDirectory, string baseCommitSha, ExperimentsManager experimentsManager)
|
105
113
|
{
|
106
|
-
var
|
107
|
-
var discoveryResult = await discoveryWorker.RunAsync(repoContentsPath.FullName, repoDirectory);
|
114
|
+
var discoveryResult = await _discoveryWorker.RunAsync(repoContentsPath.FullName, repoDirectory);
|
108
115
|
|
109
116
|
_logger.Log("Discovery JSON content:");
|
110
117
|
_logger.Log(JsonSerializer.Serialize(discoveryResult, DiscoveryWorker.SerializerOptions));
|
111
118
|
|
112
119
|
// report dependencies
|
113
|
-
var discoveredUpdatedDependencies = GetUpdatedDependencyListFromDiscovery(discoveryResult);
|
120
|
+
var discoveredUpdatedDependencies = GetUpdatedDependencyListFromDiscovery(discoveryResult, repoContentsPath.FullName);
|
114
121
|
await _apiHandler.UpdateDependencyList(discoveredUpdatedDependencies);
|
115
122
|
|
116
123
|
// TODO: pull out relevant dependencies, then check each for updates and track the changes
|
@@ -127,13 +134,31 @@ public class RunWorker
|
|
127
134
|
});
|
128
135
|
|
129
136
|
// track original contents for later handling
|
137
|
+
async Task TrackOriginalContentsAsync(string directory, string fileName, string? replacementFileName = null)
|
138
|
+
{
|
139
|
+
var repoFullPath = Path.Join(directory, fileName);
|
140
|
+
if (replacementFileName is not null)
|
141
|
+
{
|
142
|
+
repoFullPath = Path.Join(Path.GetDirectoryName(repoFullPath)!, replacementFileName);
|
143
|
+
}
|
144
|
+
|
145
|
+
repoFullPath = repoFullPath.FullyNormalizedRootedPath();
|
146
|
+
var localFullPath = Path.Join(repoContentsPath.FullName, repoFullPath);
|
147
|
+
|
148
|
+
if (!File.Exists(localFullPath))
|
149
|
+
{
|
150
|
+
return;
|
151
|
+
}
|
152
|
+
|
153
|
+
var content = await File.ReadAllTextAsync(localFullPath);
|
154
|
+
originalDependencyFileContents[repoFullPath] = content;
|
155
|
+
}
|
156
|
+
|
130
157
|
foreach (var project in discoveryResult.Projects)
|
131
158
|
{
|
159
|
+
await TrackOriginalContentsAsync(discoveryResult.Path, project.FilePath);
|
160
|
+
await TrackOriginalContentsAsync(discoveryResult.Path, project.FilePath, replacementFileName: "packages.config");
|
132
161
|
// TODO: include global.json, etc.
|
133
|
-
var path = Path.Join(discoveryResult.Path, project.FilePath).NormalizePathToUnix().EnsurePrefix("/");
|
134
|
-
var localPath = Path.Join(repoContentsPath.FullName, discoveryResult.Path, project.FilePath);
|
135
|
-
var content = await File.ReadAllTextAsync(localPath);
|
136
|
-
originalDependencyFileContents[path] = content;
|
137
162
|
}
|
138
163
|
|
139
164
|
// do update
|
@@ -155,7 +180,6 @@ public class RunWorker
|
|
155
180
|
continue;
|
156
181
|
}
|
157
182
|
|
158
|
-
var analyzeWorker = new AnalyzeWorker(_logger);
|
159
183
|
var dependencyInfo = new DependencyInfo()
|
160
184
|
{
|
161
185
|
Name = dependency.Name,
|
@@ -164,13 +188,21 @@ public class RunWorker
|
|
164
188
|
IgnoredVersions = [],
|
165
189
|
Vulnerabilities = [],
|
166
190
|
};
|
167
|
-
var analysisResult = await
|
191
|
+
var analysisResult = await _analyzeWorker.RunAsync(repoContentsPath.FullName, discoveryResult, dependencyInfo);
|
168
192
|
// TODO: log analysisResult
|
169
193
|
if (analysisResult.CanUpdate)
|
170
194
|
{
|
195
|
+
var dependencyLocation = Path.Join(discoveryResult.Path, project.FilePath);
|
196
|
+
if (dependency.Type == DependencyType.PackagesConfig)
|
197
|
+
{
|
198
|
+
dependencyLocation = Path.Join(Path.GetDirectoryName(dependencyLocation)!, "packages.config");
|
199
|
+
}
|
200
|
+
|
201
|
+
dependencyLocation = dependencyLocation.FullyNormalizedRootedPath();
|
202
|
+
|
171
203
|
// TODO: this is inefficient, but not likely causing a bottleneck
|
172
204
|
var previousDependency = discoveredUpdatedDependencies.Dependencies
|
173
|
-
.Single(d => d.Name == dependency.Name && d.Requirements.Single().File ==
|
205
|
+
.Single(d => d.Name == dependency.Name && d.Requirements.Single().File == dependencyLocation);
|
174
206
|
var updatedDependency = new ReportedDependency()
|
175
207
|
{
|
176
208
|
Name = dependency.Name,
|
@@ -179,12 +211,12 @@ public class RunWorker
|
|
179
211
|
[
|
180
212
|
new ReportedRequirement()
|
181
213
|
{
|
182
|
-
File =
|
214
|
+
File = dependencyLocation,
|
183
215
|
Requirement = analysisResult.UpdatedVersion,
|
184
216
|
Groups = previousDependency.Requirements.Single().Groups,
|
185
217
|
Source = new RequirementSource()
|
186
218
|
{
|
187
|
-
SourceUrl = analysisResult.UpdatedDependencies.
|
219
|
+
SourceUrl = analysisResult.UpdatedDependencies.FirstOrDefault(d => d.Name == dependency.Name)?.InfoUrl,
|
188
220
|
},
|
189
221
|
}
|
190
222
|
],
|
@@ -192,12 +224,16 @@ public class RunWorker
|
|
192
224
|
PreviousRequirements = previousDependency.Requirements,
|
193
225
|
};
|
194
226
|
|
195
|
-
var
|
196
|
-
var
|
197
|
-
var updateResult = await updateWorker.RunAsync(repoContentsPath.FullName, dependencyFilePath, dependency.Name, dependency.Version!, analysisResult.UpdatedVersion, isTransitive: false);
|
227
|
+
var dependencyFilePath = Path.Join(discoveryResult.Path, project.FilePath).FullyNormalizedRootedPath();
|
228
|
+
var updateResult = await _updaterWorker.RunAsync(repoContentsPath.FullName, dependencyFilePath, dependency.Name, dependency.Version!, analysisResult.UpdatedVersion, isTransitive: false);
|
198
229
|
// TODO: need to report if anything was actually updated
|
199
230
|
if (updateResult.ErrorType is null || updateResult.ErrorType == ErrorType.None)
|
200
231
|
{
|
232
|
+
if (dependencyLocation != dependencyFilePath)
|
233
|
+
{
|
234
|
+
updatedDependency.Requirements.All(r => r.File == dependencyFilePath);
|
235
|
+
}
|
236
|
+
|
201
237
|
actualUpdatedDependencies.Add(updatedDependency);
|
202
238
|
}
|
203
239
|
}
|
@@ -206,23 +242,41 @@ public class RunWorker
|
|
206
242
|
|
207
243
|
// create PR - we need to manually check file contents; we can't easily use `git status` in tests
|
208
244
|
var updatedDependencyFiles = new List<DependencyFile>();
|
209
|
-
|
245
|
+
async Task AddUpdatedFileIfDifferentAsync(string directory, string fileName, string? replacementFileName = null)
|
210
246
|
{
|
211
|
-
var
|
212
|
-
|
213
|
-
|
214
|
-
|
247
|
+
var repoFullPath = Path.Join(directory, fileName);
|
248
|
+
if (replacementFileName is not null)
|
249
|
+
{
|
250
|
+
repoFullPath = Path.Join(Path.GetDirectoryName(repoFullPath)!, replacementFileName);
|
251
|
+
}
|
252
|
+
|
253
|
+
repoFullPath = repoFullPath.FullyNormalizedRootedPath();
|
254
|
+
var localFullPath = Path.Join(repoContentsPath.FullName, repoFullPath);
|
255
|
+
|
256
|
+
if (!File.Exists(localFullPath))
|
257
|
+
{
|
258
|
+
return;
|
259
|
+
}
|
260
|
+
|
261
|
+
var originalContent = originalDependencyFileContents[repoFullPath];
|
262
|
+
var updatedContent = await File.ReadAllTextAsync(localFullPath);
|
215
263
|
if (updatedContent != originalContent)
|
216
264
|
{
|
217
265
|
updatedDependencyFiles.Add(new DependencyFile()
|
218
266
|
{
|
219
|
-
Name =
|
267
|
+
Name = Path.GetFileName(repoFullPath),
|
268
|
+
Directory = Path.GetDirectoryName(repoFullPath)!.NormalizePathToUnix(),
|
220
269
|
Content = updatedContent,
|
221
|
-
Directory = discoveryResult.Path,
|
222
270
|
});
|
223
271
|
}
|
224
272
|
}
|
225
273
|
|
274
|
+
foreach (var project in discoveryResult.Projects)
|
275
|
+
{
|
276
|
+
await AddUpdatedFileIfDifferentAsync(discoveryResult.Path, project.FilePath);
|
277
|
+
await AddUpdatedFileIfDifferentAsync(discoveryResult.Path, project.FilePath, replacementFileName: "packages.config");
|
278
|
+
}
|
279
|
+
|
226
280
|
if (updatedDependencyFiles.Count > 0)
|
227
281
|
{
|
228
282
|
var createPullRequest = new CreatePullRequest()
|
@@ -249,23 +303,27 @@ public class RunWorker
|
|
249
303
|
|
250
304
|
var result = new RunResult()
|
251
305
|
{
|
252
|
-
Base64DependencyFiles = originalDependencyFileContents.Select(kvp =>
|
306
|
+
Base64DependencyFiles = originalDependencyFileContents.Select(kvp =>
|
253
307
|
{
|
254
|
-
|
255
|
-
|
256
|
-
|
308
|
+
var fullPath = kvp.Key.FullyNormalizedRootedPath();
|
309
|
+
return new DependencyFile()
|
310
|
+
{
|
311
|
+
Name = Path.GetFileName(fullPath),
|
312
|
+
Content = Convert.ToBase64String(Encoding.UTF8.GetBytes(kvp.Value)),
|
313
|
+
Directory = Path.GetDirectoryName(fullPath)!.NormalizePathToUnix(),
|
314
|
+
};
|
257
315
|
}).ToArray(),
|
258
316
|
BaseCommitSha = baseCommitSha,
|
259
317
|
};
|
260
318
|
return result;
|
261
319
|
}
|
262
320
|
|
263
|
-
internal static UpdatedDependencyList GetUpdatedDependencyListFromDiscovery(WorkspaceDiscoveryResult discoveryResult)
|
321
|
+
internal static UpdatedDependencyList GetUpdatedDependencyListFromDiscovery(WorkspaceDiscoveryResult discoveryResult, string pathToContents)
|
264
322
|
{
|
265
323
|
string GetFullRepoPath(string path)
|
266
324
|
{
|
267
325
|
// ensures `path\to\file` is `/path/to/file`
|
268
|
-
return Path.Join(discoveryResult.Path, path).
|
326
|
+
return Path.Join(discoveryResult.Path, path).FullyNormalizedRootedPath();
|
269
327
|
}
|
270
328
|
|
271
329
|
var auxiliaryFiles = new List<string>();
|
@@ -282,6 +340,17 @@ public class RunWorker
|
|
282
340
|
auxiliaryFiles.Add(GetFullRepoPath(discoveryResult.DirectoryPackagesProps.FilePath));
|
283
341
|
}
|
284
342
|
|
343
|
+
foreach (var project in discoveryResult.Projects)
|
344
|
+
{
|
345
|
+
var projectDirectory = Path.GetDirectoryName(project.FilePath);
|
346
|
+
var pathToPackagesConfig = Path.Join(pathToContents, discoveryResult.Path, projectDirectory, "packages.config");
|
347
|
+
|
348
|
+
if (File.Exists(pathToPackagesConfig))
|
349
|
+
{
|
350
|
+
auxiliaryFiles.Add(GetFullRepoPath(Path.Join(projectDirectory, "packages.config")));
|
351
|
+
}
|
352
|
+
}
|
353
|
+
|
285
354
|
var updatedDependencyList = new UpdatedDependencyList()
|
286
355
|
{
|
287
356
|
Dependencies = discoveryResult.Projects.SelectMany(p =>
|
@@ -292,7 +361,9 @@ public class RunWorker
|
|
292
361
|
Name = d.Name,
|
293
362
|
Requirements = d.IsTransitive ? [] : [new ReportedRequirement()
|
294
363
|
{
|
295
|
-
File =
|
364
|
+
File = d.Type == DependencyType.PackagesConfig
|
365
|
+
? Path.Join(Path.GetDirectoryName(GetFullRepoPath(p.FilePath))!, "packages.config").FullyNormalizedRootedPath()
|
366
|
+
: GetFullRepoPath(p.FilePath),
|
296
367
|
Requirement = d.Version!,
|
297
368
|
Groups = ["dependencies"],
|
298
369
|
}],
|
@@ -26,6 +26,7 @@ internal static class PackageReferenceUpdater
|
|
26
26
|
string previousDependencyVersion,
|
27
27
|
string newDependencyVersion,
|
28
28
|
bool isTransitive,
|
29
|
+
ExperimentsManager experimentsManager,
|
29
30
|
ILogger logger)
|
30
31
|
{
|
31
32
|
// PackageReference project; modify the XML directly
|
@@ -42,11 +43,7 @@ internal static class PackageReferenceUpdater
|
|
42
43
|
}
|
43
44
|
|
44
45
|
var peerDependencies = await GetUpdatedPeerDependenciesAsync(repoRootPath, projectPath, tfms, dependencyName, newDependencyVersion, logger);
|
45
|
-
if (
|
46
|
-
{
|
47
|
-
await UpdateDependencyWithConflictResolution(repoRootPath, buildFiles, tfms, projectPath, dependencyName, previousDependencyVersion, newDependencyVersion, isTransitive, peerDependencies, logger);
|
48
|
-
}
|
49
|
-
else
|
46
|
+
if (experimentsManager.UseLegacyDependencySolver)
|
50
47
|
{
|
51
48
|
if (isTransitive)
|
52
49
|
{
|
@@ -62,6 +59,10 @@ internal static class PackageReferenceUpdater
|
|
62
59
|
await UpdateTopLevelDepdendency(repoRootPath, buildFiles, tfms, dependencyName, previousDependencyVersion, newDependencyVersion, peerDependencies, logger);
|
63
60
|
}
|
64
61
|
}
|
62
|
+
else
|
63
|
+
{
|
64
|
+
await UpdateDependencyWithConflictResolution(repoRootPath, buildFiles, tfms, projectPath, dependencyName, previousDependencyVersion, newDependencyVersion, isTransitive, peerDependencies, logger);
|
65
|
+
}
|
65
66
|
|
66
67
|
if (!await AreDependenciesCoherentAsync(repoRootPath, projectPath, dependencyName, logger, buildFiles, tfms))
|
67
68
|
{
|