aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2018-06-05 03:43:22 +0700
committerShulhan <ms@kilabit.info>2018-06-05 04:33:52 +0700
commitdfa3630a398ad4dc0dd89f7d42090f89df19b61f (patch)
tree09d7e3340ac1787c396d60db803651ac6e6c97e2
parent2254dd61175176f92e2529ad9b6166c27cf4a8a3 (diff)
downloadbeku-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.go25
-rw-r--r--env.go65
-rw-r--r--package.go75
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"}
+)
diff --git a/env.go b/env.go
index 7e6fa9f..8fac8dc 100644
--- a/env.go
+++ b/env.go
@@ -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 {
diff --git a/package.go b/package.go
index a444e7c..322dcd9 100644
--- a/package.go
+++ b/package.go
@@ -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.
//