The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/pkg/tsdb/Magefile.go

105 lines
2.2 KiB

//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
}
return filepath.Abs(pluginDir)
}
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
}