diff options
| author | Shulhan <ms@kilabit.info> | 2018-06-05 03:43:22 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2018-06-05 04:33:52 +0700 |
| commit | dfa3630a398ad4dc0dd89f7d42090f89df19b61f (patch) | |
| tree | 09d7e3340ac1787c396d60db803651ac6e6c97e2 | |
| parent | 2254dd61175176f92e2529ad9b6166c27cf4a8a3 (diff) | |
| download | beku-dfa3630a398ad4dc0dd89f7d42090f89df19b61f.tar.xz | |
Run vendoring tool and make, if dependency and make file exists
The following vendoring tool is known by beku,
* dep - https://github.com/golang/dep
* gmd - https://github.com/sparrc/gdm
| -rw-r--r-- | buildcmd.go | 25 | ||||
| -rw-r--r-- | env.go | 65 | ||||
| -rw-r--r-- | package.go | 75 |
3 files changed, 154 insertions, 11 deletions
diff --git a/buildcmd.go b/buildcmd.go new file mode 100644 index 0000000..62144b1 --- /dev/null +++ b/buildcmd.go @@ -0,0 +1,25 @@ +// Copyright 2018, Shulhan <ms@kilabit.info>. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package beku + +type buildMode uint + +const ( + buildModeDep buildMode = 1 << iota + buildModeGdm + buildModeMake +) + +const ( + buildFileDep = "Gopkg.toml" + buildFileGdm = "Godeps" + buildFileMake = "Makefile" +) + +var ( + buildCmdDep = []string{"dep", "ensure"} + buildCmdGdm = []string{"gdm", "restore"} + buildCmdMake = []string{"make"} +) @@ -1300,26 +1300,19 @@ func (env *Env) SyncAll() (err error) { // // (1) Update missing packages. -// (2) Re-scan package dependencies. -// (3) Install missing dependencies. -// (4) Run `go install` only if no missing package. +// (2) Run build command if its applicable +// (3) Run `go install` only if no missing package. // func (env *Env) postSync(curPkg, newPkg *Package) (err error) { // (1) env.updateMissing(newPkg, true) - // (2) - err = curPkg.ScanDeps(env) - if err != nil { - return - } - - err = env.installMissing(curPkg) + err = env.build(curPkg) if err != nil { return } - // (4) + // (3) if len(curPkg.DepsMissing) == 0 { _ = curPkg.GoInstall() } @@ -1329,6 +1322,56 @@ func (env *Env) postSync(curPkg, newPkg *Package) (err error) { return } +// +// (3) Re-scan package dependencies. +// (4) Install missing dependencies. +// +func (env *Env) build(pkg *Package) (err error) { + cmd := pkg.ScanBuild() + + if cmd&buildModeDep > 0 { + if Debug >= DebugL2 { + buildCmdDep = append(buildCmdDep, "-v") + } + err = pkg.Run(buildCmdDep) + } else if cmd&buildModeGdm > 0 { + if Debug >= DebugL2 { + buildCmdDep = append(buildCmdDep, "-v") + } + err = pkg.Run(buildCmdGdm) + } + if err != nil { + fmt.Fprintf(defStderr, "[ENV] build %s >>> %s\n", + pkg.ImportPath, err.Error()) + err = nil + } + + if cmd&buildModeMake > 0 { + err = pkg.Run(buildCmdMake) + if err != nil { + fmt.Fprintf(defStderr, "[ENV] build %s >>> %s\n", + pkg.ImportPath, err.Error()) + err = nil + } + } + + if cmd == 0 { + // (3) + err = pkg.ScanDeps(env) + if err != nil { + return + } + + // (4) + err = env.installMissing(pkg) + if err != nil { + return + } + } + + return +} + func (env *Env) reinstallAll() { for _, pkg := range env.pkgs { if len(pkg.DepsMissing) == 0 { @@ -236,6 +236,40 @@ func (pkg *Package) RemoveRequiredBy(importPath string) (ok bool) { } // +// Run command on package root directory. +// +func (pkg *Package) Run(cmds []string) (err error) { + if len(cmds) == 0 { + return + } + + cmd := exec.Command(cmds[0]) + + if len(cmds) > 1 { + cmd.Args = append(cmd.Args, cmds[1:]...) + } + + path := os.Getenv(envPATH) + if len(path) == 0 { + path = defPATH + } + + cmd.Env = append(cmd.Env, "GOPATH="+build.Default.GOPATH) + cmd.Env = append(cmd.Env, "PATH="+path) + cmd.Dir = pkg.FullPath + cmd.Stdout = defStdout + cmd.Stderr = defStderr + + fmt.Printf("[PKG] Run %s >>> %s %s %s\n", pkg.ImportPath, cmd.Dir, + cmd.Env, cmd.Args) + + err = cmd.Run() + + return + +} + +// // Scan will set the package version, `isTag` status, and remote URL using // metadata in package repository. // @@ -276,6 +310,47 @@ func (pkg *Package) ScanDeps(env *Env) (err error) { } // +// ScanBuild files on package root directory. The following build files is +// known by beku, +// +// * Godeps: gdm +// * Gopkg.toml: dep +// * Makefile: make +// +// Otherwise, it would use "go install" +// +func (pkg *Package) ScanBuild() (cmd buildMode) { + f, err := os.Open(pkg.FullPath) + if err != nil { + return + } + + fis, err := f.Readdir(0) + if err != nil { + return + } + + for x := range fis { + if fis[x].IsDir() { + continue + } + if fis[x].Name() == buildFileDep { + cmd |= buildModeDep + continue + } + if fis[x].Name() == buildFileGdm { + cmd |= buildModeGdm + continue + } + if fis[x].Name() == buildFileMake { + cmd |= buildModeMake + } + } + + return +} + +// // GetRecursiveImports will get all import path recursively using `go list` // and return it as slice of string without any duplication. // |
