dependabot-nuget 0.319.1 → 0.320.1
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/NuGetUpdater.Cli/Commands/CloneCommand.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +5 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/CloneWorker.cs +4 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/IApiHandler.cs +3 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ModifiedFilesTracker.cs +12 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +42 -19
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/CreateSecurityUpdatePullRequestHandler.cs +13 -12
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/GroupUpdateAllVersionsHandler.cs +17 -15
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/IUpdateHandler.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/RefreshGroupUpdatePullRequestHandler.cs +7 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/RefreshSecurityUpdatePullRequestHandler.cs +8 -7
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/RefreshVersionUpdatePullRequestHandler.cs +10 -9
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Clone/CloneWorkerTests.cs +3 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/HttpApiHandlerTests.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MiscellaneousTests.cs +10 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdateHandlers/RefreshSecurityUpdatePullRequestHandlerTests.cs +135 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +7 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1831ce64cfdb9602329ea6a8ae506041eafc346b8ad8bef67afcd0f049a2ca93
|
4
|
+
data.tar.gz: be1476e3b56bfa67e803fb9d70eb4ec82113af256995d0e44d7fd5dd0335331b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6767882035faa57a63a97a0b25b9e3db46061bc1c23b9befd230985435e0560d3f913c1c86ba5ebe4f9c4c81b4adcc2d90548b7a6047dede4644c363dfbc44eb
|
7
|
+
data.tar.gz: 5233059c5c248a2f54b39ca1f8819f96ddc7b4d81701135a98403f7965000aeffbd8407680d582bf7449bb543df38568f21cb45d1a895f2d220177cdea1b5b0b
|
@@ -30,7 +30,7 @@ internal static class CloneCommand
|
|
30
30
|
var apiHandler = new HttpApiHandler(apiUrl.ToString(), jobId);
|
31
31
|
var logger = new OpenTelemetryLogger();
|
32
32
|
var gitCommandHandler = new ShellGitCommandHandler(logger);
|
33
|
-
var worker = new CloneWorker(jobId, apiHandler, gitCommandHandler);
|
33
|
+
var worker = new CloneWorker(jobId, apiHandler, gitCommandHandler, logger);
|
34
34
|
var exitCode = await worker.RunAsync(jobPath, repoContentsPath);
|
35
35
|
setExitCode(exitCode);
|
36
36
|
}, JobPathOption, RepoContentsPathOption, ApiUrlOption, JobIdOption);
|
@@ -11,6 +11,7 @@ internal static class RunCommand
|
|
11
11
|
{
|
12
12
|
internal static readonly Option<FileInfo> JobPathOption = new("--job-path") { IsRequired = true };
|
13
13
|
internal static readonly Option<DirectoryInfo> RepoContentsPathOption = new("--repo-contents-path") { IsRequired = true };
|
14
|
+
internal static readonly Option<DirectoryInfo?> CaseInsensitiveRepoContentsPathOption = new("--case-insensitive-repo-contents-path") { IsRequired = false };
|
14
15
|
internal static readonly Option<Uri> ApiUrlOption = new("--api-url") { IsRequired = true };
|
15
16
|
internal static readonly Option<string> JobIdOption = new("--job-id") { IsRequired = true };
|
16
17
|
internal static readonly Option<FileInfo> OutputPathOption = new("--output-path") { IsRequired = true };
|
@@ -22,6 +23,7 @@ internal static class RunCommand
|
|
22
23
|
{
|
23
24
|
JobPathOption,
|
24
25
|
RepoContentsPathOption,
|
26
|
+
CaseInsensitiveRepoContentsPathOption,
|
25
27
|
ApiUrlOption,
|
26
28
|
JobIdOption,
|
27
29
|
OutputPathOption,
|
@@ -30,7 +32,7 @@ internal static class RunCommand
|
|
30
32
|
|
31
33
|
command.TreatUnmatchedTokensAsErrors = true;
|
32
34
|
|
33
|
-
command.SetHandler(async (jobPath, repoContentsPath, apiUrl, jobId, outputPath, baseCommitSha) =>
|
35
|
+
command.SetHandler(async (jobPath, repoContentsPath, caseInsensitiveRepoContentsPath, apiUrl, jobId, outputPath, baseCommitSha) =>
|
34
36
|
{
|
35
37
|
var apiHandler = new HttpApiHandler(apiUrl.ToString(), jobId);
|
36
38
|
var (experimentsManager, _errorResult) = await ExperimentsManager.FromJobFileAsync(jobId, jobPath.FullName);
|
@@ -39,8 +41,8 @@ internal static class RunCommand
|
|
39
41
|
var analyzeWorker = new AnalyzeWorker(jobId, experimentsManager, logger);
|
40
42
|
var updateWorker = new UpdaterWorker(jobId, experimentsManager, logger);
|
41
43
|
var worker = new RunWorker(jobId, apiHandler, discoverWorker, analyzeWorker, updateWorker, logger);
|
42
|
-
await worker.RunAsync(jobPath, repoContentsPath, baseCommitSha, outputPath);
|
43
|
-
}, JobPathOption, RepoContentsPathOption, ApiUrlOption, JobIdOption, OutputPathOption, BaseCommitShaOption);
|
44
|
+
await worker.RunAsync(jobPath, repoContentsPath, caseInsensitiveRepoContentsPath, baseCommitSha, outputPath);
|
45
|
+
}, JobPathOption, RepoContentsPathOption, CaseInsensitiveRepoContentsPathOption, ApiUrlOption, JobIdOption, OutputPathOption, BaseCommitShaOption);
|
44
46
|
|
45
47
|
return command;
|
46
48
|
}
|
@@ -12,12 +12,14 @@ public class CloneWorker
|
|
12
12
|
private readonly string _jobId;
|
13
13
|
private readonly IApiHandler _apiHandler;
|
14
14
|
private readonly IGitCommandHandler _gitCommandHandler;
|
15
|
+
private readonly ILogger _logger;
|
15
16
|
|
16
|
-
public CloneWorker(string jobId, IApiHandler apiHandler, IGitCommandHandler gitCommandHandler)
|
17
|
+
public CloneWorker(string jobId, IApiHandler apiHandler, IGitCommandHandler gitCommandHandler, ILogger logger)
|
17
18
|
{
|
18
19
|
_jobId = jobId;
|
19
20
|
_apiHandler = apiHandler;
|
20
21
|
_gitCommandHandler = gitCommandHandler;
|
22
|
+
_logger = logger;
|
21
23
|
}
|
22
24
|
|
23
25
|
// entrypoint for cli
|
@@ -89,7 +91,7 @@ public class CloneWorker
|
|
89
91
|
|
90
92
|
private async Task ReportError(JobErrorBase error)
|
91
93
|
{
|
92
|
-
await _apiHandler.RecordUpdateJobError(error);
|
94
|
+
await _apiHandler.RecordUpdateJobError(error, _logger);
|
93
95
|
await _apiHandler.MarkAsProcessed(new("unknown"));
|
94
96
|
}
|
95
97
|
|
@@ -9,8 +9,10 @@ public interface IApiHandler
|
|
9
9
|
|
10
10
|
public static class IApiHandlerExtensions
|
11
11
|
{
|
12
|
-
public static async Task RecordUpdateJobError(this IApiHandler handler, JobErrorBase error)
|
12
|
+
public static async Task RecordUpdateJobError(this IApiHandler handler, JobErrorBase error, ILogger logger)
|
13
13
|
{
|
14
|
+
var errorReport = error.GetReport();
|
15
|
+
logger.Error(errorReport);
|
14
16
|
await handler.PostAsJson("record_update_job_error", error);
|
15
17
|
if (error is UnknownError unknown)
|
16
18
|
{
|
@@ -12,6 +12,7 @@ public class ModifiedFilesTracker
|
|
12
12
|
{
|
13
13
|
public readonly DirectoryInfo RepoContentsPath;
|
14
14
|
private WorkspaceDiscoveryResult? _currentDiscoveryResult = null;
|
15
|
+
private readonly ILogger _logger;
|
15
16
|
|
16
17
|
private readonly Dictionary<string, string> _originalDependencyFileContents = [];
|
17
18
|
private readonly Dictionary<string, EOLType> _originalDependencyFileEOFs = [];
|
@@ -22,9 +23,10 @@ public class ModifiedFilesTracker
|
|
22
23
|
//public IReadOnlyDictionary<string, EOLType> OriginalDependencyFileEOFs => _originalDependencyFileEOFs;
|
23
24
|
public IReadOnlyDictionary<string, bool> OriginalDependencyFileBOMs => _originalDependencyFileBOMs;
|
24
25
|
|
25
|
-
public ModifiedFilesTracker(DirectoryInfo repoContentsPath)
|
26
|
+
public ModifiedFilesTracker(DirectoryInfo repoContentsPath, ILogger logger)
|
26
27
|
{
|
27
28
|
RepoContentsPath = repoContentsPath;
|
29
|
+
_logger = logger;
|
28
30
|
}
|
29
31
|
|
30
32
|
public async Task StartTrackingAsync(WorkspaceDiscoveryResult discoveryResult)
|
@@ -39,7 +41,7 @@ public class ModifiedFilesTracker
|
|
39
41
|
// track original contents for later handling
|
40
42
|
async Task TrackOriginalContentsAsync(string directory, string fileName)
|
41
43
|
{
|
42
|
-
var repoFullPath =
|
44
|
+
var repoFullPath = CorrectRepoRelativePathCasing(directory, fileName);
|
43
45
|
var localFullPath = Path.Join(RepoContentsPath.FullName, repoFullPath);
|
44
46
|
var content = await File.ReadAllTextAsync(localFullPath);
|
45
47
|
var rawContent = await File.ReadAllBytesAsync(localFullPath);
|
@@ -80,7 +82,7 @@ public class ModifiedFilesTracker
|
|
80
82
|
var updatedDependencyFiles = new Dictionary<string, DependencyFile>();
|
81
83
|
async Task AddUpdatedFileIfDifferentAsync(string directory, string fileName)
|
82
84
|
{
|
83
|
-
var repoFullPath =
|
85
|
+
var repoFullPath = CorrectRepoRelativePathCasing(directory, fileName);
|
84
86
|
var localFullPath = Path.GetFullPath(Path.Join(RepoContentsPath.FullName, repoFullPath));
|
85
87
|
var originalContent = _originalDependencyFileContents[repoFullPath];
|
86
88
|
var updatedContent = await File.ReadAllTextAsync(localFullPath);
|
@@ -134,6 +136,13 @@ public class ModifiedFilesTracker
|
|
134
136
|
return updatedDependencyFileList;
|
135
137
|
}
|
136
138
|
|
139
|
+
private string CorrectRepoRelativePathCasing(string directory, string fileName)
|
140
|
+
{
|
141
|
+
var repoFullPath = Path.Join(directory, fileName).FullyNormalizedRootedPath();
|
142
|
+
var correctedRepoFullPath = RunWorker.EnsureCorrectFileCasing(repoFullPath, RepoContentsPath.FullName, _logger);
|
143
|
+
return correctedRepoFullPath;
|
144
|
+
}
|
145
|
+
|
137
146
|
public static ImmutableArray<DependencyFile> MergeUpdatedFileSet(ImmutableArray<DependencyFile> setA, ImmutableArray<DependencyFile> setB)
|
138
147
|
{
|
139
148
|
static string GetFullName(DependencyFile df) => Path.Join(df.Directory, df.Name).NormalizePathToUnix();
|
@@ -44,12 +44,12 @@ public class RunWorker
|
|
44
44
|
_updaterWorker = updateWorker;
|
45
45
|
}
|
46
46
|
|
47
|
-
public async Task RunAsync(FileInfo jobFilePath, DirectoryInfo repoContentsPath, string baseCommitSha, FileInfo outputFilePath)
|
47
|
+
public async Task RunAsync(FileInfo jobFilePath, DirectoryInfo repoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, FileInfo outputFilePath)
|
48
48
|
{
|
49
49
|
var jobFileContent = await File.ReadAllTextAsync(jobFilePath.FullName);
|
50
50
|
var jobWrapper = Deserialize(jobFileContent);
|
51
51
|
var experimentsManager = ExperimentsManager.GetExperimentsManager(jobWrapper.Job.Experiments);
|
52
|
-
var result = await RunAsync(jobWrapper.Job, repoContentsPath, baseCommitSha, experimentsManager);
|
52
|
+
var result = await RunAsync(jobWrapper.Job, repoContentsPath, caseInsensitiveRepoContentsPath, baseCommitSha, experimentsManager);
|
53
53
|
if (experimentsManager.UseLegacyUpdateHandler)
|
54
54
|
{
|
55
55
|
// only the legacy handler writes this file
|
@@ -58,16 +58,16 @@ public class RunWorker
|
|
58
58
|
}
|
59
59
|
}
|
60
60
|
|
61
|
-
public async Task<RunResult> RunAsync(Job job, DirectoryInfo repoContentsPath, string baseCommitSha, ExperimentsManager experimentsManager)
|
61
|
+
public async Task<RunResult> RunAsync(Job job, DirectoryInfo repoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, ExperimentsManager experimentsManager)
|
62
62
|
{
|
63
63
|
RunResult result;
|
64
64
|
if (experimentsManager.UseLegacyUpdateHandler)
|
65
65
|
{
|
66
|
-
result = await RunWithErrorHandlingAsync(job, repoContentsPath, baseCommitSha, experimentsManager);
|
66
|
+
result = await RunWithErrorHandlingAsync(job, repoContentsPath, caseInsensitiveRepoContentsPath, baseCommitSha, experimentsManager);
|
67
67
|
}
|
68
68
|
else
|
69
69
|
{
|
70
|
-
await RunScenarioHandlersWithErrorHandlingAsync(job, repoContentsPath, baseCommitSha, experimentsManager);
|
70
|
+
await RunScenarioHandlersWithErrorHandlingAsync(job, repoContentsPath, caseInsensitiveRepoContentsPath, baseCommitSha, experimentsManager);
|
71
71
|
|
72
72
|
// the group updater doesn't return this, so we provide an empty object
|
73
73
|
result = new RunResult()
|
@@ -92,7 +92,7 @@ public class RunWorker
|
|
92
92
|
public static IUpdateHandler GetUpdateHandler(Job job) =>
|
93
93
|
UpdateHandlers.FirstOrDefault(h => h.CanHandle(job)) ?? throw new InvalidOperationException("Unable to find appropriate update handler.");
|
94
94
|
|
95
|
-
private async Task RunScenarioHandlersWithErrorHandlingAsync(Job job, DirectoryInfo repoContentsPath, string baseCommitSha, ExperimentsManager experimentsManager)
|
95
|
+
private async Task RunScenarioHandlersWithErrorHandlingAsync(Job job, DirectoryInfo repoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, ExperimentsManager experimentsManager)
|
96
96
|
{
|
97
97
|
JobErrorBase? error = null;
|
98
98
|
|
@@ -100,7 +100,7 @@ public class RunWorker
|
|
100
100
|
{
|
101
101
|
var handler = GetUpdateHandler(job);
|
102
102
|
_logger.Info($"Starting update job of type {handler.TagName}");
|
103
|
-
await handler.HandleAsync(job, repoContentsPath, baseCommitSha, _discoveryWorker, _analyzeWorker, _updaterWorker, _apiHandler, experimentsManager, _logger);
|
103
|
+
await handler.HandleAsync(job, repoContentsPath, caseInsensitiveRepoContentsPath, baseCommitSha, _discoveryWorker, _analyzeWorker, _updaterWorker, _apiHandler, experimentsManager, _logger);
|
104
104
|
}
|
105
105
|
catch (Exception ex)
|
106
106
|
{
|
@@ -109,13 +109,13 @@ public class RunWorker
|
|
109
109
|
|
110
110
|
if (error is not null)
|
111
111
|
{
|
112
|
-
await _apiHandler.RecordUpdateJobError(error);
|
112
|
+
await _apiHandler.RecordUpdateJobError(error, _logger);
|
113
113
|
}
|
114
114
|
|
115
115
|
await _apiHandler.MarkAsProcessed(new(baseCommitSha));
|
116
116
|
}
|
117
117
|
|
118
|
-
private async Task<RunResult> RunWithErrorHandlingAsync(Job job, DirectoryInfo repoContentsPath, string baseCommitSha, ExperimentsManager experimentsManager)
|
118
|
+
private async Task<RunResult> RunWithErrorHandlingAsync(Job job, DirectoryInfo repoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, ExperimentsManager experimentsManager)
|
119
119
|
{
|
120
120
|
JobErrorBase? error = null;
|
121
121
|
var currentDirectory = repoContentsPath.FullName; // used for error reporting below
|
@@ -134,7 +134,7 @@ public class RunWorker
|
|
134
134
|
{
|
135
135
|
var localPath = PathHelper.JoinPath(repoContentsPath.FullName, directory);
|
136
136
|
currentDirectory = localPath;
|
137
|
-
var result = await RunForDirectory(job, repoContentsPath, directory, baseCommitSha, experimentsManager);
|
137
|
+
var result = await RunForDirectory(job, repoContentsPath, caseInsensitiveRepoContentsPath, directory, baseCommitSha, experimentsManager);
|
138
138
|
foreach (var dependencyFile in result.Base64DependencyFiles)
|
139
139
|
{
|
140
140
|
var uniqueKey = Path.GetFullPath(Path.Join(dependencyFile.Directory, dependencyFile.Name)).NormalizePathToUnix().EnsurePrefix("/");
|
@@ -155,7 +155,7 @@ public class RunWorker
|
|
155
155
|
|
156
156
|
if (error is not null)
|
157
157
|
{
|
158
|
-
await _apiHandler.RecordUpdateJobError(error);
|
158
|
+
await _apiHandler.RecordUpdateJobError(error, _logger);
|
159
159
|
}
|
160
160
|
|
161
161
|
await _apiHandler.MarkAsProcessed(new(baseCommitSha));
|
@@ -163,15 +163,16 @@ public class RunWorker
|
|
163
163
|
return runResult;
|
164
164
|
}
|
165
165
|
|
166
|
-
private async Task<RunResult> RunForDirectory(Job job, DirectoryInfo
|
166
|
+
private async Task<RunResult> RunForDirectory(Job job, DirectoryInfo originalRepoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string repoDirectory, string baseCommitSha, ExperimentsManager experimentsManager)
|
167
167
|
{
|
168
|
+
var repoContentsPath = caseInsensitiveRepoContentsPath ?? originalRepoContentsPath;
|
168
169
|
var discoveryResult = await _discoveryWorker.RunAsync(repoContentsPath.FullName, repoDirectory);
|
169
170
|
_logger.ReportDiscovery(discoveryResult);
|
170
171
|
|
171
172
|
if (discoveryResult.Error is not null)
|
172
173
|
{
|
173
174
|
// this is unrecoverable
|
174
|
-
await _apiHandler.RecordUpdateJobError(discoveryResult.Error);
|
175
|
+
await _apiHandler.RecordUpdateJobError(discoveryResult.Error, _logger);
|
175
176
|
return new()
|
176
177
|
{
|
177
178
|
Base64DependencyFiles = [],
|
@@ -180,7 +181,7 @@ public class RunWorker
|
|
180
181
|
}
|
181
182
|
|
182
183
|
// report dependencies
|
183
|
-
var discoveredUpdatedDependencies = GetUpdatedDependencyListFromDiscovery(discoveryResult);
|
184
|
+
var discoveredUpdatedDependencies = GetUpdatedDependencyListFromDiscovery(discoveryResult, originalRepoContentsPath.FullName, _logger);
|
184
185
|
await _apiHandler.UpdateDependencyList(discoveredUpdatedDependencies);
|
185
186
|
|
186
187
|
var incrementMetric = GetIncrementMetric(job);
|
@@ -190,7 +191,7 @@ public class RunWorker
|
|
190
191
|
var actualUpdatedDependencies = new List<ReportedDependency>();
|
191
192
|
|
192
193
|
// track original contents for later handling
|
193
|
-
var tracker = new ModifiedFilesTracker(
|
194
|
+
var tracker = new ModifiedFilesTracker(originalRepoContentsPath, _logger);
|
194
195
|
await tracker.StartTrackingAsync(discoveryResult);
|
195
196
|
|
196
197
|
// do update
|
@@ -237,7 +238,7 @@ public class RunWorker
|
|
237
238
|
|
238
239
|
if (analysisResult.Error is not null)
|
239
240
|
{
|
240
|
-
await _apiHandler.RecordUpdateJobError(analysisResult.Error);
|
241
|
+
await _apiHandler.RecordUpdateJobError(analysisResult.Error, _logger);
|
241
242
|
continue;
|
242
243
|
}
|
243
244
|
|
@@ -287,7 +288,7 @@ public class RunWorker
|
|
287
288
|
var updateResult = await _updaterWorker.RunAsync(repoContentsPath.FullName, updateOperation.ProjectPath, dependency.Name, dependency.Version!, analysisResult.UpdatedVersion, isTransitive: dependency.IsTransitive);
|
288
289
|
if (updateResult.Error is not null)
|
289
290
|
{
|
290
|
-
await _apiHandler.RecordUpdateJobError(updateResult.Error);
|
291
|
+
await _apiHandler.RecordUpdateJobError(updateResult.Error, _logger);
|
291
292
|
}
|
292
293
|
else
|
293
294
|
{
|
@@ -388,7 +389,7 @@ public class RunWorker
|
|
388
389
|
switch (message)
|
389
390
|
{
|
390
391
|
case JobErrorBase error:
|
391
|
-
await _apiHandler.RecordUpdateJobError(error);
|
392
|
+
await _apiHandler.RecordUpdateJobError(error, _logger);
|
392
393
|
break;
|
393
394
|
case CreatePullRequest create:
|
394
395
|
await _apiHandler.CreatePullRequest(create);
|
@@ -708,7 +709,28 @@ public class RunWorker
|
|
708
709
|
return dependencyInfo;
|
709
710
|
}
|
710
711
|
|
711
|
-
internal static
|
712
|
+
internal static string EnsureCorrectFileCasing(string repoRelativePath, string repoRoot, ILogger logger)
|
713
|
+
{
|
714
|
+
var fullPath = Path.Join(repoRoot, repoRelativePath);
|
715
|
+
var resolvedNames = PathHelper.ResolveCaseInsensitivePathsInsideRepoRoot(fullPath, repoRoot);
|
716
|
+
if (resolvedNames is null)
|
717
|
+
{
|
718
|
+
logger.Info($"Unable to resolve correct case for file [{repoRelativePath}]; returning original.");
|
719
|
+
return repoRelativePath;
|
720
|
+
}
|
721
|
+
|
722
|
+
if (resolvedNames.Count != 1)
|
723
|
+
{
|
724
|
+
logger.Info($"Expected exactly 1 normalized file path for [{repoRelativePath}], instead found {resolvedNames.Count}: {string.Join(", ", resolvedNames)}");
|
725
|
+
return repoRelativePath;
|
726
|
+
}
|
727
|
+
|
728
|
+
var resolvedName = resolvedNames[0];
|
729
|
+
var relativeResolvedName = Path.GetRelativePath(repoRoot, resolvedName).FullyNormalizedRootedPath();
|
730
|
+
return relativeResolvedName;
|
731
|
+
}
|
732
|
+
|
733
|
+
internal static UpdatedDependencyList GetUpdatedDependencyListFromDiscovery(WorkspaceDiscoveryResult discoveryResult, string repoRoot, ILogger logger)
|
712
734
|
{
|
713
735
|
string GetFullRepoPath(string path)
|
714
736
|
{
|
@@ -793,6 +815,7 @@ public class RunWorker
|
|
793
815
|
var dependencyFiles = discoveryResult.Projects
|
794
816
|
.Select(p => GetFullRepoPath(p.FilePath))
|
795
817
|
.Concat(auxiliaryFiles)
|
818
|
+
.Select(p => EnsureCorrectFileCasing(p, repoRoot, logger))
|
796
819
|
.Distinct()
|
797
820
|
.OrderBy(p => p)
|
798
821
|
.ToArray();
|
@@ -27,8 +27,9 @@ internal class CreateSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
27
27
|
return job.SecurityUpdatesOnly;
|
28
28
|
}
|
29
29
|
|
30
|
-
public async Task HandleAsync(Job job, DirectoryInfo
|
30
|
+
public async Task HandleAsync(Job job, DirectoryInfo originalRepoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, IDiscoveryWorker discoveryWorker, IAnalyzeWorker analyzeWorker, IUpdaterWorker updaterWorker, IApiHandler apiHandler, ExperimentsManager experimentsManager, ILogger logger)
|
31
31
|
{
|
32
|
+
var repoContentsPath = caseInsensitiveRepoContentsPath ?? originalRepoContentsPath;
|
32
33
|
var jobDependencies = job.Dependencies.ToHashSet(StringComparer.OrdinalIgnoreCase);
|
33
34
|
foreach (var directory in job.GetAllDirectories())
|
34
35
|
{
|
@@ -36,11 +37,11 @@ internal class CreateSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
36
37
|
logger.ReportDiscovery(discoveryResult);
|
37
38
|
if (discoveryResult.Error is not null)
|
38
39
|
{
|
39
|
-
await apiHandler.RecordUpdateJobError(discoveryResult.Error);
|
40
|
+
await apiHandler.RecordUpdateJobError(discoveryResult.Error, logger);
|
40
41
|
return;
|
41
42
|
}
|
42
43
|
|
43
|
-
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult);
|
44
|
+
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult, originalRepoContentsPath.FullName, logger);
|
44
45
|
await apiHandler.UpdateDependencyList(updatedDependencyList);
|
45
46
|
await this.ReportUpdaterStarted(apiHandler);
|
46
47
|
|
@@ -54,13 +55,13 @@ internal class CreateSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
54
55
|
|
55
56
|
if (groupedUpdateOperationsToPerform.Count == 0)
|
56
57
|
{
|
57
|
-
await apiHandler.RecordUpdateJobError(new SecurityUpdateDependencyNotFound());
|
58
|
+
await apiHandler.RecordUpdateJobError(new SecurityUpdateDependencyNotFound(), logger);
|
58
59
|
continue;
|
59
60
|
}
|
60
61
|
|
61
62
|
logger.Info($"Updating dependencies: {string.Join(", ", groupedUpdateOperationsToPerform.Select(g => g.Key).Distinct().OrderBy(d => d, StringComparer.OrdinalIgnoreCase))}");
|
62
63
|
|
63
|
-
var tracker = new ModifiedFilesTracker(
|
64
|
+
var tracker = new ModifiedFilesTracker(originalRepoContentsPath, logger);
|
64
65
|
await tracker.StartTrackingAsync(discoveryResult);
|
65
66
|
foreach (var dependencyGroupToUpdate in groupedUpdateOperationsToPerform)
|
66
67
|
{
|
@@ -81,11 +82,11 @@ internal class CreateSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
81
82
|
if (ignoredUpdates.Length > 0)
|
82
83
|
{
|
83
84
|
logger.Error($"Cannot update {dependencyName} because all versions are ignored.");
|
84
|
-
await apiHandler.RecordUpdateJobError(new SecurityUpdateIgnored(dependencyName));
|
85
|
+
await apiHandler.RecordUpdateJobError(new SecurityUpdateIgnored(dependencyName), logger);
|
85
86
|
}
|
86
87
|
else
|
87
88
|
{
|
88
|
-
await apiHandler.RecordUpdateJobError(new SecurityUpdateNotNeeded(dependencyName));
|
89
|
+
await apiHandler.RecordUpdateJobError(new SecurityUpdateNotNeeded(dependencyName), logger);
|
89
90
|
}
|
90
91
|
|
91
92
|
continue;
|
@@ -97,14 +98,14 @@ internal class CreateSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
97
98
|
if (analysisResult.Error is not null)
|
98
99
|
{
|
99
100
|
logger.Error($"Error analyzing {dependency.Name} in {projectPath}: {analysisResult.Error.GetReport()}");
|
100
|
-
await apiHandler.RecordUpdateJobError(analysisResult.Error);
|
101
|
+
await apiHandler.RecordUpdateJobError(analysisResult.Error, logger);
|
101
102
|
return;
|
102
103
|
}
|
103
104
|
|
104
105
|
if (!analysisResult.CanUpdate)
|
105
106
|
{
|
106
107
|
logger.Info($"No updatable version found for {dependency.Name} in {projectPath}.");
|
107
|
-
await apiHandler.RecordUpdateJobError(new SecurityUpdateNotFound(dependency.Name, dependency.Version!));
|
108
|
+
await apiHandler.RecordUpdateJobError(new SecurityUpdateNotFound(dependency.Name, dependency.Version!), logger);
|
108
109
|
continue;
|
109
110
|
}
|
110
111
|
|
@@ -114,7 +115,7 @@ internal class CreateSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
114
115
|
if (updaterResult.Error is not null)
|
115
116
|
{
|
116
117
|
logger.Error($"Error updating {dependency.Name} in {projectPath}: {updaterResult.Error.GetReport()}");
|
117
|
-
await apiHandler.RecordUpdateJobError(updaterResult.Error);
|
118
|
+
await apiHandler.RecordUpdateJobError(updaterResult.Error, logger);
|
118
119
|
continue;
|
119
120
|
}
|
120
121
|
|
@@ -125,7 +126,7 @@ internal class CreateSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
125
126
|
if (!alreadyHandled)
|
126
127
|
{
|
127
128
|
logger.Error($"Update of {dependency.Name} in {projectPath} not possible.");
|
128
|
-
await apiHandler.RecordUpdateJobError(new SecurityUpdateNotPossible(dependencyName, analysisResult.UpdatedVersion, analysisResult.UpdatedVersion, []));
|
129
|
+
await apiHandler.RecordUpdateJobError(new SecurityUpdateNotPossible(dependencyName, analysisResult.UpdatedVersion, analysisResult.UpdatedVersion, []), logger);
|
129
130
|
return;
|
130
131
|
}
|
131
132
|
}
|
@@ -151,7 +152,7 @@ internal class CreateSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
151
152
|
var existingPullRequest = job.GetExistingPullRequestForDependencies(rawDependencies, considerVersions: true);
|
152
153
|
if (existingPullRequest is not null)
|
153
154
|
{
|
154
|
-
await apiHandler.RecordUpdateJobError(new PullRequestExistsForSecurityUpdate(rawDependencies));
|
155
|
+
await apiHandler.RecordUpdateJobError(new PullRequestExistsForSecurityUpdate(rawDependencies), logger);
|
155
156
|
continue;
|
156
157
|
}
|
157
158
|
}
|
data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/GroupUpdateAllVersionsHandler.cs
CHANGED
@@ -38,23 +38,24 @@ internal class GroupUpdateAllVersionsHandler : IUpdateHandler
|
|
38
38
|
return true;
|
39
39
|
}
|
40
40
|
|
41
|
-
public async Task HandleAsync(Job job, DirectoryInfo
|
41
|
+
public async Task HandleAsync(Job job, DirectoryInfo originalRepoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, IDiscoveryWorker discoveryWorker, IAnalyzeWorker analyzeWorker, IUpdaterWorker updaterWorker, IApiHandler apiHandler, ExperimentsManager experimentsManager, ILogger logger)
|
42
42
|
{
|
43
43
|
// group update, do all directories and merge
|
44
44
|
// ungrouped update, do each dir separate
|
45
45
|
await this.ReportUpdaterStarted(apiHandler);
|
46
46
|
if (job.DependencyGroups.Length > 0)
|
47
47
|
{
|
48
|
-
await RunGroupedDependencyUpdates(job,
|
48
|
+
await RunGroupedDependencyUpdates(job, originalRepoContentsPath, caseInsensitiveRepoContentsPath, baseCommitSha, discoveryWorker, analyzeWorker, updaterWorker, apiHandler, experimentsManager, logger);
|
49
49
|
}
|
50
50
|
else
|
51
51
|
{
|
52
|
-
await RunUngroupedDependencyUpdates(job,
|
52
|
+
await RunUngroupedDependencyUpdates(job, originalRepoContentsPath, caseInsensitiveRepoContentsPath, baseCommitSha, discoveryWorker, analyzeWorker, updaterWorker, apiHandler, experimentsManager, logger);
|
53
53
|
}
|
54
54
|
}
|
55
55
|
|
56
|
-
private async Task RunGroupedDependencyUpdates(Job job, DirectoryInfo
|
56
|
+
private async Task RunGroupedDependencyUpdates(Job job, DirectoryInfo originalRepoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, IDiscoveryWorker discoveryWorker, IAnalyzeWorker analyzeWorker, IUpdaterWorker updaterWorker, IApiHandler apiHandler, ExperimentsManager experimentsManager, ILogger logger)
|
57
57
|
{
|
58
|
+
var repoContentsPath = caseInsensitiveRepoContentsPath ?? originalRepoContentsPath;
|
58
59
|
foreach (var group in job.DependencyGroups)
|
59
60
|
{
|
60
61
|
var existingGroupPr = job.ExistingGroupPullRequests.FirstOrDefault(pr => pr.DependencyGroupName == group.Name);
|
@@ -75,14 +76,14 @@ internal class GroupUpdateAllVersionsHandler : IUpdateHandler
|
|
75
76
|
logger.ReportDiscovery(discoveryResult);
|
76
77
|
if (discoveryResult.Error is not null)
|
77
78
|
{
|
78
|
-
await apiHandler.RecordUpdateJobError(discoveryResult.Error);
|
79
|
+
await apiHandler.RecordUpdateJobError(discoveryResult.Error, logger);
|
79
80
|
return;
|
80
81
|
}
|
81
82
|
|
82
|
-
var tracker = new ModifiedFilesTracker(
|
83
|
+
var tracker = new ModifiedFilesTracker(originalRepoContentsPath, logger);
|
83
84
|
await tracker.StartTrackingAsync(discoveryResult);
|
84
85
|
|
85
|
-
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult);
|
86
|
+
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult, originalRepoContentsPath.FullName, logger);
|
86
87
|
await apiHandler.UpdateDependencyList(updatedDependencyList);
|
87
88
|
|
88
89
|
var updateOperationsToPerform = RunWorker.GetUpdateOperations(discoveryResult).ToArray();
|
@@ -109,7 +110,7 @@ internal class GroupUpdateAllVersionsHandler : IUpdateHandler
|
|
109
110
|
if (analysisResult.Error is not null)
|
110
111
|
{
|
111
112
|
logger.Error($"Error analyzing {dependency.Name} in {projectPath}: {analysisResult.Error.GetReport()}");
|
112
|
-
await apiHandler.RecordUpdateJobError(analysisResult.Error);
|
113
|
+
await apiHandler.RecordUpdateJobError(analysisResult.Error, logger);
|
113
114
|
return;
|
114
115
|
}
|
115
116
|
|
@@ -124,7 +125,7 @@ internal class GroupUpdateAllVersionsHandler : IUpdateHandler
|
|
124
125
|
if (updaterResult.Error is not null)
|
125
126
|
{
|
126
127
|
logger.Error($"Error updating {dependency.Name} in {projectPath}: {updaterResult.Error.GetReport()}");
|
127
|
-
await apiHandler.RecordUpdateJobError(updaterResult.Error);
|
128
|
+
await apiHandler.RecordUpdateJobError(updaterResult.Error, logger);
|
128
129
|
continue;
|
129
130
|
}
|
130
131
|
|
@@ -169,22 +170,23 @@ internal class GroupUpdateAllVersionsHandler : IUpdateHandler
|
|
169
170
|
}
|
170
171
|
}
|
171
172
|
|
172
|
-
private async Task RunUngroupedDependencyUpdates(Job job, DirectoryInfo
|
173
|
+
private async Task RunUngroupedDependencyUpdates(Job job, DirectoryInfo originalRepoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, IDiscoveryWorker discoveryWorker, IAnalyzeWorker analyzeWorker, IUpdaterWorker updaterWorker, IApiHandler apiHandler, ExperimentsManager experimentsManager, ILogger logger)
|
173
174
|
{
|
175
|
+
var repoContentsPath = caseInsensitiveRepoContentsPath ?? originalRepoContentsPath;
|
174
176
|
foreach (var directory in job.GetAllDirectories())
|
175
177
|
{
|
176
178
|
var discoveryResult = await discoveryWorker.RunAsync(repoContentsPath.FullName, directory);
|
177
179
|
logger.ReportDiscovery(discoveryResult);
|
178
180
|
if (discoveryResult.Error is not null)
|
179
181
|
{
|
180
|
-
await apiHandler.RecordUpdateJobError(discoveryResult.Error);
|
182
|
+
await apiHandler.RecordUpdateJobError(discoveryResult.Error, logger);
|
181
183
|
return;
|
182
184
|
}
|
183
185
|
|
184
|
-
var tracker = new ModifiedFilesTracker(
|
186
|
+
var tracker = new ModifiedFilesTracker(originalRepoContentsPath, logger);
|
185
187
|
await tracker.StartTrackingAsync(discoveryResult);
|
186
188
|
|
187
|
-
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult);
|
189
|
+
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult, originalRepoContentsPath.FullName, logger);
|
188
190
|
await apiHandler.UpdateDependencyList(updatedDependencyList);
|
189
191
|
|
190
192
|
var updateOperationsPerformed = new List<UpdateOperationBase>();
|
@@ -208,7 +210,7 @@ internal class GroupUpdateAllVersionsHandler : IUpdateHandler
|
|
208
210
|
if (analysisResult.Error is not null)
|
209
211
|
{
|
210
212
|
logger.Error($"Error analyzing {dependency.Name} in {projectPath}: {analysisResult.Error.GetReport()}");
|
211
|
-
await apiHandler.RecordUpdateJobError(analysisResult.Error);
|
213
|
+
await apiHandler.RecordUpdateJobError(analysisResult.Error, logger);
|
212
214
|
return;
|
213
215
|
}
|
214
216
|
|
@@ -222,7 +224,7 @@ internal class GroupUpdateAllVersionsHandler : IUpdateHandler
|
|
222
224
|
var updaterResult = await updaterWorker.RunAsync(repoContentsPath.FullName, projectPath, dependency.Name, dependency.Version!, analysisResult.UpdatedVersion, dependency.IsTransitive);
|
223
225
|
if (updaterResult.Error is not null)
|
224
226
|
{
|
225
|
-
await apiHandler.RecordUpdateJobError(updaterResult.Error);
|
227
|
+
await apiHandler.RecordUpdateJobError(updaterResult.Error, logger);
|
226
228
|
continue;
|
227
229
|
}
|
228
230
|
|
@@ -6,7 +6,7 @@ public interface IUpdateHandler
|
|
6
6
|
{
|
7
7
|
string TagName { get; }
|
8
8
|
bool CanHandle(Job job);
|
9
|
-
Task HandleAsync(Job job, DirectoryInfo
|
9
|
+
Task HandleAsync(Job job, DirectoryInfo originalRepoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, IDiscoveryWorker discoveryWorker, IAnalyzeWorker analyzeWorker, IUpdaterWorker updaterWorker, IApiHandler apiHandler, ExperimentsManager experimentsManager, ILogger logger);
|
10
10
|
}
|
11
11
|
|
12
12
|
public static class IUpdateHandlerExtensions
|
@@ -44,8 +44,9 @@ internal class RefreshGroupUpdatePullRequestHandler : IUpdateHandler
|
|
44
44
|
return job.UpdatingAPullRequest;
|
45
45
|
}
|
46
46
|
|
47
|
-
public async Task HandleAsync(Job job, DirectoryInfo
|
47
|
+
public async Task HandleAsync(Job job, DirectoryInfo originalRepoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, IDiscoveryWorker discoveryWorker, IAnalyzeWorker analyzeWorker, IUpdaterWorker updaterWorker, IApiHandler apiHandler, ExperimentsManager experimentsManager, ILogger logger)
|
48
48
|
{
|
49
|
+
var repoContentsPath = caseInsensitiveRepoContentsPath ?? originalRepoContentsPath;
|
49
50
|
if (job.DependencyGroupToRefresh is null)
|
50
51
|
{
|
51
52
|
throw new InvalidOperationException($"{nameof(job.DependencyGroupToRefresh)} must be non-null.");
|
@@ -67,11 +68,11 @@ internal class RefreshGroupUpdatePullRequestHandler : IUpdateHandler
|
|
67
68
|
logger.ReportDiscovery(discoveryResult);
|
68
69
|
if (discoveryResult.Error is not null)
|
69
70
|
{
|
70
|
-
await apiHandler.RecordUpdateJobError(discoveryResult.Error);
|
71
|
+
await apiHandler.RecordUpdateJobError(discoveryResult.Error, logger);
|
71
72
|
return;
|
72
73
|
}
|
73
74
|
|
74
|
-
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult);
|
75
|
+
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult, originalRepoContentsPath.FullName, logger);
|
75
76
|
await apiHandler.UpdateDependencyList(updatedDependencyList);
|
76
77
|
await this.ReportUpdaterStarted(apiHandler);
|
77
78
|
|
@@ -85,7 +86,7 @@ internal class RefreshGroupUpdatePullRequestHandler : IUpdateHandler
|
|
85
86
|
.ToDictionary(g => g.Key, g => g.ToArray(), StringComparer.OrdinalIgnoreCase);
|
86
87
|
logger.Info($"Updating dependencies: {string.Join(", ", groupedUpdateOperationsToPerform.Select(g => g.Key).Distinct().OrderBy(d => d, StringComparer.OrdinalIgnoreCase))}");
|
87
88
|
|
88
|
-
var tracker = new ModifiedFilesTracker(
|
89
|
+
var tracker = new ModifiedFilesTracker(originalRepoContentsPath, logger);
|
89
90
|
await tracker.StartTrackingAsync(discoveryResult);
|
90
91
|
foreach (var dependencyGroupToUpdate in groupedUpdateOperationsToPerform)
|
91
92
|
{
|
@@ -101,7 +102,7 @@ internal class RefreshGroupUpdatePullRequestHandler : IUpdateHandler
|
|
101
102
|
if (analysisResult.Error is not null)
|
102
103
|
{
|
103
104
|
logger.Error($"Error analyzing {dependency.Name} in {projectPath}: {analysisResult.Error.GetReport()}");
|
104
|
-
await apiHandler.RecordUpdateJobError(analysisResult.Error);
|
105
|
+
await apiHandler.RecordUpdateJobError(analysisResult.Error, logger);
|
105
106
|
return;
|
106
107
|
}
|
107
108
|
|
@@ -117,7 +118,7 @@ internal class RefreshGroupUpdatePullRequestHandler : IUpdateHandler
|
|
117
118
|
if (updaterResult.Error is not null)
|
118
119
|
{
|
119
120
|
logger.Error($"Error updating {dependency.Name} in {projectPath}: {updaterResult.Error.GetReport()}");
|
120
|
-
await apiHandler.RecordUpdateJobError(updaterResult.Error);
|
121
|
+
await apiHandler.RecordUpdateJobError(updaterResult.Error, logger);
|
121
122
|
continue;
|
122
123
|
}
|
123
124
|
|
@@ -26,8 +26,9 @@ internal class RefreshSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
26
26
|
return job.UpdatingAPullRequest;
|
27
27
|
}
|
28
28
|
|
29
|
-
public async Task HandleAsync(Job job, DirectoryInfo
|
29
|
+
public async Task HandleAsync(Job job, DirectoryInfo originalRepoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, IDiscoveryWorker discoveryWorker, IAnalyzeWorker analyzeWorker, IUpdaterWorker updaterWorker, IApiHandler apiHandler, ExperimentsManager experimentsManager, ILogger logger)
|
30
30
|
{
|
31
|
+
var repoContentsPath = caseInsensitiveRepoContentsPath ?? originalRepoContentsPath;
|
31
32
|
var jobDependencies = job.Dependencies.ToHashSet(StringComparer.OrdinalIgnoreCase);
|
32
33
|
foreach (var directory in job.GetAllDirectories())
|
33
34
|
{
|
@@ -36,11 +37,11 @@ internal class RefreshSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
36
37
|
if (discoveryResult.Error is not null)
|
37
38
|
{
|
38
39
|
logger.Error($"Reporting error: {discoveryResult.Error.GetReport()}");
|
39
|
-
await apiHandler.RecordUpdateJobError(discoveryResult.Error);
|
40
|
+
await apiHandler.RecordUpdateJobError(discoveryResult.Error, logger);
|
40
41
|
return;
|
41
42
|
}
|
42
43
|
|
43
|
-
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult);
|
44
|
+
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult, originalRepoContentsPath.FullName, logger);
|
44
45
|
await apiHandler.UpdateDependencyList(updatedDependencyList);
|
45
46
|
await this.ReportUpdaterStarted(apiHandler);
|
46
47
|
|
@@ -74,7 +75,7 @@ internal class RefreshSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
74
75
|
continue;
|
75
76
|
}
|
76
77
|
|
77
|
-
var tracker = new ModifiedFilesTracker(
|
78
|
+
var tracker = new ModifiedFilesTracker(originalRepoContentsPath, logger);
|
78
79
|
await tracker.StartTrackingAsync(discoveryResult);
|
79
80
|
foreach (var dependencyGroupToUpdate in groupedUpdateOperationsToPerform)
|
80
81
|
{
|
@@ -85,7 +86,7 @@ internal class RefreshSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
85
86
|
.Where(set => set.Item3.IsVulnerable)
|
86
87
|
.ToArray();
|
87
88
|
|
88
|
-
if (vulnerableDependenciesToUpdate.Length
|
89
|
+
if (vulnerableDependenciesToUpdate.Length == 0)
|
89
90
|
{
|
90
91
|
var close = ClosePullRequest.WithUpToDate(job);
|
91
92
|
logger.Info(close.GetReport());
|
@@ -99,7 +100,7 @@ internal class RefreshSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
99
100
|
if (analysisResult.Error is not null)
|
100
101
|
{
|
101
102
|
logger.Error($"Error analyzing {dependency.Name} in {projectPath}: {analysisResult.Error.GetReport()}");
|
102
|
-
await apiHandler.RecordUpdateJobError(analysisResult.Error);
|
103
|
+
await apiHandler.RecordUpdateJobError(analysisResult.Error, logger);
|
103
104
|
return;
|
104
105
|
}
|
105
106
|
|
@@ -115,7 +116,7 @@ internal class RefreshSecurityUpdatePullRequestHandler : IUpdateHandler
|
|
115
116
|
if (updaterResult.Error is not null)
|
116
117
|
{
|
117
118
|
logger.Error($"Error updating {dependency.Name} in {projectPath}: {updaterResult.Error.GetReport()}");
|
118
|
-
await apiHandler.RecordUpdateJobError(updaterResult.Error);
|
119
|
+
await apiHandler.RecordUpdateJobError(updaterResult.Error, logger);
|
119
120
|
continue;
|
120
121
|
}
|
121
122
|
|
@@ -26,8 +26,9 @@ internal class RefreshVersionUpdatePullRequestHandler : IUpdateHandler
|
|
26
26
|
return job.UpdatingAPullRequest;
|
27
27
|
}
|
28
28
|
|
29
|
-
public async Task HandleAsync(Job job, DirectoryInfo
|
29
|
+
public async Task HandleAsync(Job job, DirectoryInfo originalRepoContentsPath, DirectoryInfo? caseInsensitiveRepoContentsPath, string baseCommitSha, IDiscoveryWorker discoveryWorker, IAnalyzeWorker analyzeWorker, IUpdaterWorker updaterWorker, IApiHandler apiHandler, ExperimentsManager experimentsManager, ILogger logger)
|
30
30
|
{
|
31
|
+
var repoContentsPath = caseInsensitiveRepoContentsPath ?? originalRepoContentsPath;
|
31
32
|
var jobDependencies = job.Dependencies.ToHashSet(StringComparer.OrdinalIgnoreCase);
|
32
33
|
foreach (var directory in job.GetAllDirectories())
|
33
34
|
{
|
@@ -35,11 +36,11 @@ internal class RefreshVersionUpdatePullRequestHandler : IUpdateHandler
|
|
35
36
|
logger.ReportDiscovery(discoveryResult);
|
36
37
|
if (discoveryResult.Error is not null)
|
37
38
|
{
|
38
|
-
await apiHandler.RecordUpdateJobError(discoveryResult.Error);
|
39
|
+
await apiHandler.RecordUpdateJobError(discoveryResult.Error, logger);
|
39
40
|
return;
|
40
41
|
}
|
41
42
|
|
42
|
-
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult);
|
43
|
+
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discoveryResult, originalRepoContentsPath.FullName, logger);
|
43
44
|
await apiHandler.UpdateDependencyList(updatedDependencyList);
|
44
45
|
await this.ReportUpdaterStarted(apiHandler);
|
45
46
|
|
@@ -73,12 +74,12 @@ internal class RefreshVersionUpdatePullRequestHandler : IUpdateHandler
|
|
73
74
|
|
74
75
|
logger.Info($"Updating dependencies: {string.Join(", ", relevantUpdateOperationsToPerform.Select(g => g.Key).Distinct().OrderBy(d => d, StringComparer.OrdinalIgnoreCase))}");
|
75
76
|
|
76
|
-
var tracker = new ModifiedFilesTracker(
|
77
|
+
var tracker = new ModifiedFilesTracker(originalRepoContentsPath, logger);
|
77
78
|
await tracker.StartTrackingAsync(discoveryResult);
|
78
|
-
foreach (var
|
79
|
+
foreach (var dependencyUpdatesToPerform in relevantUpdateOperationsToPerform)
|
79
80
|
{
|
80
|
-
var dependencyName =
|
81
|
-
var dependencyInfosToUpdate =
|
81
|
+
var dependencyName = dependencyUpdatesToPerform.Key;
|
82
|
+
var dependencyInfosToUpdate = dependencyUpdatesToPerform.Value
|
82
83
|
.Where(o => !job.IsDependencyIgnoredByNameOnly(o.Dependency.Name))
|
83
84
|
.Select(o => (o.ProjectPath, o.Dependency, RunWorker.GetDependencyInfo(job, o.Dependency)))
|
84
85
|
.ToArray();
|
@@ -89,7 +90,7 @@ internal class RefreshVersionUpdatePullRequestHandler : IUpdateHandler
|
|
89
90
|
if (analysisResult.Error is not null)
|
90
91
|
{
|
91
92
|
logger.Error($"Error analyzing {dependency.Name} in {projectPath}: {analysisResult.Error.GetReport()}");
|
92
|
-
await apiHandler.RecordUpdateJobError(analysisResult.Error);
|
93
|
+
await apiHandler.RecordUpdateJobError(analysisResult.Error, logger);
|
93
94
|
return;
|
94
95
|
}
|
95
96
|
|
@@ -105,7 +106,7 @@ internal class RefreshVersionUpdatePullRequestHandler : IUpdateHandler
|
|
105
106
|
if (updaterResult.Error is not null)
|
106
107
|
{
|
107
108
|
logger.Error($"Error updating {dependency.Name} in {projectPath}: {updaterResult.Error.GetReport()}");
|
108
|
-
await apiHandler.RecordUpdateJobError(updaterResult.Error);
|
109
|
+
await apiHandler.RecordUpdateJobError(updaterResult.Error, logger);
|
109
110
|
continue;
|
110
111
|
}
|
111
112
|
|
@@ -128,7 +128,7 @@ public class CloneWorkerTests
|
|
128
128
|
// arrange
|
129
129
|
var testApiHandler = new TestApiHandler();
|
130
130
|
var testGitCommandHandler = new TestGitCommandHandler();
|
131
|
-
var cloneWorker = new CloneWorker("JOB-ID", testApiHandler, testGitCommandHandler);
|
131
|
+
var cloneWorker = new CloneWorker("JOB-ID", testApiHandler, testGitCommandHandler, new TestLogger());
|
132
132
|
using var testDirectory = new TemporaryDirectory();
|
133
133
|
var jobFilePath = Path.Combine(testDirectory.DirectoryPath, "job.json");
|
134
134
|
await File.WriteAllTextAsync(jobFilePath, "not json");
|
@@ -149,7 +149,7 @@ public class CloneWorkerTests
|
|
149
149
|
// arrange
|
150
150
|
var testApiHandler = new TestApiHandler();
|
151
151
|
var testGitCommandHandler = new TestGitCommandHandler();
|
152
|
-
var cloneWorker = new CloneWorker("JOB-ID", testApiHandler, testGitCommandHandler);
|
152
|
+
var cloneWorker = new CloneWorker("JOB-ID", testApiHandler, testGitCommandHandler, new TestLogger());
|
153
153
|
using var testDirectory = new TemporaryDirectory();
|
154
154
|
var jobFilePath = Path.Combine(testDirectory.DirectoryPath, "job.json");
|
155
155
|
|
@@ -221,7 +221,7 @@ public class CloneWorkerTests
|
|
221
221
|
// arrange
|
222
222
|
var testApiHandler = new TestApiHandler();
|
223
223
|
testGitCommandHandler ??= new TestGitCommandHandler();
|
224
|
-
var worker = new CloneWorker("TEST-JOB-ID", testApiHandler, testGitCommandHandler);
|
224
|
+
var worker = new CloneWorker("TEST-JOB-ID", testApiHandler, testGitCommandHandler, new TestLogger());
|
225
225
|
|
226
226
|
// act
|
227
227
|
var job = new Job()
|
@@ -117,7 +117,7 @@ public class HttpApiHandlerTests
|
|
117
117
|
var handler = new HttpApiHandler(http.BaseUrl, "TEST-ID");
|
118
118
|
|
119
119
|
// act
|
120
|
-
await handler.RecordUpdateJobError(error);
|
120
|
+
await handler.RecordUpdateJobError(error, new TestLogger());
|
121
121
|
|
122
122
|
// assert
|
123
123
|
AssertEx.Equal(expectedEndpoints, actualEndpoints);
|
@@ -561,6 +561,16 @@ public class MiscellaneousTests
|
|
561
561
|
Assert.Equal(expectedUpdateOperations, actualUpdateOperations);
|
562
562
|
}
|
563
563
|
|
564
|
+
[Theory]
|
565
|
+
[InlineData("/src/project.csproj", "/src/project.csproj")] // correct casing
|
566
|
+
[InlineData("/src/project.csproj", "/SRC/PROJECT.csproj")] // incorrect casing
|
567
|
+
public async Task EnsureCorrectFileCasing(string filePathOnDisk, string candidatePath)
|
568
|
+
{
|
569
|
+
using var tempDir = await TemporaryDirectory.CreateWithContentsAsync((filePathOnDisk, "contents unimportant"));
|
570
|
+
var actualRepoRelativePath = RunWorker.EnsureCorrectFileCasing(candidatePath, tempDir.DirectoryPath, new TestLogger());
|
571
|
+
Assert.Equal(filePathOnDisk, actualRepoRelativePath);
|
572
|
+
}
|
573
|
+
|
564
574
|
public static IEnumerable<object[]> GetUpdateOperationsData()
|
565
575
|
{
|
566
576
|
static ProjectDiscoveryResult GetProjectDiscovery(string filePath, params string[] dependencyNames)
|
@@ -3523,7 +3523,7 @@ public class RunWorkerTests
|
|
3523
3523
|
|
3524
3524
|
var worker = new RunWorker(jobId, testApiHandler, discoveryWorker, analyzeWorker, updaterWorker, logger);
|
3525
3525
|
var repoContentsPathDirectoryInfo = new DirectoryInfo(tempDirectory.DirectoryPath);
|
3526
|
-
var actualResult = await worker.RunAsync(job, repoContentsPathDirectoryInfo, "TEST-COMMIT-SHA", experimentsManager);
|
3526
|
+
var actualResult = await worker.RunAsync(job, repoContentsPathDirectoryInfo, repoContentsPathDirectoryInfo, "TEST-COMMIT-SHA", experimentsManager);
|
3527
3527
|
var actualApiMessages = testApiHandler.ReceivedMessages
|
3528
3528
|
.Select(m =>
|
3529
3529
|
{
|
@@ -544,6 +544,141 @@ public class RefreshSecurityUpdatePullRequestHandlerTests : UpdateHandlersTestsB
|
|
544
544
|
);
|
545
545
|
}
|
546
546
|
|
547
|
+
[Fact]
|
548
|
+
public async Task GeneratesUpdatePullRequest_OneDependencyUpToDate_OneOtherVulnerable()
|
549
|
+
{
|
550
|
+
await TestAsync(
|
551
|
+
job: new Job()
|
552
|
+
{
|
553
|
+
Dependencies = ["Some.Dependency"],
|
554
|
+
ExistingPullRequests = [
|
555
|
+
new() { Dependencies = [new() { DependencyName = "Some.Dependency", DependencyVersion = NuGetVersion.Parse("2.0.0") }] }
|
556
|
+
],
|
557
|
+
SecurityAdvisories = [
|
558
|
+
new() { DependencyName = "Some.Dependency", AffectedVersions = [Requirement.Parse(">= 1.0.0, < 2.0.0")] }
|
559
|
+
],
|
560
|
+
SecurityUpdatesOnly = true,
|
561
|
+
Source = CreateJobSource("/src"),
|
562
|
+
UpdatingAPullRequest = true,
|
563
|
+
},
|
564
|
+
files: [
|
565
|
+
("src/project1.csproj", "initial contents"),
|
566
|
+
("src/project2.csproj", "initial contents")
|
567
|
+
],
|
568
|
+
discoveryWorker: TestDiscoveryWorker.FromResults(
|
569
|
+
("/src", new WorkspaceDiscoveryResult()
|
570
|
+
{
|
571
|
+
Path = "/src",
|
572
|
+
Projects = [
|
573
|
+
new()
|
574
|
+
{
|
575
|
+
FilePath = "project1.csproj",
|
576
|
+
Dependencies = [new("Some.Dependency", "2.0.0", DependencyType.PackageReference, TargetFrameworks: ["net9.0"])],
|
577
|
+
ImportedFiles = [],
|
578
|
+
AdditionalFiles = [],
|
579
|
+
},
|
580
|
+
new()
|
581
|
+
{
|
582
|
+
FilePath = "project2.csproj",
|
583
|
+
Dependencies = [new("Some.Dependency", "1.0.0", DependencyType.PackageReference, TargetFrameworks: ["net9.0"])],
|
584
|
+
ImportedFiles = [],
|
585
|
+
AdditionalFiles = [],
|
586
|
+
}
|
587
|
+
]
|
588
|
+
})
|
589
|
+
),
|
590
|
+
analyzeWorker: new TestAnalyzeWorker(input =>
|
591
|
+
{
|
592
|
+
var repoRoot = input.Item1;
|
593
|
+
var discovery = input.Item2;
|
594
|
+
var dependencyInfo = input.Item3;
|
595
|
+
if (dependencyInfo.Name != "Some.Dependency")
|
596
|
+
{
|
597
|
+
throw new NotImplementedException($"Test didn't expect to update dependency {dependencyInfo.Name}");
|
598
|
+
}
|
599
|
+
|
600
|
+
if (dependencyInfo.Version != "1.0.0")
|
601
|
+
{
|
602
|
+
throw new NotImplementedException($"Only expected to update version 1.0.0, but found {dependencyInfo.Version}");
|
603
|
+
}
|
604
|
+
|
605
|
+
return Task.FromResult(new AnalysisResult()
|
606
|
+
{
|
607
|
+
CanUpdate = true,
|
608
|
+
UpdatedVersion = "2.0.0",
|
609
|
+
UpdatedDependencies = [],
|
610
|
+
});
|
611
|
+
}),
|
612
|
+
updaterWorker: new TestUpdaterWorker(async input =>
|
613
|
+
{
|
614
|
+
var repoRoot = input.Item1;
|
615
|
+
var workspacePath = input.Item2;
|
616
|
+
var dependencyName = input.Item3;
|
617
|
+
var previousVersion = input.Item4;
|
618
|
+
var newVersion = input.Item5;
|
619
|
+
var isTransitive = input.Item6;
|
620
|
+
|
621
|
+
await File.WriteAllTextAsync(Path.Join(repoRoot, workspacePath), "updated contents");
|
622
|
+
|
623
|
+
return new UpdateOperationResult()
|
624
|
+
{
|
625
|
+
UpdateOperations = [new DirectUpdate() { DependencyName = "Some.Dependency", NewVersion = NuGetVersion.Parse("2.0.0"), UpdatedFiles = ["/src/project2.csproj"] }],
|
626
|
+
};
|
627
|
+
}),
|
628
|
+
expectedUpdateHandler: RefreshSecurityUpdatePullRequestHandler.Instance,
|
629
|
+
expectedApiMessages: [
|
630
|
+
new UpdatedDependencyList()
|
631
|
+
{
|
632
|
+
Dependencies = [
|
633
|
+
new()
|
634
|
+
{
|
635
|
+
Name = "Some.Dependency",
|
636
|
+
Version = "2.0.0",
|
637
|
+
Requirements = [
|
638
|
+
new() { Requirement = "2.0.0", File = "/src/project1.csproj", Groups = ["dependencies"] },
|
639
|
+
],
|
640
|
+
},
|
641
|
+
new()
|
642
|
+
{
|
643
|
+
Name = "Some.Dependency",
|
644
|
+
Version = "1.0.0",
|
645
|
+
Requirements = [
|
646
|
+
new() { Requirement = "1.0.0", File = "/src/project2.csproj", Groups = ["dependencies"] },
|
647
|
+
],
|
648
|
+
},
|
649
|
+
],
|
650
|
+
DependencyFiles = ["/src/project1.csproj", "/src/project2.csproj"],
|
651
|
+
},
|
652
|
+
new IncrementMetric()
|
653
|
+
{
|
654
|
+
Metric = "updater.started",
|
655
|
+
Tags = new()
|
656
|
+
{
|
657
|
+
["operation"] = "update_security_pr",
|
658
|
+
}
|
659
|
+
},
|
660
|
+
new UpdatePullRequest()
|
661
|
+
{
|
662
|
+
DependencyNames = ["Some.Dependency"],
|
663
|
+
DependencyGroup = null,
|
664
|
+
UpdatedDependencyFiles = [
|
665
|
+
new()
|
666
|
+
{
|
667
|
+
Directory = "/src",
|
668
|
+
Name = "project2.csproj",
|
669
|
+
Content = "updated contents",
|
670
|
+
}
|
671
|
+
],
|
672
|
+
BaseCommitSha = "TEST-COMMIT-SHA",
|
673
|
+
CommitMessage = RunWorkerTests.TestPullRequestCommitMessage,
|
674
|
+
PrTitle = RunWorkerTests.TestPullRequestTitle,
|
675
|
+
PrBody = RunWorkerTests.TestPullRequestBody,
|
676
|
+
},
|
677
|
+
new MarkAsProcessed("TEST-COMMIT-SHA"),
|
678
|
+
]
|
679
|
+
);
|
680
|
+
}
|
681
|
+
|
547
682
|
[Fact]
|
548
683
|
public async Task GeneratesClosePullRequest_DependenciesRemoved()
|
549
684
|
{
|
@@ -89,7 +89,7 @@ public class UpdatedDependencyListTests
|
|
89
89
|
]
|
90
90
|
}
|
91
91
|
};
|
92
|
-
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discovery);
|
92
|
+
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discovery, repoRoot: temp.DirectoryPath, new TestLogger());
|
93
93
|
var expectedDependencyList = new UpdatedDependencyList()
|
94
94
|
{
|
95
95
|
Dependencies =
|
@@ -213,7 +213,7 @@ public class UpdatedDependencyListTests
|
|
213
213
|
};
|
214
214
|
|
215
215
|
// act
|
216
|
-
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discovery);
|
216
|
+
var updatedDependencyList = RunWorker.GetUpdatedDependencyListFromDiscovery(discovery, repoRoot: tempDir.DirectoryPath, new TestLogger());
|
217
217
|
var expectedDependencyList = new UpdatedDependencyList()
|
218
218
|
{
|
219
219
|
Dependencies = [],
|
@@ -29,7 +29,13 @@ public sealed class TemporaryDirectory : IDisposable
|
|
29
29
|
public void Dispose()
|
30
30
|
{
|
31
31
|
_environment.Dispose();
|
32
|
-
|
32
|
+
try
|
33
|
+
{
|
34
|
+
Directory.Delete(_rootDirectory, true);
|
35
|
+
}
|
36
|
+
catch
|
37
|
+
{
|
38
|
+
}
|
33
39
|
}
|
34
40
|
|
35
41
|
public async Task<TestFile[]> ReadFileContentsAsync(HashSet<string> filePaths)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dependabot-nuget
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.320.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dependabot
|
@@ -15,14 +15,14 @@ dependencies:
|
|
15
15
|
requirements:
|
16
16
|
- - '='
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version: 0.
|
18
|
+
version: 0.320.1
|
19
19
|
type: :runtime
|
20
20
|
prerelease: false
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
22
22
|
requirements:
|
23
23
|
- - '='
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version: 0.
|
25
|
+
version: 0.320.1
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rubyzip
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
@@ -580,7 +580,7 @@ licenses:
|
|
580
580
|
- MIT
|
581
581
|
metadata:
|
582
582
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
583
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
583
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.320.1
|
584
584
|
rdoc_options: []
|
585
585
|
require_paths:
|
586
586
|
- lib
|