// SPDX-FileCopyrightText: 2025 Romain Maneschi // // SPDX-License-Identifier: EUPL-1.2 package plugin import ( "context" "encoding/json" "io/fs" "github.com/go-git/go-git/v6/plumbing" grfs "gitroot.dev/server/fs" "gitroot.dev/server/logger" "gitroot.dev/server/repository" ) func (r *runtime) sendReports(ctx context.Context, repo *repository.GitRootRepository, repoWriter *repository.GitRootRepositoryWrite, plugins []Plugin) { r.logger.Debug("start sendReports", logger.NewLoggerPair("nb reports", len(r.reports))) r.repo = repo r.repoWriter = repoWriter r.command = nil fs := grfs.NewMultiple(ctx, map[string]fs.FS{ "worktree": r.repoWriter.ToFs(ctx), "webcontent": r.manager.conf.DataWeb(r.repo.Name()), }) for _, plugin := range plugins { fs.UpdateSubFs("cache", r.manager.conf.Cache(r.repo.Name(), plugin.Name)) r.plugin = plugin m, err := r.loadModule(r.ctx, plugin, fs) if err != nil { r.logger.Error("loadModule for sendReports error", err, logger.NewLoggerPair("name", plugin.Name)) continue } reporter := m.ExportedFunction("report") if reporter == nil { r.logger.Debug("not a reporter", logger.NewLoggerPair("plugin", plugin.Name)) continue } malloc := m.ExportedFunction("gitrootAlloc") if malloc == nil { malloc = m.ExportedFunction("malloc") } for _, report := range r.reports { for _, pluginRun := range plugin.Run { isAuthorized := checkBranch(pluginRun, plumbing.NewBranchReferenceName(report.FromBranch)) if !isAuthorized { continue } r.pluginRun = pluginRun reportJson, err := json.Marshal(report) if err != nil { r.logger.Error("can't marshal report", err, logger.NewLoggerPair("name", plugin.Name)) continue } if err := r.writeMemoryAndCall(m, reporter, malloc, string(reportJson)); err != nil { r.logger.Error("can't report to plugin", err, logger.NewLoggerPair("plugin", plugin.Name)) continue } } } } }