From 7bc3ee49aa317e48331cf6e39e1911ac89b2e325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=9C=C9=B4=E1=B4=8B=C9=B4=E1=B4=A1=E1=B4=8F=C9=B4?= Date: Tue, 29 Sep 2020 22:26:07 +0800 Subject: [PATCH] cmd/serv: use different log files for ORMs in hook mode (#6361) --- CHANGELOG.md | 2 ++ go.sum | 4 ---- internal/cmd/hook.go | 6 +++--- internal/cmd/serv.go | 7 ++++--- internal/db/db.go | 7 +------ internal/db/models.go | 33 ++++++++++++++++++++++++++------- 6 files changed, 36 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6d72c98b..00bfc299d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ All notable changes to Gogs are documented in this file. ### Fixed +- _Regression:_ When running Gogs on Windows, push commits no longer fail on a daily basis with the error "pre-receive hook declined". [#6316](https://github.com/gogs/gogs/issues/6316) + ### Removed - ⚠️ Migrations before 0.12 are removed, installations not on 0.12 should upgrade to it to run the migrations and then upgrade to 0.13. diff --git a/go.sum b/go.sum index 85acdce90..62b3a188b 100644 --- a/go.sum +++ b/go.sum @@ -361,8 +361,6 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/unknwon/cae v1.0.1 h1:2sLCLKUntoV4xJ3lov9N+Nya6Z3AfToqJJ0cnao4O7U= -github.com/unknwon/cae v1.0.1/go.mod h1:HqpmD2fVq9G1oGEXrXzbgIp51uJ29Hshv41n9ljm+AA= github.com/unknwon/cae v1.0.2 h1:3L8/RCN1ARvD5quyNjU30EdvYkFbxBfnRcIBXugpHlg= github.com/unknwon/cae v1.0.2/go.mod h1:HqpmD2fVq9G1oGEXrXzbgIp51uJ29Hshv41n9ljm+AA= github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= @@ -538,8 +536,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.0.1 h1:omJoilUzyrAp0xNoio88lGJCroGdIOen9hq2A/+3ifw= gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= -gorm.io/driver/postgres v1.0.0 h1:Yh4jyFQ0a7F+JPU0Gtiam/eKmpT/XFc1FKxotGqc6FM= -gorm.io/driver/postgres v1.0.0/go.mod h1:wtMFcOzmuA5QigNsgEIb7O5lhvH1tHAF1RbWmLWV4to= gorm.io/driver/postgres v1.0.1 h1:jRfDNUxpxNrea/97kbcscAQGmiks4UCKAYXsvh4rhOQ= gorm.io/driver/postgres v1.0.1/go.mod h1:pv4dVhHvEVrP7k/UYqdBIllbdbpB5VTz89X1O0uOrCA= gorm.io/driver/sqlite v1.1.3 h1:BYfdVuZB5He/u9dt4qDpZqiqDJ6KhPqs5QUqsr/Eeuc= diff --git a/internal/cmd/hook.go b/internal/cmd/hook.go index 9b4e2278e..99a5e15ba 100644 --- a/internal/cmd/hook.go +++ b/internal/cmd/hook.go @@ -66,7 +66,7 @@ func runHookPreReceive(c *cli.Context) error { if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { return nil } - setup(c, "hooks/pre-receive.log", true) + setup(c, "pre-receive.log", true) isWiki := strings.Contains(os.Getenv(db.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/") @@ -159,7 +159,7 @@ func runHookUpdate(c *cli.Context) error { if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { return nil } - setup(c, "hooks/update.log", false) + setup(c, "update.log", false) args := c.Args() if len(args) != 3 { @@ -193,7 +193,7 @@ func runHookPostReceive(c *cli.Context) error { if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { return nil } - setup(c, "hooks/post-receive.log", true) + setup(c, "post-receive.log", true) // Post-receive hook does more than just gather Git information, // so we need to setup additional services for email notifications. diff --git a/internal/cmd/serv.go b/internal/cmd/serv.go index 4c9bb4ca5..06d78a6db 100644 --- a/internal/cmd/serv.go +++ b/internal/cmd/serv.go @@ -38,7 +38,7 @@ var Serv = cli.Command{ // logs error message on the server side. When not in "prod" mode, // error message is also printed to the client for easier debugging. func fail(userMessage, errMessage string, args ...interface{}) { - fmt.Fprintln(os.Stderr, "Gogs:", userMessage) + _, _ = fmt.Fprintln(os.Stderr, "Gogs:", userMessage) if len(errMessage) > 0 { if !conf.IsProdMode() { @@ -47,10 +47,11 @@ func fail(userMessage, errMessage string, args ...interface{}) { log.Error(errMessage, args...) } + log.Stop() os.Exit(1) } -func setup(c *cli.Context, logPath string, connectDB bool) { +func setup(c *cli.Context, logFile string, connectDB bool) { conf.HookMode = true var customConf string @@ -73,7 +74,7 @@ func setup(c *cli.Context, logPath string, connectDB bool) { err = log.NewFile(log.FileConfig{ Level: level, - Filename: filepath.Join(conf.Log.RootPath, logPath), + Filename: filepath.Join(conf.Log.RootPath, "hooks", logFile), FileRotationConfig: log.FileRotationConfig{ Rotate: true, Daily: true, diff --git a/internal/db/db.go b/internal/db/db.go index c3e3f19ad..7f82c43f7 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -145,12 +145,7 @@ var Tables = []interface{}{ new(LFSObject), new(LoginSource), } -func Init() (*gorm.DB, error) { - w, err := newLogWriter() - if err != nil { - return nil, errors.Wrap(err, "new log writer") - } - +func Init(w logger.Writer) (*gorm.DB, error) { level := logger.Info if conf.IsProdMode() { level = logger.Warn diff --git a/internal/db/models.go b/internal/db/models.go index 52ef4495d..ac9cbe32d 100644 --- a/internal/db/models.go +++ b/internal/db/models.go @@ -10,16 +10,20 @@ import ( "net/url" "os" "path" + "path/filepath" "strings" "time" + "github.com/pkg/errors" "gorm.io/gorm" + "gorm.io/gorm/logger" log "unknwon.dev/clog/v2" "xorm.io/core" "xorm.io/xorm" "gogs.io/gogs/internal/conf" "gogs.io/gogs/internal/db/migrations" + "gogs.io/gogs/internal/dbutil" ) // Engine represents a XORM engine or session. @@ -132,16 +136,21 @@ func SetEngine() (*gorm.DB, error) { x.SetMapper(core.GonicMapper{}) - // WARNING: for serv command, MUST remove the output to os.stdout, - // so use log file to instead print to stdout. + var logPath string + if conf.HookMode { + logPath = filepath.Join(conf.Log.RootPath, "hooks", "xorm.log") + } else { + logPath = filepath.Join(conf.Log.RootPath, "xorm.log") + } sec := conf.File.Section("log.xorm") - logger, err := log.NewFileWriter(path.Join(conf.Log.RootPath, "xorm.log"), + fileWriter, err := log.NewFileWriter(logPath, log.FileRotationConfig{ Rotate: sec.Key("ROTATE").MustBool(true), Daily: sec.Key("ROTATE_DAILY").MustBool(true), MaxSize: sec.Key("MAX_SIZE").MustInt64(100) * 1024 * 1024, MaxDays: sec.Key("MAX_DAYS").MustInt64(3), - }) + }, + ) if err != nil { return nil, fmt.Errorf("create 'xorm.log': %v", err) } @@ -151,12 +160,22 @@ func SetEngine() (*gorm.DB, error) { x.SetConnMaxLifetime(time.Second) if conf.IsProdMode() { - x.SetLogger(xorm.NewSimpleLogger3(logger, xorm.DEFAULT_LOG_PREFIX, xorm.DEFAULT_LOG_FLAG, core.LOG_WARNING)) + x.SetLogger(xorm.NewSimpleLogger3(fileWriter, xorm.DEFAULT_LOG_PREFIX, xorm.DEFAULT_LOG_FLAG, core.LOG_WARNING)) } else { - x.SetLogger(xorm.NewSimpleLogger(logger)) + x.SetLogger(xorm.NewSimpleLogger(fileWriter)) } x.ShowSQL(true) - return Init() + + var gormLogger logger.Writer + if conf.HookMode { + gormLogger = &dbutil.Logger{Writer: fileWriter} + } else { + gormLogger, err = newLogWriter() + if err != nil { + return nil, errors.Wrap(err, "new log writer") + } + } + return Init(gormLogger) } func NewEngine() (err error) {