Forge
csharp3407750f
1using AgentForge.Plugin.Sdk;
2using AgentForge.Contracts;
3using AgentForge.Data;
4using AgentForge.Services;
5
6namespace AgentForge.Endpoints;
7
8internal static class ForgeGitEndpoints
9{
10 internal static RouteGroupBuilder MapGitEndpoints(this RouteGroupBuilder api)
11 {
12 api.MapPost("/git/push", GitPush);
13 return api;
14 }
15
16 private static async Task<IResult> GitPush(
17 GitPushRequest request,
18 HttpContext context,
19 ForgeRepository repository,
20 GitRepoService git,
21 ForgeAuthorizationService authorization,
22 CiWebhookService ci,
23 CancellationToken cancellationToken)
24 {
25 authorization.EnsureGitHook(ForgePluginHttpAuth.GetBearerToken(context));
26
27 var repo = ForgePluginEndpoints.RequireRepo(repository, request.Repo);
28 CommitProvenanceResponse? provenance = null;
29 var sha = ForgeCommitProvenanceHelper.NormalizeSha(request.Commit);
30 var provenanceRequest = request.Provenance;
31 if (provenanceRequest is null)
32 {
33 var message = git.GetCommitMessage(repo.Name, sha);
34 var branch = string.IsNullOrWhiteSpace(request.Branch) ? "main" : request.Branch.Trim();
35 if (message is not null
36 && ForgeCommitTrailerParser.TryParse(message, branch, out var fromTrailers))
37 {
38 provenanceRequest = fromTrailers;
39 }
40 }
41
42 if (provenanceRequest is not null)
43 {
44 var entity = repository.UpsertCommitProvenance(repo, sha, provenanceRequest);
45 provenance = ForgeCommitProvenanceHelper.ToResponse(entity, repo.Name);
46 }
47
48 await ci.EmitIopAsync(
49 new ForgeIopEvent(
50 "git.push",
51 repo.Name,
52 new
53 {
54 branch = request.Branch,
55 commit = request.Commit,
56 @ref = request.Ref,
57 provenance,
58 },
59 provenance?.Actor,
60 Anchors: provenance?.Anchors),
61 cancellationToken).ConfigureAwait(false);
62 return Results.Ok(new { status = "accepted", provenance });
63 }
64}
65
View only · write via MCP/CIDE