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}