mirror of
https://github.com/beego/bee.git
synced 2024-11-17 01:40:55 +00:00
677987a7d9
This reverts commit 174d2ab2e8
.
230 lines
4.8 KiB
Go
230 lines
4.8 KiB
Go
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"
|
||
"path/filepath"
|
||
"regexp"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// write to file
|
||
func (c *RenderFile) write(filename string, buf string) (err error) {
|
||
if utils.IsExist(filename) && !isNeedOverwrite(filename) {
|
||
return
|
||
}
|
||
|
||
filePath := filepath.Dir(filename)
|
||
err = createPath(filePath)
|
||
if err != nil {
|
||
err = errors.New("write create path " + err.Error())
|
||
return
|
||
}
|
||
|
||
filePathBak := filePath + "/bak"
|
||
err = createPath(filePathBak)
|
||
if err != nil {
|
||
err = errors.New("write create path bak " + err.Error())
|
||
return
|
||
}
|
||
|
||
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"))
|
||
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)
|
||
return err
|
||
}
|
||
}
|
||
|
||
file, err := os.Create(filename)
|
||
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
|
||
}
|
||
|
||
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)
|
||
if err != nil {
|
||
err = errors.New("write write file " + err.Error())
|
||
return
|
||
}
|
||
return
|
||
}
|
||
|
||
func isNeedOverwrite(fileName string) (flag bool) {
|
||
seg := "//"
|
||
ext := filepath.Ext(fileName)
|
||
if ext == ".sql" {
|
||
seg = "--"
|
||
}
|
||
|
||
f, err := os.Open(fileName)
|
||
if err != nil {
|
||
return
|
||
}
|
||
defer f.Close()
|
||
overwrite := ""
|
||
var contentByte []byte
|
||
contentByte, err = ioutil.ReadAll(f)
|
||
if err != nil {
|
||
return
|
||
}
|
||
for _, s := range strings.Split(string(contentByte), "\n") {
|
||
s = strings.TrimSpace(strings.TrimPrefix(s, seg))
|
||
if strings.HasPrefix(s, "@BeeOverwrite") {
|
||
overwrite = strings.TrimSpace(s[len("@BeeOverwrite"):])
|
||
}
|
||
}
|
||
if strings.ToLower(overwrite) == "yes" {
|
||
flag = true
|
||
return
|
||
}
|
||
return
|
||
}
|
||
|
||
// createPath 调用os.MkdirAll递归创建文件夹
|
||
func createPath(filePath string) error {
|
||
if !utils.IsExist(filePath) {
|
||
err := os.MkdirAll(filePath, os.ModePerm)
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func getPackagePath() (packagePath string) {
|
||
f, err := os.Open("go.mod")
|
||
if err != nil {
|
||
return
|
||
}
|
||
defer f.Close()
|
||
var contentByte []byte
|
||
contentByte, err = ioutil.ReadAll(f)
|
||
if err != nil {
|
||
return
|
||
}
|
||
for _, s := range strings.Split(string(contentByte), "\n") {
|
||
packagePath = strings.TrimSpace(strings.TrimPrefix(s, "module"))
|
||
return
|
||
}
|
||
return
|
||
}
|
||
|
||
func getModelType(orm string) (inputType, goType, mysqlType, tag string) {
|
||
kv := strings.SplitN(orm, ",", 2)
|
||
inputType = kv[0]
|
||
switch inputType {
|
||
case "string":
|
||
goType = "string"
|
||
tag = "size(255)"
|
||
// todo use orm data
|
||
mysqlType = "varchar(255) NOT NULL"
|
||
case "text":
|
||
goType = "string"
|
||
tag = "type(longtext)"
|
||
mysqlType = "longtext NOT NULL"
|
||
case "auto":
|
||
goType = "int"
|
||
tag = "auto"
|
||
mysqlType = "int(11) NOT NULL AUTO_INCREMENT"
|
||
case "pk":
|
||
goType = "int"
|
||
tag = "pk"
|
||
mysqlType = "int(11) NOT NULL"
|
||
case "datetime":
|
||
goType = "time.Time"
|
||
tag = "type(datetime)"
|
||
mysqlType = "datetime NOT NULL"
|
||
case "int", "int8", "int16", "int32", "int64":
|
||
fallthrough
|
||
case "uint", "uint8", "uint16", "uint32", "uint64":
|
||
goType = inputType
|
||
tag = ""
|
||
mysqlType = "int(11) DEFAULT NULL"
|
||
case "bool":
|
||
goType = inputType
|
||
tag = ""
|
||
mysqlType = "int(11) DEFAULT NULL"
|
||
case "float32", "float64":
|
||
goType = inputType
|
||
tag = ""
|
||
mysqlType = "float NOT NULL"
|
||
case "float":
|
||
goType = "float64"
|
||
tag = ""
|
||
mysqlType = "float NOT NULL"
|
||
default:
|
||
beeLogger.Log.Fatalf("not support type: %s", inputType)
|
||
}
|
||
// user set orm tag
|
||
if len(kv) == 2 {
|
||
tag = kv[1]
|
||
}
|
||
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
|
||
} |