mirror of
https://github.com/go-gitea/gitea.git
synced 2025-05-09 17:10:42 +02:00
Merge branch 'main' into feature/bots
This commit is contained in:
commit
266a122ba2
@ -1,28 +1,28 @@
|
|||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
- gosimple
|
- bidichk
|
||||||
- deadcode
|
# - deadcode # deprecated - https://github.com/golangci/golangci-lint/issues/1841
|
||||||
- typecheck
|
- depguard
|
||||||
- govet
|
|
||||||
- errcheck
|
|
||||||
- staticcheck
|
|
||||||
- unused
|
|
||||||
- structcheck
|
|
||||||
- varcheck
|
|
||||||
- dupl
|
- dupl
|
||||||
|
- errcheck
|
||||||
|
- gocritic
|
||||||
# - gocyclo # The cyclomatic complexety of a lot of functions is too high, we should refactor those another time.
|
# - gocyclo # The cyclomatic complexety of a lot of functions is too high, we should refactor those another time.
|
||||||
- gofmt
|
- gofmt
|
||||||
- gocritic
|
|
||||||
- bidichk
|
|
||||||
- ineffassign
|
|
||||||
- revive
|
|
||||||
- gofumpt
|
- gofumpt
|
||||||
- depguard
|
- gosimple
|
||||||
|
- govet
|
||||||
|
- ineffassign
|
||||||
- nakedret
|
- nakedret
|
||||||
- unconvert
|
|
||||||
- wastedassign
|
|
||||||
- nolintlint
|
- nolintlint
|
||||||
|
- revive
|
||||||
|
- staticcheck
|
||||||
|
# - structcheck # deprecated - https://github.com/golangci/golangci-lint/issues/1841
|
||||||
- stylecheck
|
- stylecheck
|
||||||
|
- typecheck
|
||||||
|
- unconvert
|
||||||
|
- unused
|
||||||
|
# - varcheck # deprecated - https://github.com/golangci/golangci-lint/issues/1841
|
||||||
|
# - wastedassign # disabled - https://github.com/golangci/golangci-lint/issues/2649
|
||||||
enable-all: false
|
enable-all: false
|
||||||
disable-all: true
|
disable-all: true
|
||||||
fast: false
|
fast: false
|
||||||
|
12
Makefile
12
Makefile
@ -26,15 +26,15 @@ COMMA := ,
|
|||||||
XGO_VERSION := go-1.19.x
|
XGO_VERSION := go-1.19.x
|
||||||
|
|
||||||
AIR_PACKAGE ?= github.com/cosmtrek/air@v1.40.4
|
AIR_PACKAGE ?= github.com/cosmtrek/air@v1.40.4
|
||||||
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@2.5.0
|
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@2.6.0
|
||||||
ERRCHECK_PACKAGE ?= github.com/kisielk/errcheck@v1.6.1
|
ERRCHECK_PACKAGE ?= github.com/kisielk/errcheck@v1.6.2
|
||||||
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.3.1
|
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.4.0
|
||||||
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.47.0
|
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1
|
||||||
GXZ_PAGAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.10
|
GXZ_PAGAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.10
|
||||||
MISSPELL_PACKAGE ?= github.com/client9/misspell/cmd/misspell@v0.3.4
|
MISSPELL_PACKAGE ?= github.com/client9/misspell/cmd/misspell@v0.3.4
|
||||||
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.30.0
|
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.30.3
|
||||||
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
|
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
|
||||||
GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.3.0
|
GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.5.0
|
||||||
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@latest
|
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@latest
|
||||||
|
|
||||||
DOCKER_IMAGE ?= gitea/gitea
|
DOCKER_IMAGE ?= gitea/gitea
|
||||||
|
@ -403,6 +403,9 @@ LOG_SQL = false ; if unset defaults to true
|
|||||||
;;
|
;;
|
||||||
;; Database maximum number of open connections, default is 0 meaning no maximum
|
;; Database maximum number of open connections, default is 0 meaning no maximum
|
||||||
;MAX_OPEN_CONNS = 0
|
;MAX_OPEN_CONNS = 0
|
||||||
|
;;
|
||||||
|
;; Whether execute database models migrations automatically
|
||||||
|
;AUTO_MIGRATION = true
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -444,6 +444,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
|||||||
- `MAX_OPEN_CONNS` **0**: Database maximum open connections - default is 0, meaning there is no limit.
|
- `MAX_OPEN_CONNS` **0**: Database maximum open connections - default is 0, meaning there is no limit.
|
||||||
- `MAX_IDLE_CONNS` **2**: Max idle database connections on connection pool, default is 2 - this will be capped to `MAX_OPEN_CONNS`.
|
- `MAX_IDLE_CONNS` **2**: Max idle database connections on connection pool, default is 2 - this will be capped to `MAX_OPEN_CONNS`.
|
||||||
- `CONN_MAX_LIFETIME` **0 or 3s**: Sets the maximum amount of time a DB connection may be reused - default is 0, meaning there is no limit (except on MySQL where it is 3s - see #6804 & #7071).
|
- `CONN_MAX_LIFETIME` **0 or 3s**: Sets the maximum amount of time a DB connection may be reused - default is 0, meaning there is no limit (except on MySQL where it is 3s - see #6804 & #7071).
|
||||||
|
- `AUTO_MIGRATION` **true**: Whether execute database models migrations automatically.
|
||||||
|
|
||||||
Please see #8540 & #8273 for further discussion of the appropriate values for `MAX_OPEN_CONNS`, `MAX_IDLE_CONNS` & `CONN_MAX_LIFETIME` and their
|
Please see #8540 & #8273 for further discussion of the appropriate values for `MAX_OPEN_CONNS`, `MAX_IDLE_CONNS` & `CONN_MAX_LIFETIME` and their
|
||||||
relation to port exhaustion.
|
relation to port exhaustion.
|
||||||
|
@ -21,8 +21,10 @@ type contextKey struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// enginedContextKey is a context key. It is used with context.Value() to get the current Engined for the context
|
// enginedContextKey is a context key. It is used with context.Value() to get the current Engined for the context
|
||||||
var enginedContextKey = &contextKey{"engined"}
|
var (
|
||||||
var _ Engined = &Context{}
|
enginedContextKey = &contextKey{"engined"}
|
||||||
|
_ Engined = &Context{}
|
||||||
|
)
|
||||||
|
|
||||||
// Context represents a db context
|
// Context represents a db context
|
||||||
type Context struct {
|
type Context struct {
|
||||||
|
@ -6,6 +6,7 @@ package repo
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"math"
|
"math"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
@ -43,7 +44,7 @@ func (stats LanguageStatList) LoadAttributes() {
|
|||||||
|
|
||||||
func (stats LanguageStatList) getLanguagePercentages() map[string]float32 {
|
func (stats LanguageStatList) getLanguagePercentages() map[string]float32 {
|
||||||
langPerc := make(map[string]float32)
|
langPerc := make(map[string]float32)
|
||||||
var otherPerc float32 = 100
|
var otherPerc float32
|
||||||
var total int64
|
var total int64
|
||||||
|
|
||||||
for _, stat := range stats {
|
for _, stat := range stats {
|
||||||
@ -51,21 +52,52 @@ func (stats LanguageStatList) getLanguagePercentages() map[string]float32 {
|
|||||||
}
|
}
|
||||||
if total > 0 {
|
if total > 0 {
|
||||||
for _, stat := range stats {
|
for _, stat := range stats {
|
||||||
perc := float32(math.Round(float64(stat.Size)/float64(total)*1000) / 10)
|
perc := float32(float64(stat.Size) / float64(total) * 100)
|
||||||
if perc <= 0.1 {
|
if perc <= 0.1 {
|
||||||
|
otherPerc += perc
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
otherPerc -= perc
|
|
||||||
langPerc[stat.Language] = perc
|
langPerc[stat.Language] = perc
|
||||||
}
|
}
|
||||||
otherPerc = float32(math.Round(float64(otherPerc)*10) / 10)
|
|
||||||
}
|
}
|
||||||
if otherPerc > 0 {
|
if otherPerc > 0 {
|
||||||
langPerc["other"] = otherPerc
|
langPerc["other"] = otherPerc
|
||||||
}
|
}
|
||||||
|
roundByLargestRemainder(langPerc, 100)
|
||||||
return langPerc
|
return langPerc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rounds to 1 decimal point, target should be the expected sum of percs
|
||||||
|
func roundByLargestRemainder(percs map[string]float32, target float32) {
|
||||||
|
leftToDistribute := int(target * 10)
|
||||||
|
|
||||||
|
keys := make([]string, 0, len(percs))
|
||||||
|
|
||||||
|
for k, v := range percs {
|
||||||
|
percs[k] = v * 10
|
||||||
|
floored := math.Floor(float64(percs[k]))
|
||||||
|
leftToDistribute -= int(floored)
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort the keys by the largest remainder
|
||||||
|
sort.SliceStable(keys, func(i, j int) bool {
|
||||||
|
_, remainderI := math.Modf(float64(percs[keys[i]]))
|
||||||
|
_, remainderJ := math.Modf(float64(percs[keys[j]]))
|
||||||
|
return remainderI > remainderJ
|
||||||
|
})
|
||||||
|
|
||||||
|
// Increment the values in order of largest remainder
|
||||||
|
for _, k := range keys {
|
||||||
|
percs[k] = float32(math.Floor(float64(percs[k])))
|
||||||
|
if leftToDistribute > 0 {
|
||||||
|
percs[k]++
|
||||||
|
leftToDistribute--
|
||||||
|
}
|
||||||
|
percs[k] /= 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GetLanguageStats returns the language statistics for a repository
|
// GetLanguageStats returns the language statistics for a repository
|
||||||
func GetLanguageStats(ctx context.Context, repo *Repository) (LanguageStatList, error) {
|
func GetLanguageStats(ctx context.Context, repo *Repository) (LanguageStatList, error) {
|
||||||
stats := make(LanguageStatList, 0, 6)
|
stats := make(LanguageStatList, 0, 6)
|
||||||
|
@ -239,7 +239,7 @@ func (counts runeCountType) needsEscape() bool {
|
|||||||
type runeType int
|
type runeType int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
basicASCIIRuneType runeType = iota //nolint // <- This is technically deadcode but its self-documenting so it should stay
|
basicASCIIRuneType runeType = iota // <- This is technically deadcode but its self-documenting so it should stay
|
||||||
brokenRuneType
|
brokenRuneType
|
||||||
nonBasicASCIIRuneType
|
nonBasicASCIIRuneType
|
||||||
ambiguousRuneType
|
ambiguousRuneType
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func checkDBVersion(ctx context.Context, logger log.Logger, autofix bool) error {
|
func checkDBVersion(ctx context.Context, logger log.Logger, autofix bool) error {
|
||||||
|
logger.Info("Expected database version: %d", migrations.ExpectedVersion())
|
||||||
if err := db.InitEngineWithMigration(ctx, migrations.EnsureUpToDate); err != nil {
|
if err := db.InitEngineWithMigration(ctx, migrations.EnsureUpToDate); err != nil {
|
||||||
if !autofix {
|
if !autofix {
|
||||||
logger.Critical("Error: %v during ensure up to date", err)
|
logger.Critical("Error: %v during ensure up to date", err)
|
||||||
|
@ -49,6 +49,7 @@ var (
|
|||||||
MaxOpenConns int
|
MaxOpenConns int
|
||||||
ConnMaxLifetime time.Duration
|
ConnMaxLifetime time.Duration
|
||||||
IterateBufferSize int
|
IterateBufferSize int
|
||||||
|
AutoMigration bool
|
||||||
}{
|
}{
|
||||||
Timeout: 500,
|
Timeout: 500,
|
||||||
IterateBufferSize: 50,
|
IterateBufferSize: 50,
|
||||||
@ -105,6 +106,7 @@ func InitDBConfig() {
|
|||||||
Database.LogSQL = sec.Key("LOG_SQL").MustBool(true)
|
Database.LogSQL = sec.Key("LOG_SQL").MustBool(true)
|
||||||
Database.DBConnectRetries = sec.Key("DB_RETRIES").MustInt(10)
|
Database.DBConnectRetries = sec.Key("DB_RETRIES").MustInt(10)
|
||||||
Database.DBConnectBackoff = sec.Key("DB_RETRY_BACKOFF").MustDuration(3 * time.Second)
|
Database.DBConnectBackoff = sec.Key("DB_RETRY_BACKOFF").MustDuration(3 * time.Second)
|
||||||
|
Database.AutoMigration = sec.Key("AUTO_MIGRATION").MustBool(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DBConnStr returns database connection string
|
// DBConnStr returns database connection string
|
||||||
|
@ -21,8 +21,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// https://peps.python.org/pep-0426/#name
|
// https://peps.python.org/pep-0426/#name
|
||||||
var normalizer = strings.NewReplacer(".", "-", "_", "-")
|
var (
|
||||||
var nameMatcher = regexp.MustCompile(`\A(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\.\-_]*[a-zA-Z0-9])\z`)
|
normalizer = strings.NewReplacer(".", "-", "_", "-")
|
||||||
|
nameMatcher = regexp.MustCompile(`\A(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\.\-_]*[a-zA-Z0-9])\z`)
|
||||||
|
)
|
||||||
|
|
||||||
// https://peps.python.org/pep-0440/#appendix-b-parsing-version-strings-with-regular-expressions
|
// https://peps.python.org/pep-0440/#appendix-b-parsing-version-strings-with-regular-expressions
|
||||||
var versionMatcher = regexp.MustCompile(`\Av?` +
|
var versionMatcher = regexp.MustCompile(`\Av?` +
|
||||||
|
@ -12,6 +12,8 @@ import (
|
|||||||
"code.gitea.io/gitea/models/migrations"
|
"code.gitea.io/gitea/models/migrations"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
|
||||||
|
"xorm.io/xorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
// InitDBEngine In case of problems connecting to DB, retry connection. Eg, PGSQL in Docker Container on Synology
|
// InitDBEngine In case of problems connecting to DB, retry connection. Eg, PGSQL in Docker Container on Synology
|
||||||
@ -24,7 +26,7 @@ func InitDBEngine(ctx context.Context) (err error) {
|
|||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
log.Info("ORM engine initialization attempt #%d/%d...", i+1, setting.Database.DBConnectRetries)
|
log.Info("ORM engine initialization attempt #%d/%d...", i+1, setting.Database.DBConnectRetries)
|
||||||
if err = db.InitEngineWithMigration(ctx, migrations.Migrate); err == nil {
|
if err = db.InitEngineWithMigration(ctx, migrateWithSetting); err == nil {
|
||||||
break
|
break
|
||||||
} else if i == setting.Database.DBConnectRetries-1 {
|
} else if i == setting.Database.DBConnectRetries-1 {
|
||||||
return err
|
return err
|
||||||
@ -36,3 +38,20 @@ func InitDBEngine(ctx context.Context) (err error) {
|
|||||||
db.HasEngine = true
|
db.HasEngine = true
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func migrateWithSetting(x *xorm.Engine) error {
|
||||||
|
if setting.Database.AutoMigration {
|
||||||
|
return migrations.Migrate(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
if current, err := migrations.GetCurrentDBVersion(x); err != nil {
|
||||||
|
return err
|
||||||
|
} else if current < 0 {
|
||||||
|
// execute migrations when the database isn't initialized even if AutoMigration is false
|
||||||
|
return migrations.Migrate(x)
|
||||||
|
} else if expected := migrations.ExpectedVersion(); current != expected {
|
||||||
|
log.Fatal(`"database.AUTO_MIGRATION" is disabled, but current database version %d is not equal to the expected version %d.`+
|
||||||
|
`You can set "database.AUTO_MIGRATION" to true or migrate manually by running "gitea [--config /path/to/app.ini] migrate"`, current, expected)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user