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 exec
6
7import (
8 "bytes"
9 "context"
10 "fmt"
11 "os"
12 "os/exec"
13 "path/filepath"
14 "time"
15
16 pluginLib "gitroot.dev/libs/golang/plugin/model"
17 "gitroot.dev/server/logger"
18 "gitroot.dev/server/repository"
19)
20
21type manager struct {
22 logger *logger.Logger
23 ctx context.Context
24 conf needConf
25}
26
27type needConf interface {
28 GetDirPathData() string
29 RootCommiterPseudo() string
30}
31
32func NewManager(ctx context.Context, conf needConf) *manager {
33 m := &manager{
34 logger: logger.NewLoggerCtx(logger.EXEC, ctx),
35 ctx: ctx,
36 conf: conf,
37 }
38 return m
39}
40
41func (m *manager) prepareExec(project *repository.GitRootRepository, callback func(dir string) error) error {
42 dir := os.TempDir()
43 tempDir := filepath.Join(dir, "pipelines-gitroot", fmt.Sprintf("%s-%d", project.Name(), time.Now().Nanosecond()))
44
45 err := os.MkdirAll(tempDir, os.ModePerm)
46 if err != nil {
47 return err
48 }
49
50 err = project.Worktree(tempDir)
51 if err != nil {
52 return err
53 }
54 return callback(tempDir)
55}
56
57func (m *manager) Exec(project *repository.GitRootRepository, commands []pluginLib.Exec) (string, error) {
58 buf := new(bytes.Buffer)
59 err := m.prepareExec(project, func(dir string) error {
60 for _, cmd := range commands {
61 c := exec.Command(cmd.Cmd, cmd.Args...)
62 m.logger.Debug("exec a cmd", logger.NewLoggerPair("cmd", cmd.Cmd), logger.NewLoggerPair("args", cmd.Args))
63 c.Env = cmd.Env
64 c.Dir = dir
65 c.Stdout = buf
66 c.Stderr = buf
67 err := c.Run()
68 if err != nil {
69 return err
70 }
71 }
72 return nil
73 })
74 return buf.String(), err
75}