1
0
mirror of https://github.com/go-task/task.git synced 2025-11-23 22:24:45 +02:00
Files
task/taskfile/node_file.go

91 lines
2.2 KiB
Go
Raw Normal View History

package taskfile
import (
"io"
"os"
"path/filepath"
"github.com/go-task/task/v3/errors"
2024-02-13 01:07:00 +00:00
"github.com/go-task/task/v3/internal/execext"
"github.com/go-task/task/v3/internal/filepathext"
"github.com/go-task/task/v3/internal/fsext"
)
// A FileNode is a node that reads a taskfile from the local filesystem.
type FileNode struct {
*baseNode
entrypoint string
}
func NewFileNode(entrypoint, dir string, opts ...NodeOption) (*FileNode, error) {
// Find the entrypoint file
resolvedEntrypoint, err := fsext.Search(entrypoint, dir, defaultTaskfiles)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
return nil, errors.TaskfileNotFoundError{URI: entrypoint, Walk: false}
}
return nil, err
}
// Resolve the directory
resolvedDir, err := fsext.ResolveDir(entrypoint, resolvedEntrypoint, dir)
if err != nil {
return nil, err
}
return &FileNode{
baseNode: NewBaseNode(resolvedDir, opts...),
entrypoint: resolvedEntrypoint,
}, nil
}
func (node *FileNode) Location() string {
return node.entrypoint
}
func (node *FileNode) Read() ([]byte, error) {
f, err := os.Open(node.Location())
if err != nil {
return nil, err
}
defer f.Close()
return io.ReadAll(f)
}
2024-02-13 19:29:28 +00:00
func (node *FileNode) ResolveEntrypoint(entrypoint string) (string, error) {
2024-02-13 01:07:00 +00:00
// If the file is remote, we don't need to resolve the path
if isRemoteEntrypoint(entrypoint) {
return entrypoint, nil
}
2024-02-13 01:07:00 +00:00
2025-04-19 11:51:31 +01:00
path, err := execext.ExpandLiteral(entrypoint)
2024-02-13 01:07:00 +00:00
if err != nil {
return "", err
}
if filepathext.IsAbs(path) {
return path, nil
}
// NOTE: Uses the directory of the entrypoint (Taskfile), not the current working directory
// This means that files are included relative to one another
entrypointDir := filepath.Dir(node.entrypoint)
2024-02-13 01:07:00 +00:00
return filepathext.SmartJoin(entrypointDir, path), nil
}
2024-02-13 19:29:28 +00:00
func (node *FileNode) ResolveDir(dir string) (string, error) {
2025-04-19 11:51:31 +01:00
path, err := execext.ExpandLiteral(dir)
2024-02-13 01:07:00 +00:00
if err != nil {
return "", err
}
if filepathext.IsAbs(path) {
return path, nil
}
// NOTE: Uses the directory of the entrypoint (Taskfile), not the current working directory
// This means that files are included relative to one another
entrypointDir := filepath.Dir(node.entrypoint)
2024-02-13 01:07:00 +00:00
return filepathext.SmartJoin(entrypointDir, path), nil
}