From 7ffcdd7df266a689b9b80b969a3222d69b6f906c Mon Sep 17 00:00:00 2001 From: Dan O'Bryan Date: Mon, 17 Dec 2018 11:01:23 -0800 Subject: [PATCH 1/4] add ability to make the binary to be built outside the working directory --- main.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 2da9b60..d5ac7df 100644 --- a/main.go +++ b/main.go @@ -9,7 +9,6 @@ import ( shellwords "github.com/mattn/go-shellwords" "gopkg.in/urfave/cli.v1" - "github.com/0xAX/notificator" "log" "os" "os/signal" @@ -18,6 +17,8 @@ import ( "strings" "syscall" "time" + + "github.com/0xAX/notificator" ) var ( @@ -169,12 +170,17 @@ func MainAction(c *cli.Context) { logger.Fatal(err) } + bin := c.GlobalString("bin") + if strings.HasPrefix(bin, string(filepath.Separator)) == false { + bin = filepath.Join(wd, bin) + } + buildPath := c.GlobalString("build") if buildPath == "" { buildPath = c.GlobalString("path") } - builder := gin.NewBuilder(buildPath, c.GlobalString("bin"), c.GlobalBool("godep"), wd, buildArgs) - runner := gin.NewRunner(filepath.Join(wd, builder.Binary()), c.Args()...) + builder := gin.NewBuilder(buildPath, bin, c.GlobalBool("godep"), wd, buildArgs) + runner := gin.NewRunner(bin, c.Args()...) runner.SetWriter(os.Stdout) proxy := gin.NewProxy(builder, runner) From ef81c24394650985bdc77edbe4f216b77df70425 Mon Sep 17 00:00:00 2001 From: ObviouslyGreen Date: Wed, 29 Jan 2020 19:48:34 -0800 Subject: [PATCH 2/4] Add ability to watch multiple paths --- main.go | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/main.go b/main.go index d5ac7df..3024162 100644 --- a/main.go +++ b/main.go @@ -3,22 +3,21 @@ package main import ( "errors" "fmt" - - "github.com/codegangsta/envy/lib" - "github.com/codegangsta/gin/lib" - shellwords "github.com/mattn/go-shellwords" - "gopkg.in/urfave/cli.v1" - "log" "os" "os/signal" "path/filepath" "strconv" "strings" + "sync" "syscall" "time" "github.com/0xAX/notificator" + envy "github.com/codegangsta/envy/lib" + gin "github.com/ezoic/gin/lib" + "github.com/mattn/go-shellwords" + "gopkg.in/urfave/cli.v1" ) var ( @@ -63,17 +62,17 @@ func main() { EnvVar: "GIN_BIN", Usage: "name of generated binary file", }, - cli.StringFlag{ + cli.StringSliceFlag{ Name: "path,t", - Value: ".", + Value: &cli.StringSlice{}, EnvVar: "GIN_PATH", - Usage: "Path to watch files from", + Usage: "Paths to watch files from", }, cli.StringFlag{ Name: "build,d", Value: "", EnvVar: "GIN_BUILD", - Usage: "Path to build files from (defaults to same value as --path)", + Usage: "Path to build files from (defaults to first value of --path)", }, cli.StringSliceFlag{ Name: "excludeDir,x", @@ -175,9 +174,14 @@ func MainAction(c *cli.Context) { bin = filepath.Join(wd, bin) } + watchPaths := c.GlobalStringSlice("path") + if len(watchPaths) == 0 { + watchPaths = []string{"."} + } + buildPath := c.GlobalString("build") if buildPath == "" { - buildPath = c.GlobalString("path") + buildPath = watchPaths[0] } builder := gin.NewBuilder(buildPath, bin, c.GlobalBool("godep"), wd, buildArgs) runner := gin.NewRunner(bin, c.Args()...) @@ -209,7 +213,7 @@ func MainAction(c *cli.Context) { build(builder, runner, logger) // scan for changes - scanChanges(c.GlobalString("path"), c.GlobalStringSlice("excludeDir"), all, func(path string) { + scanChangesForPaths(watchPaths, c.GlobalStringSlice("excludeDir"), all, func(path string) { runner.Kill() build(builder, runner, logger) }) @@ -266,6 +270,15 @@ func build(builder gin.Builder, runner gin.Runner, logger *log.Logger) { type scanCallback func(path string) +func scanChangesForPaths(watchPaths, excludeDirs []string, allFiles bool, cb scanCallback) { + wg := sync.WaitGroup{} + wg.Add(1) + for _, p := range watchPaths { + go scanChanges(p, excludeDirs, allFiles, cb) + } + wg.Wait() +} + func scanChanges(watchPath string, excludeDirs []string, allFiles bool, cb scanCallback) { for { filepath.Walk(watchPath, func(path string, info os.FileInfo, err error) error { From fe5532612c07157e9402f77b638818b933f2d867 Mon Sep 17 00:00:00 2001 From: ObviouslyGreen Date: Thu, 30 Jan 2020 15:34:43 -0800 Subject: [PATCH 3/4] Update bin arg to be path to output binary --- lib/builder.go | 8 +++----- main.go | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/builder.go b/lib/builder.go index 345337c..4d346a5 100644 --- a/lib/builder.go +++ b/lib/builder.go @@ -3,7 +3,6 @@ package gin import ( "fmt" "os/exec" - "path/filepath" "runtime" "strings" ) @@ -19,11 +18,10 @@ type builder struct { binary string errors string useGodep bool - wd string buildArgs []string } -func NewBuilder(dir string, bin string, useGodep bool, wd string, buildArgs []string) Builder { +func NewBuilder(dir string, bin string, useGodep bool, buildArgs []string) Builder { if len(bin) == 0 { bin = "bin" } @@ -35,7 +33,7 @@ func NewBuilder(dir string, bin string, useGodep bool, wd string, buildArgs []st } } - return &builder{dir: dir, binary: bin, useGodep: useGodep, wd: wd, buildArgs: buildArgs} + return &builder{dir: dir, binary: bin, useGodep: useGodep, buildArgs: buildArgs} } func (b *builder) Binary() string { @@ -47,7 +45,7 @@ func (b *builder) Errors() string { } func (b *builder) Build() error { - args := append([]string{"go", "build", "-o", filepath.Join(b.wd, b.binary)}, b.buildArgs...) + args := append([]string{"go", "build", "-o", b.binary}, b.buildArgs...) var command *exec.Cmd if b.useGodep { diff --git a/main.go b/main.go index 3024162..58d2c82 100644 --- a/main.go +++ b/main.go @@ -60,7 +60,7 @@ func main() { Name: "bin,b", Value: "gin-bin", EnvVar: "GIN_BIN", - Usage: "name of generated binary file", + Usage: "path to generated binary file, defaults to current working directory", }, cli.StringSliceFlag{ Name: "path,t", @@ -183,7 +183,7 @@ func MainAction(c *cli.Context) { if buildPath == "" { buildPath = watchPaths[0] } - builder := gin.NewBuilder(buildPath, bin, c.GlobalBool("godep"), wd, buildArgs) + builder := gin.NewBuilder(buildPath, bin, c.GlobalBool("godep"), buildArgs) runner := gin.NewRunner(bin, c.Args()...) runner.SetWriter(os.Stdout) proxy := gin.NewProxy(builder, runner) From 2e13d32e062b52b43fb410e8a9b25e5a5a16c8eb Mon Sep 17 00:00:00 2001 From: ObviouslyGreen Date: Thu, 30 Jan 2020 16:17:56 -0800 Subject: [PATCH 4/4] Use mutex to prevent concurrent buidls --- lib/builder.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/builder.go b/lib/builder.go index 4d346a5..8237c76 100644 --- a/lib/builder.go +++ b/lib/builder.go @@ -5,6 +5,7 @@ import ( "os/exec" "runtime" "strings" + "sync" ) type Builder interface { @@ -19,6 +20,7 @@ type builder struct { errors string useGodep bool buildArgs []string + mutex *sync.Mutex } func NewBuilder(dir string, bin string, useGodep bool, buildArgs []string) Builder { @@ -33,7 +35,9 @@ func NewBuilder(dir string, bin string, useGodep bool, buildArgs []string) Build } } - return &builder{dir: dir, binary: bin, useGodep: useGodep, buildArgs: buildArgs} + m := &sync.Mutex{} + + return &builder{dir: dir, binary: bin, useGodep: useGodep, buildArgs: buildArgs, mutex: m} } func (b *builder) Binary() string { @@ -51,7 +55,9 @@ func (b *builder) Build() error { if b.useGodep { args = append([]string{"godep"}, args...) } + b.mutex.Lock() command = exec.Command(args[0], args[1:]...) + b.mutex.Unlock() command.Dir = b.dir