Skip to content

Commit fbcbcde

Browse files
authored
Merge pull request #38 from nxtcoder17/feat/run-target-in-included-file
2 parents 3020367 + 1278276 commit fbcbcde

13 files changed

+76
-67
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ bin/
33
.secrets/
44
Taskfile.yml
55
go.work*
6+
tags

cmd/run/main.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -202,13 +202,15 @@ func main() {
202202
return err
203203
}
204204

205-
rf, err2 := parser.ParseRunfile(types.NewContext(ctx, logger), runfilePath)
205+
runfileCtx := types.NewContext(ctx, logger)
206+
207+
rf, err2 := parser.ParseRunfile(runfileCtx, runfilePath)
206208
if err2 != nil {
207209
slog.Error("parsing runfile, got", "err", err2)
208210
panic(err2)
209211
}
210212

211-
if err := runner.Run(types.NewContext(ctx, logger), rf, runner.RunArgs{
213+
if err := runner.Run(runfileCtx, rf, runner.RunArgs{
212214
Tasks: args,
213215
ExecuteInParallel: parallel,
214216
Watch: watch,

flake.lock

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
module github.com/nxtcoder17/runfile
22

3-
go 1.24
3+
go 1.24.1
4+
5+
toolchain go1.24.2
46

57
require (
68
github.com/alecthomas/chroma/v2 v2.15.0
79
github.com/charmbracelet/lipgloss v1.0.0
810
github.com/joho/godotenv v1.5.1
911
github.com/muesli/termenv v0.15.2
12+
github.com/nxtcoder17/fastlog v0.0.0-20250416154215-c6aac24aebcb
1013
github.com/nxtcoder17/fwatcher v1.2.2-0.20250318121757-bfc2065fa9f5
1114
github.com/nxtcoder17/go.pkgs v0.0.0-20250216034729-39e2d2cd48da
1215
github.com/urfave/cli/v3 v3.0.0-beta1

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6T
3737
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
3838
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
3939
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
40-
github.com/nxtcoder17/fwatcher v1.2.0 h1:Nn5NQZrd6tnY0aFIUmpHCysLDbIsUYn4oyHaxEaVj60=
41-
github.com/nxtcoder17/fwatcher v1.2.0/go.mod h1:SMwIdCpyi5fBygrkCX8hIIUeILzgoxJFaDSlhFBOWWQ=
40+
github.com/nxtcoder17/fastlog v0.0.0-20250416154215-c6aac24aebcb h1:BHKArf9In3jINU2B3mTLQb75F5PMoJ5fnOlRD7dOq/w=
41+
github.com/nxtcoder17/fastlog v0.0.0-20250416154215-c6aac24aebcb/go.mod h1:EWaIRNdsxHdqCv53XcNw9H9QMwhEV3LTWfsSQZCiiC4=
4242
github.com/nxtcoder17/fwatcher v1.2.2-0.20250318121757-bfc2065fa9f5 h1:6BulIAQBv2FZqUFZcKtFEhc1vMOeOdeMS+S5d874FMY=
4343
github.com/nxtcoder17/fwatcher v1.2.2-0.20250318121757-bfc2065fa9f5/go.mod h1:SMwIdCpyi5fBygrkCX8hIIUeILzgoxJFaDSlhFBOWWQ=
4444
github.com/nxtcoder17/go.pkgs v0.0.0-20250216034729-39e2d2cd48da h1:Y6GILHFlrihVfDqDPQ98y2kdUeI0SQc8tnoXh2NbEIA=

parser/parse-command.go

+4
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ func parseCommand(ctx types.Context, prf *types.ParsedRunfile, taskEnv map[strin
4444
switch {
4545
case cj.Run != nil:
4646
{
47+
if ctx.TaskNamespace != "" {
48+
*cj.Run = ctx.TaskNamespace + ":" + *cj.Run
49+
}
4750
pcj.Run = cj.Run
51+
4852
if _, ok := prf.Tasks[*cj.Run]; !ok {
4953
err := errors.ErrTaskNotFound.Wrap(fmt.Errorf("run target, not found")).KV("command", command, "run-target", cj.Run)
5054
return nil, err

parser/parse-task.go

+1
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ func ParseTask(ctx types.Context, prf *types.ParsedRunfile, task types.Task) (*t
118118
}
119119

120120
return &types.ParsedTask{
121+
Namespace: task.Metadata.Namespace,
121122
Name: task.Name,
122123
Shell: task.Shell,
123124
WorkingDir: *task.Dir,

parser/parser-runfile.go

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package parser
22

33
import (
4-
"context"
54
"fmt"
65
"os"
76
"path/filepath"
87

9-
"github.com/nxtcoder17/go.pkgs/log"
108
"github.com/nxtcoder17/runfile/errors"
119
fn "github.com/nxtcoder17/runfile/functions"
1210
"github.com/nxtcoder17/runfile/types"
@@ -18,25 +16,28 @@ func parseRunfile(ctx types.Context, runfile *types.Runfile) (*types.ParsedRunfi
1816
Env: make(map[string]string),
1917
Tasks: make(map[string]types.Task),
2018
}
19+
prf.Metadata.RunfilePath = runfile.Filepath
2120

2221
for k, task := range runfile.Tasks {
2322
task.Name = k
23+
task.Metadata.RunfilePath = &prf.Metadata.RunfilePath
2424
prf.Tasks[k] = task
2525
}
2626

27-
m, err := parseIncludes(ctx, runfile.Includes)
27+
includes, err := parseIncludes(ctx, runfile.Includes)
2828
if err != nil {
2929
return nil, err
3030
}
3131

32-
for k, iprf := range m {
33-
for taskName, task := range iprf.Tasks {
34-
task.Name = k
35-
task.Metadata.RunfilePath = &iprf.Metadata.RunfilePath
32+
for k, included := range includes {
33+
for taskName, task := range included.Tasks {
34+
task.Name = taskName
35+
task.Metadata.RunfilePath = &included.Metadata.RunfilePath
36+
task.Metadata.Namespace = k
3637
prf.Tasks[fmt.Sprintf("%s:%s", k, taskName)] = task
3738
}
3839

39-
for k, v := range iprf.Env {
40+
for k, v := range included.Env {
4041
prf.Env[k] = v
4142
}
4243
}
@@ -58,7 +59,7 @@ func parseRunfile(ctx types.Context, runfile *types.Runfile) (*types.ParsedRunfi
5859
return nil, err
5960
}
6061

61-
envVars, err := parseEnvVars(types.Context{Context: context.TODO(), Logger: log.New()}, runfile.Env, evaluationParams{Env: dotenvVars})
62+
envVars, err := parseEnvVars(ctx, runfile.Env, evaluationParams{Env: dotenvVars})
6263
if err != nil {
6364
return nil, err
6465
}
@@ -86,9 +87,6 @@ func parseRunfileFromFile(ctx types.Context, file string) (*types.ParsedRunfile,
8687
if err != nil {
8788
return nil, err
8889
}
89-
90-
// prf.Metadata.RunfilePath = file
91-
prf.Metadata.RunfilePath = fn.Must(filepath.Abs(file))
9290
return prf, nil
9391
}
9492

runner/run-task.go

+5-11
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func isTTY() bool {
5656

5757
func hasANSISupport() bool {
5858
term := os.Getenv("TERM")
59-
return strings.Contains(term, "xterm") || strings.Contains(term, "screen") || strings.Contains(term, "vt100")
59+
return strings.Contains(term, "xterm") || strings.Contains(term, "screen") || strings.Contains(term, "vt100") || strings.Contains(term, "tmux")
6060
}
6161

6262
func printCommand(writer io.Writer, prefix, lang, cmd string) {
@@ -187,25 +187,19 @@ func createCommandGroups(ctx types.Context, args CreateCommandGroupArgs) ([]exec
187187
}
188188

189189
func runTask(ctx types.Context, prf *types.ParsedRunfile, args runTaskArgs) error {
190-
runfilePath := prf.Metadata.RunfilePath
191190
task := prf.Tasks[args.taskName]
192-
193-
if task.Metadata.RunfilePath != nil {
194-
runfilePath = *task.Metadata.RunfilePath
195-
}
196-
197191
args.taskTrail = append(args.taskTrail, args.taskName)
198192

199-
logger := ctx.With("task", args.taskName, "runfile", fn.Must(filepath.Rel(fn.Must(os.Getwd()), runfilePath)))
200-
logger.Debug("running task")
193+
logger := ctx.With("task", args.taskName, "runfile", fn.Must(filepath.Rel(fn.Must(os.Getwd()), *task.Metadata.RunfilePath)), "namespace", task.Metadata.Namespace)
194+
logger.Debug("running")
195+
196+
ctx.TaskNamespace = task.Metadata.Namespace
201197

202198
task, ok := prf.Tasks[args.taskName]
203199
if !ok {
204200
return errors.ErrTaskNotFound
205201
}
206202

207-
task.Name = args.taskName
208-
209203
pt, err := parser.ParseTask(ctx, prf, task)
210204
if err != nil {
211205
return errors.WithErr(err)

runner/run-task_test.go

+31-31
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
package runner
22

3-
import (
4-
"context"
5-
"log/slog"
6-
"testing"
3+
// import (
4+
// "context"
5+
// "testing"
6+
//
7+
// "github.com/nxtcoder17/fwatcher/pkg/executor"
8+
// "github.com/nxtcoder17/go.pkgs/log"
9+
// "github.com/nxtcoder17/runfile/types"
10+
// )
711

8-
"github.com/nxtcoder17/fwatcher/pkg/executor"
9-
"github.com/nxtcoder17/runfile/types"
10-
)
11-
12-
func TestCreateCommands(t *testing.T) {
13-
tests := []struct {
14-
prf types.ParsedRunfile
15-
pt types.ParsedTask
16-
rta runTaskArgs
17-
18-
want []executor.CommandGroup
19-
}{
20-
{
21-
prf: types.ParsedRunfile{},
22-
pt: types.ParsedTask{},
23-
},
24-
}
25-
26-
for _, tt := range tests {
27-
cg, err := createCommandGroups(Context{Context: context.TODO(), Logger: slog.Default()}, &tt.prf, &tt.pt, tt.rta)
28-
if err != nil {
29-
t.Error(err)
30-
}
31-
32-
_ = cg
33-
}
34-
}
12+
// func TestCreateCommands(t *testing.T) {
13+
// tests := []struct {
14+
// prf types.ParsedRunfile
15+
// pt types.ParsedTask
16+
// rta runTaskArgs
17+
//
18+
// want []executor.CommandGroup
19+
// }{
20+
// {
21+
// prf: types.ParsedRunfile{},
22+
// pt: types.ParsedTask{},
23+
// },
24+
// }
25+
//
26+
// for _, tt := range tests {
27+
// cg, err := createCommandGroups(types.Context{Context: context.TODO(), Logger: log.New()}, &tt.prf, &tt.pt, tt.rta)
28+
// if err != nil {
29+
// t.Error(err)
30+
// }
31+
//
32+
// _ = cg
33+
// }
34+
// }

types/context.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import (
99
type Context struct {
1010
context.Context
1111
log.Logger
12-
TaskName string
12+
TaskName string
13+
TaskNamespace string
1314
}
1415

1516
func NewContext(ctx context.Context, logger log.Logger) Context {

types/parsed-types.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package types
22

33
type ParsedRunfile struct {
4-
Env map[string]string `json:"env,omitempty"`
5-
Tasks map[string]Task `json:"tasks"`
4+
Env map[string]string
5+
Includes map[string]Task
6+
Tasks map[string]Task
67

78
Metadata struct {
89
RunfilePath string
9-
} `json:"-"`
10+
}
1011
}
1112

1213
type ParsedTask struct {
14+
// Namespace for a task is auto set, when it is imported under a name
15+
Namespace string `json:"-"`
16+
1317
// Name should be resolved from key itself
1418
Name string `json:"-"`
1519

types/types.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package types
22

33
type Runfile struct {
4-
Filepath string
4+
Filepath string `json:"-"`
55
Version string `json:"version,omitempty"`
66
Includes map[string]IncludeSpec `json:"includes"`
77
Env EnvVar `json:"env,omitempty"`
@@ -51,6 +51,7 @@ type TaskWatch struct {
5151
type Task struct {
5252
Metadata struct {
5353
RunfilePath *string
54+
Namespace string
5455
}
5556

5657
Name string `json:"-"`

0 commit comments

Comments
 (0)