dependabot-nuget 0.291.0 → 0.292.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/.editorconfig +1 -0
 - data/helpers/lib/NuGetUpdater/Directory.Build.props +1 -0
 - data/helpers/lib/NuGetUpdater/Directory.Packages.props +1 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/AnalyzeCommand.cs +1 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/CloneCommand.cs +1 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +15 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +2 -2
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/UpdateCommand.cs +1 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +2 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +87 -3
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +11 -0
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +19 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/BadRequirementException.cs +9 -0
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/CloneWorker.cs +39 -8
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +67 -12
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ErrorType.cs +1 -0
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +28 -5
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +1 -0
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/BadRequirement.cs +10 -0
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CommitOptions.cs +1 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyFileNotFound.cs +3 -2
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobErrorBase.cs +1 -2
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobRepoNotFound.cs +1 -4
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PrivateSourceAuthenticationFailure.cs +1 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UnknownError.cs +6 -2
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdateNotPossible.cs +1 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +9 -3
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +1 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/WebApplicationTargetsConditionPatcher.cs +12 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +0 -7
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +8 -3
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +4 -4
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Clone/CloneWorkerTests.cs +60 -2
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +10 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +56 -0
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +1 -0
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +1 -1
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +76 -40
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +20 -2
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs +2 -2
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.LockFile.cs +251 -0
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +6 -6
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +63 -5
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +38 -20
 - data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/ProjectHelperTests.cs +65 -0
 - data/helpers/lib/NuGetUpdater/global.json +1 -1
 - data/lib/dependabot/nuget/language.rb +21 -5
 - data/lib/dependabot/nuget/native_helpers.rb +2 -0
 - data/lib/dependabot/nuget/package_manager.rb +4 -4
 - metadata +10 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: fc0cf2e8a7f769337787f983af710cd8a4c30c464b1118f22589c522b3ed107a
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: b1e2fb7957b3cd3daf6331e199ebce5b0f94d84f42033de6e6f0e39bef4295b8
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 2c66ad9bb9ce3d932d0965f18fc4a6dde14ae022413343689a7c92f1e9439cca523447c20719f579bbc6c5fe6caeadab1dde0056f0a99e4a1afd09c7a5a79266
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: eb4601daef366ea15b011fb20a3efce1b976da73a4c4ba14c991a1aa9910a01d220b2cc46a086e47e7336432597b01f431d65ad4d40b431b1545996e1af613dd
         
     | 
| 
         @@ -4,6 +4,7 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
                <CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
         
     | 
| 
       5 
5 
     | 
    
         
             
                <NoWarn>$(NoWarn);NU1701</NoWarn>
         
     | 
| 
       6 
6 
     | 
    
         
             
                <Nullable>enable</Nullable>
         
     | 
| 
      
 7 
     | 
    
         
            +
                <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
         
     | 
| 
       7 
8 
     | 
    
         
             
              </PropertyGroup>
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
       9 
10 
     | 
    
         
             
              <Import Project="Directory.Common.props" />
         
     | 
| 
         @@ -36,7 +36,7 @@ 
     | 
|
| 
       36 
36 
     | 
    
         
             
                <PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
         
     | 
| 
       37 
37 
     | 
    
         
             
                <PackageVersion Include="System.Threading.Tasks.Dataflow" Version="9.0.0" />
         
     | 
| 
       38 
38 
     | 
    
         
             
                <PackageVersion Include="xunit" Version="2.9.2" />
         
     | 
| 
       39 
     | 
    
         
            -
                <PackageVersion Include="xunit.runner.visualstudio" Version=" 
     | 
| 
      
 39 
     | 
    
         
            +
                <PackageVersion Include="xunit.runner.visualstudio" Version="3.0.0" />
         
     | 
| 
       40 
40 
     | 
    
         
             
              </ItemGroup>
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
42 
     | 
    
         
             
            </Project>
         
     | 
| 
         @@ -29,7 +29,7 @@ internal static class AnalyzeCommand 
     | 
|
| 
       29 
29 
     | 
    
         
             
                    command.SetHandler(async (jobPath, repoRoot, discoveryPath, dependencyPath, analysisDirectory) =>
         
     | 
| 
       30 
30 
     | 
    
         
             
                    {
         
     | 
| 
       31 
31 
     | 
    
         
             
                        var logger = new ConsoleLogger();
         
     | 
| 
       32 
     | 
    
         
            -
                        var experimentsManager = await ExperimentsManager.FromJobFileAsync(jobPath.FullName 
     | 
| 
      
 32 
     | 
    
         
            +
                        var (experimentsManager, _errorResult) = await ExperimentsManager.FromJobFileAsync(jobPath.FullName);
         
     | 
| 
       33 
33 
     | 
    
         
             
                        var worker = new AnalyzeWorker(experimentsManager, logger);
         
     | 
| 
       34 
34 
     | 
    
         
             
                        await worker.RunAsync(repoRoot.FullName, discoveryPath.FullName, dependencyPath.FullName, analysisDirectory.FullName);
         
     | 
| 
       35 
35 
     | 
    
         
             
                    }, JobPathOption, RepoRootOption, DiscoveryFilePathOption, DependencyFilePathOption, AnalysisFolderOption);
         
     | 
| 
         @@ -30,7 +30,7 @@ internal static class CloneCommand 
     | 
|
| 
       30 
30 
     | 
    
         
             
                        var apiHandler = new HttpApiHandler(apiUrl.ToString(), jobId);
         
     | 
| 
       31 
31 
     | 
    
         
             
                        var logger = new ConsoleLogger();
         
     | 
| 
       32 
32 
     | 
    
         
             
                        var gitCommandHandler = new ShellGitCommandHandler(logger);
         
     | 
| 
       33 
     | 
    
         
            -
                        var worker = new CloneWorker(apiHandler, gitCommandHandler 
     | 
| 
      
 33 
     | 
    
         
            +
                        var worker = new CloneWorker(jobId, apiHandler, gitCommandHandler);
         
     | 
| 
       34 
34 
     | 
    
         
             
                        var exitCode = await worker.RunAsync(jobPath, repoContentsPath);
         
     | 
| 
       35 
35 
     | 
    
         
             
                        setExitCode(exitCode);
         
     | 
| 
       36 
36 
     | 
    
         
             
                    }, JobPathOption, RepoContentsPathOption, ApiUrlOption, JobIdOption);
         
     | 
| 
         @@ -26,8 +26,22 @@ internal static class DiscoverCommand 
     | 
