2025-04-19 12:20:33 +01:00
|
|
|
package taskrc
|
|
|
|
|
|
2025-08-18 21:43:36 +01:00
|
|
|
import (
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"slices"
|
|
|
|
|
|
|
|
|
|
"github.com/go-task/task/v3/internal/fsext"
|
|
|
|
|
"github.com/go-task/task/v3/taskrc/ast"
|
|
|
|
|
)
|
|
|
|
|
|
2025-04-19 12:20:33 +01:00
|
|
|
var defaultTaskRCs = []string{
|
|
|
|
|
".taskrc.yml",
|
|
|
|
|
".taskrc.yaml",
|
|
|
|
|
}
|
2025-08-18 21:43:36 +01:00
|
|
|
|
|
|
|
|
// GetConfig loads and merges local and global Task configuration files
|
|
|
|
|
func GetConfig(dir string) (*ast.TaskRC, error) {
|
|
|
|
|
var config *ast.TaskRC
|
|
|
|
|
reader := NewReader()
|
|
|
|
|
|
|
|
|
|
// Read the XDG config file
|
|
|
|
|
if xdgConfigHome := os.Getenv("XDG_CONFIG_HOME"); xdgConfigHome != "" {
|
|
|
|
|
xdgConfigNode, err := NewNode("", filepath.Join(xdgConfigHome, "task"))
|
|
|
|
|
if err == nil && xdgConfigNode != nil {
|
|
|
|
|
config, err = reader.Read(xdgConfigNode)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Find all the nodes from the given directory up to the users home directory
|
|
|
|
|
entrypoints, err := fsext.SearchAll("", dir, defaultTaskRCs)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Reverse the entrypoints since we want the child files to override parent ones
|
|
|
|
|
slices.Reverse(entrypoints)
|
|
|
|
|
|
|
|
|
|
// Loop over the nodes, and merge them into the main config
|
|
|
|
|
for _, entrypoint := range entrypoints {
|
|
|
|
|
node, err := NewNode("", entrypoint)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
localConfig, err := reader.Read(node)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if localConfig == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if config == nil {
|
|
|
|
|
config = localConfig
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
config.Merge(localConfig)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return config, nil
|
|
|
|
|
}
|