From d9633cd9af4f8cbfaebff899911f3c4edb949746 Mon Sep 17 00:00:00 2001 From: yitea Date: Tue, 21 Jul 2020 22:24:42 +0800 Subject: [PATCH 01/25] repair staticcheck --- internal/app/module/beegopro/container.go | 39 ++++++++++---------- internal/app/module/beegopro/parser_mysql.go | 1 - internal/app/module/beegopro/pongo2.go | 6 +-- internal/app/module/beegopro/render.go | 4 +- internal/app/module/beegopro/schema.go | 7 +--- internal/app/module/beegopro/util.go | 7 +++- internal/pkg/git/repository.go | 16 -------- 7 files changed, 33 insertions(+), 47 deletions(-) diff --git a/internal/app/module/beegopro/container.go b/internal/app/module/beegopro/container.go index 296033b..3046698 100644 --- a/internal/app/module/beegopro/container.go +++ b/internal/app/module/beegopro/container.go @@ -21,32 +21,33 @@ var DefaultBeegoPro = &Container{ TimestampFile: system.CurrentDir + "/.beegopro.timestamp", GoModFile: system.CurrentDir + "/go.mod", UserOption: UserOption{ - Debug: false, - ContextDebug: false, - Dsn: "", - Driver: "mysql", - ProType: "default", - ApiPrefix: "/api", - EnableModule: nil, - Models: make(map[string]TextModel, 0), - GitRemotePath: "https://github.com/beego/beego-pro.git", - Branch: "master", - GitLocalPath: system.BeegoHome + "/beego-pro", - EnableFormat: true, - SourceGen: "text", - EnableGitPull: true, - RefreshGitTime: 24 * 3600, + Debug: false, + ContextDebug: false, + Dsn: "", + Driver: "mysql", + ProType: "default", + ApiPrefix: "/api", + EnableModule: nil, + Models: make(map[string]TextModel), + GitRemotePath: "https://github.com/beego/beego-pro.git", + Branch: "master", + GitLocalPath: system.BeegoHome + "/beego-pro", + EnableFormat: true, + SourceGen: "text", + EnableGitPull: true, Path: map[string]string{ "beego": ".", }, - EnableGomod: true, + EnableGomod: true, + RefreshGitTime: 24 * 3600, + Extend: nil, }, GenerateTime: time.Now().Format(MDateFormat), GenerateTimeUnix: time.Now().Unix(), TmplOption: TmplOption{}, CurPath: system.CurrentDir, - EnableModules: make(map[string]interface{}, 0), // get the user configuration, get the enable module result - FunctionOnce: make(map[string]sync.Once, 0), // get the tmpl configuration, get the function once result + EnableModules: make(map[string]interface{}), // get the user configuration, get the enable module result + FunctionOnce: make(map[string]sync.Once), // get the tmpl configuration, get the function once result } func (c *Container) Run() { @@ -128,7 +129,7 @@ func (c *Container) initTemplateOption() { } for _, value := range c.TmplOption.Descriptor { - if value.Once == true { + if value.Once { c.FunctionOnce[value.SrcName] = sync.Once{} } } diff --git a/internal/app/module/beegopro/parser_mysql.go b/internal/app/module/beegopro/parser_mysql.go index 204c704..08180cc 100644 --- a/internal/app/module/beegopro/parser_mysql.go +++ b/internal/app/module/beegopro/parser_mysql.go @@ -10,7 +10,6 @@ import ( type MysqlParser struct { userOption UserOption tmplOption TmplOption - db *sql.DB } func (m *MysqlParser) RegisterOption(userOption UserOption, tmplOption TmplOption) { diff --git a/internal/app/module/beegopro/pongo2.go b/internal/app/module/beegopro/pongo2.go index 3304230..31453c6 100644 --- a/internal/app/module/beegopro/pongo2.go +++ b/internal/app/module/beegopro/pongo2.go @@ -49,9 +49,9 @@ func pongo2CamelString(in *pongo2.Value, param *pongo2.Value) (*pongo2.Value, *p return pongo2.AsValue(utils.CamelString(t)), nil } -func upperFirst(str string) string { - return strings.Replace(str, string(str[0]), strings.ToUpper(string(str[0])), 1) -} +//func upperFirst(str string) string { +// return strings.Replace(str, string(str[0]), strings.ToUpper(string(str[0])), 1) +//} func lowerFirst(str string) string { return strings.Replace(str, string(str[0]), strings.ToLower(string(str[0])), 1) diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index ba5d2b7..f2e49c3 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -34,7 +34,7 @@ func NewRender(m RenderInfo) *RenderFile { newDescriptor, pathCtx = m.Descriptor.Parse(m.ModelName, m.Option.Path) obj := &RenderFile{ - Context: make(pongo2.Context, 0), + Context: make(pongo2.Context), Option: m.Option, ModelName: m.ModelName, GenerateTime: m.GenerateTime, @@ -61,7 +61,7 @@ func NewRender(m RenderInfo) *RenderFile { modelSchemas := m.Content.ToModelSchemas() camelPrimaryKey := modelSchemas.GetPrimaryKey() - importMaps := make(map[string]struct{}, 0) + importMaps := make(map[string]struct{}) if modelSchemas.IsExistTime() { importMaps["time"] = struct{}{} } diff --git a/internal/app/module/beegopro/schema.go b/internal/app/module/beegopro/schema.go index f29d981..c4f6a1e 100644 --- a/internal/app/module/beegopro/schema.go +++ b/internal/app/module/beegopro/schema.go @@ -75,7 +75,7 @@ func (descriptor Descriptor) Parse(modelName string, paths map[string]string) (n newDescriptor = descriptor render := pongo2render.NewRender("") - ctx = make(pongo2.Context, 0) + ctx = make(pongo2.Context) for key, value := range paths { absFile, err = filepath.Abs(value) if err != nil { @@ -110,10 +110,7 @@ func (descriptor Descriptor) Parse(modelName string, paths map[string]string) (n } func (descriptor Descriptor) IsExistScript() bool { - if descriptor.Script != "" { - return true - } - return false + return descriptor.Script != "" } func (d Descriptor) ExecScript(path string) (err error) { diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index 79f02a3..646ffb2 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -46,7 +46,12 @@ func (c *RenderFile) write(filename string, buf string) (err error) { } file, err := os.Create(filename) - defer file.Close() + defer func() { + err = file.Close() + if err != nil { + beeLogger.Log.Fatalf("file close error, err %s", err) + } + }() if err != nil { err = errors.New("write create file " + err.Error()) return diff --git a/internal/pkg/git/repository.go b/internal/pkg/git/repository.go index d32d597..d24a840 100644 --- a/internal/pkg/git/repository.go +++ b/internal/pkg/git/repository.go @@ -206,19 +206,3 @@ func concatenateError(err error, stderr string) error { } return fmt.Errorf("%v: %s", err, stderr) } - -// getGitProjectName 获取项目名称 -func getGitProjectName(url string) (name string, err error) { - if !strings.Contains(url, ".git") { - return "", errors.New("Project address does not contain .git") - } - fileSlice := strings.Split(url, "/") - projectName := fileSlice[len(fileSlice)-1] - if projectName == "" { - return "", errors.New("Project name does not exist") - } - - nameSlice := strings.Split(projectName, ".git") - - return nameSlice[0], nil -} From 0e6ce7dea0dacf982a8e39759a9633c0f22388b5 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Fri, 24 Jul 2020 15:15:29 +0800 Subject: [PATCH 02/25] bak file err --- internal/app/module/beegopro/util.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index 646ffb2..e1491bd 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -20,7 +20,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { return } - filePath := path.Dir(filename) + filePath := filepath.Dir(filename) err = createPath(filePath) if err != nil { err = errors.New("write create path " + err.Error()) @@ -37,7 +37,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { name := path.Base(filename) if utils.IsExist(filename) { - bakName := fmt.Sprintf("%s/%s.%s.bak", filePathBak, name, time.Now().Format("2006.01.02.15.04.05")) + bakName := fmt.Sprintf("%s/%s.%s.bak", filePathBak, filepath.Base(name), time.Now().Format("2006.01.02.15.04.05")) beeLogger.Log.Infof("bak file '%s'", bakName) if err := os.Rename(filename, bakName); err != nil { err = errors.New("file is bak error, path is " + bakName) From e0ce20407c21fb7ba9f583e34539fe095b43d2c7 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Fri, 24 Jul 2020 16:24:09 +0800 Subject: [PATCH 03/25] Change bee version --- cmd/commands/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/commands/version/version.go b/cmd/commands/version/version.go index 4eebd9f..a1ce710 100644 --- a/cmd/commands/version/version.go +++ b/cmd/commands/version/version.go @@ -57,7 +57,7 @@ Prints the current Bee, Beego and Go version alongside the platform information. } var outputFormat string -const version = "1.11.0" +const version = "1.12.0" func init() { fs := flag.NewFlagSet("version", flag.ContinueOnError) From f601e441f3be2695063fd335901ab4e20d2e0828 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sat, 25 Jul 2020 02:56:02 +0800 Subject: [PATCH 04/25] Backup only when content changes --- internal/app/module/beegopro/render.go | 26 +++++++++++++---- internal/app/module/beegopro/util.go | 40 ++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index f2e49c3..64c52fc 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -6,6 +6,8 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/flosch/pongo2" "github.com/smartwalle/pongo2render" + "io/ioutil" + "os" "path" "path/filepath" ) @@ -114,10 +116,24 @@ func (r *RenderFile) Exec(name string) { beeLogger.Log.Fatalf("Could not create the %s render tmpl: %s", name, err) return } - err = r.write(r.FlushFile, buf) - if err != nil { - beeLogger.Log.Fatalf("Could not create file: %s", err) - return + _, err = os.Stat(r.Descriptor.DstPath) + var orgContent []byte + if err == nil { + if org, err := os.OpenFile(r.Descriptor.DstPath, os.O_RDONLY, 0666); err == nil { + defer org.Close() + orgContent,_ = ioutil.ReadAll(org) + } else { + beeLogger.Log.Infof("file err %s", err) + } + } + // Replace or create when content changes + if len(orgContent) == 0 || FileContentChange(string(orgContent),buf) { + err = r.write(r.FlushFile, buf) + if err != nil { + beeLogger.Log.Fatalf("Could not create file: %s", err) + return + } + beeLogger.Log.Infof("create file '%s' from %s", r.FlushFile, r.PackageName) } - beeLogger.Log.Infof("create file '%s' from %s", r.FlushFile, r.PackageName) } + diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index e1491bd..2cbfe23 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -1,6 +1,7 @@ package beegopro import ( + "crypto/md5" "errors" "fmt" "github.com/beego/bee/internal/pkg/utils" @@ -10,6 +11,7 @@ import ( "os" "path" "path/filepath" + "regexp" "strings" "time" ) @@ -188,3 +190,41 @@ func getModelType(orm string) (inputType, goType, mysqlType, tag string) { } return } + +func FileContentChange(org,new string) bool { + if org == "" { + return false + } + var orgContent,newContent string + jump := false + // expect tab character and blank space and "import(***)" + reg := regexp.MustCompile("\\s+") + for i, s := range strings.Split(org, "\n") { + if s == "import (" { + jump = true + } + if jump && s == ")" { + jump = false + } + if i > 2 && !jump { + orgContent += reg.ReplaceAllString(s, "") + } + } + for i, s := range strings.Split(new, "\n") { + if s == "import (" { + jump = true + } + if jump && s == ")" { + jump = false + } + if i > 2 && !jump { + newContent += reg.ReplaceAllString(s, "") + } + } + orgMd5 := md5.Sum([]byte(orgContent)) + newMd5:= md5.Sum([]byte(newContent)) + if orgMd5 != newMd5 { + return true + } + return false +} \ No newline at end of file From dbb41fa430c12c90c542930fdd62aa77be255115 Mon Sep 17 00:00:00 2001 From: qiantao Date: Fri, 24 Jul 2020 15:54:52 +0800 Subject: [PATCH 05/25] 1. default gopath=false, 2. fix error work path. --- cmd/commands/api/apiapp.go | 22 ++++++++++++---------- cmd/commands/hprose/hprose.go | 21 +++++++++++---------- cmd/commands/new/new.go | 10 +++++----- utils/utils.go | 6 +++--- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/cmd/commands/api/apiapp.go b/cmd/commands/api/apiapp.go index ba0b45f..4ecbc6a 100644 --- a/cmd/commands/api/apiapp.go +++ b/cmd/commands/api/apiapp.go @@ -34,9 +34,10 @@ var CmdApiapp = &commands.Command{ Short: "Creates a Beego API application", Long: ` The command 'api' creates a Beego API application. + now default supoort generate a go modules project. {{"Example:"|bold}} - $ bee api [appname] [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-module=true] [-beego=v1.12.1] + $ bee api [appname] [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-gopath=false] [-beego=v1.12.1] If 'conn' argument is empty, the command will generate an example API application. Otherwise the command will connect to your database and generate models based on the existing tables. @@ -44,7 +45,7 @@ var CmdApiapp = &commands.Command{ The command 'api' creates a folder named [appname] with the following structure: ├── main.go - ├── go.mod + ├── go.mod ├── {{"conf"|foldername}} │ └── app.conf ├── {{"controllers"|foldername}} @@ -543,15 +544,15 @@ func TestGet(t *testing.T) { } ` -var module utils.DocValue +var gopath utils.DocValue var beegoVersion utils.DocValue func init() { CmdApiapp.Flag.Var(&generate.Tables, "tables", "List of table names separated by a comma.") CmdApiapp.Flag.Var(&generate.SQLDriver, "driver", "Database driver. Either mysql, postgres or sqlite.") CmdApiapp.Flag.Var(&generate.SQLConn, "conn", "Connection string used by the driver to connect to a database instance.") - CmdApiapp.Flag.Var(&module, "module", "Support go modules") - CmdApiapp.Flag.Var(&beegoVersion, "beego", "set beego version,only take effect by -module=true") + CmdApiapp.Flag.Var(&gopath, "gopath", "Support go path,default false") + CmdApiapp.Flag.Var(&beegoVersion, "beego", "set beego version,only take effect by go mod") commands.AvailableCommands = append(commands.AvailableCommands, CmdApiapp) } @@ -563,14 +564,15 @@ func createAPI(cmd *commands.Command, args []string) int { } if len(args) >= 2 { - cmd.Flag.Parse(args[1:]) - } else { - module = "false" + err := cmd.Flag.Parse(args[1:]) + if err != nil { + beeLogger.Log.Fatal("Parse args err " + err.Error()) + } } var appPath string var packPath string var err error - if module != `true` { + if gopath == `true` { beeLogger.Log.Info("generate api project support GOPATH") version.ShowShortVersionBanner() appPath, packPath, err = utils.CheckEnv(args[0]) @@ -605,7 +607,7 @@ func createAPI(cmd *commands.Command, args []string) int { beeLogger.Log.Info("Creating API...") os.MkdirAll(appPath, 0755) - if module == `true` { //generate first for calc model name + if gopath != `true` { //generate first for calc model name fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(appPath, "go.mod"), "\x1b[0m") utils.WriteToFile(path.Join(appPath, "go.mod"), fmt.Sprintf(goMod, packPath, utils.GetGoVersionSkipMinor(), beegoVersion.String())) } diff --git a/cmd/commands/hprose/hprose.go b/cmd/commands/hprose/hprose.go index 50ba5c1..bdd52c8 100644 --- a/cmd/commands/hprose/hprose.go +++ b/cmd/commands/hprose/hprose.go @@ -24,7 +24,7 @@ var CmdHproseapp = &commands.Command{ {{"To scaffold out your application, use:"|bold}} - $ bee hprose [appname] [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-module=true] [-beego=v1.12.1] + $ bee hprose [appname] [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-gopath=false] [-beego=v1.12.1] If 'conn' is empty, the command will generate a sample application. Otherwise the command will connect to your database and generate models based on the existing tables. @@ -52,15 +52,15 @@ require github.com/astaxie/beego %s require github.com/smartystreets/goconvey v1.6.4 ` -var module utils.DocValue +var gopath utils.DocValue var beegoVersion utils.DocValue func init() { CmdHproseapp.Flag.Var(&generate.Tables, "tables", "List of table names separated by a comma.") CmdHproseapp.Flag.Var(&generate.SQLDriver, "driver", "Database driver. Either mysql, postgres or sqlite.") CmdHproseapp.Flag.Var(&generate.SQLConn, "conn", "Connection string used by the driver to connect to a database instance.") - CmdHproseapp.Flag.Var(&module, "module", "Support go modules") - CmdHproseapp.Flag.Var(&beegoVersion, "beego", "set beego version,only take effect by -module=true") + CmdHproseapp.Flag.Var(&gopath, "gopath", "Support go path,default false") + CmdHproseapp.Flag.Var(&beegoVersion, "beego", "set beego version,only take effect by go mod") commands.AvailableCommands = append(commands.AvailableCommands, CmdHproseapp) } @@ -71,15 +71,16 @@ func createhprose(cmd *commands.Command, args []string) int { } curpath, _ := os.Getwd() - if len(args) > 1 { - cmd.Flag.Parse(args[1:]) - } else { - module = "false" + if len(args) >= 2 { + err := cmd.Flag.Parse(args[1:]) + if err != nil { + beeLogger.Log.Fatal("Parse args err " + err.Error()) + } } var apppath string var packpath string var err error - if module != `true` { + if gopath == `true` { beeLogger.Log.Info("generate api project support GOPATH") version.ShowShortVersionBanner() apppath, packpath, err = utils.CheckEnv(args[0]) @@ -109,7 +110,7 @@ func createhprose(cmd *commands.Command, args []string) int { beeLogger.Log.Info("Creating Hprose application...") os.MkdirAll(apppath, 0755) - if module == `true` { //generate first for calc model name + if gopath != `true` { //generate first for calc model name fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "go.mod"), "\x1b[0m") utils.WriteToFile(path.Join(apppath, "go.mod"), fmt.Sprintf(goMod, packpath, utils.GetGoVersionSkipMinor(), beegoVersion.String())) } diff --git a/cmd/commands/new/new.go b/cmd/commands/new/new.go index 75bafdb..6c71f07 100644 --- a/cmd/commands/new/new.go +++ b/cmd/commands/new/new.go @@ -31,12 +31,12 @@ var gopath utils.DocValue var beegoVersion utils.DocValue var CmdNew = &commands.Command{ - UsageLine: "new [appname] [-module=true] [-beego=v1.12.1]", + UsageLine: "new [appname] [-gopath=false] [-beego=v1.12.1]", Short: "Creates a Beego application", Long: ` Creates a Beego application for the given app name in the current directory. - now supoort generate a go modules project - The command 'new' creates a folder named [appname] [-module=true] [-beego=v1.12.1] and generates the following structure: + now default supoort generate a go modules project + The command 'new' creates a folder named [appname] [-gopath=false] [-beego=v1.12.1] and generates the following structure: ├── main.go ├── go.mod @@ -255,8 +255,8 @@ var reloadJsClient = `function b(a){var c=new WebSocket(a);c.onclose=function(){ ` func init() { - CmdNew.Flag.Var(&gopath, "gopath", "Support go path") - CmdNew.Flag.Var(&beegoVersion, "beego", "set beego version,only take effect by module mod") + CmdNew.Flag.Var(&gopath, "gopath", "Support go path,default false") + CmdNew.Flag.Var(&beegoVersion, "beego", "set beego version,only take effect by go mod") commands.AvailableCommands = append(commands.AvailableCommands, CmdNew) } diff --git a/utils/utils.go b/utils/utils.go index f4516e8..eedd57a 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -34,11 +34,11 @@ import ( ) func GetBeeWorkPath() string { - beePath, err := filepath.Abs(filepath.Dir(os.Args[0])) + curpath, err := os.Getwd() if err != nil { panic(err) } - return beePath + return curpath } // Go is a basic promise implementation: it wraps calls a function in a goroutine @@ -313,7 +313,7 @@ func Tmpl(text string, data interface{}) { func CheckEnv(appname string) (apppath, packpath string, err error) { gps := GetGOPATHs() if len(gps) == 0 { - beeLogger.Log.Error("if you want new a go module project,please add param `-module=true` and set env `G111MODULE=on`") + beeLogger.Log.Error("if you want new a go module project,please add param `-gopath=false`.") beeLogger.Log.Fatal("GOPATH environment variable is not set or empty") } currpath, _ := os.Getwd() From 174d2ab2e87303b289e8fcf87ddd804a1927b0c8 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sun, 26 Jul 2020 14:27:27 +0800 Subject: [PATCH 06/25] Compare content after formatting --- internal/app/module/beegopro/render.go | 20 +++++++++++--- internal/app/module/beegopro/util.go | 37 ++++++++------------------ 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index 64c52fc..3be18a1 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -1,11 +1,13 @@ package beegopro import ( + "errors" "github.com/beego/bee/internal/pkg/system" beeLogger "github.com/beego/bee/logger" "github.com/davecgh/go-spew/spew" "github.com/flosch/pongo2" "github.com/smartwalle/pongo2render" + "go/format" "io/ioutil" "os" "path" @@ -120,15 +122,27 @@ func (r *RenderFile) Exec(name string) { var orgContent []byte if err == nil { if org, err := os.OpenFile(r.Descriptor.DstPath, os.O_RDONLY, 0666); err == nil { - defer org.Close() orgContent,_ = ioutil.ReadAll(org) + org.Close() } else { beeLogger.Log.Infof("file err %s", err) } } // Replace or create when content changes - if len(orgContent) == 0 || FileContentChange(string(orgContent),buf) { - err = r.write(r.FlushFile, buf) + output := []byte(buf) + if r.Option.EnableFormat && filepath.Ext(r.FlushFile) == ".go" { + // format code + var bts []byte + bts, err = format.Source([]byte(buf)) + if err != nil { + err = errors.New("format buf error " + err.Error()) + return + } + output = bts + } + + if FileContentChange(orgContent,output) { + err = r.write(r.FlushFile, output) if err != nil { beeLogger.Log.Fatalf("Could not create file: %s", err) return diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index 2cbfe23..f6baee6 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -11,13 +11,12 @@ import ( "os" "path" "path/filepath" - "regexp" "strings" "time" ) // write to file -func (c *RenderFile) write(filename string, buf string) (err error) { +func (c *RenderFile) write(filename string, buf []byte) (err error) { if utils.IsExist(filename) && !isNeedOverwrite(filename) { return } @@ -191,34 +190,19 @@ func getModelType(orm string) (inputType, goType, mysqlType, tag string) { return } -func FileContentChange(org,new string) bool { - if org == "" { - return false +func FileContentChange(org,new []byte) bool { + if len(org) == 0 { + return true } var orgContent,newContent string - jump := false - // expect tab character and blank space and "import(***)" - reg := regexp.MustCompile("\\s+") - for i, s := range strings.Split(org, "\n") { - if s == "import (" { - jump = true - } - if jump && s == ")" { - jump = false - } - if i > 2 && !jump { - orgContent += reg.ReplaceAllString(s, "") + for i, s := range strings.Split(string(org), "\n") { + if i > 1 { + orgContent += s } } - for i, s := range strings.Split(new, "\n") { - if s == "import (" { - jump = true - } - if jump && s == ")" { - jump = false - } - if i > 2 && !jump { - newContent += reg.ReplaceAllString(s, "") + for i, s := range strings.Split(string(new), "\n") { + if i > 1 { + newContent += s } } orgMd5 := md5.Sum([]byte(orgContent)) @@ -226,5 +210,6 @@ func FileContentChange(org,new string) bool { if orgMd5 != newMd5 { return true } + beeLogger.Log.Infof("File has no change in the content") return false } \ No newline at end of file From a9d3de0872034b4c11108723f6d15ce2a8ac5d52 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sun, 26 Jul 2020 15:48:36 +0800 Subject: [PATCH 07/25] Only contents in "CompareExcept" are excluded during comparison --- internal/app/module/beegopro/config.go | 2 ++ internal/app/module/beegopro/render.go | 5 +-- internal/app/module/beegopro/util.go | 47 ++++++++++++++++---------- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/internal/app/module/beegopro/config.go b/internal/app/module/beegopro/config.go index f4854fe..716533c 100644 --- a/internal/app/module/beegopro/config.go +++ b/internal/app/module/beegopro/config.go @@ -6,6 +6,8 @@ import ( "io/ioutil" ) +var CompareExcept = []string{"@BeeGenerateTime"} + func (c *Container) GenConfig() { if utils.IsExist(c.BeegoProFile) { beeLogger.Log.Fatalf("beego pro toml exist") diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index 3be18a1..7fe55a2 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -130,7 +130,8 @@ func (r *RenderFile) Exec(name string) { } // Replace or create when content changes output := []byte(buf) - if r.Option.EnableFormat && filepath.Ext(r.FlushFile) == ".go" { + ext := filepath.Ext(r.FlushFile) + if r.Option.EnableFormat && ext == ".go" { // format code var bts []byte bts, err = format.Source([]byte(buf)) @@ -141,7 +142,7 @@ func (r *RenderFile) Exec(name string) { output = bts } - if FileContentChange(orgContent,output) { + if FileContentChange(orgContent,output,GetSeg(ext)) { err = r.write(r.FlushFile, output) if err != nil { beeLogger.Log.Fatalf("Could not create file: %s", err) diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index f6baee6..b2bd05d 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -80,11 +80,7 @@ func (c *RenderFile) write(filename string, buf []byte) (err error) { } func isNeedOverwrite(fileName string) (flag bool) { - seg := "//" - ext := filepath.Ext(fileName) - if ext == ".sql" { - seg = "--" - } + seg := GetSeg(filepath.Ext(fileName)) f, err := os.Open(fileName) if err != nil { @@ -190,21 +186,12 @@ func getModelType(orm string) (inputType, goType, mysqlType, tag string) { return } -func FileContentChange(org,new []byte) bool { +func FileContentChange(org,new []byte, seg string) bool { if len(org) == 0 { return true } - var orgContent,newContent string - for i, s := range strings.Split(string(org), "\n") { - if i > 1 { - orgContent += s - } - } - for i, s := range strings.Split(string(new), "\n") { - if i > 1 { - newContent += s - } - } + orgContent := GetFilterContent(string(org),seg) + newContent := GetFilterContent(string(org),string(new)) orgMd5 := md5.Sum([]byte(orgContent)) newMd5:= md5.Sum([]byte(newContent)) if orgMd5 != newMd5 { @@ -212,4 +199,30 @@ func FileContentChange(org,new []byte) bool { } beeLogger.Log.Infof("File has no change in the content") return false +} + +func GetFilterContent(content string, seg string) string { + res := "" + for _, s := range strings.Split(content, "\n") { + s = strings.TrimSpace(strings.TrimPrefix(s, seg)) + var have = false + for _,except := range CompareExcept{ + if strings.HasPrefix(s, except) { + have = true + } + } + if !have { + res += s + } + } + return res +} + +func GetSeg(ext string) string { + switch ext { + case ".sql": + return "--" + default: + return "//" + } } \ No newline at end of file From 59fa4ace1e8d27e04d9f5f22c2b794b9379bd785 Mon Sep 17 00:00:00 2001 From: askuy Date: Mon, 27 Jul 2020 13:09:56 +0800 Subject: [PATCH 08/25] Revert "Only contents in "CompareExcept" are excluded during comparison" This reverts commit a9d3de0872034b4c11108723f6d15ce2a8ac5d52. --- internal/app/module/beegopro/config.go | 2 -- internal/app/module/beegopro/render.go | 5 ++- internal/app/module/beegopro/util.go | 47 ++++++++++---------------- 3 files changed, 19 insertions(+), 35 deletions(-) diff --git a/internal/app/module/beegopro/config.go b/internal/app/module/beegopro/config.go index 716533c..f4854fe 100644 --- a/internal/app/module/beegopro/config.go +++ b/internal/app/module/beegopro/config.go @@ -6,8 +6,6 @@ import ( "io/ioutil" ) -var CompareExcept = []string{"@BeeGenerateTime"} - func (c *Container) GenConfig() { if utils.IsExist(c.BeegoProFile) { beeLogger.Log.Fatalf("beego pro toml exist") diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index 7fe55a2..3be18a1 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -130,8 +130,7 @@ func (r *RenderFile) Exec(name string) { } // Replace or create when content changes output := []byte(buf) - ext := filepath.Ext(r.FlushFile) - if r.Option.EnableFormat && ext == ".go" { + if r.Option.EnableFormat && filepath.Ext(r.FlushFile) == ".go" { // format code var bts []byte bts, err = format.Source([]byte(buf)) @@ -142,7 +141,7 @@ func (r *RenderFile) Exec(name string) { output = bts } - if FileContentChange(orgContent,output,GetSeg(ext)) { + if FileContentChange(orgContent,output) { err = r.write(r.FlushFile, output) if err != nil { beeLogger.Log.Fatalf("Could not create file: %s", err) diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index b2bd05d..f6baee6 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -80,7 +80,11 @@ func (c *RenderFile) write(filename string, buf []byte) (err error) { } func isNeedOverwrite(fileName string) (flag bool) { - seg := GetSeg(filepath.Ext(fileName)) + seg := "//" + ext := filepath.Ext(fileName) + if ext == ".sql" { + seg = "--" + } f, err := os.Open(fileName) if err != nil { @@ -186,12 +190,21 @@ func getModelType(orm string) (inputType, goType, mysqlType, tag string) { return } -func FileContentChange(org,new []byte, seg string) bool { +func FileContentChange(org,new []byte) bool { if len(org) == 0 { return true } - orgContent := GetFilterContent(string(org),seg) - newContent := GetFilterContent(string(org),string(new)) + var orgContent,newContent string + for i, s := range strings.Split(string(org), "\n") { + if i > 1 { + orgContent += s + } + } + for i, s := range strings.Split(string(new), "\n") { + if i > 1 { + newContent += s + } + } orgMd5 := md5.Sum([]byte(orgContent)) newMd5:= md5.Sum([]byte(newContent)) if orgMd5 != newMd5 { @@ -199,30 +212,4 @@ func FileContentChange(org,new []byte, seg string) bool { } beeLogger.Log.Infof("File has no change in the content") return false -} - -func GetFilterContent(content string, seg string) string { - res := "" - for _, s := range strings.Split(content, "\n") { - s = strings.TrimSpace(strings.TrimPrefix(s, seg)) - var have = false - for _,except := range CompareExcept{ - if strings.HasPrefix(s, except) { - have = true - } - } - if !have { - res += s - } - } - return res -} - -func GetSeg(ext string) string { - switch ext { - case ".sql": - return "--" - default: - return "//" - } } \ No newline at end of file From 0a2c7f0c5742106aafe99cb69e880702398be392 Mon Sep 17 00:00:00 2001 From: askuy Date: Mon, 27 Jul 2020 13:09:56 +0800 Subject: [PATCH 09/25] Revert "Compare content after formatting" This reverts commit 174d2ab2e87303b289e8fcf87ddd804a1927b0c8. --- internal/app/module/beegopro/render.go | 20 +++----------- internal/app/module/beegopro/util.go | 37 ++++++++++++++++++-------- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index 3be18a1..64c52fc 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -1,13 +1,11 @@ package beegopro import ( - "errors" "github.com/beego/bee/internal/pkg/system" beeLogger "github.com/beego/bee/logger" "github.com/davecgh/go-spew/spew" "github.com/flosch/pongo2" "github.com/smartwalle/pongo2render" - "go/format" "io/ioutil" "os" "path" @@ -122,27 +120,15 @@ func (r *RenderFile) Exec(name string) { var orgContent []byte if err == nil { if org, err := os.OpenFile(r.Descriptor.DstPath, os.O_RDONLY, 0666); err == nil { + defer org.Close() orgContent,_ = ioutil.ReadAll(org) - org.Close() } else { beeLogger.Log.Infof("file err %s", err) } } // Replace or create when content changes - output := []byte(buf) - if r.Option.EnableFormat && filepath.Ext(r.FlushFile) == ".go" { - // format code - var bts []byte - bts, err = format.Source([]byte(buf)) - if err != nil { - err = errors.New("format buf error " + err.Error()) - return - } - output = bts - } - - if FileContentChange(orgContent,output) { - err = r.write(r.FlushFile, output) + if len(orgContent) == 0 || FileContentChange(string(orgContent),buf) { + err = r.write(r.FlushFile, buf) if err != nil { beeLogger.Log.Fatalf("Could not create file: %s", err) return diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index f6baee6..2cbfe23 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -11,12 +11,13 @@ import ( "os" "path" "path/filepath" + "regexp" "strings" "time" ) // write to file -func (c *RenderFile) write(filename string, buf []byte) (err error) { +func (c *RenderFile) write(filename string, buf string) (err error) { if utils.IsExist(filename) && !isNeedOverwrite(filename) { return } @@ -190,19 +191,34 @@ func getModelType(orm string) (inputType, goType, mysqlType, tag string) { return } -func FileContentChange(org,new []byte) bool { - if len(org) == 0 { - return true +func FileContentChange(org,new string) bool { + if org == "" { + return false } var orgContent,newContent string - for i, s := range strings.Split(string(org), "\n") { - if i > 1 { - orgContent += s + jump := false + // expect tab character and blank space and "import(***)" + reg := regexp.MustCompile("\\s+") + for i, s := range strings.Split(org, "\n") { + if s == "import (" { + jump = true + } + if jump && s == ")" { + jump = false + } + if i > 2 && !jump { + orgContent += reg.ReplaceAllString(s, "") } } - for i, s := range strings.Split(string(new), "\n") { - if i > 1 { - newContent += s + for i, s := range strings.Split(new, "\n") { + if s == "import (" { + jump = true + } + if jump && s == ")" { + jump = false + } + if i > 2 && !jump { + newContent += reg.ReplaceAllString(s, "") } } orgMd5 := md5.Sum([]byte(orgContent)) @@ -210,6 +226,5 @@ func FileContentChange(org,new []byte) bool { if orgMd5 != newMd5 { return true } - beeLogger.Log.Infof("File has no change in the content") return false } \ No newline at end of file From 19d0116825549ae8b360f2c6d7e76b0050ea4356 Mon Sep 17 00:00:00 2001 From: askuy Date: Mon, 27 Jul 2020 13:11:14 +0800 Subject: [PATCH 10/25] Revert "Backup only when content changes" This reverts commit f601e441f3be2695063fd335901ab4e20d2e0828. --- internal/app/module/beegopro/render.go | 26 ++++------------- internal/app/module/beegopro/util.go | 40 -------------------------- 2 files changed, 5 insertions(+), 61 deletions(-) diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index 64c52fc..f2e49c3 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -6,8 +6,6 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/flosch/pongo2" "github.com/smartwalle/pongo2render" - "io/ioutil" - "os" "path" "path/filepath" ) @@ -116,24 +114,10 @@ func (r *RenderFile) Exec(name string) { beeLogger.Log.Fatalf("Could not create the %s render tmpl: %s", name, err) return } - _, err = os.Stat(r.Descriptor.DstPath) - var orgContent []byte - if err == nil { - if org, err := os.OpenFile(r.Descriptor.DstPath, os.O_RDONLY, 0666); err == nil { - defer org.Close() - orgContent,_ = ioutil.ReadAll(org) - } else { - beeLogger.Log.Infof("file err %s", err) - } - } - // Replace or create when content changes - if len(orgContent) == 0 || FileContentChange(string(orgContent),buf) { - err = r.write(r.FlushFile, buf) - if err != nil { - beeLogger.Log.Fatalf("Could not create file: %s", err) - return - } - beeLogger.Log.Infof("create file '%s' from %s", r.FlushFile, r.PackageName) + err = r.write(r.FlushFile, buf) + if err != nil { + beeLogger.Log.Fatalf("Could not create file: %s", err) + return } + beeLogger.Log.Infof("create file '%s' from %s", r.FlushFile, r.PackageName) } - diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index 2cbfe23..e1491bd 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -1,7 +1,6 @@ package beegopro import ( - "crypto/md5" "errors" "fmt" "github.com/beego/bee/internal/pkg/utils" @@ -11,7 +10,6 @@ import ( "os" "path" "path/filepath" - "regexp" "strings" "time" ) @@ -190,41 +188,3 @@ func getModelType(orm string) (inputType, goType, mysqlType, tag string) { } return } - -func FileContentChange(org,new string) bool { - if org == "" { - return false - } - var orgContent,newContent string - jump := false - // expect tab character and blank space and "import(***)" - reg := regexp.MustCompile("\\s+") - for i, s := range strings.Split(org, "\n") { - if s == "import (" { - jump = true - } - if jump && s == ")" { - jump = false - } - if i > 2 && !jump { - orgContent += reg.ReplaceAllString(s, "") - } - } - for i, s := range strings.Split(new, "\n") { - if s == "import (" { - jump = true - } - if jump && s == ")" { - jump = false - } - if i > 2 && !jump { - newContent += reg.ReplaceAllString(s, "") - } - } - orgMd5 := md5.Sum([]byte(orgContent)) - newMd5:= md5.Sum([]byte(newContent)) - if orgMd5 != newMd5 { - return true - } - return false -} \ No newline at end of file From 3e5f9cf213724ff4d573d38451a86bd07ea7a6ae Mon Sep 17 00:00:00 2001 From: askuy Date: Mon, 27 Jul 2020 13:11:14 +0800 Subject: [PATCH 11/25] Revert "Change bee version" This reverts commit e0ce20407c21fb7ba9f583e34539fe095b43d2c7. --- cmd/commands/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/commands/version/version.go b/cmd/commands/version/version.go index a1ce710..4eebd9f 100644 --- a/cmd/commands/version/version.go +++ b/cmd/commands/version/version.go @@ -57,7 +57,7 @@ Prints the current Bee, Beego and Go version alongside the platform information. } var outputFormat string -const version = "1.12.0" +const version = "1.11.0" func init() { fs := flag.NewFlagSet("version", flag.ContinueOnError) From 6a2f44720e8bc0a68bdaa194ef696e963a5dc811 Mon Sep 17 00:00:00 2001 From: askuy Date: Mon, 27 Jul 2020 13:11:14 +0800 Subject: [PATCH 12/25] Revert "bak file err" This reverts commit 0e6ce7dea0dacf982a8e39759a9633c0f22388b5. --- internal/app/module/beegopro/util.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index e1491bd..646ffb2 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -20,7 +20,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { return } - filePath := filepath.Dir(filename) + filePath := path.Dir(filename) err = createPath(filePath) if err != nil { err = errors.New("write create path " + err.Error()) @@ -37,7 +37,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { name := path.Base(filename) if utils.IsExist(filename) { - bakName := fmt.Sprintf("%s/%s.%s.bak", filePathBak, filepath.Base(name), time.Now().Format("2006.01.02.15.04.05")) + bakName := fmt.Sprintf("%s/%s.%s.bak", filePathBak, name, time.Now().Format("2006.01.02.15.04.05")) beeLogger.Log.Infof("bak file '%s'", bakName) if err := os.Rename(filename, bakName); err != nil { err = errors.New("file is bak error, path is " + bakName) From e0ada8860d7860d3a91778b03174aa75820b95dc Mon Sep 17 00:00:00 2001 From: Hanjiang Yu Date: Sun, 26 Jul 2020 10:15:26 +0800 Subject: [PATCH 13/25] Use go/build to resolve package path for `bee generate docs` --- generate/swaggergen/g_docs.go | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/generate/swaggergen/g_docs.go b/generate/swaggergen/g_docs.go index 73ba71b..c33263d 100644 --- a/generate/swaggergen/g_docs.go +++ b/generate/swaggergen/g_docs.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "go/ast" + "go/build" "go/parser" "go/token" "os" @@ -37,7 +38,6 @@ import ( "github.com/astaxie/beego/swagger" "github.com/astaxie/beego/utils" beeLogger "github.com/beego/bee/logger" - bu "github.com/beego/bee/utils" ) const ( @@ -263,7 +263,7 @@ func GenerateDocs(curpath string) { if im.Name != nil { localName = im.Name.Name } - analyseControllerPkg(path.Join(curpath, "vendor"), localName, im.Path.Value) + analyseControllerPkg(localName, im.Path.Value) } for _, d := range f.Decls { switch specDecl := d.(type) { @@ -418,7 +418,7 @@ func analyseNSInclude(baseurl string, ce *ast.CallExpr) string { return cname } -func analyseControllerPkg(vendorPath, localName, pkgpath string) { +func analyseControllerPkg(localName, pkgpath string) { pkgpath = strings.Trim(pkgpath, "\"") if isSystemPackage(pkgpath) { return @@ -433,36 +433,18 @@ func analyseControllerPkg(vendorPath, localName, pkgpath string) { importlist[pps[len(pps)-1]] = pkgpath } - pkgRealpath := "" - - if bu.IsGOMODULE() { - pkgRealpath = filepath.Join(bu.GetBeeWorkPath(), "..", pkgpath) - } else { - gopaths := bu.GetGOPATHs() - if len(gopaths) == 0 { - beeLogger.Log.Fatal("GOPATH environment variable is not set or empty") - } - wg, _ := filepath.EvalSymlinks(filepath.Join(vendorPath, pkgpath)) - if utils.FileExists(wg) { - pkgRealpath = wg - } else { - wgopath := gopaths - for _, wg := range wgopath { - wg, _ = filepath.EvalSymlinks(filepath.Join(wg, "src", pkgpath)) - if utils.FileExists(wg) { - pkgRealpath = wg - break - } - } - } + pkg, err := build.Default.Import(pkgpath, ".", build.FindOnly) + if err != nil { + beeLogger.Log.Fatalf("Package %s cannot be imported: %v", pkgpath, err) } + pkgRealpath := pkg.Dir if pkgRealpath != "" { if _, ok := pkgCache[pkgpath]; ok { return } pkgCache[pkgpath] = struct{}{} } else { - beeLogger.Log.Fatalf("Package '%s' does not exist in the GOPATH or vendor path", pkgpath) + beeLogger.Log.Fatalf("Package '%s' does not have source directory", pkgpath) } fileSet := token.NewFileSet() From a68e8ae3e88c378430a1c2a35dd9a484bee9d4b0 Mon Sep 17 00:00:00 2001 From: Hanjiang Yu Date: Sun, 26 Jul 2020 10:41:52 +0800 Subject: [PATCH 14/25] Parse AST even not in GOPATH --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index ef51e0d..bbc9284 100644 --- a/main.go +++ b/main.go @@ -69,7 +69,7 @@ func main() { // Check if current directory is inside the GOPATH, // if so parse the packages inside it. - if utils.IsInGOPATH(currentpath) && cmd.IfGenerateDocs(c.Name(), args) { + if cmd.IfGenerateDocs(c.Name(), args) { swaggergen.ParsePackagesFromDir(currentpath) } os.Exit(c.Run(c, args)) From c562cedf96b210cbd01b2206c9315756453ea6c8 Mon Sep 17 00:00:00 2001 From: Hanjiang Yu Date: Sun, 26 Jul 2020 10:52:19 +0800 Subject: [PATCH 15/25] Internalize parsePackagesFromDir() --- generate/swaggergen/g_docs.go | 12 +++++++++--- main.go | 15 --------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/generate/swaggergen/g_docs.go b/generate/swaggergen/g_docs.go index c33263d..48b54ad 100644 --- a/generate/swaggergen/g_docs.go +++ b/generate/swaggergen/g_docs.go @@ -102,8 +102,8 @@ func init() { astPkgs = make([]*ast.Package, 0) } -// ParsePackagesFromDir parses packages from a given directory -func ParsePackagesFromDir(dirpath string) { +// parsePackagesFromDir parses packages from a given directory +func parsePackagesFromDir(dirpath string) { c := make(chan error) go func() { @@ -157,8 +157,14 @@ func parsePackageFromDir(path string) error { // GenerateDocs generates documentations for a given path. func GenerateDocs(curpath string) { - fset := token.NewFileSet() + pkgspath := curpath + workspace := os.Getenv("BeeWorkspace") + if workspace != "" { + pkgspath = workspace + } + parsePackagesFromDir(pkgspath) + fset := token.NewFileSet() f, err := parser.ParseFile(fset, filepath.Join(curpath, "routers", "router.go"), nil, parser.ParseComments) if err != nil { beeLogger.Log.Fatalf("Error while parsing router.go: %s", err) diff --git a/main.go b/main.go index bbc9284..851b199 100644 --- a/main.go +++ b/main.go @@ -21,19 +21,10 @@ import ( "github.com/beego/bee/cmd" "github.com/beego/bee/cmd/commands" "github.com/beego/bee/config" - "github.com/beego/bee/generate/swaggergen" "github.com/beego/bee/utils" ) -var ( - workspace = os.Getenv("BeeWorkspace") -) - func main() { - currentpath, _ := os.Getwd() - if workspace != "" { - currentpath = workspace - } flag.Usage = cmd.Usage flag.Parse() log.SetFlags(0) @@ -66,12 +57,6 @@ func main() { } config.LoadConfig() - - // Check if current directory is inside the GOPATH, - // if so parse the packages inside it. - if cmd.IfGenerateDocs(c.Name(), args) { - swaggergen.ParsePackagesFromDir(currentpath) - } os.Exit(c.Run(c, args)) return } From a23c76305a07f5ff1630924f42fd8cb002a6a661 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sat, 1 Aug 2020 17:12:09 +0800 Subject: [PATCH 16/25] Automatic update bee every day Backup only when content changes Fix the version --- cmd/commands/version/version.go | 2 +- internal/app/module/beegopro/config.go | 2 +- internal/app/module/beegopro/render.go | 39 ++++++++++++-- internal/app/module/beegopro/util.go | 70 +++++++++++++++++--------- main.go | 1 + utils/utils.go | 64 +++++++++++++++++++++++ 6 files changed, 148 insertions(+), 30 deletions(-) diff --git a/cmd/commands/version/version.go b/cmd/commands/version/version.go index 4eebd9f..a1ce710 100644 --- a/cmd/commands/version/version.go +++ b/cmd/commands/version/version.go @@ -57,7 +57,7 @@ Prints the current Bee, Beego and Go version alongside the platform information. } var outputFormat string -const version = "1.11.0" +const version = "1.12.0" func init() { fs := flag.NewFlagSet("version", flag.ContinueOnError) diff --git a/internal/app/module/beegopro/config.go b/internal/app/module/beegopro/config.go index f4854fe..7fbdc2c 100644 --- a/internal/app/module/beegopro/config.go +++ b/internal/app/module/beegopro/config.go @@ -5,7 +5,7 @@ import ( beeLogger "github.com/beego/bee/logger" "io/ioutil" ) - +var CompareExcept = []string{"@BeeGenerateTime"} func (c *Container) GenConfig() { if utils.IsExist(c.BeegoProFile) { beeLogger.Log.Fatalf("beego pro toml exist") diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index f2e49c3..7ca97ae 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -6,6 +6,9 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/flosch/pongo2" "github.com/smartwalle/pongo2render" + "go/format" + "io/ioutil" + "os" "path" "path/filepath" ) @@ -114,10 +117,36 @@ func (r *RenderFile) Exec(name string) { beeLogger.Log.Fatalf("Could not create the %s render tmpl: %s", name, err) return } - err = r.write(r.FlushFile, buf) - if err != nil { - beeLogger.Log.Fatalf("Could not create file: %s", err) - return + _, err = os.Stat(r.Descriptor.DstPath) + var orgContent []byte + if err == nil { + if org, err := os.OpenFile(r.Descriptor.DstPath, os.O_RDONLY, 0666); err == nil { + orgContent,_ = ioutil.ReadAll(org) + org.Close() + } else { + beeLogger.Log.Infof("file err %s", err) + } + } + // Replace or create when content changes + output := []byte(buf) + ext := filepath.Ext(r.FlushFile) + if r.Option.EnableFormat && ext == ".go" { + // format code + var bts []byte + bts, err = format.Source([]byte(buf)) + if err != nil { + beeLogger.Log.Warnf("format buf error %s", err.Error()) + } + output = bts + } + + if FileContentChange(orgContent,output,GetSeg(ext)) { + err = r.write(r.FlushFile, output) + if err != nil { + beeLogger.Log.Fatalf("Could not create file: %s", err) + return + } + beeLogger.Log.Infof("create file '%s' from %s", r.FlushFile, r.PackageName) } - beeLogger.Log.Infof("create file '%s' from %s", r.FlushFile, r.PackageName) } + diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index 646ffb2..bfef1db 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -1,11 +1,11 @@ package beegopro import ( + "crypto/md5" "errors" "fmt" "github.com/beego/bee/internal/pkg/utils" beeLogger "github.com/beego/bee/logger" - "go/format" "io/ioutil" "os" "path" @@ -15,12 +15,12 @@ import ( ) // write to file -func (c *RenderFile) write(filename string, buf string) (err error) { +func (c *RenderFile) write(filename string, buf []byte) (err error) { if utils.IsExist(filename) && !isNeedOverwrite(filename) { return } - filePath := path.Dir(filename) + filePath := filepath.Dir(filename) err = createPath(filePath) if err != nil { err = errors.New("write create path " + err.Error()) @@ -37,7 +37,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { name := path.Base(filename) if utils.IsExist(filename) { - bakName := fmt.Sprintf("%s/%s.%s.bak", filePathBak, name, time.Now().Format("2006.01.02.15.04.05")) + bakName := fmt.Sprintf("%s/%s.%s.bak", filePathBak, filepath.Base(name), time.Now().Format("2006.01.02.15.04.05")) beeLogger.Log.Infof("bak file '%s'", bakName) if err := os.Rename(filename, bakName); err != nil { err = errors.New("file is bak error, path is " + bakName) @@ -57,20 +57,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { return } - output := []byte(buf) - - if c.Option.EnableFormat && filepath.Ext(filename) == ".go" { - // format code - var bts []byte - bts, err = format.Source([]byte(buf)) - if err != nil { - err = errors.New("format buf error " + err.Error()) - return - } - output = bts - } - - err = ioutil.WriteFile(filename, output, 0644) + err = ioutil.WriteFile(filename, buf, 0644) if err != nil { err = errors.New("write write file " + err.Error()) return @@ -79,11 +66,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { } func isNeedOverwrite(fileName string) (flag bool) { - seg := "//" - ext := filepath.Ext(fileName) - if ext == ".sql" { - seg = "--" - } + seg := GetSeg(filepath.Ext(fileName)) f, err := os.Open(fileName) if err != nil { @@ -188,3 +171,44 @@ func getModelType(orm string) (inputType, goType, mysqlType, tag string) { } return } + +func FileContentChange(org,new []byte, seg string) bool { + if len(org) == 0 { + return true + } + orgContent := GetFilterContent(string(org),seg) + newContent := GetFilterContent(string(new),seg) + orgMd5 := md5.Sum([]byte(orgContent)) + newMd5:= md5.Sum([]byte(newContent)) + if orgMd5 != newMd5 { + return true + } + beeLogger.Log.Infof("File has no change in the content") + return false +} + +func GetFilterContent(content string, seg string) string { + res := "" + for _, s := range strings.Split(content, "\n") { + s = strings.TrimSpace(strings.TrimPrefix(s, seg)) + var have = false + for _,except := range CompareExcept{ + if strings.HasPrefix(s, except) { + have = true + } + } + if !have { + res += s + } + } + return res +} + +func GetSeg(ext string) string { + switch ext { + case ".sql": + return "--" + default: + return "//" + } +} diff --git a/main.go b/main.go index 851b199..112d6c0 100644 --- a/main.go +++ b/main.go @@ -25,6 +25,7 @@ import ( ) func main() { + utils.UpdateBee() flag.Usage = cmd.Usage flag.Parse() log.SetFlags(0) diff --git a/utils/utils.go b/utils/utils.go index eedd57a..969e902 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -24,6 +24,7 @@ import ( "path/filepath" "regexp" "runtime" + "strconv" "strings" "text/template" "time" @@ -31,6 +32,7 @@ import ( beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger/colors" + "github.com/beego/bee/internal/pkg/system" ) func GetBeeWorkPath() string { @@ -463,3 +465,65 @@ func IsGOMODULE() bool { } return false } + +func UpdateBee() { + cmd := exec.Command("go", "version") + cmd.Output() + if cmd.Process == nil || cmd.Process.Pid <= 0 { + beeLogger.Log.Warn("There is no go environment") + return + } + path := system.BeegoHome + fp := path + "/.updateBee" + timeNow := time.Now().Unix() + var timeOld int64 + if IsExist(fp) { + oldContent, err := ioutil.ReadFile(fp) + if err != nil { + beeLogger.Log.Warnf("read file err: %s", err) + } + timeOld, _ = strconv.ParseInt(string(oldContent), 10, 64) + } else { + if cf, err := os.OpenFile(fp, os.O_CREATE, 0644); err == nil { + cf.Close() + } else { + beeLogger.Log.Warnf("Create file err: %s", err) + } + } + if timeNow-timeOld > 24*60*60 { + if w, err := os.OpenFile(fp, os.O_WRONLY|os.O_TRUNC, 0644); err == nil { + defer w.Close() + timeNowStr := strconv.FormatInt(timeNow, 10) + if _, err := w.WriteString(timeNowStr); err != nil { + beeLogger.Log.Warnf("Update file err: %s", err) + } + beeLogger.Log.Info("Updating bee") + goGetBee() + } else { + beeLogger.Log.Warnf("Update Bee file err: %s", err) + } + } +} + +func goGetBee() { + beePath := "github.com/beego/bee" + done := make(chan int, 1) + go func() { + cmd := exec.Command("go", "get", "-u", beePath) + output, err := cmd.Output() + if err != nil { + beeLogger.Log.Warnf("Update Bee err: %s", err) + beeLogger.Log.Warnf("Update Bee err: %s", output) + } + beeLogger.Log.Infof("Bee was updated successfully %s", output) + done <- 1 + }() + // wait 30 second + select { + case <-done: + return + case <-time.After(time.Second * 30): + beeLogger.Log.Warn("Update Bee timeout! The next automatic update will be in 24 hours.") + beeLogger.Log.Warn("Or you can update it yourself with `go get -u github.com/beego/bee`") + } +} From e539c34ea0a96a16376cc295ef8e0427d4591415 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sun, 2 Aug 2020 16:17:02 +0800 Subject: [PATCH 17/25] add cmd 'bee update' to update self just notice once a day if there is a new version --- cmd/bee.go | 1 + cmd/commands/command.go | 1 + cmd/commands/update/update.go | 38 ++++++++++ cmd/commands/version/version.go | 6 +- config/conf.go | 9 ++- internal/app/module/beegopro/render.go | 14 ++-- internal/app/module/beegopro/util.go | 7 +- main.go | 2 +- utils/utils.go | 99 ++++++++++++++------------ 9 files changed, 119 insertions(+), 58 deletions(-) create mode 100644 cmd/commands/update/update.go diff --git a/cmd/bee.go b/cmd/bee.go index a6c2c80..8a4f9ec 100644 --- a/cmd/bee.go +++ b/cmd/bee.go @@ -31,6 +31,7 @@ import ( _ "github.com/beego/bee/cmd/commands/rs" _ "github.com/beego/bee/cmd/commands/run" _ "github.com/beego/bee/cmd/commands/server" + _ "github.com/beego/bee/cmd/commands/update" _ "github.com/beego/bee/cmd/commands/version" "github.com/beego/bee/utils" ) diff --git a/cmd/commands/command.go b/cmd/commands/command.go index cab663f..95a1891 100644 --- a/cmd/commands/command.go +++ b/cmd/commands/command.go @@ -65,6 +65,7 @@ func (c *Command) Out() io.Writer { if c.output != nil { return *c.output } + return colors.NewColorWriter(os.Stderr) } diff --git a/cmd/commands/update/update.go b/cmd/commands/update/update.go new file mode 100644 index 0000000..3e5a87a --- /dev/null +++ b/cmd/commands/update/update.go @@ -0,0 +1,38 @@ +package update + +import ( + "flag" + "os" + "os/exec" + + "github.com/beego/bee/cmd/commands" + "github.com/beego/bee/config" + beeLogger "github.com/beego/bee/logger" +) + +var CmdUpdate = &commands.Command{ + UsageLine: "update", + Short: "Update Bee", + Long: ` +Automatic run command "go get -u github.com/beego/bee" for selfupdate +`, + Run: updateBee, +} + +func init() { + fs := flag.NewFlagSet("update", flag.ContinueOnError) + CmdUpdate.Flag = *fs + commands.AvailableCommands = append(commands.AvailableCommands, CmdUpdate) +} + +func updateBee(cmd *commands.Command, args []string) int { + beeLogger.Log.Info("Updating") + beePath := config.GitRemotePath + cmdUp := exec.Command("go", "get", "-u", beePath) + cmdUp.Stdout = os.Stdout + cmdUp.Stderr = os.Stderr + if err := cmdUp.Run(); err != nil { + beeLogger.Log.Warnf("Run cmd err:%s",err) + } + return 0 +} diff --git a/cmd/commands/version/version.go b/cmd/commands/version/version.go index a1ce710..32862a7 100644 --- a/cmd/commands/version/version.go +++ b/cmd/commands/version/version.go @@ -14,11 +14,13 @@ import ( "runtime" "strings" + "gopkg.in/yaml.v2" + "github.com/beego/bee/cmd/commands" + "github.com/beego/bee/config" beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger/colors" "github.com/beego/bee/utils" - "gopkg.in/yaml.v2" ) const verboseVersionBanner string = `%s%s______ @@ -57,7 +59,7 @@ Prints the current Bee, Beego and Go version alongside the platform information. } var outputFormat string -const version = "1.12.0" +const version = config.Version func init() { fs := flag.NewFlagSet("version", flag.ContinueOnError) diff --git a/config/conf.go b/config/conf.go index 32bdf2c..e0603e9 100644 --- a/config/conf.go +++ b/config/conf.go @@ -19,12 +19,19 @@ import ( "os" "path/filepath" - beeLogger "github.com/beego/bee/logger" "gopkg.in/yaml.v2" + + beeLogger "github.com/beego/bee/logger" ) const confVer = 0 +const ( + Version = "1.12.0" + GitRemotePath = "github.com/beego/bee" +) + + var Conf = struct { Version int WatchExts []string `json:"watch_ext" yaml:"watch_ext"` diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index 7ca97ae..7ca1464 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -1,16 +1,18 @@ package beegopro import ( - "github.com/beego/bee/internal/pkg/system" - beeLogger "github.com/beego/bee/logger" - "github.com/davecgh/go-spew/spew" - "github.com/flosch/pongo2" - "github.com/smartwalle/pongo2render" "go/format" "io/ioutil" "os" "path" "path/filepath" + + "github.com/davecgh/go-spew/spew" + "github.com/flosch/pongo2" + "github.com/smartwalle/pongo2render" + + "github.com/beego/bee/internal/pkg/system" + beeLogger "github.com/beego/bee/logger" ) // render @@ -140,7 +142,7 @@ func (r *RenderFile) Exec(name string) { output = bts } - if FileContentChange(orgContent,output,GetSeg(ext)) { + if FileContentChange(orgContent, output, GetSeg(ext)) { err = r.write(r.FlushFile, output) if err != nil { beeLogger.Log.Fatalf("Could not create file: %s", err) diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index bfef1db..604e404 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -4,14 +4,15 @@ import ( "crypto/md5" "errors" "fmt" - "github.com/beego/bee/internal/pkg/utils" - beeLogger "github.com/beego/bee/logger" "io/ioutil" "os" "path" "path/filepath" "strings" "time" + + "github.com/beego/bee/internal/pkg/utils" + beeLogger "github.com/beego/bee/logger" ) // write to file @@ -191,7 +192,7 @@ func GetFilterContent(content string, seg string) string { res := "" for _, s := range strings.Split(content, "\n") { s = strings.TrimSpace(strings.TrimPrefix(s, seg)) - var have = false + var have bool for _,except := range CompareExcept{ if strings.HasPrefix(s, except) { have = true diff --git a/main.go b/main.go index 112d6c0..251ee51 100644 --- a/main.go +++ b/main.go @@ -25,7 +25,7 @@ import ( ) func main() { - utils.UpdateBee() + utils.NoticeUpdateBee() flag.Usage = cmd.Usage flag.Parse() log.SetFlags(0) diff --git a/utils/utils.go b/utils/utils.go index 969e902..b2056e4 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -30,9 +30,12 @@ import ( "time" "unicode" + "github.com/beego/bee/config" + "github.com/beego/bee/internal/pkg/git" + + "github.com/beego/bee/internal/pkg/system" beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger/colors" - "github.com/beego/bee/internal/pkg/system" ) func GetBeeWorkPath() string { @@ -466,64 +469,70 @@ func IsGOMODULE() bool { return false } -func UpdateBee() { +func NoticeUpdateBee() { cmd := exec.Command("go", "version") cmd.Output() if cmd.Process == nil || cmd.Process.Pid <= 0 { beeLogger.Log.Warn("There is no go environment") return } - path := system.BeegoHome - fp := path + "/.updateBee" + beeHome := system.BeegoHome + fp := beeHome + "/.noticeUpdateBee" timeNow := time.Now().Unix() var timeOld int64 - if IsExist(fp) { - oldContent, err := ioutil.ReadFile(fp) + if !IsExist(fp) { + f, err := os.Create(fp) if err != nil { - beeLogger.Log.Warnf("read file err: %s", err) - } - timeOld, _ = strconv.ParseInt(string(oldContent), 10, 64) - } else { - if cf, err := os.OpenFile(fp, os.O_CREATE, 0644); err == nil { - cf.Close() - } else { - beeLogger.Log.Warnf("Create file err: %s", err) + beeLogger.Log.Warnf("Create noticeUpdateBee file err: %s", err) + return } + defer f.Close() } - if timeNow-timeOld > 24*60*60 { - if w, err := os.OpenFile(fp, os.O_WRONLY|os.O_TRUNC, 0644); err == nil { - defer w.Close() - timeNowStr := strconv.FormatInt(timeNow, 10) - if _, err := w.WriteString(timeNowStr); err != nil { - beeLogger.Log.Warnf("Update file err: %s", err) - } - beeLogger.Log.Info("Updating bee") - goGetBee() - } else { - beeLogger.Log.Warnf("Update Bee file err: %s", err) - } + oldContent, err := ioutil.ReadFile(fp) + if err != nil { + beeLogger.Log.Warnf("Read noticeUpdateBee file err: %s", err) + return } + timeOld, _ = strconv.ParseInt(string(oldContent), 10, 64) + if timeNow-timeOld < 24*60*60 { + return + } + w, err := os.OpenFile(fp, os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + beeLogger.Log.Warnf("Open noticeUpdateBee file err: %s", err) + return + } + defer w.Close() + timeNowStr := strconv.FormatInt(timeNow, 10) + if _, err := w.WriteString(timeNowStr); err != nil { + beeLogger.Log.Warnf("Update noticeUpdateBee file err: %s", err) + return + } + newVersion() } -func goGetBee() { - beePath := "github.com/beego/bee" - done := make(chan int, 1) - go func() { - cmd := exec.Command("go", "get", "-u", beePath) - output, err := cmd.Output() - if err != nil { - beeLogger.Log.Warnf("Update Bee err: %s", err) - beeLogger.Log.Warnf("Update Bee err: %s", output) - } - beeLogger.Log.Infof("Bee was updated successfully %s", output) - done <- 1 - }() - // wait 30 second - select { - case <-done: +func newVersion() { + workPath := GetBeeWorkPath() + repo, err := git.OpenRepository(workPath) + if err != nil { + beeLogger.Log.Fatalf("Fail to open repository, err: %s", err) return - case <-time.After(time.Second * 30): - beeLogger.Log.Warn("Update Bee timeout! The next automatic update will be in 24 hours.") - beeLogger.Log.Warn("Or you can update it yourself with `go get -u github.com/beego/bee`") + } + tags, err := repo.GetTags() + if err != nil { + beeLogger.Log.Fatalf("Fail to get tags, err: %s", err) + return + } + // v1.12.0 | V_1.12.0 => 1.12.0 + re, _ := regexp.Compile(`[0-9.]+`) + var versionLast string + versionList := re.FindStringSubmatch(tags[0]) + if len(versionList) >= 1 { + versionLast = versionList[0] + } + versionNow := config.Version + if versionNow != versionLast { + beeLogger.Log.Warnf("Update available %s ==> %s", versionNow, versionLast) + beeLogger.Log.Warn("Run `bee update` to update") } } From 40a90af5be067fd396ed46bf9ba25668fdfb1a7c Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sun, 2 Aug 2020 17:00:29 +0800 Subject: [PATCH 18/25] fix the bee path --- utils/utils.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/utils/utils.go b/utils/utils.go index b2056e4..7ecb0b6 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -512,7 +512,10 @@ func NoticeUpdateBee() { } func newVersion() { - workPath := GetBeeWorkPath() + hs, _, workPath := SearchGOPATHs(config.GitRemotePath) + if hs == false { + beeLogger.Log.Warn("Fail to open repository") + } repo, err := git.OpenRepository(workPath) if err != nil { beeLogger.Log.Fatalf("Fail to open repository, err: %s", err) From 07fa523da9ce0454275b7d3fdc1643578d527249 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sun, 2 Aug 2020 23:02:12 +0800 Subject: [PATCH 19/25] get bee latest version by 'https://api.github.com/repos/beego/bee/tags' --- utils/utils.go | 68 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/utils/utils.go b/utils/utils.go index 7ecb0b6..a940670 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -16,8 +16,10 @@ package utils import ( "bytes" + "encoding/json" "fmt" "io/ioutil" + "net/http" "os" "os/exec" "path" @@ -31,13 +33,15 @@ import ( "unicode" "github.com/beego/bee/config" - "github.com/beego/bee/internal/pkg/git" - "github.com/beego/bee/internal/pkg/system" beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger/colors" ) +type tagName struct { + Name string `json:"name"` +} + func GetBeeWorkPath() string { curpath, err := os.Getwd() if err != nil { @@ -508,34 +512,44 @@ func NoticeUpdateBee() { beeLogger.Log.Warnf("Update noticeUpdateBee file err: %s", err) return } - newVersion() -} - -func newVersion() { - hs, _, workPath := SearchGOPATHs(config.GitRemotePath) - if hs == false { - beeLogger.Log.Warn("Fail to open repository") - } - repo, err := git.OpenRepository(workPath) - if err != nil { - beeLogger.Log.Fatalf("Fail to open repository, err: %s", err) - return - } - tags, err := repo.GetTags() - if err != nil { - beeLogger.Log.Fatalf("Fail to get tags, err: %s", err) - return - } - // v1.12.0 | V_1.12.0 => 1.12.0 - re, _ := regexp.Compile(`[0-9.]+`) - var versionLast string - versionList := re.FindStringSubmatch(tags[0]) - if len(versionList) >= 1 { - versionLast = versionList[0] - } + beeLogger.Log.Info("Getting bee latest version...") + versionLast := BeeLastVersion() versionNow := config.Version + if versionLast == ""{ + beeLogger.Log.Warn("Get latest version err") + return + } if versionNow != versionLast { beeLogger.Log.Warnf("Update available %s ==> %s", versionNow, versionLast) beeLogger.Log.Warn("Run `bee update` to update") } + beeLogger.Log.Info("Your bee are up to date") +} + +func BeeLastVersion() (version string) { + var url = "https://api.github.com/repos/beego/bee/tags" + resp, err := http.Get(url) + if err != nil { + beeLogger.Log.Warnf("Get bee tags from github error: %s", err) + return + } + defer resp.Body.Close() + bodyContent, _ := ioutil.ReadAll(resp.Body) + var tags []tagName + if err = json.Unmarshal(bodyContent, &tags); err != nil { + beeLogger.Log.Warnf("Unmarshal tags body error: %s", err) + return + } + if len(tags) < 1 { + beeLogger.Log.Warn("There is no tags!") + return + } + last := tags[0] + re, _ := regexp.Compile(`[0-9.]+`) + versionList := re.FindStringSubmatch(last.Name) + if len(versionList) > 0 { + return versionList[0] + } + beeLogger.Log.Warn("There is no tags!") + return } From e0ea0abf5b6ea761bdaaf151038dfd22b432b103 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sat, 1 Aug 2020 17:12:09 +0800 Subject: [PATCH 20/25] Automatic update bee every day Backup only when content changes Fix the version --- cmd/commands/version/version.go | 2 +- internal/app/module/beegopro/config.go | 2 +- internal/app/module/beegopro/render.go | 39 ++++++++++++-- internal/app/module/beegopro/util.go | 70 +++++++++++++++++--------- main.go | 1 + utils/utils.go | 64 +++++++++++++++++++++++ 6 files changed, 148 insertions(+), 30 deletions(-) diff --git a/cmd/commands/version/version.go b/cmd/commands/version/version.go index 4eebd9f..a1ce710 100644 --- a/cmd/commands/version/version.go +++ b/cmd/commands/version/version.go @@ -57,7 +57,7 @@ Prints the current Bee, Beego and Go version alongside the platform information. } var outputFormat string -const version = "1.11.0" +const version = "1.12.0" func init() { fs := flag.NewFlagSet("version", flag.ContinueOnError) diff --git a/internal/app/module/beegopro/config.go b/internal/app/module/beegopro/config.go index f4854fe..7fbdc2c 100644 --- a/internal/app/module/beegopro/config.go +++ b/internal/app/module/beegopro/config.go @@ -5,7 +5,7 @@ import ( beeLogger "github.com/beego/bee/logger" "io/ioutil" ) - +var CompareExcept = []string{"@BeeGenerateTime"} func (c *Container) GenConfig() { if utils.IsExist(c.BeegoProFile) { beeLogger.Log.Fatalf("beego pro toml exist") diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index f2e49c3..7ca97ae 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -6,6 +6,9 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/flosch/pongo2" "github.com/smartwalle/pongo2render" + "go/format" + "io/ioutil" + "os" "path" "path/filepath" ) @@ -114,10 +117,36 @@ func (r *RenderFile) Exec(name string) { beeLogger.Log.Fatalf("Could not create the %s render tmpl: %s", name, err) return } - err = r.write(r.FlushFile, buf) - if err != nil { - beeLogger.Log.Fatalf("Could not create file: %s", err) - return + _, err = os.Stat(r.Descriptor.DstPath) + var orgContent []byte + if err == nil { + if org, err := os.OpenFile(r.Descriptor.DstPath, os.O_RDONLY, 0666); err == nil { + orgContent,_ = ioutil.ReadAll(org) + org.Close() + } else { + beeLogger.Log.Infof("file err %s", err) + } + } + // Replace or create when content changes + output := []byte(buf) + ext := filepath.Ext(r.FlushFile) + if r.Option.EnableFormat && ext == ".go" { + // format code + var bts []byte + bts, err = format.Source([]byte(buf)) + if err != nil { + beeLogger.Log.Warnf("format buf error %s", err.Error()) + } + output = bts + } + + if FileContentChange(orgContent,output,GetSeg(ext)) { + err = r.write(r.FlushFile, output) + if err != nil { + beeLogger.Log.Fatalf("Could not create file: %s", err) + return + } + beeLogger.Log.Infof("create file '%s' from %s", r.FlushFile, r.PackageName) } - beeLogger.Log.Infof("create file '%s' from %s", r.FlushFile, r.PackageName) } + diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index 646ffb2..bfef1db 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -1,11 +1,11 @@ package beegopro import ( + "crypto/md5" "errors" "fmt" "github.com/beego/bee/internal/pkg/utils" beeLogger "github.com/beego/bee/logger" - "go/format" "io/ioutil" "os" "path" @@ -15,12 +15,12 @@ import ( ) // write to file -func (c *RenderFile) write(filename string, buf string) (err error) { +func (c *RenderFile) write(filename string, buf []byte) (err error) { if utils.IsExist(filename) && !isNeedOverwrite(filename) { return } - filePath := path.Dir(filename) + filePath := filepath.Dir(filename) err = createPath(filePath) if err != nil { err = errors.New("write create path " + err.Error()) @@ -37,7 +37,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { name := path.Base(filename) if utils.IsExist(filename) { - bakName := fmt.Sprintf("%s/%s.%s.bak", filePathBak, name, time.Now().Format("2006.01.02.15.04.05")) + bakName := fmt.Sprintf("%s/%s.%s.bak", filePathBak, filepath.Base(name), time.Now().Format("2006.01.02.15.04.05")) beeLogger.Log.Infof("bak file '%s'", bakName) if err := os.Rename(filename, bakName); err != nil { err = errors.New("file is bak error, path is " + bakName) @@ -57,20 +57,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { return } - output := []byte(buf) - - if c.Option.EnableFormat && filepath.Ext(filename) == ".go" { - // format code - var bts []byte - bts, err = format.Source([]byte(buf)) - if err != nil { - err = errors.New("format buf error " + err.Error()) - return - } - output = bts - } - - err = ioutil.WriteFile(filename, output, 0644) + err = ioutil.WriteFile(filename, buf, 0644) if err != nil { err = errors.New("write write file " + err.Error()) return @@ -79,11 +66,7 @@ func (c *RenderFile) write(filename string, buf string) (err error) { } func isNeedOverwrite(fileName string) (flag bool) { - seg := "//" - ext := filepath.Ext(fileName) - if ext == ".sql" { - seg = "--" - } + seg := GetSeg(filepath.Ext(fileName)) f, err := os.Open(fileName) if err != nil { @@ -188,3 +171,44 @@ func getModelType(orm string) (inputType, goType, mysqlType, tag string) { } return } + +func FileContentChange(org,new []byte, seg string) bool { + if len(org) == 0 { + return true + } + orgContent := GetFilterContent(string(org),seg) + newContent := GetFilterContent(string(new),seg) + orgMd5 := md5.Sum([]byte(orgContent)) + newMd5:= md5.Sum([]byte(newContent)) + if orgMd5 != newMd5 { + return true + } + beeLogger.Log.Infof("File has no change in the content") + return false +} + +func GetFilterContent(content string, seg string) string { + res := "" + for _, s := range strings.Split(content, "\n") { + s = strings.TrimSpace(strings.TrimPrefix(s, seg)) + var have = false + for _,except := range CompareExcept{ + if strings.HasPrefix(s, except) { + have = true + } + } + if !have { + res += s + } + } + return res +} + +func GetSeg(ext string) string { + switch ext { + case ".sql": + return "--" + default: + return "//" + } +} diff --git a/main.go b/main.go index 851b199..112d6c0 100644 --- a/main.go +++ b/main.go @@ -25,6 +25,7 @@ import ( ) func main() { + utils.UpdateBee() flag.Usage = cmd.Usage flag.Parse() log.SetFlags(0) diff --git a/utils/utils.go b/utils/utils.go index eedd57a..969e902 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -24,6 +24,7 @@ import ( "path/filepath" "regexp" "runtime" + "strconv" "strings" "text/template" "time" @@ -31,6 +32,7 @@ import ( beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger/colors" + "github.com/beego/bee/internal/pkg/system" ) func GetBeeWorkPath() string { @@ -463,3 +465,65 @@ func IsGOMODULE() bool { } return false } + +func UpdateBee() { + cmd := exec.Command("go", "version") + cmd.Output() + if cmd.Process == nil || cmd.Process.Pid <= 0 { + beeLogger.Log.Warn("There is no go environment") + return + } + path := system.BeegoHome + fp := path + "/.updateBee" + timeNow := time.Now().Unix() + var timeOld int64 + if IsExist(fp) { + oldContent, err := ioutil.ReadFile(fp) + if err != nil { + beeLogger.Log.Warnf("read file err: %s", err) + } + timeOld, _ = strconv.ParseInt(string(oldContent), 10, 64) + } else { + if cf, err := os.OpenFile(fp, os.O_CREATE, 0644); err == nil { + cf.Close() + } else { + beeLogger.Log.Warnf("Create file err: %s", err) + } + } + if timeNow-timeOld > 24*60*60 { + if w, err := os.OpenFile(fp, os.O_WRONLY|os.O_TRUNC, 0644); err == nil { + defer w.Close() + timeNowStr := strconv.FormatInt(timeNow, 10) + if _, err := w.WriteString(timeNowStr); err != nil { + beeLogger.Log.Warnf("Update file err: %s", err) + } + beeLogger.Log.Info("Updating bee") + goGetBee() + } else { + beeLogger.Log.Warnf("Update Bee file err: %s", err) + } + } +} + +func goGetBee() { + beePath := "github.com/beego/bee" + done := make(chan int, 1) + go func() { + cmd := exec.Command("go", "get", "-u", beePath) + output, err := cmd.Output() + if err != nil { + beeLogger.Log.Warnf("Update Bee err: %s", err) + beeLogger.Log.Warnf("Update Bee err: %s", output) + } + beeLogger.Log.Infof("Bee was updated successfully %s", output) + done <- 1 + }() + // wait 30 second + select { + case <-done: + return + case <-time.After(time.Second * 30): + beeLogger.Log.Warn("Update Bee timeout! The next automatic update will be in 24 hours.") + beeLogger.Log.Warn("Or you can update it yourself with `go get -u github.com/beego/bee`") + } +} From 9c636351694b06293a4d304496581e151cc476c0 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sun, 2 Aug 2020 16:17:02 +0800 Subject: [PATCH 21/25] add cmd 'bee update' to update self just notice once a day if there is a new version --- cmd/bee.go | 1 + cmd/commands/command.go | 1 + cmd/commands/update/update.go | 38 ++++++++++ cmd/commands/version/version.go | 6 +- config/conf.go | 9 ++- internal/app/module/beegopro/render.go | 14 ++-- internal/app/module/beegopro/util.go | 7 +- main.go | 2 +- utils/utils.go | 99 ++++++++++++++------------ 9 files changed, 119 insertions(+), 58 deletions(-) create mode 100644 cmd/commands/update/update.go diff --git a/cmd/bee.go b/cmd/bee.go index a6c2c80..8a4f9ec 100644 --- a/cmd/bee.go +++ b/cmd/bee.go @@ -31,6 +31,7 @@ import ( _ "github.com/beego/bee/cmd/commands/rs" _ "github.com/beego/bee/cmd/commands/run" _ "github.com/beego/bee/cmd/commands/server" + _ "github.com/beego/bee/cmd/commands/update" _ "github.com/beego/bee/cmd/commands/version" "github.com/beego/bee/utils" ) diff --git a/cmd/commands/command.go b/cmd/commands/command.go index cab663f..95a1891 100644 --- a/cmd/commands/command.go +++ b/cmd/commands/command.go @@ -65,6 +65,7 @@ func (c *Command) Out() io.Writer { if c.output != nil { return *c.output } + return colors.NewColorWriter(os.Stderr) } diff --git a/cmd/commands/update/update.go b/cmd/commands/update/update.go new file mode 100644 index 0000000..3e5a87a --- /dev/null +++ b/cmd/commands/update/update.go @@ -0,0 +1,38 @@ +package update + +import ( + "flag" + "os" + "os/exec" + + "github.com/beego/bee/cmd/commands" + "github.com/beego/bee/config" + beeLogger "github.com/beego/bee/logger" +) + +var CmdUpdate = &commands.Command{ + UsageLine: "update", + Short: "Update Bee", + Long: ` +Automatic run command "go get -u github.com/beego/bee" for selfupdate +`, + Run: updateBee, +} + +func init() { + fs := flag.NewFlagSet("update", flag.ContinueOnError) + CmdUpdate.Flag = *fs + commands.AvailableCommands = append(commands.AvailableCommands, CmdUpdate) +} + +func updateBee(cmd *commands.Command, args []string) int { + beeLogger.Log.Info("Updating") + beePath := config.GitRemotePath + cmdUp := exec.Command("go", "get", "-u", beePath) + cmdUp.Stdout = os.Stdout + cmdUp.Stderr = os.Stderr + if err := cmdUp.Run(); err != nil { + beeLogger.Log.Warnf("Run cmd err:%s",err) + } + return 0 +} diff --git a/cmd/commands/version/version.go b/cmd/commands/version/version.go index a1ce710..32862a7 100644 --- a/cmd/commands/version/version.go +++ b/cmd/commands/version/version.go @@ -14,11 +14,13 @@ import ( "runtime" "strings" + "gopkg.in/yaml.v2" + "github.com/beego/bee/cmd/commands" + "github.com/beego/bee/config" beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger/colors" "github.com/beego/bee/utils" - "gopkg.in/yaml.v2" ) const verboseVersionBanner string = `%s%s______ @@ -57,7 +59,7 @@ Prints the current Bee, Beego and Go version alongside the platform information. } var outputFormat string -const version = "1.12.0" +const version = config.Version func init() { fs := flag.NewFlagSet("version", flag.ContinueOnError) diff --git a/config/conf.go b/config/conf.go index 32bdf2c..e0603e9 100644 --- a/config/conf.go +++ b/config/conf.go @@ -19,12 +19,19 @@ import ( "os" "path/filepath" - beeLogger "github.com/beego/bee/logger" "gopkg.in/yaml.v2" + + beeLogger "github.com/beego/bee/logger" ) const confVer = 0 +const ( + Version = "1.12.0" + GitRemotePath = "github.com/beego/bee" +) + + var Conf = struct { Version int WatchExts []string `json:"watch_ext" yaml:"watch_ext"` diff --git a/internal/app/module/beegopro/render.go b/internal/app/module/beegopro/render.go index 7ca97ae..7ca1464 100644 --- a/internal/app/module/beegopro/render.go +++ b/internal/app/module/beegopro/render.go @@ -1,16 +1,18 @@ package beegopro import ( - "github.com/beego/bee/internal/pkg/system" - beeLogger "github.com/beego/bee/logger" - "github.com/davecgh/go-spew/spew" - "github.com/flosch/pongo2" - "github.com/smartwalle/pongo2render" "go/format" "io/ioutil" "os" "path" "path/filepath" + + "github.com/davecgh/go-spew/spew" + "github.com/flosch/pongo2" + "github.com/smartwalle/pongo2render" + + "github.com/beego/bee/internal/pkg/system" + beeLogger "github.com/beego/bee/logger" ) // render @@ -140,7 +142,7 @@ func (r *RenderFile) Exec(name string) { output = bts } - if FileContentChange(orgContent,output,GetSeg(ext)) { + if FileContentChange(orgContent, output, GetSeg(ext)) { err = r.write(r.FlushFile, output) if err != nil { beeLogger.Log.Fatalf("Could not create file: %s", err) diff --git a/internal/app/module/beegopro/util.go b/internal/app/module/beegopro/util.go index bfef1db..604e404 100644 --- a/internal/app/module/beegopro/util.go +++ b/internal/app/module/beegopro/util.go @@ -4,14 +4,15 @@ import ( "crypto/md5" "errors" "fmt" - "github.com/beego/bee/internal/pkg/utils" - beeLogger "github.com/beego/bee/logger" "io/ioutil" "os" "path" "path/filepath" "strings" "time" + + "github.com/beego/bee/internal/pkg/utils" + beeLogger "github.com/beego/bee/logger" ) // write to file @@ -191,7 +192,7 @@ func GetFilterContent(content string, seg string) string { res := "" for _, s := range strings.Split(content, "\n") { s = strings.TrimSpace(strings.TrimPrefix(s, seg)) - var have = false + var have bool for _,except := range CompareExcept{ if strings.HasPrefix(s, except) { have = true diff --git a/main.go b/main.go index 112d6c0..251ee51 100644 --- a/main.go +++ b/main.go @@ -25,7 +25,7 @@ import ( ) func main() { - utils.UpdateBee() + utils.NoticeUpdateBee() flag.Usage = cmd.Usage flag.Parse() log.SetFlags(0) diff --git a/utils/utils.go b/utils/utils.go index 969e902..b2056e4 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -30,9 +30,12 @@ import ( "time" "unicode" + "github.com/beego/bee/config" + "github.com/beego/bee/internal/pkg/git" + + "github.com/beego/bee/internal/pkg/system" beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger/colors" - "github.com/beego/bee/internal/pkg/system" ) func GetBeeWorkPath() string { @@ -466,64 +469,70 @@ func IsGOMODULE() bool { return false } -func UpdateBee() { +func NoticeUpdateBee() { cmd := exec.Command("go", "version") cmd.Output() if cmd.Process == nil || cmd.Process.Pid <= 0 { beeLogger.Log.Warn("There is no go environment") return } - path := system.BeegoHome - fp := path + "/.updateBee" + beeHome := system.BeegoHome + fp := beeHome + "/.noticeUpdateBee" timeNow := time.Now().Unix() var timeOld int64 - if IsExist(fp) { - oldContent, err := ioutil.ReadFile(fp) + if !IsExist(fp) { + f, err := os.Create(fp) if err != nil { - beeLogger.Log.Warnf("read file err: %s", err) - } - timeOld, _ = strconv.ParseInt(string(oldContent), 10, 64) - } else { - if cf, err := os.OpenFile(fp, os.O_CREATE, 0644); err == nil { - cf.Close() - } else { - beeLogger.Log.Warnf("Create file err: %s", err) + beeLogger.Log.Warnf("Create noticeUpdateBee file err: %s", err) + return } + defer f.Close() } - if timeNow-timeOld > 24*60*60 { - if w, err := os.OpenFile(fp, os.O_WRONLY|os.O_TRUNC, 0644); err == nil { - defer w.Close() - timeNowStr := strconv.FormatInt(timeNow, 10) - if _, err := w.WriteString(timeNowStr); err != nil { - beeLogger.Log.Warnf("Update file err: %s", err) - } - beeLogger.Log.Info("Updating bee") - goGetBee() - } else { - beeLogger.Log.Warnf("Update Bee file err: %s", err) - } + oldContent, err := ioutil.ReadFile(fp) + if err != nil { + beeLogger.Log.Warnf("Read noticeUpdateBee file err: %s", err) + return } + timeOld, _ = strconv.ParseInt(string(oldContent), 10, 64) + if timeNow-timeOld < 24*60*60 { + return + } + w, err := os.OpenFile(fp, os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + beeLogger.Log.Warnf("Open noticeUpdateBee file err: %s", err) + return + } + defer w.Close() + timeNowStr := strconv.FormatInt(timeNow, 10) + if _, err := w.WriteString(timeNowStr); err != nil { + beeLogger.Log.Warnf("Update noticeUpdateBee file err: %s", err) + return + } + newVersion() } -func goGetBee() { - beePath := "github.com/beego/bee" - done := make(chan int, 1) - go func() { - cmd := exec.Command("go", "get", "-u", beePath) - output, err := cmd.Output() - if err != nil { - beeLogger.Log.Warnf("Update Bee err: %s", err) - beeLogger.Log.Warnf("Update Bee err: %s", output) - } - beeLogger.Log.Infof("Bee was updated successfully %s", output) - done <- 1 - }() - // wait 30 second - select { - case <-done: +func newVersion() { + workPath := GetBeeWorkPath() + repo, err := git.OpenRepository(workPath) + if err != nil { + beeLogger.Log.Fatalf("Fail to open repository, err: %s", err) return - case <-time.After(time.Second * 30): - beeLogger.Log.Warn("Update Bee timeout! The next automatic update will be in 24 hours.") - beeLogger.Log.Warn("Or you can update it yourself with `go get -u github.com/beego/bee`") + } + tags, err := repo.GetTags() + if err != nil { + beeLogger.Log.Fatalf("Fail to get tags, err: %s", err) + return + } + // v1.12.0 | V_1.12.0 => 1.12.0 + re, _ := regexp.Compile(`[0-9.]+`) + var versionLast string + versionList := re.FindStringSubmatch(tags[0]) + if len(versionList) >= 1 { + versionLast = versionList[0] + } + versionNow := config.Version + if versionNow != versionLast { + beeLogger.Log.Warnf("Update available %s ==> %s", versionNow, versionLast) + beeLogger.Log.Warn("Run `bee update` to update") } } From 82e40f90108b8bdd9557aeba819be752fb27cc5d Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sun, 2 Aug 2020 17:00:29 +0800 Subject: [PATCH 22/25] fix the bee path --- utils/utils.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/utils/utils.go b/utils/utils.go index b2056e4..7ecb0b6 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -512,7 +512,10 @@ func NoticeUpdateBee() { } func newVersion() { - workPath := GetBeeWorkPath() + hs, _, workPath := SearchGOPATHs(config.GitRemotePath) + if hs == false { + beeLogger.Log.Warn("Fail to open repository") + } repo, err := git.OpenRepository(workPath) if err != nil { beeLogger.Log.Fatalf("Fail to open repository, err: %s", err) From 732fdfa32199c8121dfeaad31d0a13a421fb8631 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Sun, 2 Aug 2020 23:02:12 +0800 Subject: [PATCH 23/25] get bee latest version by 'https://api.github.com/repos/beego/bee/tags' --- utils/utils.go | 68 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/utils/utils.go b/utils/utils.go index 7ecb0b6..a940670 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -16,8 +16,10 @@ package utils import ( "bytes" + "encoding/json" "fmt" "io/ioutil" + "net/http" "os" "os/exec" "path" @@ -31,13 +33,15 @@ import ( "unicode" "github.com/beego/bee/config" - "github.com/beego/bee/internal/pkg/git" - "github.com/beego/bee/internal/pkg/system" beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger/colors" ) +type tagName struct { + Name string `json:"name"` +} + func GetBeeWorkPath() string { curpath, err := os.Getwd() if err != nil { @@ -508,34 +512,44 @@ func NoticeUpdateBee() { beeLogger.Log.Warnf("Update noticeUpdateBee file err: %s", err) return } - newVersion() -} - -func newVersion() { - hs, _, workPath := SearchGOPATHs(config.GitRemotePath) - if hs == false { - beeLogger.Log.Warn("Fail to open repository") - } - repo, err := git.OpenRepository(workPath) - if err != nil { - beeLogger.Log.Fatalf("Fail to open repository, err: %s", err) - return - } - tags, err := repo.GetTags() - if err != nil { - beeLogger.Log.Fatalf("Fail to get tags, err: %s", err) - return - } - // v1.12.0 | V_1.12.0 => 1.12.0 - re, _ := regexp.Compile(`[0-9.]+`) - var versionLast string - versionList := re.FindStringSubmatch(tags[0]) - if len(versionList) >= 1 { - versionLast = versionList[0] - } + beeLogger.Log.Info("Getting bee latest version...") + versionLast := BeeLastVersion() versionNow := config.Version + if versionLast == ""{ + beeLogger.Log.Warn("Get latest version err") + return + } if versionNow != versionLast { beeLogger.Log.Warnf("Update available %s ==> %s", versionNow, versionLast) beeLogger.Log.Warn("Run `bee update` to update") } + beeLogger.Log.Info("Your bee are up to date") +} + +func BeeLastVersion() (version string) { + var url = "https://api.github.com/repos/beego/bee/tags" + resp, err := http.Get(url) + if err != nil { + beeLogger.Log.Warnf("Get bee tags from github error: %s", err) + return + } + defer resp.Body.Close() + bodyContent, _ := ioutil.ReadAll(resp.Body) + var tags []tagName + if err = json.Unmarshal(bodyContent, &tags); err != nil { + beeLogger.Log.Warnf("Unmarshal tags body error: %s", err) + return + } + if len(tags) < 1 { + beeLogger.Log.Warn("There is no tags!") + return + } + last := tags[0] + re, _ := regexp.Compile(`[0-9.]+`) + versionList := re.FindStringSubmatch(last.Name) + if len(versionList) > 0 { + return versionList[0] + } + beeLogger.Log.Warn("There is no tags!") + return } From 413f4ef12944a546141ca136aaa7744c2c3e2f32 Mon Sep 17 00:00:00 2001 From: wangle <285273592@qq.com> Date: Mon, 10 Aug 2020 22:46:29 +0800 Subject: [PATCH 24/25] make .beego dir if don`t exist --- utils/utils.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/utils/utils.go b/utils/utils.go index a940670..e9656dc 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -481,6 +481,12 @@ func NoticeUpdateBee() { return } beeHome := system.BeegoHome + if !IsExist(beeHome) { + if err := os.MkdirAll(beeHome, 0755); err != nil { + beeLogger.Log.Fatalf("Could not create the directory: %s", err) + return + } + } fp := beeHome + "/.noticeUpdateBee" timeNow := time.Now().Unix() var timeOld int64 From 57309c38b275546f1fb1723fad6c7b4c88692d4a Mon Sep 17 00:00:00 2001 From: Ming Deng Date: Sun, 8 Nov 2020 20:24:30 +0800 Subject: [PATCH 25/25] Upgrade go version --- .travis.yml | 2 +- go.mod | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index eaad43e..aeb400f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: go go: - - 1.12.17 + - 1.14.11 install: - export PATH=$PATH:$HOME/gopath/bin - go get -u github.com/opennota/check/cmd/structcheck diff --git a/go.mod b/go.mod index aee2524..4fb9479 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,8 @@ module github.com/beego/bee -go 1.13 +go 1.14 require ( - github.com/BurntSushi/toml v0.3.1 github.com/astaxie/beego v1.12.1 github.com/davecgh/go-spew v1.1.1 github.com/flosch/pongo2 v0.0.0-20200529170236-5abacdfa4915