|
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
                    command.SetHandler(async (jobPath, repoRoot, workspace, outputPath) =>
         
     | 
| 
       28 
28 
     | 
    
         
             
                    {
         
     | 
| 
      
 29 
     | 
    
         
            +
                        var (experimentsManager, errorResult) = await ExperimentsManager.FromJobFileAsync(jobPath.FullName);
         
     | 
| 
      
 30 
     | 
    
         
            +
                        if (errorResult is not null)
         
     | 
| 
      
 31 
     | 
    
         
            +
                        {
         
     | 
| 
      
 32 
     | 
    
         
            +
                            // to make testing easier, this should be a `WorkspaceDiscoveryResult` object
         
     | 
| 
      
 33 
     | 
    
         
            +
                            var discoveryErrorResult = new WorkspaceDiscoveryResult
         
     | 
| 
      
 34 
     | 
    
         
            +
                            {
         
     | 
| 
      
 35 
     | 
    
         
            +
                                Path = workspace,
         
     | 
| 
      
 36 
     | 
    
         
            +
                                Projects = [],
         
     | 
| 
      
 37 
     | 
    
         
            +
                                ErrorType = errorResult.ErrorType,
         
     | 
| 
      
 38 
     | 
    
         
            +
                                ErrorDetails = errorResult.ErrorDetails,
         
     | 
| 
      
 39 
     | 
    
         
            +
                            };
         
     | 
| 
      
 40 
     | 
    
         
            +
                            await DiscoveryWorker.WriteResultsAsync(repoRoot.FullName, outputPath.FullName, discoveryErrorResult);
         
     | 
| 
      
 41 
     | 
    
         
            +
                            return;
         
     | 
| 
      
 42 
     | 
    
         
            +
                        }
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
       29 
44 
     | 
    
         
             
                        var logger = new ConsoleLogger();
         
     | 
| 
       30 
     | 
    
         
            -
                        var experimentsManager = await ExperimentsManager.FromJobFileAsync(jobPath.FullName, logger);
         
     | 
| 
       31 
45 
     | 
    
         
             
                        var worker = new DiscoveryWorker(experimentsManager, logger);
         
     | 
| 
       32 
46 
     | 
    
         
             
                        await worker.RunAsync(repoRoot.FullName, workspace, outputPath.FullName);
         
     | 
| 
       33 
47 
     | 
    
         
             
                    }, JobPathOption, RepoRootOption, WorkspaceOption, OutputOption);
         
     | 
| 
         @@ -33,12 +33,12 @@ internal static class RunCommand 
     | 
|
| 
       33 
33 
     | 
    
         
             
                    command.SetHandler(async (jobPath, repoContentsPath, apiUrl, jobId, outputPath, baseCommitSha) =>
         
     | 
| 
       34 
34 
     | 
    
         
             
                    {
         
     | 
| 
       35 
35 
     | 
    
         
             
                        var apiHandler = new HttpApiHandler(apiUrl.ToString(), jobId);
         
     | 
| 
      
 36 
     | 
    
         
            +
                        var (experimentsManager, _errorResult) = await ExperimentsManager.FromJobFileAsync(jobPath.FullName);
         
     | 
| 
       36 
37 
     | 
    
         
             
                        var logger = new ConsoleLogger();
         
     | 
| 
       37 
     | 
    
         
            -
                        var experimentsManager = await ExperimentsManager.FromJobFileAsync(jobPath.FullName, logger);
         
     | 
| 
       38 
38 
     | 
    
         
             
                        var discoverWorker = new DiscoveryWorker(experimentsManager, logger);
         
     | 
| 
       39 
39 
     | 
    
         
             
                        var analyzeWorker = new AnalyzeWorker(experimentsManager, logger);
         
     | 
| 
       40 
40 
     | 
    
         
             
                        var updateWorker = new UpdaterWorker(experimentsManager, logger);
         
     | 
| 
       41 
     | 
    
         
            -
                        var worker = new RunWorker(apiHandler, discoverWorker, analyzeWorker, updateWorker, logger);
         
     | 
| 
      
 41 
     | 
    
         
            +
                        var worker = new RunWorker(jobId, apiHandler, discoverWorker, analyzeWorker, updateWorker, logger);
         
     | 
| 
       42 
42 
     | 
    
         
             
                        await worker.RunAsync(jobPath, repoContentsPath, baseCommitSha, outputPath);
         
     | 
| 
       43 
43 
     | 
    
         
             
                    }, JobPathOption, RepoContentsPathOption, ApiUrlOption, JobIdOption, OutputPathOption, BaseCommitShaOption);
         
     | 
| 
       44 
44 
     | 
    
         | 
| 
         @@ -33,8 +33,8 @@ internal static class UpdateCommand 
     | 
|
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
                    command.SetHandler(async (jobPath, repoRoot, solutionOrProjectFile, dependencyName, newVersion, previousVersion, isTransitive, resultOutputPath) =>
         
     | 
| 
       35 
35 
     | 
    
         
             
                    {
         
     | 
| 
      
 36 
     | 
    
         
            +
                        var (experimentsManager, _errorResult) = await ExperimentsManager.FromJobFileAsync(jobPath.FullName);
         
     | 
| 
       36 
37 
     | 
    
         
             
                        var logger = new ConsoleLogger();
         
     | 
| 
       37 
     | 
    
         
            -
                        var experimentsManager = await ExperimentsManager.FromJobFileAsync(jobPath.FullName, logger);
         
     | 
| 
       38 
38 
     | 
    
         
             
                        var worker = new UpdaterWorker(experimentsManager, logger);
         
     | 
| 
       39 
39 
     | 
    
         
             
                        await worker.RunAsync(repoRoot.FullName, solutionOrProjectFile.FullName, dependencyName, previousVersion, newVersion, isTransitive, resultOutputPath);
         
     | 
| 
       40 
40 
     | 
    
         
             
                        setExitCode(0);
         
     | 
| 
         @@ -345,7 +345,8 @@ public partial class EntryPointTests 
     | 
|
| 
       345 
345 
     | 
    
         
             
                                {
         
     | 
| 
       346 
346 
     | 
    
         
             
                                    if (args[i] == "--job-path")
         
     | 
| 
       347 
347 
     | 
    
         
             
                                    {
         
     | 
| 
       348 
     | 
    
         
            -
                                         
     | 
| 
      
 348 
     | 
    
         
            +
                                        var experimentsResult = await ExperimentsManager.FromJobFileAsync(args[i + 1]);
         
     | 
| 
      
 349 
     | 
    
         
            +
                                        experimentsManager = experimentsResult.ExperimentsManager;
         
     | 
| 
       349 
350 
     | 
    
         
             
                                    }
         
     | 
| 
       350 
351 
     | 
    
         
             
                                }
         
     | 
| 
       351 
352 
     | 
    
         | 
| 
         @@ -388,6 +388,83 @@ public partial class EntryPointTests 
     | 
|
| 
       388 
388 
     | 
    
         
             
                        );
         
     | 
| 
       389 
389 
     | 
    
         
             
                    }
         
     | 
