GitRoot
Craft your forge, Build your project, Grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package plugin
6
7import (
8 "context"
9
10 "github.com/go-git/go-git/v6/plumbing"
11 "github.com/tetratelabs/wazero/api"
12 "gitroot.dev/server/logger"
13 "gitroot.dev/server/repository"
14)
15
16func (r *runtime) sendReports(ctx context.Context, repo *repository.GitRootRepository, repoWriter *repository.GitRootRepositoryWrite, branch plumbing.ReferenceName, plugins []Plugin) {
17 r.logger.Debug("start sendReports", logger.NewLoggerPair("nb reports", len(r.reports)))
18 if len(r.reports) == 0 {
19 return
20 }
21
22 r.repo = repo
23 r.repoWriter = repoWriter
24 r.command = nil
25
26 toRunLater := []CommandForDiff{}
27
28 r.commitHook = func(hash plumbing.Hash) {
29 lastCom, err := repoWriter.GetLastCommit(hash)
30 if err != nil {
31 r.logger.Error("can't GetLastCommit in start runtime", err)
32 return
33 }
34 newCmd, err := CommandForDiffFromCommitCmd(ctx, r.plugin.commiter.SimpleUser, lastCom, branch)
35 if err != nil {
36 r.logger.Error("can't CommandForDiffFromCommitCmd in start runtime", err)
37 return
38 }
39 toRunLater = append(toRunLater, newCmd)
40 }
41
42 defer func() {
43 r.commitHook = nil
44 }()
45
46 it := r.iteratorManager.AddReports("reports", r.reports)
47
48 var m api.Module
49 var err error
50
51 for _, plugin := range plugins {
52 it.Reset()
53 r.plugin = plugin
54 m, _, err = r.loadModule(ctx, plugin)
55 if err != nil {
56 r.logger.Error("loadModule for sendReports error", err, logger.NewLoggerPair("name", plugin.Log()))
57 continue
58 }
59
60 reporter := m.ExportedFunction("report")
61 if reporter == nil {
62 r.logger.Debug("not a reporter", logger.NewLoggerPair("plugin", plugin.Log()))
63 continue
64 }
65
66 malloc := m.ExportedFunction("gitrootAlloc")
67 if malloc == nil {
68 malloc = m.ExportedFunction("malloc")
69 }
70
71 for _, pluginRun := range plugin.Run {
72 r.pluginRun = pluginRun
73
74 if err := r.writeMemoryAndCall(m, reporter, malloc, "reports"); err != nil {
75 r.logger.Error("can't report to plugin", err, logger.NewLoggerPair("plugin", plugin.Log()))
76 continue
77 }
78 }
79 }
80
81 r.iteratorManager.DeleteReports("reports")
82
83 r.logger.Debug("after send report", logger.NewLoggerPair("project", repo.Name()), logger.NewLoggerPair("nb commits", len(toRunLater)))
84 r.repo.StopWrite()
85 //No git/commit after report
86 repoWriterTemp, err := r.repo.WillWrite(branch)
87 r.repoWriter = repoWriterTemp
88 r.repoWriter.Reject()
89 for _, cmd := range toRunLater {
90 r.runCmd(ctx, plugins, repo, cmd)
91 }
92}