1
0
mirror of https://github.com/go-task/task.git synced 2026-04-24 19:54:16 +02:00
Files

102 lines
2.2 KiB
Go
Raw Permalink Normal View History

2023-12-29 20:32:03 +00:00
package taskfile
2023-09-02 15:24:01 -05:00
import (
2023-09-12 16:42:54 -05:00
"context"
2023-09-02 15:24:01 -05:00
"strings"
2024-03-25 19:05:21 +00:00
"time"
2023-09-02 15:24:01 -05:00
giturls "github.com/chainguard-dev/git-urls"
2023-09-12 16:42:54 -05:00
"github.com/go-task/task/v3/errors"
"github.com/go-task/task/v3/experiments"
2025-04-19 12:20:33 +01:00
"github.com/go-task/task/v3/internal/fsext"
2023-09-02 15:24:01 -05:00
)
type Node interface {
Read() ([]byte, error)
2023-09-02 15:24:01 -05:00
Parent() Node
Location() string
2024-02-13 01:07:00 +00:00
Dir() string
2025-05-24 14:00:02 +01:00
Checksum() string
Verify(checksum string) bool
2024-02-13 19:29:28 +00:00
ResolveEntrypoint(entrypoint string) (string, error)
ResolveDir(dir string) (string, error)
}
type RemoteNode interface {
Node
ReadContext(ctx context.Context) ([]byte, error)
CacheKey() string
2023-09-02 15:24:01 -05:00
}
2024-01-25 12:22:10 +00:00
func NewRootNode(
entrypoint string,
2024-02-13 01:07:00 +00:00
dir string,
2024-01-25 12:22:10 +00:00
insecure bool,
2024-03-25 19:05:21 +00:00
timeout time.Duration,
opts ...NodeOption,
2024-01-25 12:22:10 +00:00
) (Node, error) {
2025-04-19 12:20:33 +01:00
dir = fsext.DefaultDir(entrypoint, dir)
2024-05-08 16:44:05 +01:00
// If the entrypoint is "-", we read from stdin
if entrypoint == "-" {
return NewStdinNode(dir)
2024-01-25 12:22:10 +00:00
}
return NewNode(entrypoint, dir, insecure, opts...)
2024-01-25 12:22:10 +00:00
}
2023-09-12 16:42:54 -05:00
func NewNode(
2024-02-13 01:07:00 +00:00
entrypoint string,
dir string,
2023-09-12 16:42:54 -05:00
insecure bool,
opts ...NodeOption,
) (Node, error) {
var node Node
var err error
scheme, err := getScheme(entrypoint)
if err != nil {
return nil, err
}
switch scheme {
case "git":
node, err = NewGitNode(entrypoint, dir, insecure, opts...)
2023-09-12 16:42:54 -05:00
case "http", "https":
node, err = NewHTTPNode(entrypoint, dir, insecure, opts...)
2023-09-02 15:24:01 -05:00
default:
node, err = NewFileNode(entrypoint, dir, opts...)
2023-09-12 16:42:54 -05:00
}
if _, isRemote := node.(RemoteNode); isRemote && !experiments.RemoteTaskfiles.Enabled() {
2023-12-29 20:42:30 +00:00
return nil, errors.New("task: Remote taskfiles are not enabled. You can read more about this experiment and how to enable it at https://taskfile.dev/experiments/remote-taskfiles")
2023-09-02 15:24:01 -05:00
}
2023-09-12 16:42:54 -05:00
return node, err
2023-09-02 15:24:01 -05:00
}
func isRemoteEntrypoint(entrypoint string) bool {
scheme, _ := getScheme(entrypoint)
switch scheme {
case "git", "http", "https":
return true
default:
return false
}
}
func getScheme(uri string) (string, error) {
u, err := giturls.Parse(uri)
if u == nil {
return "", err
}
if strings.HasSuffix(strings.Split(u.Path, "//")[0], ".git") && (u.Scheme == "git" || u.Scheme == "ssh" || u.Scheme == "https" || u.Scheme == "http") {
return "git", nil
}
2023-09-02 15:24:01 -05:00
if i := strings.Index(uri, "://"); i != -1 {
return uri[:i], nil
2023-09-02 15:24:01 -05:00
}
return "", nil
2023-09-02 15:24:01 -05:00
}