| 
       390 
390 
     | 
    
         | 
| 
      
 391 
     | 
    
         
            +
                    [Fact]
         
     | 
| 
      
 392 
     | 
    
         
            +
                    public async Task JobFileParseErrorIsReported_InvalidJson()
         
     | 
| 
      
 393 
     | 
    
         
            +
                    {
         
     | 
| 
      
 394 
     | 
    
         
            +
                        using var testDirectory = new TemporaryDirectory();
         
     | 
| 
      
 395 
     | 
    
         
            +
                        var jobFilePath = Path.Combine(testDirectory.DirectoryPath, "job.json");
         
     | 
| 
      
 396 
     | 
    
         
            +
                        var resultFilePath = Path.Combine(testDirectory.DirectoryPath, DiscoveryWorker.DiscoveryResultFileName);
         
     | 
| 
      
 397 
     | 
    
         
            +
                        await File.WriteAllTextAsync(jobFilePath, "not json");
         
     | 
| 
      
 398 
     | 
    
         
            +
                        await RunAsync(path =>
         
     | 
| 
      
 399 
     | 
    
         
            +
                            [
         
     | 
| 
      
 400 
     | 
    
         
            +
                                "discover",
         
     | 
| 
      
 401 
     | 
    
         
            +
                                "--job-path",
         
     | 
| 
      
 402 
     | 
    
         
            +
                                jobFilePath,
         
     | 
| 
      
 403 
     | 
    
         
            +
                                "--repo-root",
         
     | 
| 
      
 404 
     | 
    
         
            +
                                path,
         
     | 
| 
      
 405 
     | 
    
         
            +
                                "--workspace",
         
     | 
| 
      
 406 
     | 
    
         
            +
                                "/",
         
     | 
| 
      
 407 
     | 
    
         
            +
                                "--output",
         
     | 
| 
      
 408 
     | 
    
         
            +
                                resultFilePath
         
     | 
| 
      
 409 
     | 
    
         
            +
                            ],
         
     | 
| 
      
 410 
     | 
    
         
            +
                            initialFiles: [],
         
     | 
| 
      
 411 
     | 
    
         
            +
                            expectedResult: new()
         
     | 
| 
      
 412 
     | 
    
         
            +
                            {
         
     | 
| 
      
 413 
     | 
    
         
            +
                                Path = "/",
         
     | 
| 
      
 414 
     | 
    
         
            +
                                Projects = [],
         
     | 
| 
      
 415 
     | 
    
         
            +
                                ErrorType = ErrorType.Unknown,
         
     | 
| 
      
 416 
     | 
    
         
            +
                                ErrorDetailsPattern = "JsonException",
         
     | 
| 
      
 417 
     | 
    
         
            +
                            }
         
     | 
| 
      
 418 
     | 
    
         
            +
                        );
         
     | 
| 
      
 419 
     | 
    
         
            +
                    }
         
     | 
| 
      
 420 
     | 
    
         
            +
             
     | 
| 
      
 421 
     | 
    
         
            +
                    [Fact]
         
     | 
| 
      
 422 
     | 
    
         
            +
                    public async Task JobFileParseErrorIsReported_BadRequirement()
         
     | 
| 
      
 423 
     | 
    
         
            +
                    {
         
     | 
| 
      
 424 
     | 
    
         
            +
                        using var testDirectory = new TemporaryDirectory();
         
     | 
| 
      
 425 
     | 
    
         
            +
                        var jobFilePath = Path.Combine(testDirectory.DirectoryPath, "job.json");
         
     | 
| 
      
 426 
     | 
    
         
            +
                        var resultFilePath = Path.Combine(testDirectory.DirectoryPath, DiscoveryWorker.DiscoveryResultFileName);
         
     | 
| 
      
 427 
     | 
    
         
            +
             
     | 
| 
      
 428 
     | 
    
         
            +
                        // write a job file with a valid shape, but invalid requirement
         
     | 
| 
      
 429 
     | 
    
         
            +
                        await File.WriteAllTextAsync(jobFilePath, """
         
     | 
| 
      
 430 
     | 
    
         
            +
                            {
         
     | 
| 
      
 431 
     | 
    
         
            +
                                "job": {
         
     | 
| 
      
 432 
     | 
    
         
            +
                                    "source": {
         
     | 
| 
      
 433 
     | 
    
         
            +
                                        "provider": "github",
         
     | 
| 
      
 434 
     | 
    
         
            +
                                        "repo": "test/repo"
         
     | 
| 
      
 435 
     | 
    
         
            +
                                    },
         
     | 
| 
      
 436 
     | 
    
         
            +
                                    "security-advisories": [
         
     | 
| 
      
 437 
     | 
    
         
            +
                                        {
         
     | 
| 
      
 438 
     | 
    
         
            +
                                            "dependency-name": "Some.Dependency",
         
     | 
| 
      
 439 
     | 
    
         
            +
                                            "affected-versions": ["not a valid requirement"]
         
     | 
| 
      
 440 
     | 
    
         
            +
                                        }
         
     | 
| 
      
 441 
     | 
    
         
            +
                                    ]
         
     | 
| 
      
 442 
     | 
    
         
            +
                                }
         
     | 
| 
      
 443 
     | 
    
         
            +
                            }
         
     | 
| 
      
 444 
     | 
    
         
            +
                            """);
         
     | 
| 
      
 445 
     | 
    
         
            +
                        await RunAsync(path =>
         
     | 
| 
      
 446 
     | 
    
         
            +
                            [
         
     | 
| 
      
 447 
     | 
    
         
            +
                                "discover",
         
     | 
| 
      
 448 
     | 
    
         
            +
                                "--job-path",
         
     | 
| 
      
 449 
     | 
    
         
            +
                                jobFilePath,
         
     | 
| 
      
 450 
     | 
    
         
            +
                                "--repo-root",
         
     | 
| 
      
 451 
     | 
    
         
            +
                                path,
         
     | 
| 
      
 452 
     | 
    
         
            +
                                "--workspace",
         
     | 
| 
      
 453 
     | 
    
         
            +
                                "/",
         
     | 
| 
      
 454 
     | 
    
         
            +
                                "--output",
         
     | 
| 
      
 455 
     | 
    
         
            +
                                resultFilePath
         
     | 
| 
      
 456 
     | 
    
         
            +
                            ],
         
     | 
| 
      
 457 
     | 
    
         
            +
                            initialFiles: [],
         
     | 
| 
      
 458 
     | 
    
         
            +
                            expectedResult: new()
         
     | 
| 
      
 459 
     | 
    
         
            +
                            {
         
     | 
| 
      
 460 
     | 
    
         
            +
                                Path = "/",
         
     | 
| 
      
 461 
     | 
    
         
            +
                                Projects = [],
         
     | 
| 
      
 462 
     | 
    
         
            +
                                ErrorType = ErrorType.BadRequirement,
         
     | 
| 
      
 463 
     | 
    
         
            +
                                ErrorDetailsPattern = "not a valid requirement",
         
     | 
| 
      
 464 
     | 
    
         
            +
                            }
         
     | 
| 
      
 465 
     | 
    
         
            +
                        );
         
     | 
| 
      
 466 
     | 
    
         
            +
                    }
         
     | 
