@@ -2,19 +2,14 @@ package main
22
33import (
44 "context"
5- "fmt"
6- "log/slog"
75 "os"
86 "os/exec"
97 "os/signal"
10- "path/filepath"
118 "strings"
12- "sync"
139 "syscall"
1410 "time"
1511
1612 "github.com/nxtcoder17/fwatcher/pkg/executor"
17- fn "github.com/nxtcoder17/fwatcher/pkg/functions"
1813 "github.com/nxtcoder17/fwatcher/pkg/logging"
1914 "github.com/nxtcoder17/fwatcher/pkg/watcher"
2015 "github.com/urfave/cli/v3"
@@ -25,21 +20,11 @@ var (
2520 Version string
2621)
2722
28- // DefaultIgnoreList is list of directories that are mostly ignored
29- var DefaultIgnoreList = []string {
30- ".git" , ".svn" , ".hg" , // version control
31- ".idea" , ".vscode" , // IDEs
32- ".direnv" , // direnv nix
33- "node_modules" , // node
34- ".DS_Store" , // macOS
35- ".log" , // logs
36- }
37-
3823func main () {
3924 cmd := & cli.Command {
4025 Name : ProgramName ,
4126 UseShortOptionHandling : true ,
42- Usage : "simple tool to run commands on filesystem change events" ,
27+ Usage : "a simple tool to run things on filesystem change events" ,
4328 ArgsUsage : "<Command To Run>" ,
4429 Version : Version ,
4530 Flags : []cli.Flag {
@@ -77,7 +62,7 @@ func main() {
7762 & cli.StringSliceFlag {
7863 Name : "ignore-list" ,
7964 Usage : "disables ignoring from default ignore list" ,
80- Value : DefaultIgnoreList ,
65+ Value : watcher . DefaultIgnoreList ,
8166 Aliases : []string {"I" },
8267 },
8368
@@ -92,17 +77,10 @@ func main() {
9277 Usage : "interactive mode, with stdin" ,
9378 },
9479
95- & cli.BoolFlag {
96- Name : "sse" ,
97- Usage : "run watcher in sse mode" ,
98- },
99-
10080 & cli.StringFlag {
10181 Name : "sse-addr" ,
10282 HideDefault : false ,
103- Usage : "run watcher in sse mode" ,
104- Sources : cli.ValueSourceChain {},
105- Value : ":12345" ,
83+ Usage : "run watcher with Server Side Events (SSE) enabled" ,
10684 },
10785 },
10886 Action : func (ctx context.Context , c * cli.Command ) error {
@@ -161,86 +139,39 @@ func main() {
161139 panic (err )
162140 }
163141
164- var ex executor.Executor
142+ var executors [] executor.Executor
165143
166- switch {
167- case c .Bool ("sse" ):
168- {
169- sseAddr := c .String ("sse-addr" )
170- ex = executor .NewSSEExecutor (executor.SSEExecutorArgs {Addr : sseAddr })
171- logger .Info ("HELLo world" )
172- }
173- default :
174- {
175- execCmd := c .Args ().First ()
176- execArgs := c .Args ().Tail ()
177- ex = executor .NewCmdExecutor (ctx , executor.CmdExecutorArgs {
178- Logger : logger ,
179- Interactive : c .Bool ("interactive" ),
180- Command : func (context.Context ) * exec.Cmd {
144+ if sseAddr := c .String ("sse-addr" ); sseAddr != "" {
145+ executors = append (executors , executor .NewSSEExecutor (executor.SSEExecutorArgs {Addr : sseAddr }))
146+ }
147+
148+ if c .NArg () > 0 {
149+ execCmd := c .Args ().First ()
150+ execArgs := c .Args ().Tail ()
151+ executors = append (executors , executor .NewCmdExecutor (ctx , executor.CmdExecutorArgs {
152+ Logger : logger ,
153+ Interactive : c .Bool ("interactive" ),
154+ Commands : []func (context.Context ) * exec.Cmd {
155+ func (c context.Context ) * exec.Cmd {
181156 cmd := exec .CommandContext (ctx , execCmd , execArgs ... )
182157 cmd .Stdout = os .Stdout
183158 cmd .Stderr = os .Stderr
184159 cmd .Stdin = os .Stdin
185160 return cmd
186161 },
187- // IsInteractive: true,
188- })
189- }
162+ },
163+ }))
190164 }
191165
192- var wg sync.WaitGroup
193- wg .Add (1 )
194- go func () {
195- defer wg .Done ()
196- if err := ex .Start (); err != nil {
197- slog .Error ("got" , "err" , err )
198- }
199- logger .Debug ("1. start-job finished" )
200- }()
201-
202- counter := 0
203- pwd := fn .Must (os .Getwd ())
204-
205- wg .Add (1 )
206- go func () {
207- defer wg .Done ()
208- w .Watch (ctx )
209- logger .Debug ("2. watch context closed" )
210- }()
211-
212- wg .Add (1 )
213- go func () {
214- defer wg .Done ()
215- <- ctx .Done ()
216- ex .Stop ()
217- logger .Debug ("3. killed signal processed" )
218- }()
219-
220- for event := range w .GetEvents () {
221- logger .Debug ("received" , "event" , event )
222- relPath , err := filepath .Rel (pwd , event .Name )
223- if err != nil {
224- return err
225- }
226- counter += 1
227- logger .Info (fmt .Sprintf ("[RELOADING (%d)] due changes in %s" , counter , relPath ))
228-
229- ex .OnWatchEvent (executor.Event {Source : event .Name })
166+ if err := w .WatchAndExecute (ctx , executors ); err != nil {
167+ return err
230168 }
231169
232- // logger.Debug("stopping executor")
233- // if err := ex.Stop(); err != nil {
234- // return err
235- // }
236- // logger.Info("stopped executor")
237-
238- wg .Wait ()
239170 return nil
240171 },
241172 }
242173
243- ctx , stop := signal .NotifyContext (context .TODO (), syscall .SIGINT , syscall .SIGTERM , syscall . SIGABRT )
174+ ctx , stop := signal .NotifyContext (context .TODO (), syscall .SIGINT , syscall .SIGTERM )
244175 defer stop ()
245176
246177 if err := cmd .Run (ctx , os .Args ); err != nil {
0 commit comments