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 "errors"
9 "io/fs"
10 "os"
11 "slices"
12 "strings"
13
14 "github.com/go-git/go-git/v5/plumbing"
15 pluginLib "gitroot.dev/libs/golang/plugin"
16)
17
18func checkBranch(pluginRun PluginRun, branch plumbing.ReferenceName) bool {
19 if len(pluginRun.Branch) == 0 {
20 return false
21 }
22
23 isAuthorized := true
24 for _, b := range pluginRun.Branch {
25 if b == "*" {
26 isAuthorized = true
27 break
28 }
29 if branch.Short() != b {
30 isAuthorized = false
31 }
32 }
33
34 //negate check
35 for _, b := range pluginRun.Branch {
36 if strings.HasPrefix(b, "!") && strings.TrimPrefix(b, "!") == branch.Short() {
37 isAuthorized = false
38 }
39 }
40
41 return isAuthorized
42}
43
44var ErrCantAdd = errors.New("plugin try to add new file but can't")
45var ErrCantMod = errors.New("plugin try to mod file but can't")
46
47func checkWrite(pluginWriteRight []PluginWriteRight, f fs.FS, path string) (bool, error) {
48 canAdd := slices.ContainsFunc(pluginWriteRight, func(pwr PluginWriteRight) bool {
49 return slices.Contains(pwr.Can, pluginLib.PluginWriteRightCanAdd) && pwr.glob.Match(path)
50 })
51 canMod := slices.ContainsFunc(pluginWriteRight, func(pwr PluginWriteRight) bool {
52 return slices.Contains(pwr.Can, pluginLib.PluginWriteRightCanMod) && pwr.glob.Match(path)
53 })
54 if !canAdd && !canMod {
55 return false, nil
56 }
57 if !canAdd || !canMod {
58 _, err := fs.Stat(f, path)
59 if errors.Is(err, os.ErrNotExist) && !canAdd {
60 return false, ErrCantAdd
61 } else if err == nil && !canMod {
62 return false, ErrCantMod
63 } else if err != nil && !errors.Is(err, os.ErrNotExist) {
64 return false, err
65 }
66 }
67 return true, nil
68}