| 
      
 467 
     | 
    
         
            +
             
     | 
| 
       391 
468 
     | 
    
         
             
                    private static async Task RunAsync(
         
     | 
| 
       392 
469 
     | 
    
         
             
                        Func<string, string[]> getArgs,
         
     | 
| 
       393 
470 
     | 
    
         
             
                        TestFile[] initialFiles,
         
     | 
| 
         @@ -406,6 +483,7 @@ public partial class EntryPointTests 
     | 
|
| 
       406 
483 
     | 
    
         
             
                            var originalErr = Console.Error;
         
     | 
| 
       407 
484 
     | 
    
         
             
                            Console.SetOut(writer);
         
     | 
| 
       408 
485 
     | 
    
         
             
                            Console.SetError(writer);
         
     | 
| 
      
 486 
     | 
    
         
            +
                            string? resultPath = null;
         
     | 
| 
       409 
487 
     | 
    
         | 
| 
       410 
488 
     | 
    
         
             
                            try
         
     | 
| 
       411 
489 
     | 
    
         
             
                            {
         
     | 
| 
         @@ -416,9 +494,15 @@ public partial class EntryPointTests 
     | 
|
| 
       416 
494 
     | 
    
         
             
                                // manually pull out the experiments manager for the validate step below
         
     | 
| 
       417 
495 
     | 
    
         
             
                                for (int i = 0; i < args.Length - 1; i++)
         
     | 
| 
       418 
496 
     | 
    
         
             
                                {
         
     | 
| 
       419 
     | 
    
         
            -
                                     
     | 
| 
      
 497 
     | 
    
         
            +
                                    switch (args[i])
         
     | 
| 
       420 
498 
     | 
    
         
             
                                    {
         
     | 
| 
       421 
     | 
    
         
            -
                                         
     | 
| 
      
 499 
     | 
    
         
            +
                                        case "--job-path":
         
     | 
| 
      
 500 
     | 
    
         
            +
                                            var experimentsResult = await ExperimentsManager.FromJobFileAsync(args[i + 1]);
         
     | 
| 
      
 501 
     | 
    
         
            +
                                            experimentsManager = experimentsResult.ExperimentsManager;
         
     | 
| 
      
 502 
     | 
    
         
            +
                                            break;
         
     | 
| 
      
 503 
     | 
    
         
            +
                                        case "--output":
         
     | 
| 
      
 504 
     | 
    
         
            +
                                            resultPath = args[i + 1];
         
     | 
| 
      
 505 
     | 
    
         
            +
                                            break;
         
     | 
| 
       422 
506 
     | 
    
         
             
                                    }
         
     | 
| 
       423 
507 
     | 
    
         
             
                                }
         
     | 
| 
       424 
508 
     | 
    
         | 
| 
         @@ -434,7 +518,7 @@ public partial class EntryPointTests 
     | 
|
| 
       434 
518 
     | 
    
         
             
                                Console.SetError(originalErr);
         
     | 
| 
       435 
519 
     | 
    
         
             
                            }
         
     | 
| 
       436 
520 
     | 
    
         | 
| 
       437 
     | 
    
         
            -
                             
     | 
| 
      
 521 
     | 
    
         
            +
                            resultPath ??= Path.Join(path, DiscoveryWorker.DiscoveryResultFileName);
         
     | 
| 
       438 
522 
     | 
    
         
             
                            var resultJson = await File.ReadAllTextAsync(resultPath);
         
     | 
| 
       439 
523 
     | 
    
         
             
                            var resultObject = JsonSerializer.Deserialize<WorkspaceDiscoveryResult>(resultJson, DiscoveryWorker.SerializerOptions);
         
     | 
| 
       440 
524 
     | 
    
         
             
                            return resultObject!;
         
     | 
| 
         @@ -62,6 +62,17 @@ public partial class AnalyzeWorker : IAnalyzeWorker 
     | 
|
| 
       62 
62 
     | 
    
         
             
                            UpdatedDependencies = [],
         
     | 
| 
       63 
63 
     | 
    
         
             
                        };
         
     | 
| 
       64 
64 
     | 
    
         
             
                    }
         
     | 
| 
      
 65 
     | 
    
         
            +
                    catch (Exception ex)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    {
         
     | 
| 
      
 67 
     | 
    
         
            +
                        analysisResult = new AnalysisResult
         
     | 
| 
      
 68 
     | 
    
         
            +
                        {
         
     | 
| 
      
 69 
     | 
    
         
            +
                            ErrorType = ErrorType.Unknown,
         
     | 
| 
      
 70 
     | 
    
         
            +
                            ErrorDetails = ex.ToString(),
         
     | 
| 
      
 71 
     | 
    
         
            +
                            UpdatedVersion = string.Empty,
         
     | 
| 
      
 72 
     | 
    
         
            +
                            CanUpdate = false,
         
     | 
| 
      
 73 
     | 
    
         
            +
                            UpdatedDependencies = [],
         
     | 
| 
      
 74 
     | 
    
         
            +
                        };
         
     | 
| 
      
 75 
     | 
    
         
            +
                    }
         
     | 
| 
       65 
76 
     | 
    
         | 
| 
       66 
77 
     | 
    
         
             
                    return analysisResult;
         
     | 
| 
       67 
78 
     | 
    
         
             
                }
         
     | 
| 
         @@ -7,7 +7,25 @@ public class RequirementConverter : JsonConverter<Requirement> 
     | 
|
| 
       7 
