dependabot-nuget 0.276.0 → 0.278.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +42 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Program.cs +1 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Run.cs +132 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +11 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/DependencyFinder.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +9 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +2 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/AllowedUpdate.cs +6 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CreatePullRequest.cs +18 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyFile.cs +18 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/IncrementMetric.cs +7 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +49 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobFile.cs +6 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobSource.cs +11 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/MarkAsProcessed.cs +9 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/ReportedDependency.cs +16 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/ReportedRequirement.cs +9 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/RequirementSource.cs +7 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdatedDependencyList.cs +7 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/HttpApiHandler.cs +59 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/IApiHandler.cs +11 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunResult.cs +13 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +283 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +28 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +16 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +34 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +223 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +60 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/TestApiHandler.cs +35 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +69 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +22 -0
- data/lib/dependabot/nuget/file_fetcher.rb +17 -0
- metadata +29 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d29298584fd13989b51d63574bc462c199b1db8144a2a28b6c893ae90bf41dec
|
4
|
+
data.tar.gz: f2fc3a71de6471f5cca05fe294ce492bb4dbb1837ce2feb03bf40cfcec9ff4cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80ad942cbaf12ad2bec0eacf04124a26cb37b4a8f54cda4f3290f9a4b8c776f16a907cd963099634be43d925c64f0bef54ef5247632360954e9e28064bcda676
|
7
|
+
data.tar.gz: f413dfafd425032365e31d9c0969a94c6c8ac8195efe0de8b922ab464575fac246276012a6ceca8b1f9f55b10e3d8fb49d9cd5c4390f281674782a04a91b15ca
|
@@ -0,0 +1,42 @@
|
|
1
|
+
using System.CommandLine;
|
2
|
+
|
3
|
+
using NuGetUpdater.Core;
|
4
|
+
using NuGetUpdater.Core.Run;
|
5
|
+
|
6
|
+
namespace NuGetUpdater.Cli.Commands;
|
7
|
+
|
8
|
+
internal static class RunCommand
|
9
|
+
{
|
10
|
+
internal static readonly Option<FileInfo> JobPathOption = new("--job-path") { IsRequired = true };
|
11
|
+
internal static readonly Option<DirectoryInfo> RepoContentsPathOption = new("--repo-contents-path") { IsRequired = true };
|
12
|
+
internal static readonly Option<Uri> ApiUrlOption = new("--api-url") { IsRequired = true };
|
13
|
+
internal static readonly Option<string> JobIdOption = new("--job-id") { IsRequired = true };
|
14
|
+
internal static readonly Option<FileInfo> OutputPathOption = new("--output-path") { IsRequired = true };
|
15
|
+
internal static readonly Option<string> BaseCommitShaOption = new("--base-commit-sha") { IsRequired = true };
|
16
|
+
internal static readonly Option<bool> VerboseOption = new("--verbose", getDefaultValue: () => false);
|
17
|
+
|
18
|
+
internal static Command GetCommand(Action<int> setExitCode)
|
19
|
+
{
|
20
|
+
Command command = new("run", "Runs a full dependabot job.")
|
21
|
+
{
|
22
|
+
JobPathOption,
|
23
|
+
RepoContentsPathOption,
|
24
|
+
ApiUrlOption,
|
25
|
+
JobIdOption,
|
26
|
+
OutputPathOption,
|
27
|
+
BaseCommitShaOption,
|
28
|
+
VerboseOption
|
29
|
+
};
|
30
|
+
|
31
|
+
command.TreatUnmatchedTokensAsErrors = true;
|
32
|
+
|
33
|
+
command.SetHandler(async (jobPath, repoContentsPath, apiUrl, jobId, outputPath, baseCommitSha, verbose) =>
|
34
|
+
{
|
35
|
+
var apiHandler = new HttpApiHandler(apiUrl.ToString(), jobId);
|
36
|
+
var worker = new RunWorker(apiHandler, new Logger(verbose));
|
37
|
+
await worker.RunAsync(jobPath, repoContentsPath, baseCommitSha, outputPath);
|
38
|
+
}, JobPathOption, RepoContentsPathOption, ApiUrlOption, JobIdOption, OutputPathOption, BaseCommitShaOption, VerboseOption);
|
39
|
+
|
40
|
+
return command;
|
41
|
+
}
|
42
|
+
}
|
@@ -0,0 +1,132 @@
|
|
1
|
+
using System.Text;
|
2
|
+
using System.Text.Json;
|
3
|
+
|
4
|
+
using NuGetUpdater.Core.Run;
|
5
|
+
using NuGetUpdater.Core.Run.ApiModel;
|
6
|
+
using NuGetUpdater.Core.Test;
|
7
|
+
using NuGetUpdater.Core.Test.Update;
|
8
|
+
|
9
|
+
using Xunit;
|
10
|
+
|
11
|
+
namespace NuGetUpdater.Cli.Test;
|
12
|
+
|
13
|
+
using TestFile = (string Path, string Content);
|
14
|
+
|
15
|
+
public partial class EntryPointTests
|
16
|
+
{
|
17
|
+
public class Run
|
18
|
+
{
|
19
|
+
[Fact]
|
20
|
+
public async Task Run_Simple()
|
21
|
+
{
|
22
|
+
// verify we can pass command line arguments and hit the appropriate URLs
|
23
|
+
await RunAsync(
|
24
|
+
packages:
|
25
|
+
[
|
26
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0"),
|
27
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.1", "net8.0"),
|
28
|
+
],
|
29
|
+
files:
|
30
|
+
[
|
31
|
+
("src/project.csproj", """
|
32
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
33
|
+
<PropertyGroup>
|
34
|
+
<TargetFramework>net8.0</TargetFramework>
|
35
|
+
</PropertyGroup>
|
36
|
+
<ItemGroup>
|
37
|
+
<PackageReference Include="Some.Package" Version="1.0.0" />
|
38
|
+
</ItemGroup>
|
39
|
+
</Project>
|
40
|
+
""")
|
41
|
+
],
|
42
|
+
job: new Job()
|
43
|
+
{
|
44
|
+
PackageManager = "nuget",
|
45
|
+
AllowedUpdates = [
|
46
|
+
new()
|
47
|
+
{
|
48
|
+
UpdateType = "all"
|
49
|
+
}
|
50
|
+
],
|
51
|
+
Source = new()
|
52
|
+
{
|
53
|
+
Provider = "github",
|
54
|
+
Repo = "test",
|
55
|
+
Directory = "src",
|
56
|
+
}
|
57
|
+
},
|
58
|
+
expectedUrls:
|
59
|
+
[
|
60
|
+
"/update_jobs/TEST-ID/update_dependency_list",
|
61
|
+
"/update_jobs/TEST-ID/increment_metric",
|
62
|
+
"/update_jobs/TEST-ID/create_pull_request",
|
63
|
+
"/update_jobs/TEST-ID/mark_as_processed",
|
64
|
+
]
|
65
|
+
);
|
66
|
+
}
|
67
|
+
|
68
|
+
private static async Task RunAsync(TestFile[] files, Job job, string[] expectedUrls, MockNuGetPackage[]? packages = null)
|
69
|
+
{
|
70
|
+
using var tempDirectory = new TemporaryDirectory();
|
71
|
+
|
72
|
+
// write test files
|
73
|
+
foreach (var testFile in files)
|
74
|
+
{
|
75
|
+
var fullPath = Path.Join(tempDirectory.DirectoryPath, testFile.Path);
|
76
|
+
var directory = Path.GetDirectoryName(fullPath)!;
|
77
|
+
Directory.CreateDirectory(directory);
|
78
|
+
await File.WriteAllTextAsync(fullPath, testFile.Content);
|
79
|
+
}
|
80
|
+
|
81
|
+
// write job file
|
82
|
+
var jobPath = Path.Combine(tempDirectory.DirectoryPath, "job.json");
|
83
|
+
await File.WriteAllTextAsync(jobPath, JsonSerializer.Serialize(new { Job = job }, RunWorker.SerializerOptions));
|
84
|
+
|
85
|
+
// save packages
|
86
|
+
await UpdateWorkerTestBase.MockNuGetPackagesInDirectory(packages, tempDirectory.DirectoryPath);
|
87
|
+
|
88
|
+
var actualUrls = new List<string>();
|
89
|
+
using var http = TestHttpServer.CreateTestStringServer(url =>
|
90
|
+
{
|
91
|
+
actualUrls.Add(new Uri(url).PathAndQuery);
|
92
|
+
return (200, "ok");
|
93
|
+
});
|
94
|
+
var args = new List<string>()
|
95
|
+
{
|
96
|
+
"run",
|
97
|
+
"--job-path",
|
98
|
+
jobPath,
|
99
|
+
"--repo-contents-path",
|
100
|
+
tempDirectory.DirectoryPath,
|
101
|
+
"--api-url",
|
102
|
+
http.BaseUrl,
|
103
|
+
"--job-id",
|
104
|
+
"TEST-ID",
|
105
|
+
"--output-path",
|
106
|
+
Path.Combine(tempDirectory.DirectoryPath, "output.json"),
|
107
|
+
"--base-commit-sha",
|
108
|
+
"BASE-COMMIT-SHA",
|
109
|
+
"--verbose"
|
110
|
+
};
|
111
|
+
|
112
|
+
var output = new StringBuilder();
|
113
|
+
// redirect stdout
|
114
|
+
var originalOut = Console.Out;
|
115
|
+
Console.SetOut(new StringWriter(output));
|
116
|
+
int result = -1;
|
117
|
+
try
|
118
|
+
{
|
119
|
+
result = await Program.Main(args.ToArray());
|
120
|
+
}
|
121
|
+
catch
|
122
|
+
{
|
123
|
+
// restore stdout
|
124
|
+
Console.SetOut(originalOut);
|
125
|
+
throw;
|
126
|
+
}
|
127
|
+
|
128
|
+
Assert.True(result == 0, output.ToString());
|
129
|
+
Assert.Equal(expectedUrls, actualUrls);
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
@@ -33,6 +33,12 @@ public partial class AnalyzeWorker
|
|
33
33
|
{
|
34
34
|
var discovery = await DeserializeJsonFileAsync<WorkspaceDiscoveryResult>(discoveryPath, nameof(WorkspaceDiscoveryResult));
|
35
35
|
var dependencyInfo = await DeserializeJsonFileAsync<DependencyInfo>(dependencyPath, nameof(DependencyInfo));
|
36
|
+
var analysisResult = await RunAsync(repoRoot, discovery, dependencyInfo);
|
37
|
+
await WriteResultsAsync(analysisDirectory, dependencyInfo.Name, analysisResult, _logger);
|
38
|
+
}
|
39
|
+
|
40
|
+
public async Task<AnalysisResult> RunAsync(string repoRoot, WorkspaceDiscoveryResult discovery, DependencyInfo dependencyInfo)
|
41
|
+
{
|
36
42
|
var startingDirectory = PathHelper.JoinPath(repoRoot, discovery.Path);
|
37
43
|
|
38
44
|
_logger.Log($"Starting analysis of {dependencyInfo.Name}...");
|
@@ -61,7 +67,7 @@ public partial class AnalyzeWorker
|
|
61
67
|
bool isProjectUpdateNecessary = IsUpdateNecessary(dependencyInfo, projectsWithDependency);
|
62
68
|
var isUpdateNecessary = isProjectUpdateNecessary || dotnetToolsHasDependency || globalJsonHasDependency;
|
63
69
|
using var nugetContext = new NuGetContext(startingDirectory);
|
64
|
-
AnalysisResult
|
70
|
+
AnalysisResult analysisResult;
|
65
71
|
try
|
66
72
|
{
|
67
73
|
if (isUpdateNecessary)
|
@@ -134,7 +140,7 @@ public partial class AnalyzeWorker
|
|
134
140
|
// should track the dependenciesToUpdate as they have already been analyzed.
|
135
141
|
}
|
136
142
|
|
137
|
-
|
143
|
+
analysisResult = new AnalysisResult
|
138
144
|
{
|
139
145
|
UpdatedVersion = updatedVersion?.ToNormalizedString() ?? dependencyInfo.Version,
|
140
146
|
CanUpdate = updatedVersion is not null,
|
@@ -146,7 +152,7 @@ public partial class AnalyzeWorker
|
|
146
152
|
when (ex.StatusCode == HttpStatusCode.Unauthorized || ex.StatusCode == HttpStatusCode.Forbidden)
|
147
153
|
{
|
148
154
|
// TODO: consolidate this error handling between AnalyzeWorker, DiscoveryWorker, and UpdateWorker
|
149
|
-
|
155
|
+
analysisResult = new AnalysisResult
|
150
156
|
{
|
151
157
|
ErrorType = ErrorType.AuthenticationFailure,
|
152
158
|
ErrorDetails = "(" + string.Join("|", nugetContext.PackageSources.Select(s => s.Source)) + ")",
|
@@ -156,9 +162,8 @@ public partial class AnalyzeWorker
|
|
156
162
|
};
|
157
163
|
}
|
158
164
|
|
159
|
-
await WriteResultsAsync(analysisDirectory, dependencyInfo.Name, result, _logger);
|
160
|
-
|
161
165
|
_logger.Log($"Analysis complete.");
|
166
|
+
return analysisResult;
|
162
167
|
}
|
163
168
|
|
164
169
|
private static bool IsUpdateNecessary(DependencyInfo dependencyInfo, ImmutableArray<ProjectDiscoveryResult> projectsWithDependency)
|
@@ -393,7 +398,7 @@ public partial class AnalyzeWorker
|
|
393
398
|
|
394
399
|
// Create distinct list of dependencies taking the highest version of each
|
395
400
|
var dependencyResult = await DependencyFinder.GetDependenciesAsync(
|
396
|
-
|
401
|
+
repoRoot,
|
397
402
|
projectPath,
|
398
403
|
projectFrameworks,
|
399
404
|
packageIds,
|
@@ -8,7 +8,7 @@ namespace NuGetUpdater.Core.Analyze;
|
|
8
8
|
internal static class DependencyFinder
|
9
9
|
{
|
10
10
|
public static async Task<ImmutableDictionary<NuGetFramework, ImmutableArray<Dependency>>> GetDependenciesAsync(
|
11
|
-
string
|
11
|
+
string repoRoot,
|
12
12
|
string projectPath,
|
13
13
|
IEnumerable<NuGetFramework> frameworks,
|
14
14
|
ImmutableHashSet<string> packageIds,
|
@@ -26,7 +26,7 @@ internal static class DependencyFinder
|
|
26
26
|
foreach (var framework in frameworks)
|
27
27
|
{
|
28
28
|
var dependencies = await MSBuildHelper.GetAllPackageDependenciesAsync(
|
29
|
-
|
29
|
+
repoRoot,
|
30
30
|
projectPath,
|
31
31
|
framework.ToString(),
|
32
32
|
packages,
|
@@ -30,7 +30,7 @@ public partial class DiscoveryWorker
|
|
30
30
|
_logger = logger;
|
31
31
|
}
|
32
32
|
|
33
|
-
public async Task RunAsync(string repoRootPath, string workspacePath
|
33
|
+
public async Task<WorkspaceDiscoveryResult> RunAsync(string repoRootPath, string workspacePath)
|
34
34
|
{
|
35
35
|
MSBuildHelper.RegisterMSBuild(Environment.CurrentDirectory, repoRootPath);
|
36
36
|
|
@@ -102,11 +102,16 @@ public partial class DiscoveryWorker
|
|
102
102
|
};
|
103
103
|
}
|
104
104
|
|
105
|
-
await WriteResultsAsync(repoRootPath, outputPath, result);
|
106
|
-
|
107
105
|
_logger.Log("Discovery complete.");
|
108
|
-
|
109
106
|
_processedProjectPaths.Clear();
|
107
|
+
|
108
|
+
return result;
|
109
|
+
}
|
110
|
+
|
111
|
+
public async Task RunAsync(string repoRootPath, string workspacePath, string outputPath)
|
112
|
+
{
|
113
|
+
var result = await RunAsync(repoRootPath, workspacePath);
|
114
|
+
await WriteResultsAsync(repoRootPath, outputPath, result);
|
110
115
|
}
|
111
116
|
|
112
117
|
/// <summary>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
using System.Text.Json.Serialization;
|
2
|
+
|
3
|
+
namespace NuGetUpdater.Core.Run.ApiModel;
|
4
|
+
|
5
|
+
public sealed record CreatePullRequest
|
6
|
+
{
|
7
|
+
public required ReportedDependency[] Dependencies { get; init; }
|
8
|
+
[JsonPropertyName("updated-dependency-files")]
|
9
|
+
public required DependencyFile[] UpdatedDependencyFiles { get; init; }
|
10
|
+
[JsonPropertyName("base-commit-sha")]
|
11
|
+
public required string BaseCommitSha { get; init; }
|
12
|
+
[JsonPropertyName("commit-message")]
|
13
|
+
public required string CommitMessage { get; init; }
|
14
|
+
[JsonPropertyName("pr-title")]
|
15
|
+
public required string PrTitle { get; init; }
|
16
|
+
[JsonPropertyName("pr-body")]
|
17
|
+
public required string PrBody { get; init; }
|
18
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
using System.Text.Json.Serialization;
|
2
|
+
|
3
|
+
namespace NuGetUpdater.Core.Run.ApiModel;
|
4
|
+
|
5
|
+
public sealed record DependencyFile
|
6
|
+
{
|
7
|
+
public required string Name { get; init; }
|
8
|
+
public required string Content { get; init; }
|
9
|
+
public required string Directory { get; init; }
|
10
|
+
public string Type { get; init; } = "file"; // TODO: enum
|
11
|
+
[JsonPropertyName("support_file")]
|
12
|
+
public bool SupportFile { get; init; } = false;
|
13
|
+
[JsonPropertyName("content_encoding")]
|
14
|
+
public string ContentEncoding { get; init; } = "utf-8";
|
15
|
+
public bool Deleted { get; init; } = false;
|
16
|
+
public string Operation { get; init; } = "update"; // TODO: enum
|
17
|
+
public string? Mode { get; init; } = null; // TODO: what is this?
|
18
|
+
}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
namespace NuGetUpdater.Core.Run.ApiModel;
|
2
|
+
|
3
|
+
public sealed record Job
|
4
|
+
{
|
5
|
+
public required string PackageManager { get; init; }
|
6
|
+
public AllowedUpdate[]? AllowedUpdates { get; init; } = null;
|
7
|
+
public bool Debug { get; init; } = false;
|
8
|
+
public object[]? DependencyGroups { get; init; } = null;
|
9
|
+
public object[]? Dependencies { get; init; } = null;
|
10
|
+
public string? DependencyGroupToRefresh { get; init; } = null;
|
11
|
+
public object[]? ExistingPullRequests { get; init; } = null;
|
12
|
+
public object[]? ExistingGroupPullRequests { get; init; } = null;
|
13
|
+
public Dictionary<string, object>? Experiments { get; init; } = null;
|
14
|
+
public object[]? IgnoreConditions { get; init; } = null;
|
15
|
+
public bool LockfileOnly { get; init; } = false;
|
16
|
+
public string? RequirementsUpdateStrategy { get; init; } = null;
|
17
|
+
public object[]? SecurityAdvisories { get; init; } = null;
|
18
|
+
public bool SecurityUpdatesOnly { get; init; } = false;
|
19
|
+
public required JobSource Source { get; init; }
|
20
|
+
public bool UpdateSubdependencies { get; init; } = false;
|
21
|
+
public bool UpdatingAPullRequest { get; init; } = false;
|
22
|
+
public bool VendorDependencies { get; init; } = false;
|
23
|
+
public bool RejectExternalCode { get; init; } = false;
|
24
|
+
public bool RepoPrivate { get; init; } = false;
|
25
|
+
public object? CommitMessageOptions { get; init; } = null;
|
26
|
+
public object[]? CredentialsMetadata { get; init; } = null;
|
27
|
+
public int MaxUpdaterRunTime { get; init; } = 0;
|
28
|
+
|
29
|
+
public IEnumerable<string> GetAllDirectories()
|
30
|
+
{
|
31
|
+
var returnedADirectory = false;
|
32
|
+
if (Source.Directory is not null)
|
33
|
+
{
|
34
|
+
returnedADirectory = true;
|
35
|
+
yield return Source.Directory;
|
36
|
+
}
|
37
|
+
|
38
|
+
foreach (var directory in Source.Directories ?? [])
|
39
|
+
{
|
40
|
+
returnedADirectory = true;
|
41
|
+
yield return directory;
|
42
|
+
}
|
43
|
+
|
44
|
+
if (!returnedADirectory)
|
45
|
+
{
|
46
|
+
yield return "/";
|
47
|
+
}
|
48
|
+
}
|
49
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
namespace NuGetUpdater.Core.Run.ApiModel;
|
2
|
+
|
3
|
+
public sealed class JobSource
|
4
|
+
{
|
5
|
+
public required string Provider { get; init; }
|
6
|
+
public required string Repo { get; init; }
|
7
|
+
public string? Directory { get; init; } = null;
|
8
|
+
public string[]? Directories { get; init; } = null;
|
9
|
+
public string? Hostname { get; init; } = null;
|
10
|
+
public string? ApiEndpoint { get; init; } = null;
|
11
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
using System.Text.Json.Serialization;
|
2
|
+
|
3
|
+
namespace NuGetUpdater.Core.Run.ApiModel;
|
4
|
+
|
5
|
+
public sealed record ReportedDependency
|
6
|
+
{
|
7
|
+
public required string Name { get; init; }
|
8
|
+
public required string? Version { get; init; }
|
9
|
+
public required ReportedRequirement[] Requirements { get; init; }
|
10
|
+
[JsonPropertyName("previous-version")]
|
11
|
+
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
12
|
+
public string? PreviousVersion { get; init; } = null;
|
13
|
+
[JsonPropertyName("previous-requirements")]
|
14
|
+
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
15
|
+
public ReportedRequirement[]? PreviousRequirements { get; init; } = null;
|
16
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
namespace NuGetUpdater.Core.Run.ApiModel;
|
2
|
+
|
3
|
+
public sealed record ReportedRequirement
|
4
|
+
{
|
5
|
+
public required string Requirement { get; init; }
|
6
|
+
public required string File { get; init; }
|
7
|
+
public string[] Groups { get; init; } = Array.Empty<string>();
|
8
|
+
public RequirementSource? Source { get; init; } = null;
|
9
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
using System.Text;
|
2
|
+
using System.Text.Json;
|
3
|
+
using System.Text.Json.Serialization;
|
4
|
+
|
5
|
+
using NuGetUpdater.Core.Run.ApiModel;
|
6
|
+
|
7
|
+
namespace NuGetUpdater.Core.Run;
|
8
|
+
|
9
|
+
public class HttpApiHandler : IApiHandler
|
10
|
+
{
|
11
|
+
private static readonly HttpClient HttpClient = new();
|
12
|
+
|
13
|
+
public static readonly JsonSerializerOptions SerializerOptions = new()
|
14
|
+
{
|
15
|
+
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
|
16
|
+
Converters = { new JsonStringEnumConverter() },
|
17
|
+
};
|
18
|
+
|
19
|
+
private readonly string _apiUrl;
|
20
|
+
private readonly string _jobId;
|
21
|
+
|
22
|
+
public HttpApiHandler(string apiUrl, string jobId)
|
23
|
+
{
|
24
|
+
_apiUrl = apiUrl.TrimEnd('/');
|
25
|
+
_jobId = jobId;
|
26
|
+
}
|
27
|
+
|
28
|
+
public async Task UpdateDependencyList(UpdatedDependencyList updatedDependencyList)
|
29
|
+
{
|
30
|
+
await PostAsJson("update_dependency_list", updatedDependencyList);
|
31
|
+
}
|
32
|
+
|
33
|
+
public async Task IncrementMetric(IncrementMetric incrementMetric)
|
34
|
+
{
|
35
|
+
await PostAsJson("increment_metric", incrementMetric);
|
36
|
+
}
|
37
|
+
|
38
|
+
public async Task CreatePullRequest(CreatePullRequest createPullRequest)
|
39
|
+
{
|
40
|
+
await PostAsJson("create_pull_request", createPullRequest);
|
41
|
+
}
|
42
|
+
|
43
|
+
public async Task MarkAsProcessed(MarkAsProcessed markAsProcessed)
|
44
|
+
{
|
45
|
+
await PostAsJson("mark_as_processed", markAsProcessed);
|
46
|
+
}
|
47
|
+
|
48
|
+
private async Task PostAsJson(string endpoint, object body)
|
49
|
+
{
|
50
|
+
var wrappedBody = new
|
51
|
+
{
|
52
|
+
Data = body,
|
53
|
+
};
|
54
|
+
var payload = JsonSerializer.Serialize(wrappedBody, SerializerOptions);
|
55
|
+
var content = new StringContent(payload, Encoding.UTF8, "application/json");
|
56
|
+
var response = await HttpClient.PostAsync($"{_apiUrl}/update_jobs/{_jobId}/{endpoint}", content);
|
57
|
+
var _ = response.EnsureSuccessStatusCode();
|
58
|
+
}
|
59
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
using NuGetUpdater.Core.Run.ApiModel;
|
2
|
+
|
3
|
+
namespace NuGetUpdater.Core.Run;
|
4
|
+
|
5
|
+
public interface IApiHandler
|
6
|
+
{
|
7
|
+
Task UpdateDependencyList(UpdatedDependencyList updatedDependencyList);
|
8
|
+
Task IncrementMetric(IncrementMetric incrementMetric);
|
9
|
+
Task CreatePullRequest(CreatePullRequest createPullRequest);
|
10
|
+
Task MarkAsProcessed(MarkAsProcessed markAsProcessed);
|
11
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
using System.Text.Json.Serialization;
|
2
|
+
|
3
|
+
using NuGetUpdater.Core.Run.ApiModel;
|
4
|
+
|
5
|
+
namespace NuGetUpdater.Core.Run;
|
6
|
+
|
7
|
+
public sealed record RunResult
|
8
|
+
{
|
9
|
+
[JsonPropertyName("base64_dependency_files")]
|
10
|
+
public required DependencyFile[] Base64DependencyFiles { get; init; }
|
11
|
+
[JsonPropertyName("base_commit_sha")]
|
12
|
+
public required string BaseCommitSha { get; init; }
|
13
|
+
}
|