From cd302c790ddc14fe6472a4c9ba1b17579b854ead Mon Sep 17 00:00:00 2001 From: lyyyuna Date: Fri, 12 Jun 2020 17:51:10 +0800 Subject: [PATCH] update --- cmd/build.go | 16 ++-- cmd/clear.go | 2 +- cmd/commonflags.go | 49 ++++++++++++ cmd/cover.go | 30 +++---- cmd/init.go | 2 +- cmd/install.go | 45 +++-------- cmd/profile.go | 2 +- cmd/root.go | 15 +++- go.mod | 2 + go.sum | 9 +++ pkg/build/binarymove.go | 6 +- pkg/build/build.go | 40 ++++++++++ pkg/build/gomodules.go | 7 +- pkg/build/install.go | 44 ++++++++++ pkg/build/legacy.go | 12 +-- pkg/build/tmpfolder.go | 75 +++++++++-------- pkg/build/tmpfolder_test.go | 133 ------------------------------- pkg/cover/cover.go | 13 +-- tests/e2e/simple_project_test.go | 4 +- 19 files changed, 250 insertions(+), 256 deletions(-) create mode 100644 cmd/commonflags.go create mode 100644 pkg/build/build.go create mode 100644 pkg/build/install.go delete mode 100644 pkg/build/tmpfolder_test.go diff --git a/cmd/build.go b/cmd/build.go index 360f5bf..dd0f726 100644 --- a/cmd/build.go +++ b/cmd/build.go @@ -25,7 +25,6 @@ import ( "path/filepath" "strings" - "github.com/qiniu/goc/pkg/build" "github.com/spf13/cobra" ) @@ -51,8 +50,12 @@ goc build -- -o /to/this/path goc build -- -ldflags "-extldflags -static" -tags="embed kodo" `, Run: func(cmd *cobra.Command, args []string) { - newgopath, newwd, tmpdir, pkgs := build.MvProjectsToTmp(target, args) - doCover(cmd, args, newgopath, tmpdir) + + return + /* + gocbuild := build.NewInstall(buildFlags, packages) + newgopath, newwd, tmpdir, _ := gocbuild.MvProjectsToTmp() + doCover("args", newgopath, tmpdir) newArgs, modified := modifyOutputArg(args) doBuild(newArgs, newgopath, newwd) @@ -60,14 +63,15 @@ goc build -- -ldflags "-extldflags -static" -tags="embed kodo" // find the binary in temp build dir // and copy them into original dir if false == modified { - build.MvBinaryToOri(pkgs, tmpdir) + // build.MvBinaryToOri(pkgs, tmpdir) } + + */ }, } func init() { - buildCmd.Flags().StringVarP(¢er, "center", "", "http://127.0.0.1:7777", "cover profile host center") - + addBuildFlags(buildCmd.Flags()) rootCmd.AddCommand(buildCmd) } diff --git a/cmd/clear.go b/cmd/clear.go index 10dba7d..c6d5fb1 100644 --- a/cmd/clear.go +++ b/cmd/clear.go @@ -46,6 +46,6 @@ goc clear --center=http://192.168.1.1:8080 } func init() { - clearCmd.Flags().StringVarP(¢er, "center", "", "http://127.0.0.1:7777", "cover profile host center") + addBasicFlags(clearCmd.Flags()) rootCmd.AddCommand(clearCmd) } diff --git a/cmd/commonflags.go b/cmd/commonflags.go new file mode 100644 index 0000000..6e5d732 --- /dev/null +++ b/cmd/commonflags.go @@ -0,0 +1,49 @@ +package cmd + +import ( + "github.com/spf13/pflag" + "github.com/spf13/viper" +) + +var ( + target string + center string + mode string + debugGoc bool + buildFlags string + packages string + appArgs string +) + +// addBasicFlags adds a +func addBasicFlags(cmdset *pflag.FlagSet) *pflag.FlagSet { + cmdset.StringVar(¢er, "center", "http://127.0.0.1:7777", "cover profile host center") + // bind to viper + viper.BindPFlags(cmdset) + return cmdset +} + +func addCommonFlags(cmdset *pflag.FlagSet) *pflag.FlagSet { + addBasicFlags(cmdset) + cmdset.StringVar(&mode, "mode", "count", "coverage mode: set, count, atomic") + cmdset.StringVar(&buildFlags, "buildflags", "", "specify the build flags") + // bind to viper + viper.BindPFlags(cmdset) + return cmdset +} + +func addBuildFlags(cmdset *pflag.FlagSet) *pflag.FlagSet { + addCommonFlags(cmdset) + cmdset.StringVar(&packages, "packages", ".", "specify the package name, only . and ./... are supported") + // bind to viper + viper.BindPFlags(cmdset) + return cmdset +} + +func addRunFlags(cmdset *pflag.FlagSet) { + addBuildFlags(cmdset) + cmdset.Lookup("packages").Usage = "specify the package name, only ., ./... and *.go are supported" + cmdset.StringVar(&appArgs, "appargs", "", "specify the application's arguments") + // bind to viper + viper.BindPFlags(cmdset) +} diff --git a/cmd/cover.go b/cmd/cover.go index 94d992b..cc81ab0 100644 --- a/cmd/cover.go +++ b/cmd/cover.go @@ -18,6 +18,7 @@ package cmd import ( "fmt" + "github.com/spf13/viper" "log" "os" "strings" @@ -40,7 +41,10 @@ goc cover --center=http://127.0.0.1:7777 # Do cover for the target path, cover mode: atomic. goc cover --center=http://127.0.0.1:7777 --target=/path/to/target --mode=atomic `, + Hidden: true, Run: func(cmd *cobra.Command, args []string) { + var buildFlags string + buildFlags = viper.GetString("buildflags") if mode == "" { log.Fatalf("Error: flag needs an argument: -mode %v", mode) } @@ -48,39 +52,27 @@ goc cover --center=http://127.0.0.1:7777 --target=/path/to/target --mode=atomic log.Fatalf("unknown -mode %v", mode) } - doCover(cmd, args, "", "") + doCover(buildFlags, "", target) }, } -var ( - target string - center string - mode string -) - func init() { - coverCmd.Flags().StringVarP(¢er, "center", "", "http://127.0.0.1:7777", "cover profile host center") - coverCmd.Flags().StringVarP(&target, "target", "", ".", "target folder to cover") - coverCmd.Flags().StringVarP(&mode, "mode", "", "count", "coverage mode: set, count, atomic") - + coverCmd.Flags().StringVar(&target, "target", ".", "target folder to cover") + addCommonFlags(coverCmd.Flags()) rootCmd.AddCommand(coverCmd) - log.SetFlags(log.LstdFlags | log.Lshortfile) } -func doCover(cmd *cobra.Command, args []string, newgopath string, newtarget string) { - if newtarget != "" { - target = newtarget - } +func doCover(args string, newgopath string, target string) { if !isDirExist(target) { log.Fatalf("target directory %s not exist", target) } - listArgs := []string{"list", "-json"} + listArgs := []string{"-json"} if len(args) != 0 { - listArgs = append(listArgs, args...) + listArgs = append(listArgs, args) } listArgs = append(listArgs, "./...") - pkgs := cover.ListPackages(target, listArgs, newgopath) + pkgs := cover.ListPackages(target, strings.Join(listArgs, " "), newgopath) var seen = make(map[string]*cover.PackageCover) var seenCache = make(map[string]*cover.PackageCover) diff --git a/cmd/init.go b/cmd/init.go index b258737..2084301 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -34,6 +34,6 @@ var initCmd = &cobra.Command{ } func init() { - initCmd.Flags().StringVarP(¢er, "center", "", "http://127.0.0.1:7777", "cover profile host center") + addBasicFlags(initCmd.Flags()) rootCmd.AddCommand(initCmd) } diff --git a/cmd/install.go b/cmd/install.go index bacd3c5..abc8aa2 100644 --- a/cmd/install.go +++ b/cmd/install.go @@ -17,14 +17,7 @@ package cmd import ( - "fmt" - "log" - "os" - "os/exec" - "strings" - "github.com/qiniu/goc/pkg/build" - "github.com/qiniu/goc/pkg/cover" "github.com/spf13/cobra" ) @@ -38,44 +31,26 @@ To pass origial go build flags to goc command, place them after "--", see exampl `, Example: ` # Install all binaries with cover variables injected. The binary will be installed in $GOPATH/bin or $HOME/go/bin if directory existed. -goc install -- ./... +goc install --packages="./..." # Install the current binary with cover variables injected, and set the registry center to http://127.0.0.1:7777. goc install --center=http://127.0.0.1:7777 # Install the current binary with cover variables injected, and set necessary build flags: -ldflags "-extldflags -static" -tags="embed kodo". -goc build -- -ldflags "-extldflags -static" -tags="embed kodo" +goc build --buildflags="-ldflags '-extldflags -static' -tags='embed kodo'" `, Run: func(cmd *cobra.Command, args []string) { - newgopath, newwd, tmpdir, pkgs := build.MvProjectsToTmp(target, args) - doCover(cmd, args, newgopath, tmpdir) - doInstall(args, newgopath, newwd, pkgs) + gocbuild := build.NewInstall(buildFlags, packages) + gocbuild.MvProjectsToTmp() + // doCover with original buildFlags, with new GOPATH( tmp:original ) + // in the tmp directory + doCover(buildFlags, gocbuild.NewGOPATH, gocbuild.TmpDir) + // + gocbuild.Install() }, } func init() { - installCmd.Flags().StringVarP(¢er, "center", "", "http://127.0.0.1:7777", "cover profile host center") - + addBuildFlags(installCmd.Flags()) rootCmd.AddCommand(installCmd) } - -func doInstall(args []string, newgopath string, newworkingdir string, pkgs map[string]*cover.Package) { - log.Println("Go building in temp...") - newArgs := []string{"install"} - newArgs = append(newArgs, args...) - cmd := exec.Command("go", newArgs...) - cmd.Dir = newworkingdir - - // Change the temp GOBIN, to force binary install to original place - cmd.Env = append(os.Environ(), fmt.Sprintf("GOBIN=%v", build.FindWhereToInstall(pkgs))) - if newgopath != "" { - // Change to temp GOPATH for go install command - cmd.Env = append(cmd.Env, fmt.Sprintf("GOPATH=%v", newgopath)) - } - - out, err := cmd.CombinedOutput() - if err != nil { - log.Fatalf("Fail to execute: go install %v. The error is: %v, the stdout/stderr is: %v", strings.Join(args, " "), err, string(out)) - } - log.Printf("Go install successful. Binary installed in: %v", build.FindWhereToInstall(pkgs)) -} diff --git a/cmd/profile.go b/cmd/profile.go index d130abc..cef1c3e 100644 --- a/cmd/profile.go +++ b/cmd/profile.go @@ -70,6 +70,6 @@ var output string func init() { profileCmd.Flags().StringVarP(&output, "output", "o", "", "download cover profile") - profileCmd.Flags().StringVarP(¢er, "center", "", "http://127.0.0.1:7777", "cover profile host center") + addBasicFlags(profileCmd.Flags()) rootCmd.AddCommand(profileCmd) } diff --git a/cmd/root.go b/cmd/root.go index 37fcc98..717ef9b 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -17,6 +17,7 @@ package cmd import ( + "io/ioutil" "log" "github.com/spf13/cobra" @@ -28,8 +29,20 @@ var rootCmd = &cobra.Command{ Long: `goc is a comprehensive coverage testing tool for go language. Find more information at: - https://github.com/qbox/goc + https://github.com/qiniu/goc `, + PersistentPreRun: func(cmd *cobra.Command, args []string) { + log.SetFlags(log.LstdFlags | log.Lshortfile) + if debugGoc == false { + // we only need log in debug mode + log.SetOutput(ioutil.Discard) + } + }, +} + +func init() { + rootCmd.PersistentFlags().BoolVar(&debugGoc, "debuggoc", false, "turn goc into debug mode") + rootCmd.PersistentFlags().MarkHidden("debuggoc") } // Execute the goc tool diff --git a/go.mod b/go.mod index 79e1eca..bdc4484 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,8 @@ require ( github.com/qiniu/api.v7/v7 v7.5.0 github.com/sirupsen/logrus v1.4.2 github.com/spf13/cobra v1.0.0 + github.com/spf13/pflag v1.0.5 + github.com/spf13/viper v1.6.2 github.com/stretchr/testify v1.5.1 golang.org/x/net v0.0.0-20200301022130-244492dfa37a golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d diff --git a/go.sum b/go.sum index c1b07ba..20cc21b 100644 --- a/go.sum +++ b/go.sum @@ -410,6 +410,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -512,6 +513,7 @@ github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFW github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e/go.mod h1:waEya8ee1Ro/lgxpVhkJI4BVASzkm3UZqkx/cFJiYHM= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -576,6 +578,7 @@ github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT9 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= @@ -656,8 +659,10 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= @@ -666,6 +671,7 @@ github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHN github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -676,6 +682,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -688,6 +695,7 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tektoncd/pipeline v0.11.0/go.mod h1:hlkH32S92+/UODROH0dmxzyuMxfRFp/Nc3e29MewLn8= @@ -1009,6 +1017,7 @@ gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.52.0 h1:j+Lt/M1oPPejkniCg1TkWE2J3Eh1oZTsHSXzMTzUXn4= gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= diff --git a/pkg/build/binarymove.go b/pkg/build/binarymove.go index b638bd5..12d9cbe 100644 --- a/pkg/build/binarymove.go +++ b/pkg/build/binarymove.go @@ -25,12 +25,12 @@ import ( "github.com/qiniu/goc/pkg/cover" ) -func MvBinaryToOri(pkgs map[string]*cover.Package, newgopath string) { - for _, pkg := range pkgs { +func (b *Build) MvBinaryToOri(pkgs map[string]*cover.Package) { + for _, pkg := range b.Pkgs { if pkg.Name == "main" { _, binaryTarget := filepath.Split(pkg.Target) - binaryTmpPath := filepath.Join(getTmpwd(newgopath, pkgs, !checkIfLegacyProject(pkgs)), binaryTarget) + binaryTmpPath := filepath.Join(b.TmpWorkingDir) if false == checkIfFileExist(binaryTmpPath) { continue diff --git a/pkg/build/build.go b/pkg/build/build.go new file mode 100644 index 0000000..8a7dd3e --- /dev/null +++ b/pkg/build/build.go @@ -0,0 +1,40 @@ +/* + Copyright 2020 Qiniu Cloud (qiniu.com) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package build + +import "github.com/qiniu/goc/pkg/cover" + +// Build is to describe the building/installing process of a goc build/install +type Build struct { + Pkgs map[string]*cover.Package // + NewGOPATH string + OriGOPATH string + TmpDir string + TmpWorkingDir string + IsMod bool + BuildFlags string + Packages string + Root string // Project Root +} + +func NewInstall(buildflags string, packages string) *Build { + return &Build{ + BuildFlags: buildflags, + Packages: packages, + } +} + diff --git a/pkg/build/gomodules.go b/pkg/build/gomodules.go index e136250..092856a 100644 --- a/pkg/build/gomodules.go +++ b/pkg/build/gomodules.go @@ -20,13 +20,12 @@ import ( "log" "github.com/otiai10/copy" - "github.com/qiniu/goc/pkg/cover" ) -func cpGoModulesProject(tmpBuildDir string, pkgs map[string]*cover.Package) { - for _, v := range pkgs { +func (b *Build) cpGoModulesProject() { + for _, v := range b.Pkgs { if v.Name == "main" { - dst := tmpBuildDir + dst := b.TmpDir src := v.Module.Dir if err := copy.Copy(src, dst); err != nil { diff --git a/pkg/build/install.go b/pkg/build/install.go new file mode 100644 index 0000000..bdf7b97 --- /dev/null +++ b/pkg/build/install.go @@ -0,0 +1,44 @@ +/* + Copyright 2020 Qiniu Cloud (qiniu.com) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package build + +import ( + "fmt" + "log" + "os" + "os/exec" +) + +func (b *Build) Install() { + log.Println("Go building in temp...") + cmd := exec.Command("/bin/bash", "-c", "go install " + b.BuildFlags + " " + b.Packages) + cmd.Dir = b.TmpWorkingDir + + // Change the temp GOBIN, to force binary install to original place + cmd.Env = append(os.Environ(), fmt.Sprintf("GOBIN=%v", b.findWhereToInstall())) + if b.NewGOPATH != "" { + // Change to temp GOPATH for go install command + cmd.Env = append(cmd.Env, fmt.Sprintf("GOPATH=%v", b.NewGOPATH)) + } + + log.Printf("go install cmd is: %v", cmd.Args) + out, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("Fail to execute: %v. The error is: %v, the stdout/stderr is: %v", cmd.Args, err, string(out)) + } + log.Printf("Go install successful. Binary installed in: %v", b.findWhereToInstall()) +} diff --git a/pkg/build/legacy.go b/pkg/build/legacy.go index cc40e84..a4d4e08 100644 --- a/pkg/build/legacy.go +++ b/pkg/build/legacy.go @@ -25,10 +25,10 @@ import ( "github.com/qiniu/goc/pkg/cover" ) -func cpLegacyProject(tmpBuildDir string, pkgs map[string]*cover.Package) { +func (b *Build) cpLegacyProject() { visited := make(map[string]bool) - for k, v := range pkgs { - dst := filepath.Join(tmpBuildDir, "src", k) + for k, v := range b.Pkgs { + dst := filepath.Join(b.TmpDir, "src", k) src := v.Dir if _, ok := visited[src]; ok { @@ -42,13 +42,13 @@ func cpLegacyProject(tmpBuildDir string, pkgs map[string]*cover.Package) { visited[src] = true - cpDepPackages(tmpBuildDir, v, visited) + b.cpDepPackages(v, visited) } } // only cp dependency in root(current gopath), // skip deps in other GOPATHs -func cpDepPackages(tmpBuildDir string, pkg *cover.Package, visited map[string]bool) { +func (b *Build) cpDepPackages( pkg *cover.Package, visited map[string]bool) { /* oriGOPATH := os.Getenv("GOPATH") if oriGOPATH == "" { @@ -70,7 +70,7 @@ func cpDepPackages(tmpBuildDir string, pkg *cover.Package, visited map[string]bo continue } - dst := filepath.Join(tmpBuildDir, "src", dep) + dst := filepath.Join(b.TmpDir, "src", dep) if err := copy.Copy(src, dst); err != nil { log.Printf("Failed to Copy the folder from %v to %v, the error is: %v ", src, dst, err) diff --git a/pkg/build/tmpfolder.go b/pkg/build/tmpfolder.go index 078fd78..efaafad 100644 --- a/pkg/build/tmpfolder.go +++ b/pkg/build/tmpfolder.go @@ -27,56 +27,53 @@ import ( "github.com/qiniu/goc/pkg/cover" ) -func MvProjectsToTmp(target string, args []string) (newGopath string, newWorkingDir string, tmpBuildDir string, pkgs map[string]*cover.Package) { - listArgs := []string{"list", "-json"} - if len(args) != 0 { - listArgs = append(listArgs, args...) +func (b *Build) MvProjectsToTmp() (newGopath string, newWorkingDir string, tmpBuildDir string, pkgs map[string]*cover.Package) { + listArgs := []string{"-json"} + if len(b.BuildFlags) != 0 { + listArgs = append(listArgs, b.BuildFlags) } listArgs = append(listArgs, "./...") - pkgs = cover.ListPackages(target, listArgs, "") + b.Pkgs = cover.ListPackages(".", strings.Join(listArgs, " "), "") - tmpBuildDir, newWorkingDir, isMod := mvProjectsToTmp(pkgs) + b.mvProjectsToTmp() oriGopath := os.Getenv("GOPATH") - if isMod == true { - newGopath = "" + if b.IsMod == true { + b.NewGOPATH = "" } else if oriGopath == "" { - newGopath = tmpBuildDir + b.NewGOPATH = b.TmpDir } else { - newGopath = fmt.Sprintf("%v:%v", tmpBuildDir, oriGopath) + b.NewGOPATH = fmt.Sprintf("%v:%v", b.TmpDir, oriGopath) } - log.Printf("New GOPATH: %v", newGopath) + log.Printf("New GOPATH: %v", b.NewGOPATH) return } -func mvProjectsToTmp(pkgs map[string]*cover.Package) (string, string, bool) { +func (b *Build) mvProjectsToTmp() { path, err := os.Getwd() if err != nil { log.Fatalf("Cannot get current working directoy, the error is: %v", err) } - tmpBuildDir := filepath.Join(os.TempDir(), TmpFolderName(path)) + b.TmpDir = filepath.Join(os.TempDir(), TmpFolderName(path)) // Delete previous tmp folder and its content - os.RemoveAll(tmpBuildDir) + os.RemoveAll(b.TmpDir) // Create a new tmp folder - err = os.MkdirAll(filepath.Join(tmpBuildDir, "src"), os.ModePerm) + err = os.MkdirAll(filepath.Join(b.TmpDir, "src"), os.ModePerm) if err != nil { log.Fatalf("Fail to create the temporary build directory. The err is: %v", err) } - log.Printf("Temp project generated in: %v", tmpBuildDir) + log.Printf("Tmp project generated in: %v", b.TmpDir) - isMod := false - var tmpWorkingDir string - if checkIfLegacyProject(pkgs) { - cpLegacyProject(tmpBuildDir, pkgs) - tmpWorkingDir = getTmpwd(tmpBuildDir, pkgs, false) + // set Build.IsMod flag, so we dont have to call checkIfLegacyProject another time + if b.checkIfLegacyProject() { + b.cpLegacyProject() } else { - cpGoModulesProject(tmpBuildDir, pkgs) - tmpWorkingDir = getTmpwd(tmpBuildDir, pkgs, true) - isMod = true + b.IsMod = true + b.cpGoModulesProject() } + b.getTmpwd() - log.Printf("New working/building directory in: %v", tmpWorkingDir) - return tmpBuildDir, tmpWorkingDir, isMod + log.Printf("New workingdir in tmp directory in: %v", b.TmpWorkingDir) } func TmpFolderName(path string) string { @@ -86,11 +83,11 @@ func TmpFolderName(path string) string { return "goc-" + h } -// Check if it is go module project +// checkIfLegacyProject Check if it is go module project // true legacy // false go mod -func checkIfLegacyProject(pkgs map[string]*cover.Package) bool { - for _, v := range pkgs { +func (b *Build) checkIfLegacyProject() bool { + for _, v := range b.Pkgs { if v.Module == nil { return true } @@ -100,8 +97,10 @@ func checkIfLegacyProject(pkgs map[string]*cover.Package) bool { return false } -func getTmpwd(tmpBuildDir string, pkgs map[string]*cover.Package, isMod bool) string { - for _, pkg := range pkgs { +// getTmpwd get the corresponding working directory in the temporary working directory +// and store it in the Build.tmpWorkdingDir +func (b *Build) getTmpwd() { + for _, pkg := range b.Pkgs { path, err := os.Getwd() if err != nil { log.Fatalf("Cannot get current working directory, the error is: %v", err) @@ -109,7 +108,7 @@ func getTmpwd(tmpBuildDir string, pkgs map[string]*cover.Package, isMod bool) st index := -1 var parentPath string - if isMod == false { + if b.IsMod == false { index = strings.Index(path, pkg.Root) parentPath = pkg.Root } else { @@ -120,24 +119,24 @@ func getTmpwd(tmpBuildDir string, pkgs map[string]*cover.Package, isMod bool) st if index == -1 { log.Fatalf("goc install not executed in project directory.") } - tmpwd := filepath.Join(tmpBuildDir, path[len(parentPath):]) + b.TmpWorkingDir = filepath.Join(b.TmpDir, path[len(parentPath):]) // log.Printf("New building directory in: %v", tmpwd) - return tmpwd + return } log.Fatalln("Should never be reached....") - return "" + return } -func FindWhereToInstall(pkgs map[string]*cover.Package) string { +func (b *Build) findWhereToInstall() string { if GOBIN := os.Getenv("GOBIN"); GOBIN != "" { return GOBIN } // old GOPATH dir GOPATH := os.Getenv("GOPATH") - if true == checkIfLegacyProject(pkgs) { - for _, v := range pkgs { + if false == b.IsMod { + for _, v := range b.Pkgs { return filepath.Join(v.Root, "bin") } } diff --git a/pkg/build/tmpfolder_test.go b/pkg/build/tmpfolder_test.go deleted file mode 100644 index 596021d..0000000 --- a/pkg/build/tmpfolder_test.go +++ /dev/null @@ -1,133 +0,0 @@ -/* - Copyright 2020 Qiniu Cloud (qiniu.com) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package build - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/qiniu/goc/pkg/cover" -) - -const TEST_GO_LIST_LEGACY = `{ - "Dir": "/Users/lyyyuna/gitup/linking/src/qiniu.com/linking/api/linking.v1", - "ImportPath": "qiniu.com/linking/api/linking.v1", - "Name": "linking", - "Target": "/Users/lyyyuna/gitup/linking/pkg/darwin_amd64/qiniu.com/linking/api/linking.v1.a", - "Root": "/Users/lyyyuna/gitup/linking", - "Match": [ - "./..." - ], - "Stale": true, - "StaleReason": "stale dependency: vendor/github.com/modern-go/concurrent", - "GoFiles": [ - "client.go" - ], - "Imports": [ - "vendor/github.com/json-iterator/go", - "github.com/qiniu/rpc.v2", - "vendor/github.com/qiniu/xlog.v1", - "vendor/qiniu.com/auth/qiniumac.v1" - ], - "ImportMap": { - "github.com/json-iterator/go": "vendor/github.com/json-iterator/go", - "github.com/qiniu/xlog.v1": "vendor/github.com/qiniu/xlog.v1", - "qiniu.com/auth/qiniumac.v1": "vendor/qiniu.com/auth/qiniumac.v1" - }, - "Deps": [ - "bufio" - ] -}` - -const TEST_GO_LIST_MOD = `{ - "Dir": "/Users/lyyyuna/gitup/tonghu-chat", - "ImportPath": "github.com/lyyyuna/tonghu-chat", - "Name": "main", - "Target": "/Users/lyyyuna/go/bin/tonghu-chat", - "Root": "/Users/lyyyuna/gitup/tonghu-chat", - "Module": { - "Path": "github.com/lyyyuna/tonghu-chat", - "Main": true, - "Dir": "/Users/lyyyuna/gitup/tonghu-chat", - "GoMod": "/Users/lyyyuna/gitup/tonghu-chat/go.mod", - "GoVersion": "1.14" - }, - "Match": [ - "./..." - ], - "Stale": true, - "StaleReason": "not installed but available in build cache", - "GoFiles": [ - "main.go" - ], - "Imports": [ - "github.com/gin-gonic/gin", - "github.com/gorilla/websocket" - ], - "Deps": [ - "bufio" - ] -}` - -func constructPkg(raw string) *cover.Package { - var pkg cover.Package - if err := json.Unmarshal([]byte(raw), &pkg); err != nil { - panic(err) - } - return &pkg -} - -func TestLegacyProjectJudgement(t *testing.T) { - pkgs := make(map[string]*cover.Package) - pkg := constructPkg(TEST_GO_LIST_LEGACY) - pkgs[pkg.ImportPath] = pkg - if expect, got := true, checkIfLegacyProject(pkgs); expect != got { - t.Fatalf("Expected %v, but got %v.", expect, got) - } -} - -func TestModProjectJudgement(t *testing.T) { - pkgs := make(map[string]*cover.Package) - pkg := constructPkg(TEST_GO_LIST_MOD) - pkgs[pkg.ImportPath] = pkg - if expect, got := false, checkIfLegacyProject(pkgs); expect != got { - t.Fatalf("Expected %v, but got %v.", expect, got) - } -} - -func TestNewDirParseInLegacyProject(t *testing.T) { - workingDir := "../../tests/samples/simple_gopath_project/src/qiniu.com/simple_gopath_project" - gopath, _ := filepath.Abs("../../tests/samples/simple_gopath_project") - - os.Chdir(workingDir) - fmt.Println(gopath) - os.Setenv("GOPATH", gopath) - os.Setenv("GO111MODULE", "off") - - newgopath, newwd, tmpdir, _ := MvProjectsToTmp(".", nil) - if -1 == strings.Index(newwd, tmpdir) { - t.Fatalf("Directory parse error. newwd: %v, tmpdir: %v", newwd, tmpdir) - } - - if -1 == strings.Index(newgopath, ":") || -1 == strings.Index(newgopath, tmpdir) { - t.Fatalf("The New GOPATH is wrong. newgopath: %v, tmpdir: %v", newgopath, tmpdir) - } -} diff --git a/pkg/cover/cover.go b/pkg/cover/cover.go index 71e868c..70e165c 100644 --- a/pkg/cover/cover.go +++ b/pkg/cover/cover.go @@ -113,17 +113,18 @@ type PackageError struct { } // ListPackages list all packages under specific via go list command -func ListPackages(dir string, args []string, newgopath string) map[string]*Package { - cmd := exec.Command("go", args...) +// The argument newgopath is if you need to go list in a different GOPATH +func ListPackages(dir string, args string, newgopath string) map[string]*Package { + cmd := exec.Command("/bin/bash", "-c", "go list " + args) log.Printf("go list cmd is: %v", cmd.Args) cmd.Dir = dir if newgopath != "" { cmd.Env = append(os.Environ(), fmt.Sprintf("GOPATH=%v", newgopath)) } - out, _ := cmd.Output() - // if err != nil { - // log.Fatalf("excute `go list -json ./...` command failed, err: %v, out: %v", err, string(out)) - // } + out, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("excute `go list -json ./...` command failed, err: %v, out: %v", err, string(out)) + } dec := json.NewDecoder(bytes.NewReader(out)) pkgs := make(map[string]*Package, 0) diff --git a/tests/e2e/simple_project_test.go b/tests/e2e/simple_project_test.go index 8173df5..291950f 100644 --- a/tests/e2e/simple_project_test.go +++ b/tests/e2e/simple_project_test.go @@ -63,7 +63,7 @@ var _ = Describe("E2E", func() { By("goc install") testProjDir = filepath.Join(TESTS_ROOT, "samples/simple_project") - cmd = exec.Command("goc", "install", "./...") + cmd = exec.Command("goc", "install", "--debuggoc") cmd.Dir = testProjDir out, err = cmd.CombinedOutput() @@ -124,7 +124,7 @@ var _ = Describe("E2E", func() { By("goc install") testProjDir = filepath.Join(TESTS_ROOT, "samples/simple_gopath_project") - cmd = exec.Command("goc", "install", "./...") + cmd = exec.Command("goc", "install", "--debuggoc") cmd.Dir = filepath.Join(testProjDir, "src/qiniu.com/simple_gopath_project") // use GOPATH mode to compile project cmd.Env = append(os.Environ(), fmt.Sprintf("GOPATH=%v", testProjDir), "GO111MODULE=off")