7 
     | 
    
         
             
            {
         
     | 
| 
       8 
8 
     | 
    
         
             
                public override Requirement? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
         
     | 
| 
       9 
9 
     | 
    
         
             
                {
         
     | 
| 
       10 
     | 
    
         
            -
                     
     | 
| 
      
 10 
     | 
    
         
            +
                    if (reader.TokenType != JsonTokenType.String)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    {
         
     | 
| 
      
 12 
     | 
    
         
            +
                        throw new BadRequirementException($"Expected token type {nameof(JsonTokenType.String)}, but found {reader.TokenType}.");
         
     | 
| 
      
 13 
     | 
    
         
            +
                    }
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    var text = reader.GetString();
         
     | 
| 
      
 16 
     | 
    
         
            +
                    if (text is null)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    {
         
     | 
| 
      
 18 
     | 
    
         
            +
                        throw new BadRequirementException("Unexpected null token.");
         
     | 
| 
      
 19 
     | 
    
         
            +
                    }
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                    try
         
     | 
| 
      
 22 
     | 
    
         
            +
                    {
         
     | 
| 
      
 23 
     | 
    
         
            +
                        return Requirement.Parse(text);
         
     | 
| 
      
 24 
     | 
    
         
            +
                    }
         
     | 
| 
      
 25 
     | 
    
         
            +
                    catch
         
     | 
| 
      
 26 
     | 
    
         
            +
                    {
         
     | 
| 
      
 27 
     | 
    
         
            +
                        throw new BadRequirementException(text);
         
     | 
| 
      
 28 
     | 
    
         
            +
                    }
         
     | 
| 
       11 
29 
     | 
    
         
             
                }
         
     | 
| 
       12 
30 
     | 
    
         | 
| 
       13 
31 
     | 
    
         
             
                public override void Write(Utf8JsonWriter writer, Requirement value, JsonSerializerOptions options)
         
     | 
| 
         @@ -9,23 +9,49 @@ namespace NuGetUpdater.Core.Clone; 
     | 
|
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
            public class CloneWorker
         
     | 
| 
       11 
11 
     | 
    
         
             
            {
         
     | 
| 
      
 12 
     | 
    
         
            +
                private readonly string _jobId;
         
     | 
| 
       12 
13 
     | 
    
         
             
                private readonly IApiHandler _apiHandler;
         
     | 
| 
       13 
14 
     | 
    
         
             
                private readonly IGitCommandHandler _gitCommandHandler;
         
     | 
| 
       14 
     | 
    
         
            -
                private readonly ILogger _logger;
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
                public CloneWorker(IApiHandler apiHandler, IGitCommandHandler gitCommandHandler 
     | 
| 
      
 16 
     | 
    
         
            +
                public CloneWorker(string jobId, IApiHandler apiHandler, IGitCommandHandler gitCommandHandler)
         
     | 
| 
       17 
17 
     | 
    
         
             
                {
         
     | 
| 
      
 18 
     | 
    
         
            +
                    _jobId = jobId;
         
     | 
| 
       18 
19 
     | 
    
         
             
                    _apiHandler = apiHandler;
         
     | 
| 
       19 
20 
     | 
    
         
             
                    _gitCommandHandler = gitCommandHandler;
         
     | 
| 
       20 
     | 
    
         
            -
                    _logger = logger;
         
     | 
| 
       21 
21 
     | 
    
         
             
                }
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                // entrypoint for cli
         
     | 
| 
       24 
24 
     | 
    
         
             
                public async Task<int> RunAsync(FileInfo jobFilePath, DirectoryInfo repoContentsPath)
         
     | 
| 
       25 
25 
     | 
    
         
             
                {
         
     | 
| 
       26 
26 
     | 
    
         
             
                    var jobFileContent = await File.ReadAllTextAsync(jobFilePath.FullName);
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                     
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                    // only a limited set of errors can occur here
         
     | 
| 
      
 29 
     | 
    
         
            +
                    JobFile? jobFile = null;
         
     | 
| 
      
 30 
     | 
    
         
            +
                    JobErrorBase? parseError = null;
         
     | 
| 
      
 31 
     | 
    
         
            +
                    try
         
     | 
| 
      
 32 
     | 
    
         
            +
                    {
         
     | 
| 
      
 33 
     | 
    
         
            +
                        jobFile = RunWorker.Deserialize(jobFileContent);
         
     | 
| 
      
 34 
     | 
    
         
            +
                        if (jobFile is null)
         
     | 
| 
      
 35 
     | 
    
         
            +
                        {
         
     | 
| 
      
 36 
     | 
    
         
            +
                            parseError = new UnknownError(new Exception("Job file could not be deserialized"), _jobId);
         
     | 
| 
      
 37 
     | 
    
         
            +
                        }
         
     | 
| 
      
 38 
     | 
    
         
            +
                    }
         
     | 
| 
      
 39 
     | 
    
         
            +
                    catch (BadRequirementException ex)
         
     | 
| 
      
 40 
     | 
    
         
            +
                    {
         
     | 
| 
      
 41 
     | 
    
         
            +
                        parseError = new BadRequirement(ex.Message);
         
     | 
| 
      
 42 
     | 
    
         
            +
                    }
         
     | 
| 
      
 43 
     | 
    
         
            +
                    catch (Exception ex)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    {
         
     | 
| 
      
 45 
     | 
    
         
            +
                        parseError = new UnknownError(ex, _jobId);
         
     | 
| 
      
 46 
     | 
    
         
            +
                    }
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                    if (parseError is not null)
         
     | 
| 
      
 49 
     | 
    
         
            +
                    {
         
     | 
| 
      
 50 
     | 
    
         
            +
                        await ReportError(parseError);
         
     | 
| 
      
 51 
     | 
    
         
            +
                        return 1;
         
     | 
| 
      
 52 
     | 
    
         
            +
                    }
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                    var result = await RunAsync(jobFile!.Job, repoContentsPath.FullName);
         
     | 
| 
       29 
55 
     | 
    
         
             
                    return result;
         
     | 
| 
       30 
56 
     | 
    
         
             
                }
         
     | 
| 
       31 
57 
     | 
    
         | 
| 
         @@ -48,19 +74,24 @@ public class CloneWorker 
     | 
|
| 
       48 
74 
     | 
    
         
             
                    }
         
     | 
| 
       49 
75 
     | 
    
         
             
                    catch (Exception ex)
         
     | 
| 
       50 
76 
     | 
    
         
             
                    {
         
     | 
| 
       51 
     | 
    
         
            -
                        error = new UnknownError(ex 
     | 
| 
      
 77 
     | 
    
         
            +
                        error = new UnknownError(ex, _jobId);
         
     | 
| 
       52 
78 
     | 
    
         
             
                    }
         
     | 
| 
       53 
79 
     | 
    
         | 
| 
       54 
80 
     | 
    
         
             
                    if (error is not null)
         
     | 
| 
       55 
81 
     | 
    
         
             
                    {
         
     | 
| 
       56 
     | 
    
         
            -
                        await  
     | 
| 
       57 
     | 
    
         
            -
                        await _apiHandler.MarkAsProcessed(new("unknown"));
         
     | 
| 
      
 82 
     | 
    
         
            +
                        await ReportError(error);
         
     | 
| 
       58 
83 
     | 
    
         
             
                        return 1;
         
     | 
| 
       59 
84 
     | 
    
         
             
                    }
         
     | 
| 
       60 
85 
     | 
    
         | 
| 
       61 
86 
     | 
    
         
             
                    return 0;
         
     | 
| 
       62 
87 
     | 
    
         
             
                }
         
     | 
| 
       63 
88 
     | 
    
         | 
| 
      
 89 
     | 
    
         
            +
                private async Task ReportError(JobErrorBase error)
         
     | 
| 
      
 90 
     | 
    
         
            +
                {
         
     | 
| 
      
 91 
     | 
    
         
            +
                    await _apiHandler.RecordUpdateJobError(error);
         
     | 
| 
      
 92 
     | 
    
         
            +
                    await _apiHandler.MarkAsProcessed(new("unknown"));
         
     | 
| 
      
 93 
     | 
    
         
            +
                }
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
       64 
95 
     | 
    
         
             
                internal static CommandArguments[] GetAllCommandArgs(Job job, string repoContentsPath)
         
     | 
| 
       65 
96 
     | 
    
         
             
                {
         
     | 
| 
       66 
97 
     | 
    
         
             
                    var commandArgs = new List<CommandArguments>()
         
     | 
| 
         @@ -8,6 +8,8 @@ using Microsoft.Build.Definition; 
     | 
|
| 
       8 
8 
     | 
    
         
             
            using Microsoft.Build.Evaluation;
         
     | 
| 
       9 
9 
     | 
    
         
             
            using Microsoft.Build.Exceptions;
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
      
 11 
     | 
    
         
            +
            using NuGet.Frameworks;
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       11 
13 
     | 
    
         
             
            using NuGetUpdater.Core.Analyze;
         
     | 
| 
       12 
14 
     | 
    
         
             
            using NuGetUpdater.Core.Utilities;
         
     | 
| 
       13 
15 
     | 
    
         | 
| 
         @@ -57,6 +59,16 @@ public partial class DiscoveryWorker : IDiscoveryWorker 
     | 
|
| 
       57 
59 
     | 
    
         
             
                            Projects = [],
         
     | 
| 
       58 
60 
     | 
    
         
             
                        };
         
     | 
| 
       59 
61 
     | 
    
         
             
                    }
         
     | 
| 
      
 62 
     | 
    
         
            +
                    catch (Exception ex)
         
     | 
| 
      
 63 
     | 
    
         
            +
                    {
         
     | 
| 
      
 64 
     | 
    
         
            +
                        result = new WorkspaceDiscoveryResult
         
     | 
| 
      
 65 
     | 
    
         
            +
                        {
         
     | 
| 
      
 66 
     | 
    
         
            +
                            ErrorType = ErrorType.Unknown,
         
     | 
| 
      
 67 
     | 
    
         
            +
                            ErrorDetails = ex.ToString(),
         
     | 
| 
      
 68 
     | 
    
         
            +
                            Path = workspacePath,
         
     | 
| 
      
 69 
     | 
    
         
            +
                            Projects = [],
         
     | 
| 
      
 70 
     | 
    
         
            +
                        };
         
     | 
| 
      
 71 
     | 
    
         
            +
                    }
         
     | 
| 
       60 
72 
     | 
    
         | 
| 
       61 
73 
     | 
    
         
             
                    return result;
         
     | 
| 
       62 
74 
     | 
    
         
             
                }
         
     | 
