Compare commits

...

6 Commits

Author SHA1 Message Date
1ede8c77ba version updates 2022-06-24 15:21:36 +08:00
48f95d0009 fix issue in Response.WriteJson/Xml functions 2022-06-24 15:21:10 +08:00
0bb57b8989 go.sum update 2022-06-24 15:16:46 +08:00
0503c17867 feat/gfcli: replace gofmt&goimports with tools/imports (#1935) 2022-06-24 14:15:20 +08:00
19779cd342 Fix multiple gdb-group overrides (#1890)
Co-authored-by: longl <longlei@dealmap.cloud>
2022-06-23 21:30:29 +08:00
141f3512a9 fix glog bug (#1844) 2022-06-23 21:05:12 +08:00
11 changed files with 158 additions and 62 deletions

View File

@ -3,11 +3,12 @@ module github.com/gogf/gf/cmd/gf/v2
go 1.15
require (
github.com/gogf/gf/contrib/drivers/mssql/v2 v2.0.6
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.0.6
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.0.6
github.com/gogf/gf/v2 v2.0.6
github.com/gogf/gf/contrib/drivers/mssql/v2 v2.1.0
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.1.0
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.1.0
github.com/gogf/gf/v2 v2.1.0
github.com/olekukonko/tablewriter v0.0.5
golang.org/x/tools v0.1.11
)
replace (

View File

@ -91,6 +91,7 @@ github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMT
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
@ -100,17 +101,22 @@ go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -132,8 +138,10 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@ -141,12 +149,15 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2 h1:GLw7MR8AfAG2GmGcmVgObFOHXYypgGjnGno25RDwn3Y=
golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY=
golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

View File

@ -1,52 +1,24 @@
package utils
import (
"context"
"fmt"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gproc"
"github.com/gogf/gf/v2/text/gstr"
"golang.org/x/tools/imports"
)
var (
gofmtPath = gproc.SearchBinaryPath("gofmt") // gofmtPath is the binary path of command `gofmt`.
goimportsPath = gproc.SearchBinaryPath("goimports") // gofmtPath is the binary path of command `goimports`.
)
func init() {
// Wraps the command binary path with char '"' if there's space char in the path.
if gstr.Contains(gofmtPath, " ") {
gofmtPath = fmt.Sprintf(`"%s"`, gofmtPath)
}
if gstr.Contains(goimportsPath, " ") {
goimportsPath = fmt.Sprintf(`"%s"`, goimportsPath)
}
}
// GoFmt formats the source file using command `gofmt -w -s PATH`.
// GoFmt formats the source file.
func GoFmt(path string) {
if gofmtPath == "" {
mlog.Fatal(`command "gofmt" not found`)
}
var command = fmt.Sprintf(`%s -w %s`, gofmtPath, path)
result, err := gproc.ShellExec(context.Background(), command)
if err != nil {
mlog.Fatalf(`error executing command "%s": %s`, command, result)
if err := pretty(path, true); err != nil {
mlog.Fatalf(`error format "%s" go files: %v`, path, err)
}
}
// GoImports formats the source file using command `goimports -w PATH`.
// GoImports adds or removes import statements as necessary for the source file.
func GoImports(path string) {
if goimportsPath == "" {
mlog.Fatal(`command "goimports" not found`)
}
var command = fmt.Sprintf(`%s -w %s`, goimportsPath, path)
result, err := gproc.ShellExec(context.Background(), command)
if err != nil {
mlog.Fatalf(`error executing command "%s": %s`, command, result)
if err := pretty(path); err != nil {
mlog.Fatalf(`error update "%s" go file imports: %v`, path, err)
}
}
@ -57,3 +29,31 @@ func IsFileDoNotEdit(filePath string) bool {
}
return gstr.Contains(gfile.GetContents(filePath), consts.DoNotEditKey)
}
// pretty format go file and adds or removes import statements as necessary.
func pretty(filePath string, formatOnly ...bool) error {
var genOpt *imports.Options
if len(formatOnly) > 0 {
genOpt = &imports.Options{
Comments: true,
TabIndent: true,
TabWidth: 8,
FormatOnly: true,
}
}
replaceFunc := func(path, content string) string {
res, err := imports.Process(path, []byte(content), genOpt)
if err != nil {
mlog.Printf(`pretty go file "%s" failed: %v`, path, err)
return content
}
return string(res)
}
if gfile.IsFile(filePath) {
if gfile.ExtName(filePath) != "go" {
return nil
}
return gfile.ReplaceFileFunc(replaceFunc, filePath)
}
return gfile.ReplaceDirFunc(replaceFunc, filePath, "*.go", true)
}

View File

@ -72,6 +72,6 @@ func (m *Model) Group(groupBy ...string) *Model {
if model.groupBy != "" {
model.groupBy += ","
}
model.groupBy = model.db.GetCore().QuoteString(strings.Join(groupBy, ","))
model.groupBy += model.db.GetCore().QuoteString(strings.Join(groupBy, ","))
return model
}

View File

@ -111,8 +111,6 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogf/katyusha v0.4.0 h1:mQVfXHhzC+UQf11Q8HAk9IOhQZ1VMXqGUqezyywZUOs=
github.com/gogf/katyusha v0.4.0/go.mod h1:nqsIWBsImnq9+OLlfB6iNef6ZLRyR2L1Bnk9h2aZvKs=
github.com/gogf/katyusha v0.4.1-0.20220620125113-f55d6f739773 h1:YQBLawktoymYtPGs9idE9JS5Wqd3SjIzUEZOPKCdSw0=
github.com/gogf/katyusha v0.4.1-0.20220620125113-f55d6f739773/go.mod h1:Z0GCeHXz1UI0HtA0K45c6TzEGM4DL/PLatS747/WarI=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=

View File

@ -109,6 +109,7 @@ func (r *Response) WriteJson(content interface{}) {
switch content.(type) {
case string, []byte:
r.Write(gconv.String(content))
return
}
// Else use json.Marshal function to encode the parameter.
if b, err := json.Marshal(content); err != nil {
@ -135,6 +136,7 @@ func (r *Response) WriteJsonP(content interface{}) {
switch content.(type) {
case string, []byte:
r.Write(gconv.String(content))
return
}
// Else use json.Marshal function to encode the parameter.
if b, err := json.Marshal(content); err != nil {
@ -170,6 +172,7 @@ func (r *Response) WriteXml(content interface{}, rootTag ...string) {
switch content.(type) {
case string, []byte:
r.Write(gconv.String(content))
return
}
if b, err := gjson.New(content).ToXml(rootTag...); err != nil {
panic(gerror.Wrap(err, `WriteXml failed`))

View File

@ -39,6 +39,23 @@ func Open(path string, flag int, perm os.FileMode, ttl ...time.Duration) (file *
return pool.File()
}
// Get returns a file item with given file path, flag and opening permission.
// It retrieves a file item from the file pointer pool after then.
func Get(path string, flag int, perm os.FileMode, ttl ...time.Duration) (file *File) {
var fpTTL time.Duration
if len(ttl) > 0 {
fpTTL = ttl[0]
}
f, found := pools.Search(fmt.Sprintf("%s&%d&%d&%d", path, flag, fpTTL, perm))
if !found {
return nil
}
fp, _ := f.(*Pool).pool.Get()
return fp.(*File)
}
// Stat returns the FileInfo structure describing file.
func (f *File) Stat() (os.FileInfo, error) {
if f.stat == nil {
@ -48,7 +65,11 @@ func (f *File) Stat() (os.FileInfo, error) {
}
// Close puts the file pointer back to the file pointer pool.
func (f *File) Close() error {
func (f *File) Close(close ...bool) error {
if len(close) > 0 && close[0] {
f.File.Close()
}
if f.pid == f.pool.id.Val() {
return f.pool.pool.Put(f)
}

View File

@ -12,6 +12,7 @@ import (
"fmt"
"io"
"os"
"runtime"
"strings"
"time"
@ -309,10 +310,27 @@ func (l *Logger) printToFile(ctx context.Context, t time.Time, in *HandlerInput)
defer gmlock.Unlock(memoryLockKey)
// Rotation file size checks.
if l.config.RotateSize > 0 {
if gfile.Size(logFilePath) > l.config.RotateSize {
if l.config.RotateSize > 0 && gfile.Size(logFilePath) > l.config.RotateSize {
if runtime.GOOS == "windows" {
file := l.getFilePointer(ctx, logFilePath)
if file == nil {
intlog.Errorf(ctx, `got nil file pointer for: %s`, logFilePath)
return buffer
}
if _, err := file.Write(buffer.Bytes()); err != nil {
intlog.Errorf(ctx, `%+v`, err)
}
if err := file.Close(true); err != nil {
intlog.Errorf(ctx, `%+v`, err)
}
l.rotateFileBySize(ctx, t)
return buffer
}
l.rotateFileBySize(ctx, t)
}
// Logging content outputting to disk file.
if file := l.getFilePointer(ctx, logFilePath); file == nil {
@ -343,6 +361,21 @@ func (l *Logger) getFilePointer(ctx context.Context, path string) *gfpool.File {
return file
}
// getFilePointer retrieves and returns a file pointer from file pool.
func (l *Logger) getOpenedFilePointer(ctx context.Context, path string) *gfpool.File {
file := gfpool.Get(
path,
defaultFileFlags,
defaultFilePerm,
defaultFileExpire,
)
if file == nil {
intlog.Errorf(ctx, `can not find the file, path:%s`, path)
}
return file
}
// printStd prints content `s` without stack.
func (l *Logger) printStd(ctx context.Context, level int, value ...interface{}) {
l.print(ctx, level, "", value...)

View File

@ -9,6 +9,7 @@ package glog
import (
"context"
"fmt"
"runtime"
"time"
"github.com/gogf/gf/v2/container/garray"
@ -152,15 +153,37 @@ func (l *Logger) rotateChecksTimely(ctx context.Context) {
mtime = gfile.MTime(file)
subDuration = now.Sub(mtime)
if subDuration > l.config.RotateExpire {
expireRotated = true
intlog.Printf(
ctx,
`%v - %v = %v > %v, rotation expire logging file: %s`,
now, mtime, subDuration, l.config.RotateExpire, file,
)
if err := l.doRotateFile(ctx, file); err != nil {
intlog.Errorf(ctx, `%+v`, err)
}
func() {
memoryLockFileKey := memoryLockPrefixForPrintingToFile + file
if !gmlock.TryLock(memoryLockFileKey) {
return
}
defer gmlock.Unlock(memoryLockFileKey)
fp := l.getOpenedFilePointer(ctx, file)
if fp == nil {
intlog.Errorf(ctx, `got nil file pointer for: %s`, file)
return
}
if runtime.GOOS == "windows" {
if err := fp.Close(true); err != nil {
intlog.Errorf(ctx, `%+v`, err)
}
}
expireRotated = true
intlog.Printf(
ctx,
`%v - %v = %v > %v, rotation expire logging file: %s`,
now, mtime, subDuration, l.config.RotateExpire, file,
)
if err := l.doRotateFile(ctx, file); err != nil {
intlog.Errorf(ctx, `%+v`, err)
}
}()
}
}
if expireRotated {

View File

@ -8,7 +8,6 @@ package glog_test
import (
"context"
"fmt"
"testing"
"time"
@ -42,9 +41,17 @@ func Test_Rotate_Size(t *testing.T) {
defer gfile.Remove(p)
s := "1234567890abcdefg"
for i := 0; i < 10; i++ {
fmt.Println(ctx, "logging content index:", i)
for i := 0; i < 8; i++ {
l.Print(ctx, s)
time.Sleep(time.Second)
}
logFiles, err := gfile.ScanDirFile(p, "access*")
t.AssertNil(err)
for _, v := range logFiles {
content := gfile.GetContents(v)
t.AssertIN(gstr.Count(content, s), []int{1, 2})
}
time.Sleep(time.Second * 3)
@ -53,9 +60,6 @@ func Test_Rotate_Size(t *testing.T) {
t.AssertNil(err)
t.Assert(len(files), 2)
content := gfile.GetContents(gfile.Join(p, "access.log"))
t.Assert(gstr.Count(content, s), 1)
time.Sleep(time.Second * 5)
files, err = gfile.ScanDirFile(p, "*.gz")
t.AssertNil(err)
@ -93,6 +97,8 @@ func Test_Rotate_Expire(t *testing.T) {
time.Sleep(time.Second * 3)
filenames, err := gfile.ScanDirFile(p, "*")
t.Log(filenames, err)
files, err = gfile.ScanDirFile(p, "*.gz")
t.AssertNil(err)
t.Assert(len(files), 1)

View File

@ -1,4 +1,4 @@
package gf
const VERSION = "v2.1.0"
const VERSION = "v2.1.1"
const AUTHORS = "john<john@goframe.org>"