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}