| 
         @@ -364,19 +376,62 @@ public partial class DiscoveryWorker : IDiscoveryWorker 
     | 
|
| 
       364 
376 
     | 
    
         
             
                                }
         
     | 
| 
       365 
377 
     | 
    
         
             
                            }
         
     | 
| 
       366 
378 
     | 
    
         | 
| 
       367 
     | 
    
         
            -
                            if ( 
     | 
| 
       368 
     | 
    
         
            -
                                packagesConfigResult is not null &&
         
     | 
| 
       369 
     | 
    
         
            -
                                packagesConfigResult.Dependencies.Length > 0)
         
     | 
| 
      
 379 
     | 
    
         
            +
                            if (packagesConfigResult is not null)
         
     | 
| 
       370 
380 
     | 
    
         
             
                            {
         
     | 
| 
       371 
     | 
    
         
            -
                                //  
     | 
| 
       372 
     | 
    
         
            -
                                results 
     | 
| 
      
 381 
     | 
    
         
            +
                                // we might have to merge this dependency with some others
         
     | 
| 
      
 382 
     | 
    
         
            +
                                if (results.TryGetValue(relativeProjectPath, out var existingProjectDiscovery))
         
     | 
| 
      
 383 
     | 
    
         
            +
                                {
         
     | 
| 
      
 384 
     | 
    
         
            +
                                    // merge SDK and packages.config results
         
     | 
| 
      
 385 
     | 
    
         
            +
                                    var mergedDependencies = existingProjectDiscovery.Dependencies.Concat(packagesConfigResult.Dependencies)
         
     | 
| 
      
 386 
     | 
    
         
            +
                                        .DistinctBy(d => d.Name, StringComparer.OrdinalIgnoreCase)
         
     | 
| 
      
 387 
     | 
    
         
            +
                                        .OrderBy(d => d.Name)
         
     | 
| 
      
 388 
     | 
    
         
            +
                                        .ToImmutableArray();
         
     | 
| 
      
 389 
     | 
    
         
            +
                                    var mergedTargetFrameworks = existingProjectDiscovery.TargetFrameworks.Concat(packagesConfigResult.TargetFrameworks)
         
     | 
| 
      
 390 
     | 
    
         
            +
                                        .Select(t =>
         
     | 
| 
      
 391 
     | 
    
         
            +
                                        {
         
     | 
| 
      
 392 
     | 
    
         
            +
                                            try
         
     | 
| 
      
 393 
     | 
    
         
            +
                                            {
         
     | 
| 
      
 394 
     | 
    
         
            +
                                                var tfm = NuGetFramework.Parse(t);
         
     | 
| 
      
 395 
     | 
    
         
            +
                                                return tfm.GetShortFolderName();
         
     | 
| 
      
 396 
     | 
    
         
            +
                                            }
         
     | 
| 
      
 397 
     | 
    
         
            +
                                            catch
         
     | 
| 
      
 398 
     | 
    
         
            +
                                            {
         
     | 
| 
      
 399 
     | 
    
         
            +
                                                return string.Empty;
         
     | 
| 
      
 400 
     | 
    
         
            +
                                            }
         
     | 
| 
      
 401 
     | 
    
         
            +
                                        })
         
     | 
| 
      
 402 
     | 
    
         
            +
                                        .Where(tfm => !string.IsNullOrEmpty(tfm))
         
     | 
| 
      
 403 
     | 
    
         
            +
                                        .Distinct()
         
     | 
| 
      
 404 
     | 
    
         
            +
                                        .OrderBy(tfm => tfm)
         
     | 
| 
      
 405 
     | 
    
         
            +
                                        .ToImmutableArray();
         
     | 
| 
      
 406 
     | 
    
         
            +
                                    var mergedProperties = existingProjectDiscovery.Properties; // packages.config discovery doesn't produce properties
         
     | 
| 
      
 407 
     | 
    
         
            +
                                    var mergedImportedFiles = existingProjectDiscovery.ImportedFiles; // packages.config discovery doesn't produce imported files
         
     | 
| 
      
 408 
     | 
    
         
            +
                                    var mergedAdditionalFiles = existingProjectDiscovery.AdditionalFiles.Concat(packagesConfigResult.AdditionalFiles)
         
     | 
| 
      
 409 
     | 
    
         
            +
                                        .Distinct(StringComparer.OrdinalIgnoreCase)
         
     | 
| 
      
 410 
     | 
    
         
            +
                                        .OrderBy(f => f)
         
     | 
| 
      
 411 
     | 
    
         
            +
                                        .ToImmutableArray();
         
     | 
| 
      
 412 
     | 
    
         
            +
                                    var mergedResult = new ProjectDiscoveryResult()
         
     | 
| 
      
 413 
     | 
    
         
            +
                                    {
         
     | 
| 
      
 414 
     | 
    
         
            +
                                        FilePath = existingProjectDiscovery.FilePath,
         
     | 
| 
      
 415 
     | 
    
         
            +
                                        Dependencies = mergedDependencies,
         
     | 
| 
      
 416 
     | 
    
         
            +
                                        TargetFrameworks = mergedTargetFrameworks,
         
     | 
| 
      
 417 
     | 
    
         
            +
                                        Properties = mergedProperties,
         
     | 
| 
      
 418 
     | 
    
         
            +
                                        ImportedFiles = mergedImportedFiles,
         
     | 
| 
      
 419 
     | 
    
         
            +
                                        AdditionalFiles = mergedAdditionalFiles,
         
     | 
| 
      
 420 
     | 
    
         
            +
                                    };
         
     | 
| 
      
 421 
     | 
    
         
            +
                                    results[relativeProjectPath] = mergedResult;
         
     | 
| 
      
 422 
     | 
    
         
            +
                                }
         
     | 
| 
      
 423 
     | 
    
         
            +
                                else
         
     | 
| 
       373 
424 
     | 
    
         
             
                                {
         
     | 
| 
       374 
     | 
    
         
            -
                                     
     | 
| 
       375 
     | 
    
         
            -
                                     
     | 
| 
       376 
     | 
    
         
            -
                                     
     | 
| 
       377 
     | 
    
         
            -
             
     | 
| 
       378 
     | 
    
         
            -
             
     | 
| 
       379 
     | 
    
         
            -
             
     | 
| 
      
 425 
     | 
    
         
            +
                                    // add packages.config results
         
     | 
| 
      
 426 
     | 
    
         
            +
                                    results[relativeProjectPath] = new ProjectDiscoveryResult()
         
     | 
| 
      
 427 
     | 
    
         
            +
                                    {
         
     | 
| 
      
 428 
     | 
    
         
            +
                                        FilePath = relativeProjectPath,
         
     | 
| 
      
 429 
     | 
    
         
            +
                                        Dependencies = packagesConfigResult.Dependencies,
         
     | 
| 
      
 430 
     | 
    
         
            +
                                        TargetFrameworks = packagesConfigResult.TargetFrameworks,
         
     | 
| 
      
 431 
     | 
    
         
            +
                                        ImportedFiles = [], // no imported files resolved for packages.config scenarios
         
     | 
| 
      
 432 
     | 
    
         
            +
                                        AdditionalFiles = packagesConfigResult.AdditionalFiles,
         
     | 
| 
      
 433 
     | 
    
         
            +
                                    };
         
     | 
| 
      
 434 
     | 
    
         
            +
                                }
         
     | 
| 
       380 
435 
     | 
    
         
             
                            }
         
     | 
