From 40d34df126886ae6ec0f7cb378f0f71acee26c8d Mon Sep 17 00:00:00 2001 From: asoseil Date: Tue, 31 Oct 2017 13:28:58 +0100 Subject: [PATCH] commands initialization moved --- cmd.go | 130 +++++++---------------------------------------- cmd_test.go | 8 +-- settings_test.go | 6 +-- watcher.go | 102 ++++++++++++++++++++++++++++++------- 4 files changed, 108 insertions(+), 138 deletions(-) diff --git a/cmd.go b/cmd.go index 15bcacb..f7275f9 100644 --- a/cmd.go +++ b/cmd.go @@ -5,8 +5,6 @@ import ( "gopkg.in/urfave/cli.v2" "os" "path/filepath" - "time" - "reflect" ) // Tool options customizable, should be moved in Cmd @@ -41,14 +39,18 @@ type Cmd struct { } // Clean duplicate projects -func (r *realize) clean() { - arr := r.Schema - for key, val := range arr { - if _, err := duplicates(val, arr[key+1:]); err != nil { - r.Schema = append(arr[:key], arr[key+1:]...) - break +func (r *realize) clean() error { + if len(r.Schema) > 0 { + arr := r.Schema + for key, val := range arr { + if _, err := duplicates(val, arr[key+1:]); err != nil { + r.Schema = append(arr[:key], arr[key+1:]...) + break + } } + return nil } + return errors.New("there are no projects") } // Add a new project @@ -80,7 +82,7 @@ func (r *realize) add(p *cli.Context) error { Args: params(p), Watcher: Watch{ Paths: []string{"/"}, - Ignore: []string{".git",".realize","vendor"}, + Ignore: []string{".git", ".realize", "vendor"}, Exts: []string{"go"}, }, } @@ -95,14 +97,11 @@ func (r *realize) add(p *cli.Context) error { func (r *realize) run(p *cli.Context) error { var match bool // check projects and remove duplicates - if len(r.Schema) > 0 { - r.clean() - }else{ - return errors.New("there are no projects") + if err := r.clean(); err != nil { + return err } // set gobin - err := os.Setenv("GOBIN", filepath.Join(os.Getenv("GOPATH"), "bin")) - if err != nil { + if err := os.Setenv("GOBIN", filepath.Join(os.Getenv("GOPATH"), "bin")); err != nil { return err } // loop projects @@ -113,113 +112,18 @@ func (r *realize) run(p *cli.Context) error { } for k, elm := range r.Schema { // command start using name flag - if p.String("name") != "" && r.Schema[k].Name != p.String("name") { + if p.String("name") != "" && elm.Name != p.String("name") { continue } - // validate project path, if invalid get wdir or clean current - if !filepath.IsAbs(elm.Path){ - r.Schema[k].Path = wdir() - }else{ - r.Schema[k].Path = filepath.Clean(elm.Path) - } - // env variables - for key, item := range r.Schema[k].Environment { - if err := os.Setenv(key, item); err != nil { - r.Schema[k].Buffer.StdErr = append(r.Schema[k].Buffer.StdErr, BufferOut{Time: time.Now(), Text: err.Error(), Type: "Env error", Stream: ""}) - } - } - // get basepath name - r.Schema[k].name = filepath.Base(r.Schema[k].Path) - - fields := reflect.Indirect(reflect.ValueOf(&r.Schema[k].Cmds)) - // Loop struct Cmds fields - for i := 0; i < fields.NumField(); i++ { - field := fields.Type().Field(i).Name - if fields.FieldByName(field).Type().Name() == "Cmd" { - v := fields.FieldByName(field) - // Loop struct Cmd - for i := 0; i < v.NumField(); i++ { - //f := v.Type().Field(i).Name - //fmt.Println(f) - //if f.IsValid() { - // if f.CanSet() { - // fmt.Println(f.) - // //switch f.Kind() { - // //case reflect.Bool: - // //case reflect.String: - // //case reflect.Slice: - // //} - // } - //} - } - } - } - - if elm.Cmds.Fmt.Status { - if len(elm.Cmds.Fmt.Args) == 0 { - elm.Cmds.Fmt.Args = []string{"-s", "-w", "-e", "./"} - } - r.Schema[k].tools = append(r.Schema[k].tools, tool{ - status: elm.Cmds.Fmt.Status, - cmd: replace([]string{"gofmt"}, r.Schema[k].Cmds.Fmt.Method), - options: split([]string{}, elm.Cmds.Fmt.Args), - name: "Fmt", - }) - } - if elm.Cmds.Generate.Status { - r.Schema[k].tools = append(r.Schema[k].tools, tool{ - status: elm.Cmds.Generate.Status, - cmd: replace([]string{"go", "generate"}, r.Schema[k].Cmds.Generate.Method), - options: split([]string{}, elm.Cmds.Generate.Args), - name: "Generate", - dir: true, - }) - } - if elm.Cmds.Test.Status { - r.Schema[k].tools = append(r.Schema[k].tools, tool{ - status: elm.Cmds.Test.Status, - cmd: replace([]string{"go", "test"}, r.Schema[k].Cmds.Test.Method), - options: split([]string{}, elm.Cmds.Test.Args), - name: "Test", - dir: true, - }) - } - if elm.Cmds.Vet.Status { - r.Schema[k].tools = append(r.Schema[k].tools, tool{ - status: elm.Cmds.Vet.Status, - cmd: replace([]string{"go", "vet"}, r.Schema[k].Cmds.Vet.Method), - options: split([]string{}, elm.Cmds.Vet.Args), - name: "Vet", - dir: true, - }) - } - // default settings - r.Schema[k].Cmds.Install = Cmd{ - Status: elm.Cmds.Install.Status, - Args: append([]string{}, elm.Cmds.Install.Args...), - method: replace([]string{"go", "install"}, r.Schema[k].Cmds.Install.Method), - name: "Install", - startTxt: "Installing...", - endTxt: "Installed", - } - r.Schema[k].Cmds.Build = Cmd{ - Status: elm.Cmds.Build.Status, - Args: append([]string{}, elm.Cmds.Build.Args...), - method: replace([]string{"go", "build"}, r.Schema[k].Cmds.Build.Method), - name: "Build", - startTxt: "Building...", - endTxt: "Built", - } - r.Schema[k].parent = r - match = true + r.Schema[k].config(r) go r.Schema[k].watch() } if !match { return errors.New("there is no project with the given name") } wg.Wait() - return err + return nil } // Remove a project diff --git a/cmd_test.go b/cmd_test.go index 6684754..3ebe2d8 100644 --- a/cmd_test.go +++ b/cmd_test.go @@ -5,10 +5,10 @@ import ( "gopkg.in/urfave/cli.v2" "log" "os" + "path/filepath" "reflect" "testing" "time" - "path/filepath" ) type loggerT struct{} @@ -34,8 +34,8 @@ func TestRealize_Clean(t *testing.T) { r.Schema = append(r.Schema, Project{Path: "test1"}) r.Schema = append(r.Schema, Project{Path: "test1"}) r.clean() - if len(r.Schema) > 2 { - t.Error("Expected only one project") + if len(r.Schema) != 2 { + t.Error("Expected two projects") } } @@ -81,7 +81,7 @@ func TestRealize_Add(t *testing.T) { }, Watcher: Watch{ Paths: []string{"/"}, - Ignore: []string{".git",".realize","vendor"}, + Ignore: []string{".git", ".realize", "vendor"}, Exts: []string{"go"}, }, } diff --git a/settings_test.go b/settings_test.go index cfe04e2..f084abf 100644 --- a/settings_test.go +++ b/settings_test.go @@ -108,7 +108,7 @@ func TestSettings_Validate(t *testing.T) { } } -func TestSettings_Fatal(t *testing.T){ +func TestSettings_Fatal(t *testing.T) { s := Settings{} - s.fatal(nil,"test") -} \ No newline at end of file + s.fatal(nil, "test") +} diff --git a/watcher.go b/watcher.go index e2dc395..ff5841f 100644 --- a/watcher.go +++ b/watcher.go @@ -51,23 +51,23 @@ type Buffer struct { // Project defines the informations of a single project type Project struct { - parent *realize - watcher FileWatcher - init bool - files, folders int64 - name, lastFile string - tools []tool - paths []string - lastTime time.Time - Settings `yaml:"-" json:"-"` - Name string `yaml:"name" json:"name"` - Path string `yaml:"path" json:"path"` - Environment map[string]string `yaml:"environment,omitempty" json:"environment,omitempty"` - Cmds Cmds `yaml:"commands" json:"commands"` - Args []string `yaml:"args,omitempty" json:"args,omitempty"` - Watcher Watch `yaml:"watcher" json:"watcher"` - Buffer Buffer `yaml:"-" json:"buffer"` - ErrorOutputPattern string `yaml:"errorOutputPattern,omitempty" json:"errorOutputPattern,omitempty"` + parent *realize + watcher FileWatcher + init bool + files, folders int64 + name, lastFile string + tools []tool + paths []string + lastTime time.Time + Settings `yaml:"-" json:"-"` + Name string `yaml:"name" json:"name"` + Path string `yaml:"path" json:"path"` + Environment map[string]string `yaml:"environment,omitempty" json:"environment,omitempty"` + Cmds Cmds `yaml:"commands" json:"commands"` + Args []string `yaml:"args,omitempty" json:"args,omitempty"` + Watcher Watch `yaml:"watcher" json:"watcher"` + Buffer Buffer `yaml:"-" json:"buffer"` + ErrorOutputPattern string `yaml:"errorOutputPattern,omitempty" json:"errorOutputPattern,omitempty"` } // Command options @@ -170,6 +170,72 @@ func (p *Project) err(err error) { p.stamp("error", out, msg, "") } +// Config project init +func (p *Project) config(r *realize) { + // validate project path, if invalid get wdir or clean current + if !filepath.IsAbs(p.Path) { + p.Path = wdir() + } else { + p.Path = filepath.Clean(p.Path) + } + // get basepath name + p.name = filepath.Base(p.Path) + // env variables + for key, item := range p.Environment { + if err := os.Setenv(key, item); err != nil { + p.Buffer.StdErr = append(p.Buffer.StdErr, BufferOut{Time: time.Now(), Text: err.Error(), Type: "Env error", Stream: ""}) + } + } + // init commands + if len(p.Cmds.Fmt.Args) == 0 { + p.Cmds.Fmt.Args = []string{"-s", "-w", "-e", "./"} + } + p.tools = append(p.tools, tool{ + status: p.Cmds.Fmt.Status, + cmd: replace([]string{"gofmt"}, p.Cmds.Fmt.Method), + options: split([]string{}, p.Cmds.Fmt.Args), + name: "Fmt", + }) + p.tools = append(p.tools, tool{ + status: p.Cmds.Generate.Status, + cmd: replace([]string{"go", "generate"}, p.Cmds.Generate.Method), + options: split([]string{}, p.Cmds.Generate.Args), + name: "Generate", + dir: true, + }) + p.tools = append(p.tools, tool{ + status: p.Cmds.Test.Status, + cmd: replace([]string{"go", "test"}, p.Cmds.Test.Method), + options: split([]string{}, p.Cmds.Test.Args), + name: "Test", + dir: true, + }) + p.tools = append(p.tools, tool{ + status: p.Cmds.Vet.Status, + cmd: replace([]string{"go", "vet"}, p.Cmds.Vet.Method), + options: split([]string{}, p.Cmds.Vet.Args), + name: "Vet", + dir: true, + }) + p.Cmds.Install = Cmd{ + Status: p.Cmds.Install.Status, + Args: append([]string{}, p.Cmds.Install.Args...), + method: replace([]string{"go", "install"}, p.Cmds.Install.Method), + name: "Install", + startTxt: "Installing...", + endTxt: "Installed", + } + p.Cmds.Build = Cmd{ + Status: p.Cmds.Build.Status, + Args: append([]string{}, p.Cmds.Build.Args...), + method: replace([]string{"go", "build"}, p.Cmds.Build.Method), + name: "Build", + startTxt: "Building...", + endTxt: "Built", + } + p.parent = r +} + // Cmd calls the method that execute commands after/before and display the results func (p *Project) cmd(stop <-chan bool, flag string, global bool) { done := make(chan bool) @@ -312,7 +378,7 @@ func (p *Project) changed(event fsnotify.Event, stop chan bool) { // Watch the files tree of a project func (p *Project) walk(path string, info os.FileInfo, err error) error { for _, v := range p.Watcher.Ignore { - s := append([]string{p.Path},strings.Split(v,string(os.PathSeparator))...) + s := append([]string{p.Path}, strings.Split(v, string(os.PathSeparator))...) if strings.Contains(path, filepath.Join(s...)) { return nil }