grafana/pkg/tsdb/Magefile.go
2024-01-24 14:01:15 +01:00

110 lines
2.3 KiB
Go

//go:build mage
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
build "github.com/grafana/grafana-plugin-sdk-go/build"
)
func find(dir string, name string) ([]string, error) {
files := []string{}
err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error {
if err != nil {
return err
}
if filepath.Base(path) == name {
files = append(files, path)
}
return nil
})
return files, err
}
func fileHasString(path string, s string) bool {
f, err := os.ReadFile(path)
if err != nil {
return false
}
return strings.Contains(string(f), s)
}
func findPluginJSONDir(pluginID string) (string, error) {
pluginJSONMatches, err := filepath.Glob("../../public/app/plugins/datasource/*/plugin.json")
if err != nil {
return "", err
}
if len(pluginJSONMatches) == 0 {
return "", fmt.Errorf("Could not find plugin.json")
}
pluginJSONPath := ""
for _, pluginJSONMatch := range pluginJSONMatches {
if !fileHasString(pluginJSONMatch, fmt.Sprintf(`"id": "%s"`, pluginID)) {
continue
}
pluginJSONPath = pluginJSONMatch
break
}
pluginJSONPath, err = filepath.Abs(pluginJSONPath)
if err != nil {
return "", err
}
return filepath.Dir(pluginJSONPath), nil
}
func findRootDir(pluginID string) (string, error) {
matches, err := find(".", "main.go")
if err != nil {
return "", err
}
if len(matches) == 0 {
return "", fmt.Errorf("Could not find main.go")
}
pluginDir := ""
for _, match := range matches {
if fileHasString(match, fmt.Sprintf(`datasource.Manage("%s"`, pluginID)) {
pluginDir = filepath.Dir(match)
break
}
}
if pluginDir == "" {
return "", nil
}
absolutePath, err := filepath.Abs(pluginDir)
if err != nil {
return "", err
}
return filepath.Dir(absolutePath), nil
}
func buildPlugin(rootDir, pluginJSONDir string) {
distDir := filepath.Join(pluginJSONDir, "dist")
configCallback := func(cfg build.Config) (build.Config, error) {
cfg.OutputBinaryPath = distDir
cfg.PluginJSONPath = pluginJSONDir
cfg.RootPackagePath = rootDir
return cfg, nil
}
build.SetBeforeBuildCallback(configCallback)
build.BuildAll()
}
func BuildPlugin(pluginID string) error {
rootDir, err := findRootDir(pluginID)
if err != nil {
return err
}
pluginJSONDir, err := findPluginJSONDir(pluginID)
if err != nil {
return err
}
buildPlugin(rootDir, pluginJSONDir)
return nil
}