| 
       381 
436 
     | 
    
         
             
                        }
         
     | 
| 
       382 
437 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -397,6 +452,6 @@ public partial class DiscoveryWorker : IDiscoveryWorker 
     | 
|
| 
       397 
452 
     | 
    
         
             
                    }
         
     | 
| 
       398 
453 
     | 
    
         | 
| 
       399 
454 
     | 
    
         
             
                    var resultJson = JsonSerializer.Serialize(result, SerializerOptions);
         
     | 
| 
       400 
     | 
    
         
            -
                    await File.WriteAllTextAsync( 
     | 
| 
      
 455 
     | 
    
         
            +
                    await File.WriteAllTextAsync(resultPath, resultJson);
         
     | 
| 
       401 
456 
     | 
    
         
             
                }
         
     | 
| 
       402 
457 
     | 
    
         
             
            }
         
     | 
| 
         @@ -30,19 +30,42 @@ public record ExperimentsManager 
     | 
|
| 
       30 
30 
     | 
    
         
             
                    };
         
     | 
| 
       31 
31 
     | 
    
         
             
                }
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
                public static async Task<ExperimentsManager> FromJobFileAsync(string jobFilePath 
     | 
| 
      
 33 
     | 
    
         
            +
                public static async Task<(ExperimentsManager ExperimentsManager, NativeResult? ErrorResult)> FromJobFileAsync(string jobFilePath)
         
     | 
| 
       34 
34 
     | 
    
         
             
                {
         
     | 
| 
       35 
     | 
    
         
            -
                    var  
     | 
| 
      
 35 
     | 
    
         
            +
                    var experimentsManager = new ExperimentsManager();
         
     | 
| 
      
 36 
     | 
    
         
            +
                    NativeResult? errorResult = null;
         
     | 
| 
       36 
37 
     | 
    
         
             
                    try
         
     | 
| 
       37 
38 
     | 
    
         
             
                    {
         
     | 
| 
      
 39 
     | 
    
         
            +
                        var jobFileContent = await File.ReadAllTextAsync(jobFilePath);
         
     | 
| 
       38 
40 
     | 
    
         
             
                        var jobWrapper = RunWorker.Deserialize(jobFileContent);
         
     | 
| 
       39 
     | 
    
         
            -
                         
     | 
| 
      
 41 
     | 
    
         
            +
                        experimentsManager = GetExperimentsManager(jobWrapper.Job.Experiments);
         
     | 
| 
      
 42 
     | 
    
         
            +
                    }
         
     | 
| 
      
 43 
     | 
    
         
            +
                    catch (BadRequirementException ex)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    {
         
     | 
| 
      
 45 
     | 
    
         
            +
                        errorResult = new NativeResult
         
     | 
| 
      
 46 
     | 
    
         
            +
                        {
         
     | 
| 
      
 47 
     | 
    
         
            +
                            ErrorType = ErrorType.BadRequirement,
         
     | 
| 
      
 48 
     | 
    
         
            +
                            ErrorDetails = ex.Message,
         
     | 
| 
      
 49 
     | 
    
         
            +
                        };
         
     | 
| 
       40 
50 
     | 
    
         
             
                    }
         
     | 
| 
       41 
51 
     | 
    
         
             
                    catch (JsonException ex)
         
     | 
| 
       42 
52 
     | 
    
         
             
                    {
         
     | 
| 
       43 
     | 
    
         
            -
                         
     | 
| 
       44 
     | 
    
         
            -
                         
     | 
| 
      
 53 
     | 
    
         
            +
                        errorResult = new NativeResult
         
     | 
| 
      
 54 
     | 
    
         
            +
                        {
         
     | 
| 
      
 55 
     | 
    
         
            +
                            ErrorType = ErrorType.Unknown,
         
     | 
| 
      
 56 
     | 
    
         
            +
                            ErrorDetails = $"Error deserializing job file: {ex}: {File.ReadAllText(jobFilePath)}",
         
     | 
| 
      
 57 
     | 
    
         
            +
                        };
         
     | 
| 
      
 58 
     | 
    
         
            +
                    }
         
     | 
| 
      
 59 
     | 
    
         
            +
                    catch (Exception ex)
         
     | 
| 
      
 60 
     | 
    
         
            +
                    {
         
     | 
| 
      
 61 
     | 
    
         
            +
                        errorResult = new NativeResult
         
     | 
| 
      
 62 
     | 
    
         
            +
                        {
         
     | 
| 
      
 63 
     | 
    
         
            +
                            ErrorType = ErrorType.Unknown,
         
     | 
| 
      
 64 
     | 
    
         
            +
                            ErrorDetails = ex.ToString(),
         
     | 
| 
      
 65 
     | 
    
         
            +
                        };
         
     | 
| 
       45 
66 
     | 
    
         
             
                    }
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                    return (experimentsManager, errorResult);
         
     | 
| 
       46 
69 
     | 
    
         
             
                }
         
     | 
| 
       47 
70 
     | 
    
         | 
| 
       48 
71 
     | 
    
         
             
                private static bool IsEnabled(Dictionary<string, object>? experiments, string experimentName)
         
     | 
| 
         @@ -2,9 +2,10 @@ namespace NuGetUpdater.Core.Run.ApiModel; 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            public record DependencyFileNotFound : JobErrorBase
         
     | 
| 
       4 
4 
     | 
    
         
             
            {
         
     | 
| 
       5 
     | 
    
         
            -
                public DependencyFileNotFound(string filePath)
         
     | 
| 
      
 5 
     | 
    
         
            +
                public DependencyFileNotFound(string message, string filePath)
         
     | 
| 
       6 
6 
     | 
    
         
             
                    : base("dependency_file_not_found")
         
     | 
| 
       7 
7 
     | 
    
         
             
                {
         
     | 
| 
       8 
     | 
    
         
            -
                    Details =  
     | 
| 
      
 8 
     | 
    
         
            +
                    Details["message"] = message;
         
     | 
| 
      
 9 
     | 
    
         
            +
                    Details["file-path"] = filePath;
         
     | 
| 
       9 
10 
     | 
    
         
             
                }
         
     | 
| 
       10 
11 
     | 
    
         
             
            }
         
     | 
| 
         @@ -13,6 +13,5 @@ public abstract record JobErrorBase 
     | 
|
| 
       13 
13 
     | 
    
         
             
                public string Type { get; }
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                [JsonPropertyName("error-details")]
         
     | 
| 
       16 
     | 
    
         
            -
                 
     | 
| 
       17 
     | 
    
         
            -
                public object? Details { get; init; } = null;
         
     | 
| 
      
 16 
     | 
    
         
            +
                public Dictionary<string, object> Details { get; init; } = new();
         
     | 
| 
       18 
17 
     | 
    
         
             
            }
         
     | 
    
        data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PrivateSourceAuthenticationFailure.cs
    CHANGED
    
    | 
         @@ -5,6 +5,6 @@ public record PrivateSourceAuthenticationFailure : JobErrorBase 
     | 
