Skip to content

Commit d6eb5f0

Browse files
committed
feat: brings back support to print syntax highlighted commands prior to their execution
1 parent 2f6194b commit d6eb5f0

File tree

4 files changed

+68
-11
lines changed

4 files changed

+68
-11
lines changed

go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ module github.com/nxtcoder17/runfile
33
go 1.24
44

55
require (
6+
github.com/alecthomas/chroma/v2 v2.15.0
7+
github.com/charmbracelet/lipgloss v1.0.0
68
github.com/joho/godotenv v1.5.1
79
github.com/muesli/termenv v0.15.2
810
github.com/nxtcoder17/fwatcher v1.2.0
@@ -14,6 +16,8 @@ require (
1416

1517
require (
1618
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
19+
github.com/charmbracelet/x/ansi v0.4.2 // indirect
20+
github.com/dlclark/regexp2 v1.11.4 // indirect
1721
github.com/fsnotify/fsnotify v1.8.0 // indirect
1822
github.com/google/go-cmp v0.6.0 // indirect
1923
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect

go.sum

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,28 @@
1+
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
2+
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
3+
github.com/alecthomas/chroma/v2 v2.15.0 h1:LxXTQHFoYrstG2nnV9y2X5O94sOBzf0CIUpSTbpxvMc=
4+
github.com/alecthomas/chroma/v2 v2.15.0/go.mod h1:gUhVLrPDXPtp/f+L1jo9xepo9gL4eLwRuGAunSZMkio=
5+
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
6+
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
17
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
28
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
9+
github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg=
10+
github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo=
11+
github.com/charmbracelet/x/ansi v0.4.2 h1:0JM6Aj/g/KC154/gOP4vfxun0ff6itogDYk41kof+qk=
12+
github.com/charmbracelet/x/ansi v0.4.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
313
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
414
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
515
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
16+
github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
17+
github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
618
github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
719
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
820
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
921
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
1022
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
1123
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
24+
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
25+
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
1226
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
1327
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
1428
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
@@ -23,8 +37,6 @@ github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6T
2337
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
2438
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
2539
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
26-
github.com/nxtcoder17/fwatcher v1.1.0 h1:boRQ1zyN7SDnRYqrEUMJTKpf/j3sQ3YMY0FQKkUIQ0o=
27-
github.com/nxtcoder17/fwatcher v1.1.0/go.mod h1:50dOLE7lHu6bwGtBM7lZ5m6b8wKKMUZDPgBKM2pgdEA=
2840
github.com/nxtcoder17/fwatcher v1.2.0 h1:Nn5NQZrd6tnY0aFIUmpHCysLDbIsUYn4oyHaxEaVj60=
2941
github.com/nxtcoder17/fwatcher v1.2.0/go.mod h1:SMwIdCpyi5fBygrkCX8hIIUeILzgoxJFaDSlhFBOWWQ=
3042
github.com/nxtcoder17/go.pkgs v0.0.0-20250216034729-39e2d2cd48da h1:Y6GILHFlrihVfDqDPQ98y2kdUeI0SQc8tnoXh2NbEIA=

runner/run-task.go

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package runner
22

33
import (
4-
// "bytes"
4+
"bytes"
55
"context"
66
"fmt"
7+
"io"
78
"os"
89
"os/exec"
910
"path/filepath"
1011
"strings"
1112
"sync"
1213

13-
// "github.com/alecthomas/chroma/v2/quick"
14-
// "github.com/charmbracelet/lipgloss"
14+
"github.com/alecthomas/chroma/v2/quick"
15+
"github.com/charmbracelet/lipgloss"
1516
"github.com/muesli/termenv"
1617
"github.com/nxtcoder17/fwatcher/pkg/executor"
1718
"github.com/nxtcoder17/fwatcher/pkg/watcher"
@@ -53,6 +54,35 @@ func isTTY() bool {
5354
return ((stdout.Mode() & os.ModeCharDevice) == os.ModeCharDevice) && ((stderr.Mode() & os.ModeCharDevice) == os.ModeCharDevice)
5455
}
5556

57+
func printCommand(writer io.Writer, prefix, lang, cmd string) {
58+
if isTTY() {
59+
borderColor := "#4388cc"
60+
if !isDarkTheme() {
61+
borderColor = "#3d5485"
62+
}
63+
s := lipgloss.NewStyle().BorderForeground(lipgloss.Color(borderColor)).PaddingLeft(1).PaddingRight(1).Border(lipgloss.RoundedBorder(), true, true, true, true)
64+
// labelStyle := lipgloss.NewStyle().Foreground(lipgloss.Color(borderColor)).Blink(true)
65+
66+
hlCode := new(bytes.Buffer)
67+
// choose colorschemes from `https://swapoff.org/chroma/playground/`
68+
colorscheme := "catppuccin-macchiato"
69+
if !isDarkTheme() {
70+
colorscheme = "monokailight"
71+
}
72+
_ = colorscheme
73+
// quick.Highlight(hlCode, strings.TrimSpace(command.Command), "bash", "terminal16m", colorscheme)
74+
75+
cmdStr := strings.TrimSpace(cmd)
76+
77+
quick.Highlight(hlCode, cmdStr, lang, "terminal16m", colorscheme)
78+
// cst := styles.Get("gruvbox")
79+
// fmt.Println("cst: ", cst.Name, styles.Fallback.Name, styles.Names())
80+
81+
// fmt.Printf("%s\n", s.Render(args.taskName+" | "+hlCode.String()))
82+
fmt.Fprintf(writer, "%s\n", s.Render(padString(hlCode.String(), prefix)))
83+
}
84+
}
85+
5686
type CreateCommandGroupArgs struct {
5787
Runfile *types.ParsedRunfile
5888
Task *types.ParsedTask
@@ -104,6 +134,15 @@ func createCommandGroups(ctx Context, args CreateCommandGroupArgs) ([]executor.C
104134
cg := executor.CommandGroup{Parallel: args.Task.Parallel}
105135

106136
cg.Commands = append(cg.Commands, func(c context.Context) *exec.Cmd {
137+
commandsList := make([]string, 0, len(args.Task.Commands))
138+
for _, c := range args.Task.Commands {
139+
if c.Command != nil {
140+
commandsList = append(commandsList, *c.Command)
141+
}
142+
}
143+
144+
printCommand(args.Stdout.WithPrefix(""), strings.Join(args.Trail, "/"), "bash", strings.Join(commandsList, "\n"))
145+
107146
return CreateCommand(ctx, CmdArgs{
108147
Shell: args.Task.Shell,
109148
Env: fn.ToEnviron(args.Task.Env),

runner/writer.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ import (
99
)
1010

1111
type LineWriter struct {
12-
prefix string
13-
w io.Writer
12+
w io.Writer
1413
}
1514

1615
// Write implements io.Writer.
@@ -40,7 +39,7 @@ func (s *LogWriter) WithPrefix(prefix string) io.Writer {
4039
defer s.wg.Done()
4140
copyStream(prefix, s.w, pr)
4241
}()
43-
return &LineWriter{prefix: prefix, w: pw}
42+
return &LineWriter{w: pw}
4443
}
4544

4645
func (s *LogWriter) Wait() {
@@ -52,15 +51,18 @@ func copyStream(prefix string, dest io.Writer, src io.Reader) {
5251
for {
5352
b, err := r.ReadBytes('\n')
5453
if err != nil {
55-
fmt.Println("ERR: ", err)
5654
if errors.Is(err, io.EOF) {
57-
dest.Write([]byte(fmt.Sprintf("[%s] ", prefix)))
55+
if prefix != "" {
56+
dest.Write([]byte(fmt.Sprintf("[%s] ", prefix)))
57+
}
5858
dest.Write(b)
5959
return
6060
}
6161
}
6262

63-
dest.Write([]byte(fmt.Sprintf("[%s] ", prefix)))
63+
if prefix != "" {
64+
dest.Write([]byte(fmt.Sprintf("[%s] ", prefix)))
65+
}
6466
dest.Write(b)
6567
}
6668
}

0 commit comments

Comments
 (0)