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	"os"
 9	"path/filepath"
10
11	"github.com/samber/oops"
12	executorLib "gitroot.dev/executor/lib"
13	pluginLib "gitroot.dev/libs/golang/plugin/model"
14	"gitroot.dev/server/logger"
15)
16
17type BareMetal struct {
18	logger *logger.Logger
19}
20
21func NewBareMetal(log *logger.Logger) *BareMetal {
22	return &BareMetal{
23		logger: log.NewSubLogger("bareMetal"),
24	}
25}
26
27func (e *BareMetal) name() string {
28	return "bareMetal"
29}
30
31func (e *BareMetal) prepareTempDir(dir string) error {
32	err := os.MkdirAll(filepath.Join(dir, JOB_CONTEXT_DIR), os.ModePerm)
33	if err != nil {
34		return oops.Wrapf(err, "can't MkdirAll for JOB_CONTEXT_DIR dir")
35	}
36	return nil
37}
38
39func (e *BareMetal) exec(dir string, exe pluginLib.Exec, projectPluginCacheDir string) (*pluginLib.ExecStatus, error) {
40	for _, cache := range exe.Cache {
41		cacheSource := filepath.Join(projectPluginCacheDir, CACHE_DIR, cache.Key)
42		err := os.MkdirAll(cacheSource, os.ModePerm)
43		if err != nil {
44			return nil, err
45		}
46		if cache.ReadOnly {
47			err = copyDir(cacheSource, filepath.Join(dir, APP_DIR, cache.Path))
48		} else {
49			target := filepath.Join(dir, APP_DIR, cache.Path)
50			dir, _ := filepath.Split(target)
51			err = os.MkdirAll(dir, os.ModePerm)
52			if err != nil {
53				return nil, err
54			}
55			err = os.Symlink(cacheSource, target)
56		}
57		if err != nil {
58			return nil, err
59		}
60	}
61	return executorLib.Start(filepath.Join(dir, APP_DIR), exe, true)
62}