|
| 
       5 
5 
     | 
    
         
             
                public PrivateSourceAuthenticationFailure(string[] urls)
         
     | 
| 
       6 
6 
     | 
    
         
             
                    : base("private_source_authentication_failure")
         
     | 
| 
       7 
7 
     | 
    
         
             
                {
         
     | 
| 
       8 
     | 
    
         
            -
                    Details = $"({string.Join("|", urls)})";
         
     | 
| 
      
 8 
     | 
    
         
            +
                    Details["source"] = $"({string.Join("|", urls)})";
         
     | 
| 
       9 
9 
     | 
    
         
             
                }
         
     | 
| 
       10 
10 
     | 
    
         
             
            }
         
     | 
| 
         @@ -2,9 +2,13 @@ namespace NuGetUpdater.Core.Run.ApiModel; 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            public record UnknownError : JobErrorBase
         
     | 
| 
       4 
4 
     | 
    
         
             
            {
         
     | 
| 
       5 
     | 
    
         
            -
                public UnknownError(string  
     | 
| 
      
 5 
     | 
    
         
            +
                public UnknownError(Exception ex, string jobId)
         
     | 
| 
       6 
6 
     | 
    
         
             
                    : base("unknown_error")
         
     | 
| 
       7 
7 
     | 
    
         
             
                {
         
     | 
| 
       8 
     | 
    
         
            -
                    Details =  
     | 
| 
      
 8 
     | 
    
         
            +
                    Details["error-class"] = ex.GetType().Name;
         
     | 
| 
      
 9 
     | 
    
         
            +
                    Details["error-message"] = ex.Message;
         
     | 
| 
      
 10 
     | 
    
         
            +
                    Details["error-backtrace"] = ex.StackTrace ?? "<unknown>";
         
     | 
| 
      
 11 
     | 
    
         
            +
                    Details["package-manager"] = "nuget";
         
     | 
| 
      
 12 
     | 
    
         
            +
                    Details["job-id"] = jobId;
         
     | 
| 
       9 
13 
     | 
    
         
             
                }
         
     | 
| 
       10 
14 
     | 
    
         
             
            }
         
     |