0
0
mirror of https://github.com/go-gitea/gitea.git synced 2025-06-23 15:14:40 +02:00

Merge branch 'main' into lunny/move_wikipath

This commit is contained in:
Lunny Xiao 2025-03-31 11:17:23 -07:00
commit 0e7e3fb74a
373 changed files with 3913 additions and 3030 deletions

View File

@ -1,7 +1,9 @@
version: "2"
output:
sort-order:
- file
linters: linters:
enable-all: false default: none
disable-all: true
fast: false
enable: enable:
- bidichk - bidichk
- depguard - depguard
@ -9,141 +11,159 @@ linters:
- errcheck - errcheck
- forbidigo - forbidigo
- gocritic - gocritic
- gofmt
- gofumpt
- gosimple
- govet - govet
- ineffassign - ineffassign
- nakedret - nakedret
- nolintlint - nolintlint
- revive - revive
- staticcheck - staticcheck
- stylecheck
- testifylint - testifylint
- typecheck
- unconvert - unconvert
- unused
- unparam - unparam
- unused
- usetesting - usetesting
- wastedassign - wastedassign
settings:
run: depguard:
timeout: 10m rules:
main:
output: deny:
sort-results: true - pkg: encoding/json
sort-order: [file] desc: use gitea's modules/json instead of encoding/json
show-stats: true - pkg: github.com/unknwon/com
desc: use gitea's util and replacements
linters-settings: - pkg: io/ioutil
testifylint: desc: use os or io instead
disable: - pkg: golang.org/x/exp
- go-require desc: it's experimental and unreliable
- require-error - pkg: code.gitea.io/gitea/modules/git/internal
stylecheck: desc: do not use the internal package, use AddXxx function instead
checks: ["all", "-ST1005", "-ST1003"] - pkg: gopkg.in/ini.v1
nakedret: desc: do not use the ini package, use gitea's config system instead
max-func-lines: 0 - pkg: gitea.com/go-chi/cache
gocritic: desc: do not use the go-chi cache package, use gitea's cache system
disabled-checks: gocritic:
- ifElseChain disabled-checks:
- singleCaseSwitch # Every time this occurred in the code, there was no other way. - ifElseChain
revive: - singleCaseSwitch # Every time this occurred in the code, there was no other way.
severity: error revive:
severity: error
rules:
- name: atomic
- name: bare-return
- name: blank-imports
- name: constant-logical-expr
- name: context-as-argument
- name: context-keys-type
- name: dot-imports
- name: duplicated-imports
- name: empty-lines
- name: error-naming
- name: error-return
- name: error-strings
- name: errorf
- name: exported
- name: identical-branches
- name: if-return
- name: increment-decrement
- name: indent-error-flow
- name: modifies-value-receiver
- name: package-comments
- name: range
- name: receiver-naming
- name: redefines-builtin-id
- name: string-of-int
- name: superfluous-else
- name: time-naming
- name: unconditional-recursion
- name: unexported-return
- name: unreachable-code
- name: var-declaration
- name: var-naming
staticcheck:
checks:
- all
- -ST1003
- -ST1005
- -QF1001
- -QF1006
- -QF1008
testifylint:
disable:
- go-require
- require-error
usetesting:
os-temp-dir: true
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
rules: rules:
- name: atomic - linters:
- name: bare-return - dupl
- name: blank-imports - errcheck
- name: constant-logical-expr - gocyclo
- name: context-as-argument - gosec
- name: context-keys-type - staticcheck
- name: dot-imports - unparam
- name: duplicated-imports path: _test\.go
- name: empty-lines - linters:
- name: error-naming - dupl
- name: error-return - errcheck
- name: error-strings - gocyclo
- name: errorf - gosec
- name: exported path: models/migrations/v
- name: identical-branches - linters:
- name: if-return - forbidigo
- name: increment-decrement path: cmd
- name: indent-error-flow - linters:
- name: modifies-value-receiver - dupl
- name: package-comments text: (?i)webhook
- name: range - linters:
- name: receiver-naming - gocritic
- name: redefines-builtin-id text: (?i)`ID' should not be capitalized
- name: string-of-int - linters:
- name: superfluous-else - deadcode
- name: time-naming - unused
- name: unconditional-recursion text: (?i)swagger
- name: unexported-return - linters:
- name: unreachable-code - staticcheck
- name: var-declaration text: (?i)argument x is overwritten before first use
- name: var-naming - linters:
gofumpt: - gocritic
extra-rules: true text: '(?i)commentFormatting: put a space between `//` and comment text'
depguard: - linters:
rules: - gocritic
main: text: '(?i)exitAfterDefer:'
deny: paths:
- pkg: encoding/json - node_modules
desc: use gitea's modules/json instead of encoding/json - public
- pkg: github.com/unknwon/com - web_src
desc: use gitea's util and replacements - third_party$
- pkg: io/ioutil - builtin$
desc: use os or io instead - examples$
- pkg: golang.org/x/exp
desc: it's experimental and unreliable
- pkg: code.gitea.io/gitea/modules/git/internal
desc: do not use the internal package, use AddXxx function instead
- pkg: gopkg.in/ini.v1
desc: do not use the ini package, use gitea's config system instead
- pkg: gitea.com/go-chi/cache
desc: do not use the go-chi cache package, use gitea's cache system
usetesting:
os-temp-dir: true
issues: issues:
max-issues-per-linter: 0 max-issues-per-linter: 0
max-same-issues: 0 max-same-issues: 0
exclude-dirs: [node_modules, public, web_src] formatters:
exclude-case-sensitive: true enable:
exclude-rules: - gofmt
- path: _test\.go - gofumpt
linters: settings:
- gocyclo gofumpt:
- errcheck extra-rules: true
- dupl exclusions:
- gosec generated: lax
- unparam paths:
- staticcheck - node_modules
- path: models/migrations/v - public
linters: - web_src
- gocyclo - third_party$
- errcheck - builtin$
- dupl - examples$
- gosec
- path: cmd run:
linters: timeout: 10m
- forbidigo
- text: "webhook"
linters:
- dupl
- text: "`ID' should not be capitalized"
linters:
- gocritic
- text: "swagger"
linters:
- unused
- deadcode
- text: "argument x is overwritten before first use"
linters:
- staticcheck
- text: "commentFormatting: put a space between `//` and comment text"
linters:
- gocritic
- text: "exitAfterDefer:"
linters:
- gocritic

View File

@ -28,7 +28,7 @@ XGO_VERSION := go-1.24.x
AIR_PACKAGE ?= github.com/air-verse/air@v1 AIR_PACKAGE ?= github.com/air-verse/air@v1
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.2.1 EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.2.1
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.7.0 GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.7.0
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.7 GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.0.2
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.12 GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.12
MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.6.0 MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.6.0
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0

View File

@ -229,11 +229,11 @@ func TestAddLdapBindDn(t *testing.T) {
return nil return nil
}, },
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
assert.FailNow(t, "case %d: should not call updateAuthSource", n) assert.FailNow(t, "updateAuthSource called", "case %d: should not call updateAuthSource", n)
return nil return nil
}, },
getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) {
assert.FailNow(t, "case %d: should not call getAuthSourceByID", n) assert.FailNow(t, "getAuthSourceByID called", "case %d: should not call getAuthSourceByID", n)
return nil, nil return nil, nil
}, },
} }
@ -460,11 +460,11 @@ func TestAddLdapSimpleAuth(t *testing.T) {
return nil return nil
}, },
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
assert.FailNow(t, "case %d: should not call updateAuthSource", n) assert.FailNow(t, "updateAuthSource called", "case %d: should not call updateAuthSource", n)
return nil return nil
}, },
getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) {
assert.FailNow(t, "case %d: should not call getAuthSourceByID", n) assert.FailNow(t, "getAuthSourceById called", "case %d: should not call getAuthSourceByID", n)
return nil, nil return nil, nil
}, },
} }
@ -925,7 +925,7 @@ func TestUpdateLdapBindDn(t *testing.T) {
return nil return nil
}, },
createAuthSource: func(ctx context.Context, authSource *auth.Source) error { createAuthSource: func(ctx context.Context, authSource *auth.Source) error {
assert.FailNow(t, "case %d: should not call createAuthSource", n) assert.FailNow(t, "createAuthSource called", "case %d: should not call createAuthSource", n)
return nil return nil
}, },
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
@ -1315,7 +1315,7 @@ func TestUpdateLdapSimpleAuth(t *testing.T) {
return nil return nil
}, },
createAuthSource: func(ctx context.Context, authSource *auth.Source) error { createAuthSource: func(ctx context.Context, authSource *auth.Source) error {
assert.FailNow(t, "case %d: should not call createAuthSource", n) assert.FailNow(t, "createAuthSource called", "case %d: should not call createAuthSource", n)
return nil return nil
}, },
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {

View File

@ -61,6 +61,6 @@ func TestAdminUserCreate(t *testing.T) {
assert.NoError(t, createUser("u", "--user-type bot")) assert.NoError(t, createUser("u", "--user-type bot"))
u := unittest.AssertExistsAndLoadBean(t, &user_model.User{LowerName: "u"}) u := unittest.AssertExistsAndLoadBean(t, &user_model.User{LowerName: "u"})
assert.Equal(t, user_model.UserTypeBot, u.Type) assert.Equal(t, user_model.UserTypeBot, u.Type)
assert.Equal(t, "", u.Passwd) assert.Empty(t, u.Passwd)
}) })
} }

View File

@ -144,11 +144,12 @@ func setupDoctorDefaultLogger(ctx *cli.Context, colorize bool) {
setupConsoleLogger(log.FATAL, log.CanColorStderr, os.Stderr) setupConsoleLogger(log.FATAL, log.CanColorStderr, os.Stderr)
logFile := ctx.String("log-file") logFile := ctx.String("log-file")
if logFile == "" { switch logFile {
case "":
return // if no doctor log-file is set, do not show any log from default logger return // if no doctor log-file is set, do not show any log from default logger
} else if logFile == "-" { case "-":
setupConsoleLogger(log.TRACE, colorize, os.Stdout) setupConsoleLogger(log.TRACE, colorize, os.Stdout)
} else { default:
logFile, _ = filepath.Abs(logFile) logFile, _ = filepath.Abs(logFile)
writeMode := log.WriterMode{Level: log.TRACE, WriterOption: log.WriterFileOption{FileName: logFile}} writeMode := log.WriterMode{Level: log.TRACE, WriterOption: log.WriterFileOption{FileName: logFile}}
writer, err := log.NewEventWriter("console-to-file", "file", writeMode) writer, err := log.NewEventWriter("console-to-file", "file", writeMode)

View File

@ -131,14 +131,14 @@ func TestCliCmdError(t *testing.T) {
r, err := runTestApp(app, "./gitea", "test-cmd") r, err := runTestApp(app, "./gitea", "test-cmd")
assert.Error(t, err) assert.Error(t, err)
assert.Equal(t, 1, r.ExitCode) assert.Equal(t, 1, r.ExitCode)
assert.Equal(t, "", r.Stdout) assert.Empty(t, r.Stdout)
assert.Equal(t, "Command error: normal error\n", r.Stderr) assert.Equal(t, "Command error: normal error\n", r.Stderr)
app = newTestApp(func(ctx *cli.Context) error { return cli.Exit("exit error", 2) }) app = newTestApp(func(ctx *cli.Context) error { return cli.Exit("exit error", 2) })
r, err = runTestApp(app, "./gitea", "test-cmd") r, err = runTestApp(app, "./gitea", "test-cmd")
assert.Error(t, err) assert.Error(t, err)
assert.Equal(t, 2, r.ExitCode) assert.Equal(t, 2, r.ExitCode)
assert.Equal(t, "", r.Stdout) assert.Empty(t, r.Stdout)
assert.Equal(t, "exit error\n", r.Stderr) assert.Equal(t, "exit error\n", r.Stderr)
app = newTestApp(func(ctx *cli.Context) error { return nil }) app = newTestApp(func(ctx *cli.Context) error { return nil })
@ -146,12 +146,12 @@ func TestCliCmdError(t *testing.T) {
assert.Error(t, err) assert.Error(t, err)
assert.Equal(t, 1, r.ExitCode) assert.Equal(t, 1, r.ExitCode)
assert.Equal(t, "Incorrect Usage: flag provided but not defined: -no-such\n\n", r.Stdout) assert.Equal(t, "Incorrect Usage: flag provided but not defined: -no-such\n\n", r.Stdout)
assert.Equal(t, "", r.Stderr) // the cli package's strange behavior, the error message is not in stderr .... assert.Empty(t, r.Stderr) // the cli package's strange behavior, the error message is not in stderr ....
app = newTestApp(func(ctx *cli.Context) error { return nil }) app = newTestApp(func(ctx *cli.Context) error { return nil })
r, err = runTestApp(app, "./gitea", "test-cmd") r, err = runTestApp(app, "./gitea", "test-cmd")
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, -1, r.ExitCode) // the cli.OsExiter is not called assert.Equal(t, -1, r.ExitCode) // the cli.OsExiter is not called
assert.Equal(t, "", r.Stdout) assert.Empty(t, r.Stdout)
assert.Equal(t, "", r.Stderr) assert.Empty(t, r.Stderr)
} }

View File

@ -69,6 +69,6 @@ func TestMigratePackages(t *testing.T) {
entries, err := os.ReadDir(p) entries, err := os.ReadDir(p)
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, entries, 2) assert.Len(t, entries, 2)
assert.EqualValues(t, "01", entries[0].Name()) assert.Equal(t, "01", entries[0].Name())
assert.EqualValues(t, "tmp", entries[1].Name()) assert.Equal(t, "tmp", entries[1].Name())
} }

View File

@ -780,6 +780,9 @@ LEVEL = Info
;ALLOW_ONLY_EXTERNAL_REGISTRATION = false ;ALLOW_ONLY_EXTERNAL_REGISTRATION = false
;; ;;
;; User must sign in to view anything. ;; User must sign in to view anything.
;; It could be set to "expensive" to block anonymous users accessing some pages which consume a lot of resources,
;; for example: block anonymous AI crawlers from accessing repo code pages.
;; The "expensive" mode is experimental and subject to change.
;REQUIRE_SIGNIN_VIEW = false ;REQUIRE_SIGNIN_VIEW = false
;; ;;
;; Mail notification ;; Mail notification

View File

@ -86,9 +86,10 @@ func (r *ActionRunner) BelongsToOwnerType() types.OwnerType {
return types.OwnerTypeRepository return types.OwnerTypeRepository
} }
if r.OwnerID != 0 { if r.OwnerID != 0 {
if r.Owner.Type == user_model.UserTypeOrganization { switch r.Owner.Type {
case user_model.UserTypeOrganization:
return types.OwnerTypeOrganization return types.OwnerTypeOrganization
} else if r.Owner.Type == user_model.UserTypeIndividual { case user_model.UserTypeIndividual:
return types.OwnerTypeIndividual return types.OwnerTypeIndividual
} }
} }

View File

@ -17,7 +17,7 @@ func TestGetLatestRunnerToken(t *testing.T) {
token := unittest.AssertExistsAndLoadBean(t, &ActionRunnerToken{ID: 3}) token := unittest.AssertExistsAndLoadBean(t, &ActionRunnerToken{ID: 3})
expectedToken, err := GetLatestRunnerToken(db.DefaultContext, 1, 0) expectedToken, err := GetLatestRunnerToken(db.DefaultContext, 1, 0)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, expectedToken, token) assert.Equal(t, expectedToken, token)
} }
func TestNewRunnerToken(t *testing.T) { func TestNewRunnerToken(t *testing.T) {
@ -26,7 +26,7 @@ func TestNewRunnerToken(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
expectedToken, err := GetLatestRunnerToken(db.DefaultContext, 1, 0) expectedToken, err := GetLatestRunnerToken(db.DefaultContext, 1, 0)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, expectedToken, token) assert.Equal(t, expectedToken, token)
} }
func TestUpdateRunnerToken(t *testing.T) { func TestUpdateRunnerToken(t *testing.T) {
@ -36,5 +36,5 @@ func TestUpdateRunnerToken(t *testing.T) {
assert.NoError(t, UpdateRunnerToken(db.DefaultContext, token)) assert.NoError(t, UpdateRunnerToken(db.DefaultContext, token))
expectedToken, err := GetLatestRunnerToken(db.DefaultContext, 1, 0) expectedToken, err := GetLatestRunnerToken(db.DefaultContext, 1, 0)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, expectedToken, token) assert.Equal(t, expectedToken, token)
} }

View File

@ -130,7 +130,7 @@ func TestDeleteIssueActions(t *testing.T) {
// load an issue // load an issue
issue := unittest.AssertExistsAndLoadBean(t, &issue_model.Issue{ID: 4}) issue := unittest.AssertExistsAndLoadBean(t, &issue_model.Issue{ID: 4})
assert.NotEqualValues(t, issue.ID, issue.Index) // it needs to use different ID/Index to test the DeleteIssueActions to delete some actions by IssueIndex assert.NotEqual(t, issue.ID, issue.Index) // it needs to use different ID/Index to test the DeleteIssueActions to delete some actions by IssueIndex
// insert a comment // insert a comment
err := db.Insert(db.DefaultContext, &issue_model.Comment{Type: issue_model.CommentTypeComment, IssueID: issue.ID}) err := db.Insert(db.DefaultContext, &issue_model.Comment{Type: issue_model.CommentTypeComment, IssueID: issue.ID})

View File

@ -44,11 +44,11 @@ func TestNotificationsForUser(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
if assert.Len(t, notfs, 3) { if assert.Len(t, notfs, 3) {
assert.EqualValues(t, 5, notfs[0].ID) assert.EqualValues(t, 5, notfs[0].ID)
assert.EqualValues(t, user.ID, notfs[0].UserID) assert.Equal(t, user.ID, notfs[0].UserID)
assert.EqualValues(t, 4, notfs[1].ID) assert.EqualValues(t, 4, notfs[1].ID)
assert.EqualValues(t, user.ID, notfs[1].UserID) assert.Equal(t, user.ID, notfs[1].UserID)
assert.EqualValues(t, 2, notfs[2].ID) assert.EqualValues(t, 2, notfs[2].ID)
assert.EqualValues(t, user.ID, notfs[2].UserID) assert.Equal(t, user.ID, notfs[2].UserID)
} }
} }
@ -58,7 +58,7 @@ func TestNotification_GetRepo(t *testing.T) {
repo, err := notf.GetRepo(db.DefaultContext) repo, err := notf.GetRepo(db.DefaultContext)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, repo, notf.Repository) assert.Equal(t, repo, notf.Repository)
assert.EqualValues(t, notf.RepoID, repo.ID) assert.Equal(t, notf.RepoID, repo.ID)
} }
func TestNotification_GetIssue(t *testing.T) { func TestNotification_GetIssue(t *testing.T) {
@ -67,7 +67,7 @@ func TestNotification_GetIssue(t *testing.T) {
issue, err := notf.GetIssue(db.DefaultContext) issue, err := notf.GetIssue(db.DefaultContext)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, issue, notf.Issue) assert.Equal(t, issue, notf.Issue)
assert.EqualValues(t, notf.IssueID, issue.ID) assert.Equal(t, notf.IssueID, issue.ID)
} }
func TestGetNotificationCount(t *testing.T) { func TestGetNotificationCount(t *testing.T) {
@ -136,5 +136,5 @@ func TestSetIssueReadBy(t *testing.T) {
nt, err := activities_model.GetIssueNotification(db.DefaultContext, user.ID, issue.ID) nt, err := activities_model.GetIssueNotification(db.DefaultContext, user.ID, issue.ID)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, activities_model.NotificationStatusRead, nt.Status) assert.Equal(t, activities_model.NotificationStatusRead, nt.Status)
} }

View File

@ -18,6 +18,7 @@ import (
"github.com/42wim/sshsig" "github.com/42wim/sshsig"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
func Test_SSHParsePublicKey(t *testing.T) { func Test_SSHParsePublicKey(t *testing.T) {
@ -42,7 +43,7 @@ func Test_SSHParsePublicKey(t *testing.T) {
keyTypeN, lengthN, err := SSHNativeParsePublicKey(tc.content) keyTypeN, lengthN, err := SSHNativeParsePublicKey(tc.content)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, tc.keyType, keyTypeN) assert.Equal(t, tc.keyType, keyTypeN)
assert.EqualValues(t, tc.length, lengthN) assert.Equal(t, tc.length, lengthN)
}) })
if tc.skipSSHKeygen { if tc.skipSSHKeygen {
return return
@ -52,19 +53,18 @@ func Test_SSHParsePublicKey(t *testing.T) {
if err != nil { if err != nil {
// Some servers do not support ecdsa format. // Some servers do not support ecdsa format.
if !strings.Contains(err.Error(), "line 1 too long:") { if !strings.Contains(err.Error(), "line 1 too long:") {
assert.FailNow(t, "%v", err) require.NoError(t, err)
} }
} }
assert.Equal(t, tc.keyType, keyTypeK) assert.Equal(t, tc.keyType, keyTypeK)
assert.EqualValues(t, tc.length, lengthK) assert.Equal(t, tc.length, lengthK)
}) })
t.Run("SSHParseKeyNative", func(t *testing.T) { t.Run("SSHParseKeyNative", func(t *testing.T) {
keyTypeK, lengthK, err := SSHNativeParsePublicKey(tc.content) keyTypeK, lengthK, err := SSHNativeParsePublicKey(tc.content)
if err != nil { require.NoError(t, err)
assert.FailNow(t, "%v", err)
}
assert.Equal(t, tc.keyType, keyTypeK) assert.Equal(t, tc.keyType, keyTypeK)
assert.EqualValues(t, tc.length, lengthK) assert.Equal(t, tc.length, lengthK)
}) })
}) })
} }

View File

@ -126,7 +126,7 @@ func TestOAuth2Application_CreateGrant(t *testing.T) {
assert.NotNil(t, grant) assert.NotNil(t, grant)
assert.Equal(t, int64(2), grant.UserID) assert.Equal(t, int64(2), grant.UserID)
assert.Equal(t, int64(1), grant.ApplicationID) assert.Equal(t, int64(1), grant.ApplicationID)
assert.Equal(t, "", grant.Scope) assert.Empty(t, grant.Scope)
} }
//////////////////// Grant //////////////////// Grant

View File

@ -118,7 +118,7 @@ func TestContextSafety(t *testing.T) {
}) })
return nil return nil
}) })
assert.EqualValues(t, testCount, actualCount) assert.Equal(t, testCount, actualCount)
// deny the bad usages // deny the bad usages
assert.PanicsWithError(t, "using database context in an iterator would cause corrupted results", func() { assert.PanicsWithError(t, "using database context in an iterator would cause corrupted results", func() {

View File

@ -42,9 +42,10 @@ func newXORMEngine() (*xorm.Engine, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
if setting.Database.Type == "mysql" { switch setting.Database.Type {
case "mysql":
engine.Dialect().SetParams(map[string]string{"rowFormat": "DYNAMIC"}) engine.Dialect().SetParams(map[string]string{"rowFormat": "DYNAMIC"})
} else if setting.Database.Type == "mssql" { case "mssql":
engine.Dialect().SetParams(map[string]string{"DEFAULT_VARCHAR": "nvarchar"}) engine.Dialect().SetParams(map[string]string{"DEFAULT_VARCHAR": "nvarchar"})
} }
engine.SetSchema(setting.Database.Schema) engine.SetSchema(setting.Database.Schema)

View File

@ -52,7 +52,7 @@ func TestDeleteOrphanedObjects(t *testing.T) {
countAfter, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{}) countAfter, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, countBefore, countAfter) assert.Equal(t, countBefore, countAfter)
} }
func TestPrimaryKeys(t *testing.T) { func TestPrimaryKeys(t *testing.T) {

View File

@ -47,6 +47,6 @@ func TestFind(t *testing.T) {
repoUnits, newCnt, err := db.FindAndCount[repo_model.RepoUnit](db.DefaultContext, opts) repoUnits, newCnt, err := db.FindAndCount[repo_model.RepoUnit](db.DefaultContext, opts)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, cnt, newCnt) assert.Equal(t, cnt, newCnt)
assert.Len(t, repoUnits, repoUnitCount) assert.Len(t, repoUnits, repoUnitCount)
} }

View File

@ -31,15 +31,15 @@ func TestDbfsBasic(t *testing.T) {
n, err := f.Write([]byte("0123456789")) // blocks: 0123 4567 89 n, err := f.Write([]byte("0123456789")) // blocks: 0123 4567 89
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 10, n) assert.Equal(t, 10, n)
_, err = f.Seek(0, io.SeekStart) _, err = f.Seek(0, io.SeekStart)
assert.NoError(t, err) assert.NoError(t, err)
buf, err := io.ReadAll(f) buf, err := io.ReadAll(f)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 10, n) assert.Equal(t, 10, n)
assert.EqualValues(t, "0123456789", string(buf)) assert.Equal(t, "0123456789", string(buf))
// write some new data // write some new data
_, err = f.Seek(1, io.SeekStart) _, err = f.Seek(1, io.SeekStart)
@ -50,14 +50,14 @@ func TestDbfsBasic(t *testing.T) {
// read from offset // read from offset
buf, err = io.ReadAll(f) buf, err = io.ReadAll(f)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "9", string(buf)) assert.Equal(t, "9", string(buf))
// read all // read all
_, err = f.Seek(0, io.SeekStart) _, err = f.Seek(0, io.SeekStart)
assert.NoError(t, err) assert.NoError(t, err)
buf, err = io.ReadAll(f) buf, err = io.ReadAll(f)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "0bcdefghi9", string(buf)) assert.Equal(t, "0bcdefghi9", string(buf))
// write to new size // write to new size
_, err = f.Seek(-1, io.SeekEnd) _, err = f.Seek(-1, io.SeekEnd)
@ -68,7 +68,7 @@ func TestDbfsBasic(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
buf, err = io.ReadAll(f) buf, err = io.ReadAll(f)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "0bcdefghiJKLMNOP", string(buf)) assert.Equal(t, "0bcdefghiJKLMNOP", string(buf))
// write beyond EOF and fill with zero // write beyond EOF and fill with zero
_, err = f.Seek(5, io.SeekCurrent) _, err = f.Seek(5, io.SeekCurrent)
@ -79,7 +79,7 @@ func TestDbfsBasic(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
buf, err = io.ReadAll(f) buf, err = io.ReadAll(f)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "0bcdefghiJKLMNOP\x00\x00\x00\x00\x00xyzu", string(buf)) assert.Equal(t, "0bcdefghiJKLMNOP\x00\x00\x00\x00\x00xyzu", string(buf))
// write to the block with zeros // write to the block with zeros
_, err = f.Seek(-6, io.SeekCurrent) _, err = f.Seek(-6, io.SeekCurrent)
@ -90,7 +90,7 @@ func TestDbfsBasic(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
buf, err = io.ReadAll(f) buf, err = io.ReadAll(f)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "0bcdefghiJKLMNOP\x00\x00\x00ABCDzu", string(buf)) assert.Equal(t, "0bcdefghiJKLMNOP\x00\x00\x00ABCDzu", string(buf))
assert.NoError(t, f.Close()) assert.NoError(t, f.Close())
@ -117,7 +117,7 @@ func TestDbfsBasic(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
stat, err := f.Stat() stat, err := f.Stat()
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "test.txt", stat.Name()) assert.Equal(t, "test.txt", stat.Name())
assert.EqualValues(t, 0, stat.Size()) assert.EqualValues(t, 0, stat.Size())
_, err = f.Write([]byte("0123456789")) _, err = f.Write([]byte("0123456789"))
assert.NoError(t, err) assert.NoError(t, err)
@ -144,7 +144,7 @@ func TestDbfsReadWrite(t *testing.T) {
line, err := f2r.ReadString('\n') line, err := f2r.ReadString('\n')
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "line 1\n", line) assert.Equal(t, "line 1\n", line)
_, err = f2r.ReadString('\n') _, err = f2r.ReadString('\n')
assert.ErrorIs(t, err, io.EOF) assert.ErrorIs(t, err, io.EOF)
@ -153,7 +153,7 @@ func TestDbfsReadWrite(t *testing.T) {
line, err = f2r.ReadString('\n') line, err = f2r.ReadString('\n')
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "line 2\n", line) assert.Equal(t, "line 2\n", line)
_, err = f2r.ReadString('\n') _, err = f2r.ReadString('\n')
assert.ErrorIs(t, err, io.EOF) assert.ErrorIs(t, err, io.EOF)
} }
@ -186,5 +186,5 @@ func TestDbfsSeekWrite(t *testing.T) {
buf, err := io.ReadAll(fr) buf, err := io.ReadAll(fr)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "111333", string(buf)) assert.Equal(t, "111333", string(buf))
} }

View File

@ -21,7 +21,7 @@ import (
func TestAddDeletedBranch(t *testing.T) { func TestAddDeletedBranch(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase()) assert.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
assert.EqualValues(t, git.Sha1ObjectFormat.Name(), repo.ObjectFormatName) assert.Equal(t, git.Sha1ObjectFormat.Name(), repo.ObjectFormatName)
firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 1}) firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 1})
assert.True(t, firstBranch.IsDeleted) assert.True(t, firstBranch.IsDeleted)

View File

@ -70,7 +70,7 @@ func TestBranchRuleMatchPriority(t *testing.T) {
assert.Error(t, fmt.Errorf("no matched rules but expected %s[%d]", kase.Rules[kase.ExpectedMatchIdx], kase.ExpectedMatchIdx)) assert.Error(t, fmt.Errorf("no matched rules but expected %s[%d]", kase.Rules[kase.ExpectedMatchIdx], kase.ExpectedMatchIdx))
} }
} else { } else {
assert.EqualValues(t, kase.Rules[kase.ExpectedMatchIdx], matchedPB.RuleName) assert.Equal(t, kase.Rules[kase.ExpectedMatchIdx], matchedPB.RuleName)
} }
} }
} }

View File

@ -74,7 +74,7 @@ func TestBranchRuleMatch(t *testing.T) {
} else { } else {
infact = " not" infact = " not"
} }
assert.EqualValues(t, kase.ExpectedMatch, pb.Match(kase.BranchName), assert.Equal(t, kase.ExpectedMatch, pb.Match(kase.BranchName),
"%s should%s match %s but it is%s", kase.BranchName, should, kase.Rule, infact, "%s should%s match %s but it is%s", kase.BranchName, should, kase.Rule, infact,
) )
} }

View File

@ -34,10 +34,10 @@ func TestCreateComment(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
then := time.Now().Unix() then := time.Now().Unix()
assert.EqualValues(t, issues_model.CommentTypeComment, comment.Type) assert.Equal(t, issues_model.CommentTypeComment, comment.Type)
assert.EqualValues(t, "Hello", comment.Content) assert.Equal(t, "Hello", comment.Content)
assert.EqualValues(t, issue.ID, comment.IssueID) assert.Equal(t, issue.ID, comment.IssueID)
assert.EqualValues(t, doer.ID, comment.PosterID) assert.Equal(t, doer.ID, comment.PosterID)
unittest.AssertInt64InRange(t, now, then, int64(comment.CreatedUnix)) unittest.AssertInt64InRange(t, now, then, int64(comment.CreatedUnix))
unittest.AssertExistsAndLoadBean(t, comment) // assert actually added to DB unittest.AssertExistsAndLoadBean(t, comment) // assert actually added to DB
@ -58,9 +58,9 @@ func Test_UpdateCommentAttachment(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
attachment2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: attachment.ID}) attachment2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: attachment.ID})
assert.EqualValues(t, attachment.Name, attachment2.Name) assert.Equal(t, attachment.Name, attachment2.Name)
assert.EqualValues(t, comment.ID, attachment2.CommentID) assert.Equal(t, comment.ID, attachment2.CommentID)
assert.EqualValues(t, comment.IssueID, attachment2.IssueID) assert.Equal(t, comment.IssueID, attachment2.IssueID)
} }
func TestFetchCodeComments(t *testing.T) { func TestFetchCodeComments(t *testing.T) {
@ -111,7 +111,7 @@ func TestMigrate_InsertIssueComments(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
issueModified := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1}) issueModified := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1})
assert.EqualValues(t, issue.NumComments+1, issueModified.NumComments) assert.Equal(t, issue.NumComments+1, issueModified.NumComments)
unittest.CheckConsistencyFor(t, &issues_model.Issue{}) unittest.CheckConsistencyFor(t, &issues_model.Issue{})
} }
@ -122,5 +122,5 @@ func Test_UpdateIssueNumComments(t *testing.T) {
assert.NoError(t, issues_model.UpdateIssueNumComments(db.DefaultContext, issue2.ID)) assert.NoError(t, issues_model.UpdateIssueNumComments(db.DefaultContext, issue2.ID))
issue2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) issue2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
assert.EqualValues(t, 1, issue2.NumComments) assert.Equal(t, 1, issue2.NumComments)
} }

View File

@ -27,7 +27,7 @@ func TestIssueList_LoadRepositories(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, repos, 2) assert.Len(t, repos, 2)
for _, issue := range issueList { for _, issue := range issueList {
assert.EqualValues(t, issue.RepoID, issue.Repo.ID) assert.Equal(t, issue.RepoID, issue.Repo.ID)
} }
} }
@ -41,28 +41,28 @@ func TestIssueList_LoadAttributes(t *testing.T) {
assert.NoError(t, issueList.LoadAttributes(db.DefaultContext)) assert.NoError(t, issueList.LoadAttributes(db.DefaultContext))
for _, issue := range issueList { for _, issue := range issueList {
assert.EqualValues(t, issue.RepoID, issue.Repo.ID) assert.Equal(t, issue.RepoID, issue.Repo.ID)
for _, label := range issue.Labels { for _, label := range issue.Labels {
assert.EqualValues(t, issue.RepoID, label.RepoID) assert.Equal(t, issue.RepoID, label.RepoID)
unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label.ID}) unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label.ID})
} }
if issue.PosterID > 0 { if issue.PosterID > 0 {
assert.EqualValues(t, issue.PosterID, issue.Poster.ID) assert.Equal(t, issue.PosterID, issue.Poster.ID)
} }
if issue.AssigneeID > 0 { if issue.AssigneeID > 0 {
assert.EqualValues(t, issue.AssigneeID, issue.Assignee.ID) assert.Equal(t, issue.AssigneeID, issue.Assignee.ID)
} }
if issue.MilestoneID > 0 { if issue.MilestoneID > 0 {
assert.EqualValues(t, issue.MilestoneID, issue.Milestone.ID) assert.Equal(t, issue.MilestoneID, issue.Milestone.ID)
} }
if issue.IsPull { if issue.IsPull {
assert.EqualValues(t, issue.ID, issue.PullRequest.IssueID) assert.Equal(t, issue.ID, issue.PullRequest.IssueID)
} }
for _, attachment := range issue.Attachments { for _, attachment := range issue.Attachments {
assert.EqualValues(t, issue.ID, attachment.IssueID) assert.Equal(t, issue.ID, attachment.IssueID)
} }
for _, comment := range issue.Comments { for _, comment := range issue.Comments {
assert.EqualValues(t, issue.ID, comment.IssueID) assert.Equal(t, issue.ID, comment.IssueID)
} }
if issue.ID == int64(1) { if issue.ID == int64(1) {
assert.Equal(t, int64(400), issue.TotalTrackedTime) assert.Equal(t, int64(400), issue.TotalTrackedTime)

View File

@ -141,8 +141,8 @@ func TestUpdateIssueCols(t *testing.T) {
then := time.Now().Unix() then := time.Now().Unix()
updatedIssue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: issue.ID}) updatedIssue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: issue.ID})
assert.EqualValues(t, newTitle, updatedIssue.Title) assert.Equal(t, newTitle, updatedIssue.Title)
assert.EqualValues(t, prevContent, updatedIssue.Content) assert.Equal(t, prevContent, updatedIssue.Content)
unittest.AssertInt64InRange(t, now, then, int64(updatedIssue.UpdatedUnix)) unittest.AssertInt64InRange(t, now, then, int64(updatedIssue.UpdatedUnix))
} }
@ -201,7 +201,7 @@ func TestIssues(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
if assert.Len(t, issues, len(test.ExpectedIssueIDs)) { if assert.Len(t, issues, len(test.ExpectedIssueIDs)) {
for i, issue := range issues { for i, issue := range issues {
assert.EqualValues(t, test.ExpectedIssueIDs[i], issue.ID) assert.Equal(t, test.ExpectedIssueIDs[i], issue.ID)
} }
} }
} }
@ -234,10 +234,10 @@ func testInsertIssue(t *testing.T, title, content string, expectIndex int64) *is
has, err := db.GetEngine(db.DefaultContext).ID(issue.ID).Get(&newIssue) has, err := db.GetEngine(db.DefaultContext).ID(issue.ID).Get(&newIssue)
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, has) assert.True(t, has)
assert.EqualValues(t, issue.Title, newIssue.Title) assert.Equal(t, issue.Title, newIssue.Title)
assert.EqualValues(t, issue.Content, newIssue.Content) assert.Equal(t, issue.Content, newIssue.Content)
if expectIndex > 0 { if expectIndex > 0 {
assert.EqualValues(t, expectIndex, newIssue.Index) assert.Equal(t, expectIndex, newIssue.Index)
} }
}) })
return &newIssue return &newIssue
@ -271,7 +271,7 @@ func TestIssue_ResolveMentions(t *testing.T) {
ids[i] = user.ID ids[i] = user.ID
} }
sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] }) sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] })
assert.EqualValues(t, expected, ids) assert.Equal(t, expected, ids)
} }
// Public repo, existing user // Public repo, existing user
@ -392,28 +392,28 @@ func TestIssueLoadAttributes(t *testing.T) {
for _, issue := range issueList { for _, issue := range issueList {
assert.NoError(t, issue.LoadAttributes(db.DefaultContext)) assert.NoError(t, issue.LoadAttributes(db.DefaultContext))
assert.EqualValues(t, issue.RepoID, issue.Repo.ID) assert.Equal(t, issue.RepoID, issue.Repo.ID)
for _, label := range issue.Labels { for _, label := range issue.Labels {
assert.EqualValues(t, issue.RepoID, label.RepoID) assert.Equal(t, issue.RepoID, label.RepoID)
unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label.ID}) unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label.ID})
} }
if issue.PosterID > 0 { if issue.PosterID > 0 {
assert.EqualValues(t, issue.PosterID, issue.Poster.ID) assert.Equal(t, issue.PosterID, issue.Poster.ID)
} }
if issue.AssigneeID > 0 { if issue.AssigneeID > 0 {
assert.EqualValues(t, issue.AssigneeID, issue.Assignee.ID) assert.Equal(t, issue.AssigneeID, issue.Assignee.ID)
} }
if issue.MilestoneID > 0 { if issue.MilestoneID > 0 {
assert.EqualValues(t, issue.MilestoneID, issue.Milestone.ID) assert.Equal(t, issue.MilestoneID, issue.Milestone.ID)
} }
if issue.IsPull { if issue.IsPull {
assert.EqualValues(t, issue.ID, issue.PullRequest.IssueID) assert.Equal(t, issue.ID, issue.PullRequest.IssueID)
} }
for _, attachment := range issue.Attachments { for _, attachment := range issue.Attachments {
assert.EqualValues(t, issue.ID, attachment.IssueID) assert.Equal(t, issue.ID, attachment.IssueID)
} }
for _, comment := range issue.Comments { for _, comment := range issue.Comments {
assert.EqualValues(t, issue.ID, comment.IssueID) assert.Equal(t, issue.ID, comment.IssueID)
} }
if issue.ID == int64(1) { if issue.ID == int64(1) {
assert.Equal(t, int64(400), issue.TotalTrackedTime) assert.Equal(t, int64(400), issue.TotalTrackedTime)

View File

@ -20,7 +20,7 @@ func TestLabel_CalOpenIssues(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase()) assert.NoError(t, unittest.PrepareTestDatabase())
label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1}) label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1})
label.CalOpenIssues() label.CalOpenIssues()
assert.EqualValues(t, 2, label.NumOpenIssues) assert.Equal(t, 2, label.NumOpenIssues)
} }
func TestLabel_LoadSelectedLabelsAfterClick(t *testing.T) { func TestLabel_LoadSelectedLabelsAfterClick(t *testing.T) {
@ -154,7 +154,7 @@ func TestGetLabelsByRepoID(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, labels, len(expectedIssueIDs)) assert.Len(t, labels, len(expectedIssueIDs))
for i, label := range labels { for i, label := range labels {
assert.EqualValues(t, expectedIssueIDs[i], label.ID) assert.Equal(t, expectedIssueIDs[i], label.ID)
} }
} }
testSuccess(1, "leastissues", []int64{2, 1}) testSuccess(1, "leastissues", []int64{2, 1})
@ -221,7 +221,7 @@ func TestGetLabelsByOrgID(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, labels, len(expectedIssueIDs)) assert.Len(t, labels, len(expectedIssueIDs))
for i, label := range labels { for i, label := range labels {
assert.EqualValues(t, expectedIssueIDs[i], label.ID) assert.Equal(t, expectedIssueIDs[i], label.ID)
} }
} }
testSuccess(3, "leastissues", []int64{3, 4}) testSuccess(3, "leastissues", []int64{3, 4})
@ -267,10 +267,10 @@ func TestUpdateLabel(t *testing.T) {
label.Name = update.Name label.Name = update.Name
assert.NoError(t, issues_model.UpdateLabel(db.DefaultContext, update)) assert.NoError(t, issues_model.UpdateLabel(db.DefaultContext, update))
newLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1}) newLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1})
assert.EqualValues(t, label.ID, newLabel.ID) assert.Equal(t, label.ID, newLabel.ID)
assert.EqualValues(t, label.Color, newLabel.Color) assert.Equal(t, label.Color, newLabel.Color)
assert.EqualValues(t, label.Name, newLabel.Name) assert.Equal(t, label.Name, newLabel.Name)
assert.EqualValues(t, label.Description, newLabel.Description) assert.Equal(t, label.Description, newLabel.Description)
assert.EqualValues(t, 0, newLabel.ArchivedUnix) assert.EqualValues(t, 0, newLabel.ArchivedUnix)
unittest.CheckConsistencyFor(t, &issues_model.Label{}, &repo_model.Repository{}) unittest.CheckConsistencyFor(t, &issues_model.Label{}, &repo_model.Repository{})
} }
@ -313,7 +313,7 @@ func TestNewIssueLabel(t *testing.T) {
Content: "1", Content: "1",
}) })
label = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 2}) label = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 2})
assert.EqualValues(t, prevNumIssues+1, label.NumIssues) assert.Equal(t, prevNumIssues+1, label.NumIssues)
// re-add existing IssueLabel // re-add existing IssueLabel
assert.NoError(t, issues_model.NewIssueLabel(db.DefaultContext, issue, label, doer)) assert.NoError(t, issues_model.NewIssueLabel(db.DefaultContext, issue, label, doer))
@ -366,11 +366,11 @@ func TestNewIssueLabels(t *testing.T) {
}) })
unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label1.ID}) unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label1.ID})
label1 = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1}) label1 = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1})
assert.EqualValues(t, 3, label1.NumIssues) assert.Equal(t, 3, label1.NumIssues)
assert.EqualValues(t, 1, label1.NumClosedIssues) assert.Equal(t, 1, label1.NumClosedIssues)
label2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 2}) label2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 2})
assert.EqualValues(t, 1, label2.NumIssues) assert.Equal(t, 1, label2.NumIssues)
assert.EqualValues(t, 1, label2.NumClosedIssues) assert.Equal(t, 1, label2.NumClosedIssues)
// corner case: test empty slice // corner case: test empty slice
assert.NoError(t, issues_model.NewIssueLabels(db.DefaultContext, issue, []*issues_model.Label{}, doer)) assert.NoError(t, issues_model.NewIssueLabels(db.DefaultContext, issue, []*issues_model.Label{}, doer))
@ -408,8 +408,8 @@ func TestDeleteIssueLabel(t *testing.T) {
LabelID: labelID, LabelID: labelID,
}, `content=''`) }, `content=''`)
label = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: labelID}) label = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: labelID})
assert.EqualValues(t, expectedNumIssues, label.NumIssues) assert.Equal(t, expectedNumIssues, label.NumIssues)
assert.EqualValues(t, expectedNumClosedIssues, label.NumClosedIssues) assert.Equal(t, expectedNumClosedIssues, label.NumClosedIssues)
} }
testSuccess(1, 1, 2) testSuccess(1, 1, 2)
testSuccess(2, 5, 2) testSuccess(2, 5, 2)

View File

@ -69,7 +69,7 @@ func TestGetMilestonesByRepoID(t *testing.T) {
assert.Len(t, milestones, n) assert.Len(t, milestones, n)
for _, milestone := range milestones { for _, milestone := range milestones {
assert.EqualValues(t, repoID, milestone.RepoID) assert.Equal(t, repoID, milestone.RepoID)
} }
} }
test(1, api.StateOpen) test(1, api.StateOpen)
@ -327,7 +327,7 @@ func TestUpdateMilestone(t *testing.T) {
milestone.Content = "newMilestoneContent" milestone.Content = "newMilestoneContent"
assert.NoError(t, issues_model.UpdateMilestone(db.DefaultContext, milestone, milestone.IsClosed)) assert.NoError(t, issues_model.UpdateMilestone(db.DefaultContext, milestone, milestone.IsClosed))
milestone = unittest.AssertExistsAndLoadBean(t, &issues_model.Milestone{ID: 1}) milestone = unittest.AssertExistsAndLoadBean(t, &issues_model.Milestone{ID: 1})
assert.EqualValues(t, "newMilestoneName", milestone.Name) assert.Equal(t, "newMilestoneName", milestone.Name)
unittest.CheckConsistencyFor(t, &issues_model.Milestone{}) unittest.CheckConsistencyFor(t, &issues_model.Milestone{})
} }
@ -364,7 +364,7 @@ func TestMigrate_InsertMilestones(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
unittest.AssertExistsAndLoadBean(t, ms) unittest.AssertExistsAndLoadBean(t, ms)
repoModified := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repo.ID}) repoModified := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repo.ID})
assert.EqualValues(t, repo.NumMilestones+1, repoModified.NumMilestones) assert.Equal(t, repo.NumMilestones+1, repoModified.NumMilestones)
unittest.CheckConsistencyFor(t, &issues_model.Milestone{}) unittest.CheckConsistencyFor(t, &issues_model.Milestone{})
} }

View File

@ -40,7 +40,7 @@ func TestPullRequestList_LoadReviewCommentsCounts(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, reviewComments, 2) assert.Len(t, reviewComments, 2)
for _, pr := range prs { for _, pr := range prs {
assert.EqualValues(t, 1, reviewComments[pr.IssueID]) assert.Equal(t, 1, reviewComments[pr.IssueID])
} }
} }

View File

@ -285,7 +285,7 @@ func TestDeleteOrphanedObjects(t *testing.T) {
countAfter, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{}) countAfter, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, countBefore, countAfter) assert.Equal(t, countBefore, countAfter)
} }
func TestParseCodeOwnersLine(t *testing.T) { func TestParseCodeOwnersLine(t *testing.T) {
@ -318,7 +318,7 @@ func TestGetApprovers(t *testing.T) {
setting.Repository.PullRequest.DefaultMergeMessageOfficialApproversOnly = false setting.Repository.PullRequest.DefaultMergeMessageOfficialApproversOnly = false
approvers := pr.GetApprovers(db.DefaultContext) approvers := pr.GetApprovers(db.DefaultContext)
expected := "Reviewed-by: User Five <user5@example.com>\nReviewed-by: Org Six <org6@example.com>\n" expected := "Reviewed-by: User Five <user5@example.com>\nReviewed-by: Org Six <org6@example.com>\n"
assert.EqualValues(t, expected, approvers) assert.Equal(t, expected, approvers)
} }
func TestGetPullRequestByMergedCommit(t *testing.T) { func TestGetPullRequestByMergedCommit(t *testing.T) {

View File

@ -378,6 +378,7 @@ func prepareMigrationTasks() []*migration {
newMigration(315, "Add Ephemeral to ActionRunner", v1_24.AddEphemeralToActionRunner), newMigration(315, "Add Ephemeral to ActionRunner", v1_24.AddEphemeralToActionRunner),
newMigration(316, "Add description for secrets and variables", v1_24.AddDescriptionForSecretsAndVariables), newMigration(316, "Add description for secrets and variables", v1_24.AddDescriptionForSecretsAndVariables),
newMigration(317, "Add new index for action for heatmap", v1_24.AddNewIndexForUserDashboard), newMigration(317, "Add new index for action for heatmap", v1_24.AddNewIndexForUserDashboard),
newMigration(318, "Add anonymous_access_mode for repo_unit", v1_24.AddRepoUnitAnonymousAccessMode),
} }
return preparedMigrations return preparedMigrations
} }

View File

@ -22,7 +22,7 @@ func TestMigrations(t *testing.T) {
assert.EqualValues(t, 71, migrationIDNumberToDBVersion(70)) assert.EqualValues(t, 71, migrationIDNumberToDBVersion(70))
assert.EqualValues(t, []*migration{{idNumber: 70}, {idNumber: 71}}, getPendingMigrations(70, preparedMigrations)) assert.Equal(t, []*migration{{idNumber: 70}, {idNumber: 71}}, getPendingMigrations(70, preparedMigrations))
assert.EqualValues(t, []*migration{{idNumber: 71}}, getPendingMigrations(71, preparedMigrations)) assert.Equal(t, []*migration{{idNumber: 71}}, getPendingMigrations(71, preparedMigrations))
assert.EqualValues(t, []*migration{}, getPendingMigrations(72, preparedMigrations)) assert.Equal(t, []*migration{}, getPendingMigrations(72, preparedMigrations))
} }

View File

@ -49,7 +49,7 @@ func Test_AddPrimaryEmail2EmailAddress(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, has) assert.True(t, has)
assert.True(t, emailAddress.IsPrimary) assert.True(t, emailAddress.IsPrimary)
assert.EqualValues(t, user.IsActive, emailAddress.IsActivated) assert.Equal(t, user.IsActive, emailAddress.IsActivated)
assert.EqualValues(t, user.ID, emailAddress.UID) assert.Equal(t, user.ID, emailAddress.UID)
} }
} }

View File

@ -75,8 +75,8 @@ func Test_UnwrapLDAPSourceCfg(t *testing.T) {
return return
} }
assert.EqualValues(t, expected, converted, "UnwrapLDAPSourceCfg failed for %d", source.ID) assert.Equal(t, expected, converted, "UnwrapLDAPSourceCfg failed for %d", source.ID)
assert.EqualValues(t, source.ID%2 == 0, source.IsActive, "UnwrapLDAPSourceCfg failed for %d", source.ID) assert.Equal(t, source.ID%2 == 0, source.IsActive, "UnwrapLDAPSourceCfg failed for %d", source.ID)
} }
} }
} }

View File

@ -62,7 +62,7 @@ func Test_AddRepoIDForAttachment(t *testing.T) {
has, err := x.ID(attach.IssueID).Get(&issue) has, err := x.ID(attach.IssueID).Get(&issue)
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, has) assert.True(t, has)
assert.EqualValues(t, attach.RepoID, issue.RepoID) assert.Equal(t, attach.RepoID, issue.RepoID)
} }
var releaseAttachments []*NewAttachment var releaseAttachments []*NewAttachment
@ -75,6 +75,6 @@ func Test_AddRepoIDForAttachment(t *testing.T) {
has, err := x.ID(attach.ReleaseID).Get(&release) has, err := x.ID(attach.ReleaseID).Get(&release)
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, has) assert.True(t, has)
assert.EqualValues(t, attach.RepoID, release.RepoID) assert.Equal(t, attach.RepoID, release.RepoID)
} }
} }

View File

@ -71,5 +71,5 @@ func Test_RemigrateU2FCredentials(t *testing.T) {
return return
} }
assert.EqualValues(t, expected, got) assert.Equal(t, expected, got)
} }

View File

@ -64,7 +64,7 @@ func Test_AddHeaderAuthorizationEncryptedColWebhook(t *testing.T) {
assert.Equal(t, e.Meta, got[i].Meta) assert.Equal(t, e.Meta, got[i].Meta)
if e.HeaderAuthorization == "" { if e.HeaderAuthorization == "" {
assert.Equal(t, "", got[i].HeaderAuthorizationEncrypted) assert.Empty(t, got[i].HeaderAuthorizationEncrypted)
} else { } else {
cipherhex := got[i].HeaderAuthorizationEncrypted cipherhex := got[i].HeaderAuthorizationEncrypted
cleartext, err := secret.DecryptSecret(setting.SecretKey, cipherhex) cleartext, err := secret.DecryptSecret(setting.SecretKey, cipherhex)

View File

@ -96,7 +96,7 @@ func Test_ConvertScopedAccessTokens(t *testing.T) {
tokens := make([]AccessToken, 0) tokens := make([]AccessToken, 0)
err = x.Find(&tokens) err = x.Find(&tokens)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, len(tests), len(tokens)) assert.Len(t, tokens, len(tests))
// sort the tokens (insertion order by auto-incrementing primary key) // sort the tokens (insertion order by auto-incrementing primary key)
sort.Slice(tokens, func(i, j int) bool { sort.Slice(tokens, func(i, j int) bool {

View File

@ -108,11 +108,11 @@ func Test_RepositoryFormat(t *testing.T) {
ok, err := x.ID(2).Get(repo) ok, err := x.ID(2).Get(repo)
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, ok) assert.True(t, ok)
assert.EqualValues(t, "sha1", repo.ObjectFormatName) assert.Equal(t, "sha1", repo.ObjectFormatName)
repo = new(Repository) repo = new(Repository)
ok, err = x.ID(id).Get(repo) ok, err = x.ID(id).Get(repo)
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, ok) assert.True(t, ok)
assert.EqualValues(t, "sha256", repo.ObjectFormatName) assert.Equal(t, "sha256", repo.ObjectFormatName)
} }

View File

@ -0,0 +1,17 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package v1_24 //nolint
import (
"code.gitea.io/gitea/models/perm"
"xorm.io/xorm"
)
func AddRepoUnitAnonymousAccessMode(x *xorm.Engine) error {
type RepoUnit struct { //revive:disable-line:exported
AnonymousAccessMode perm.AccessMode `xorm:"NOT NULL DEFAULT 0"`
}
return x.Sync(&RepoUnit{})
}

View File

@ -57,7 +57,7 @@ func TestGetUserOrgsList(t *testing.T) {
if assert.Len(t, orgs, 1) { if assert.Len(t, orgs, 1) {
assert.EqualValues(t, 3, orgs[0].ID) assert.EqualValues(t, 3, orgs[0].ID)
// repo_id: 3 is in the team, 32 is public, 5 is private with no team // repo_id: 3 is in the team, 32 is public, 5 is private with no team
assert.EqualValues(t, 2, orgs[0].NumRepos) assert.Equal(t, 2, orgs[0].NumRepos)
} }
} }

View File

@ -135,7 +135,7 @@ func TestIsOrganizationOwner(t *testing.T) {
test := func(orgID, userID int64, expected bool) { test := func(orgID, userID int64, expected bool) {
isOwner, err := organization.IsOrganizationOwner(db.DefaultContext, orgID, userID) isOwner, err := organization.IsOrganizationOwner(db.DefaultContext, orgID, userID)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, expected, isOwner) assert.Equal(t, expected, isOwner)
} }
test(3, 2, true) test(3, 2, true)
test(3, 3, false) test(3, 3, false)
@ -149,7 +149,7 @@ func TestIsOrganizationMember(t *testing.T) {
test := func(orgID, userID int64, expected bool) { test := func(orgID, userID int64, expected bool) {
isMember, err := organization.IsOrganizationMember(db.DefaultContext, orgID, userID) isMember, err := organization.IsOrganizationMember(db.DefaultContext, orgID, userID)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, expected, isMember) assert.Equal(t, expected, isMember)
} }
test(3, 2, true) test(3, 2, true)
test(3, 3, false) test(3, 3, false)
@ -164,7 +164,7 @@ func TestIsPublicMembership(t *testing.T) {
test := func(orgID, userID int64, expected bool) { test := func(orgID, userID int64, expected bool) {
isMember, err := organization.IsPublicMembership(db.DefaultContext, orgID, userID) isMember, err := organization.IsPublicMembership(db.DefaultContext, orgID, userID)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, expected, isMember) assert.Equal(t, expected, isMember)
} }
test(3, 2, true) test(3, 2, true)
test(3, 3, false) test(3, 3, false)
@ -237,7 +237,7 @@ func TestRestrictedUserOrgMembers(t *testing.T) {
memberUIDs = append(memberUIDs, member.UID) memberUIDs = append(memberUIDs, member.UID)
} }
slices.Sort(memberUIDs) slices.Sort(memberUIDs)
assert.EqualValues(t, tc.expectedUIDs, memberUIDs) assert.Equal(t, tc.expectedUIDs, memberUIDs)
}) })
} }
} }
@ -255,7 +255,7 @@ func TestGetOrgUsersByOrgID(t *testing.T) {
sort.Slice(orgUsers, func(i, j int) bool { sort.Slice(orgUsers, func(i, j int) bool {
return orgUsers[i].ID < orgUsers[j].ID return orgUsers[i].ID < orgUsers[j].ID
}) })
assert.EqualValues(t, []*organization.OrgUser{{ assert.Equal(t, []*organization.OrgUser{{
ID: 1, ID: 1,
OrgID: 3, OrgID: 3,
UID: 2, UID: 2,
@ -322,7 +322,7 @@ func TestAccessibleReposEnv_CountRepos(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
count, err := env.CountRepos(db.DefaultContext) count, err := env.CountRepos(db.DefaultContext)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, expectedCount, count) assert.Equal(t, expectedCount, count)
} }
testSuccess(2, 3) testSuccess(2, 3)
testSuccess(4, 2) testSuccess(4, 2)

View File

@ -139,7 +139,7 @@ func TestAddOrgUser(t *testing.T) {
unittest.AssertExistsAndLoadBean(t, ou) unittest.AssertExistsAndLoadBean(t, ou)
assert.Equal(t, isPublic, ou.IsPublic) assert.Equal(t, isPublic, ou.IsPublic)
org = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID}) org = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID})
assert.EqualValues(t, expectedNumMembers, org.NumMembers) assert.Equal(t, expectedNumMembers, org.NumMembers)
} }
setting.Service.DefaultOrgMemberVisible = false setting.Service.DefaultOrgMemberVisible = false

View File

@ -77,7 +77,7 @@ func TestGetTeam(t *testing.T) {
testSuccess := func(orgID int64, name string) { testSuccess := func(orgID int64, name string) {
team, err := organization.GetTeam(db.DefaultContext, orgID, name) team, err := organization.GetTeam(db.DefaultContext, orgID, name)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, orgID, team.OrgID) assert.Equal(t, orgID, team.OrgID)
assert.Equal(t, name, team.Name) assert.Equal(t, name, team.Name)
} }
testSuccess(3, "Owners") testSuccess(3, "Owners")
@ -95,7 +95,7 @@ func TestGetTeamByID(t *testing.T) {
testSuccess := func(teamID int64) { testSuccess := func(teamID int64) {
team, err := organization.GetTeamByID(db.DefaultContext, teamID) team, err := organization.GetTeamByID(db.DefaultContext, teamID)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, teamID, team.ID) assert.Equal(t, teamID, team.ID)
} }
testSuccess(1) testSuccess(1)
testSuccess(2) testSuccess(2)
@ -163,7 +163,7 @@ func TestGetUserOrgTeams(t *testing.T) {
teams, err := organization.GetUserOrgTeams(db.DefaultContext, orgID, userID) teams, err := organization.GetUserOrgTeams(db.DefaultContext, orgID, userID)
assert.NoError(t, err) assert.NoError(t, err)
for _, team := range teams { for _, team := range teams {
assert.EqualValues(t, orgID, team.OrgID) assert.Equal(t, orgID, team.OrgID)
unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{TeamID: team.ID, UID: userID}) unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{TeamID: team.ID, UID: userID})
} }
} }

View File

@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/util"
) )
@ -25,7 +26,8 @@ type Permission struct {
units []*repo_model.RepoUnit units []*repo_model.RepoUnit
unitsMode map[unit.Type]perm_model.AccessMode unitsMode map[unit.Type]perm_model.AccessMode
everyoneAccessMode map[unit.Type]perm_model.AccessMode everyoneAccessMode map[unit.Type]perm_model.AccessMode // the unit's minimal access mode for every signed-in user
anonymousAccessMode map[unit.Type]perm_model.AccessMode // the unit's minimal access mode for anonymous (non-signed-in) user
} }
// IsOwner returns true if current user is the owner of repository. // IsOwner returns true if current user is the owner of repository.
@ -39,7 +41,7 @@ func (p *Permission) IsAdmin() bool {
} }
// HasAnyUnitAccess returns true if the user might have at least one access mode to any unit of this repository. // HasAnyUnitAccess returns true if the user might have at least one access mode to any unit of this repository.
// It doesn't count the "everyone access mode". // It doesn't count the "public(anonymous/everyone) access mode".
func (p *Permission) HasAnyUnitAccess() bool { func (p *Permission) HasAnyUnitAccess() bool {
for _, v := range p.unitsMode { for _, v := range p.unitsMode {
if v >= perm_model.AccessModeRead { if v >= perm_model.AccessModeRead {
@ -49,13 +51,22 @@ func (p *Permission) HasAnyUnitAccess() bool {
return p.AccessMode >= perm_model.AccessModeRead return p.AccessMode >= perm_model.AccessModeRead
} }
func (p *Permission) HasAnyUnitAccessOrEveryoneAccess() bool { func (p *Permission) HasAnyUnitPublicAccess() bool {
for _, v := range p.anonymousAccessMode {
if v >= perm_model.AccessModeRead {
return true
}
}
for _, v := range p.everyoneAccessMode { for _, v := range p.everyoneAccessMode {
if v >= perm_model.AccessModeRead { if v >= perm_model.AccessModeRead {
return true return true
} }
} }
return p.HasAnyUnitAccess() return false
}
func (p *Permission) HasAnyUnitAccessOrPublicAccess() bool {
return p.HasAnyUnitPublicAccess() || p.HasAnyUnitAccess()
} }
// HasUnits returns true if the permission contains attached units // HasUnits returns true if the permission contains attached units
@ -73,14 +84,16 @@ func (p *Permission) GetFirstUnitRepoID() int64 {
} }
// UnitAccessMode returns current user access mode to the specify unit of the repository // UnitAccessMode returns current user access mode to the specify unit of the repository
// It also considers "everyone access mode" // It also considers "public (anonymous/everyone) access mode"
func (p *Permission) UnitAccessMode(unitType unit.Type) perm_model.AccessMode { func (p *Permission) UnitAccessMode(unitType unit.Type) perm_model.AccessMode {
// if the units map contains the access mode, use it, but admin/owner mode could override it // if the units map contains the access mode, use it, but admin/owner mode could override it
if m, ok := p.unitsMode[unitType]; ok { if m, ok := p.unitsMode[unitType]; ok {
return util.Iif(p.AccessMode >= perm_model.AccessModeAdmin, p.AccessMode, m) return util.Iif(p.AccessMode >= perm_model.AccessModeAdmin, p.AccessMode, m)
} }
// if the units map does not contain the access mode, return the default access mode if the unit exists // if the units map does not contain the access mode, return the default access mode if the unit exists
unitDefaultAccessMode := max(p.AccessMode, p.everyoneAccessMode[unitType]) unitDefaultAccessMode := p.AccessMode
unitDefaultAccessMode = max(unitDefaultAccessMode, p.anonymousAccessMode[unitType])
unitDefaultAccessMode = max(unitDefaultAccessMode, p.everyoneAccessMode[unitType])
hasUnit := slices.ContainsFunc(p.units, func(u *repo_model.RepoUnit) bool { return u.Type == unitType }) hasUnit := slices.ContainsFunc(p.units, func(u *repo_model.RepoUnit) bool { return u.Type == unitType })
return util.Iif(hasUnit, unitDefaultAccessMode, perm_model.AccessModeNone) return util.Iif(hasUnit, unitDefaultAccessMode, perm_model.AccessModeNone)
} }
@ -171,27 +184,41 @@ func (p *Permission) LogString() string {
format += "\n\tunitsMode[%-v]: %-v" format += "\n\tunitsMode[%-v]: %-v"
args = append(args, key.LogString(), value.LogString()) args = append(args, key.LogString(), value.LogString())
} }
format += "\n\tanonymousAccessMode: %-v"
args = append(args, p.anonymousAccessMode)
format += "\n\teveryoneAccessMode: %-v" format += "\n\teveryoneAccessMode: %-v"
args = append(args, p.everyoneAccessMode) args = append(args, p.everyoneAccessMode)
format += "\n\t]>" format += "\n\t]>"
return fmt.Sprintf(format, args...) return fmt.Sprintf(format, args...)
} }
func applyPublicAccessPermission(unitType unit.Type, accessMode perm_model.AccessMode, modeMap *map[unit.Type]perm_model.AccessMode) {
if setting.Repository.ForcePrivate {
return
}
if accessMode >= perm_model.AccessModeRead && accessMode > (*modeMap)[unitType] {
if *modeMap == nil {
*modeMap = make(map[unit.Type]perm_model.AccessMode)
}
(*modeMap)[unitType] = accessMode
}
}
func finalProcessRepoUnitPermission(user *user_model.User, perm *Permission) { func finalProcessRepoUnitPermission(user *user_model.User, perm *Permission) {
// apply public (anonymous) access permissions
for _, u := range perm.units {
applyPublicAccessPermission(u.Type, u.AnonymousAccessMode, &perm.anonymousAccessMode)
}
if user == nil || user.ID <= 0 { if user == nil || user.ID <= 0 {
// for anonymous access, it could be: // for anonymous access, it could be:
// AccessMode is None or Read, units has repo units, unitModes is nil // AccessMode is None or Read, units has repo units, unitModes is nil
return return
} }
// apply everyone access permissions // apply public (everyone) access permissions
for _, u := range perm.units { for _, u := range perm.units {
if u.EveryoneAccessMode >= perm_model.AccessModeRead && u.EveryoneAccessMode > perm.everyoneAccessMode[u.Type] { applyPublicAccessPermission(u.Type, u.EveryoneAccessMode, &perm.everyoneAccessMode)
if perm.everyoneAccessMode == nil {
perm.everyoneAccessMode = make(map[unit.Type]perm_model.AccessMode)
}
perm.everyoneAccessMode[u.Type] = u.EveryoneAccessMode
}
} }
if perm.unitsMode == nil { if perm.unitsMode == nil {
@ -209,6 +236,11 @@ func finalProcessRepoUnitPermission(user *user_model.User, perm *Permission) {
break break
} }
} }
for t := range perm.anonymousAccessMode {
if shouldKeep = shouldKeep || u.Type == t; shouldKeep {
break
}
}
for t := range perm.everyoneAccessMode { for t := range perm.everyoneAccessMode {
if shouldKeep = shouldKeep || u.Type == t; shouldKeep { if shouldKeep = shouldKeep || u.Type == t; shouldKeep {
break break

View File

@ -22,14 +22,21 @@ func TestHasAnyUnitAccess(t *testing.T) {
units: []*repo_model.RepoUnit{{Type: unit.TypeWiki}}, units: []*repo_model.RepoUnit{{Type: unit.TypeWiki}},
} }
assert.False(t, perm.HasAnyUnitAccess()) assert.False(t, perm.HasAnyUnitAccess())
assert.False(t, perm.HasAnyUnitAccessOrEveryoneAccess()) assert.False(t, perm.HasAnyUnitAccessOrPublicAccess())
perm = Permission{ perm = Permission{
units: []*repo_model.RepoUnit{{Type: unit.TypeWiki}}, units: []*repo_model.RepoUnit{{Type: unit.TypeWiki}},
everyoneAccessMode: map[unit.Type]perm_model.AccessMode{unit.TypeIssues: perm_model.AccessModeRead}, everyoneAccessMode: map[unit.Type]perm_model.AccessMode{unit.TypeIssues: perm_model.AccessModeRead},
} }
assert.False(t, perm.HasAnyUnitAccess()) assert.False(t, perm.HasAnyUnitAccess())
assert.True(t, perm.HasAnyUnitAccessOrEveryoneAccess()) assert.True(t, perm.HasAnyUnitAccessOrPublicAccess())
perm = Permission{
units: []*repo_model.RepoUnit{{Type: unit.TypeWiki}},
anonymousAccessMode: map[unit.Type]perm_model.AccessMode{unit.TypeIssues: perm_model.AccessModeRead},
}
assert.False(t, perm.HasAnyUnitAccess())
assert.True(t, perm.HasAnyUnitAccessOrPublicAccess())
perm = Permission{ perm = Permission{
AccessMode: perm_model.AccessModeRead, AccessMode: perm_model.AccessModeRead,
@ -43,7 +50,7 @@ func TestHasAnyUnitAccess(t *testing.T) {
assert.True(t, perm.HasAnyUnitAccess()) assert.True(t, perm.HasAnyUnitAccess())
} }
func TestApplyEveryoneRepoPermission(t *testing.T) { func TestApplyPublicAccessRepoPermission(t *testing.T) {
perm := Permission{ perm := Permission{
AccessMode: perm_model.AccessModeNone, AccessMode: perm_model.AccessModeNone,
units: []*repo_model.RepoUnit{ units: []*repo_model.RepoUnit{
@ -53,6 +60,15 @@ func TestApplyEveryoneRepoPermission(t *testing.T) {
finalProcessRepoUnitPermission(nil, &perm) finalProcessRepoUnitPermission(nil, &perm)
assert.False(t, perm.CanRead(unit.TypeWiki)) assert.False(t, perm.CanRead(unit.TypeWiki))
perm = Permission{
AccessMode: perm_model.AccessModeNone,
units: []*repo_model.RepoUnit{
{Type: unit.TypeWiki, AnonymousAccessMode: perm_model.AccessModeRead},
},
}
finalProcessRepoUnitPermission(nil, &perm)
assert.True(t, perm.CanRead(unit.TypeWiki))
perm = Permission{ perm = Permission{
AccessMode: perm_model.AccessModeNone, AccessMode: perm_model.AccessModeNone,
units: []*repo_model.RepoUnit{ units: []*repo_model.RepoUnit{

View File

@ -97,9 +97,9 @@ func Test_MoveColumnsOnProject(t *testing.T) {
columnsAfter, err := project1.GetColumns(db.DefaultContext) columnsAfter, err := project1.GetColumns(db.DefaultContext)
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, columnsAfter, 3) assert.Len(t, columnsAfter, 3)
assert.EqualValues(t, columns[1].ID, columnsAfter[0].ID) assert.Equal(t, columns[1].ID, columnsAfter[0].ID)
assert.EqualValues(t, columns[2].ID, columnsAfter[1].ID) assert.Equal(t, columns[2].ID, columnsAfter[1].ID)
assert.EqualValues(t, columns[0].ID, columnsAfter[2].ID) assert.Equal(t, columns[0].ID, columnsAfter[2].ID)
} }
func Test_NewColumn(t *testing.T) { func Test_NewColumn(t *testing.T) {

View File

@ -113,10 +113,10 @@ func TestProjectsSort(t *testing.T) {
OrderBy: GetSearchOrderByBySortType(tt.sortType), OrderBy: GetSearchOrderByBySortType(tt.sortType),
}) })
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, int64(6), count) assert.Equal(t, int64(6), count)
if assert.Len(t, projects, 6) { if assert.Len(t, projects, 6) {
for i := range projects { for i := range projects {
assert.EqualValues(t, tt.wants[i], projects[i].ID) assert.Equal(t, tt.wants[i], projects[i].ID)
} }
} }
} }

View File

@ -25,8 +25,8 @@ func TestRepository_GetCollaborators(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, collaborators, int(expectedLen)) assert.Len(t, collaborators, int(expectedLen))
for _, collaborator := range collaborators { for _, collaborator := range collaborators {
assert.EqualValues(t, collaborator.User.ID, collaborator.Collaboration.UserID) assert.Equal(t, collaborator.User.ID, collaborator.Collaboration.UserID)
assert.EqualValues(t, repoID, collaborator.Collaboration.RepoID) assert.Equal(t, repoID, collaborator.Collaboration.RepoID)
} }
} }
test(1) test(1)
@ -51,7 +51,7 @@ func TestRepository_GetCollaborators(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, collaborators2, 1) assert.Len(t, collaborators2, 1)
assert.NotEqualValues(t, collaborators1[0].ID, collaborators2[0].ID) assert.NotEqual(t, collaborators1[0].ID, collaborators2[0].ID)
} }
func TestRepository_IsCollaborator(t *testing.T) { func TestRepository_IsCollaborator(t *testing.T) {
@ -76,10 +76,10 @@ func TestRepository_ChangeCollaborationAccessMode(t *testing.T) {
assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, 4, perm.AccessModeAdmin)) assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, 4, perm.AccessModeAdmin))
collaboration := unittest.AssertExistsAndLoadBean(t, &repo_model.Collaboration{RepoID: repo.ID, UserID: 4}) collaboration := unittest.AssertExistsAndLoadBean(t, &repo_model.Collaboration{RepoID: repo.ID, UserID: 4})
assert.EqualValues(t, perm.AccessModeAdmin, collaboration.Mode) assert.Equal(t, perm.AccessModeAdmin, collaboration.Mode)
access := unittest.AssertExistsAndLoadBean(t, &access_model.Access{UserID: 4, RepoID: repo.ID}) access := unittest.AssertExistsAndLoadBean(t, &access_model.Access{UserID: 4, RepoID: repo.ID})
assert.EqualValues(t, perm.AccessModeAdmin, access.Mode) assert.Equal(t, perm.AccessModeAdmin, access.Mode)
assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, 4, perm.AccessModeAdmin)) assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, 4, perm.AccessModeAdmin))

View File

@ -429,32 +429,33 @@ func (repo *Repository) MustGetUnit(ctx context.Context, tp unit.Type) *RepoUnit
return ru return ru
} }
if tp == unit.TypeExternalWiki { switch tp {
case unit.TypeExternalWiki:
return &RepoUnit{ return &RepoUnit{
Type: tp, Type: tp,
Config: new(ExternalWikiConfig), Config: new(ExternalWikiConfig),
} }
} else if tp == unit.TypeExternalTracker { case unit.TypeExternalTracker:
return &RepoUnit{ return &RepoUnit{
Type: tp, Type: tp,
Config: new(ExternalTrackerConfig), Config: new(ExternalTrackerConfig),
} }
} else if tp == unit.TypePullRequests { case unit.TypePullRequests:
return &RepoUnit{ return &RepoUnit{
Type: tp, Type: tp,
Config: new(PullRequestsConfig), Config: new(PullRequestsConfig),
} }
} else if tp == unit.TypeIssues { case unit.TypeIssues:
return &RepoUnit{ return &RepoUnit{
Type: tp, Type: tp,
Config: new(IssuesConfig), Config: new(IssuesConfig),
} }
} else if tp == unit.TypeActions { case unit.TypeActions:
return &RepoUnit{ return &RepoUnit{
Type: tp, Type: tp,
Config: new(ActionsConfig), Config: new(ActionsConfig),
} }
} else if tp == unit.TypeProjects { case unit.TypeProjects:
cfg := new(ProjectsConfig) cfg := new(ProjectsConfig)
cfg.ProjectsMode = ProjectsModeNone cfg.ProjectsMode = ProjectsModeNone
return &RepoUnit{ return &RepoUnit{

View File

@ -42,12 +42,13 @@ func (err ErrUnitTypeNotExist) Unwrap() error {
// RepoUnit describes all units of a repository // RepoUnit describes all units of a repository
type RepoUnit struct { //revive:disable-line:exported type RepoUnit struct { //revive:disable-line:exported
ID int64 ID int64
RepoID int64 `xorm:"INDEX(s)"` RepoID int64 `xorm:"INDEX(s)"`
Type unit.Type `xorm:"INDEX(s)"` Type unit.Type `xorm:"INDEX(s)"`
Config convert.Conversion `xorm:"TEXT"` Config convert.Conversion `xorm:"TEXT"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX CREATED"` CreatedUnix timeutil.TimeStamp `xorm:"INDEX CREATED"`
EveryoneAccessMode perm.AccessMode `xorm:"NOT NULL DEFAULT 0"` AnonymousAccessMode perm.AccessMode `xorm:"NOT NULL DEFAULT 0"`
EveryoneAccessMode perm.AccessMode `xorm:"NOT NULL DEFAULT 0"`
} }
func init() { func init() {
@ -341,3 +342,9 @@ func UpdateRepoUnit(ctx context.Context, unit *RepoUnit) error {
_, err := db.GetEngine(ctx).ID(unit.ID).Update(unit) _, err := db.GetEngine(ctx).ID(unit.ID).Update(unit)
return err return err
} }
func UpdateRepoUnitPublicAccess(ctx context.Context, unit *RepoUnit) error {
_, err := db.GetEngine(ctx).Where("repo_id=? AND `type`=?", unit.RepoID, unit.Type).
Cols("anonymous_access_mode", "everyone_access_mode").Update(unit)
return err
}

View File

@ -12,19 +12,19 @@ import (
func TestActionsConfig(t *testing.T) { func TestActionsConfig(t *testing.T) {
cfg := &ActionsConfig{} cfg := &ActionsConfig{}
cfg.DisableWorkflow("test1.yaml") cfg.DisableWorkflow("test1.yaml")
assert.EqualValues(t, []string{"test1.yaml"}, cfg.DisabledWorkflows) assert.Equal(t, []string{"test1.yaml"}, cfg.DisabledWorkflows)
cfg.DisableWorkflow("test1.yaml") cfg.DisableWorkflow("test1.yaml")
assert.EqualValues(t, []string{"test1.yaml"}, cfg.DisabledWorkflows) assert.Equal(t, []string{"test1.yaml"}, cfg.DisabledWorkflows)
cfg.EnableWorkflow("test1.yaml") cfg.EnableWorkflow("test1.yaml")
assert.EqualValues(t, []string{}, cfg.DisabledWorkflows) assert.Equal(t, []string{}, cfg.DisabledWorkflows)
cfg.EnableWorkflow("test1.yaml") cfg.EnableWorkflow("test1.yaml")
assert.EqualValues(t, []string{}, cfg.DisabledWorkflows) assert.Equal(t, []string{}, cfg.DisabledWorkflows)
cfg.DisableWorkflow("test1.yaml") cfg.DisableWorkflow("test1.yaml")
cfg.DisableWorkflow("test2.yaml") cfg.DisableWorkflow("test2.yaml")
cfg.DisableWorkflow("test3.yaml") cfg.DisableWorkflow("test3.yaml")
assert.EqualValues(t, "test1.yaml,test2.yaml,test3.yaml", cfg.ToString()) assert.Equal(t, "test1.yaml,test2.yaml,test3.yaml", cfg.ToString())
} }

View File

@ -53,7 +53,7 @@ func TestAddTopic(t *testing.T) {
totalNrOfTopics++ totalNrOfTopics++
topic, err := repo_model.GetTopicByName(db.DefaultContext, "gitea") topic, err := repo_model.GetTopicByName(db.DefaultContext, "gitea")
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, topic.RepoCount) assert.Equal(t, 1, topic.RepoCount)
topics, err = db.Find[repo_model.Topic](db.DefaultContext, &repo_model.FindTopicOptions{}) topics, err = db.Find[repo_model.Topic](db.DefaultContext, &repo_model.FindTopicOptions{})
assert.NoError(t, err) assert.NoError(t, err)

View File

@ -36,7 +36,7 @@ func TestGetWatchers(t *testing.T) {
// One watchers are inactive, thus minus 1 // One watchers are inactive, thus minus 1
assert.Len(t, watches, repo.NumWatches-1) assert.Len(t, watches, repo.NumWatches-1)
for _, watch := range watches { for _, watch := range watches {
assert.EqualValues(t, repo.ID, watch.RepoID) assert.Equal(t, repo.ID, watch.RepoID)
} }
watches, err = repo_model.GetWatchers(db.DefaultContext, unittest.NonexistentID) watches, err = repo_model.GetWatchers(db.DefaultContext, unittest.NonexistentID)

View File

@ -29,10 +29,10 @@ func Test_repoStatsCorrectIssueNumComments(t *testing.T) {
issue2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) issue2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
assert.NotNil(t, issue2) assert.NotNil(t, issue2)
assert.EqualValues(t, 0, issue2.NumComments) // the fixture data is wrong, but we don't fix it here assert.Equal(t, 0, issue2.NumComments) // the fixture data is wrong, but we don't fix it here
assert.NoError(t, repoStatsCorrectIssueNumComments(db.DefaultContext, 2)) assert.NoError(t, repoStatsCorrectIssueNumComments(db.DefaultContext, 2))
// reload the issue // reload the issue
issue2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) issue2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
assert.EqualValues(t, 1, issue2.NumComments) assert.Equal(t, 1, issue2.NumComments)
} }

View File

@ -21,24 +21,24 @@ func TestSettings(t *testing.T) {
rev, settings, err := system.GetAllSettings(db.DefaultContext) rev, settings, err := system.GetAllSettings(db.DefaultContext)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, rev) assert.Equal(t, 1, rev)
assert.Len(t, settings, 1) // there is only one "revision" key assert.Len(t, settings, 1) // there is only one "revision" key
err = system.SetSettings(db.DefaultContext, map[string]string{keyName: "true"}) err = system.SetSettings(db.DefaultContext, map[string]string{keyName: "true"})
assert.NoError(t, err) assert.NoError(t, err)
rev, settings, err = system.GetAllSettings(db.DefaultContext) rev, settings, err = system.GetAllSettings(db.DefaultContext)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 2, rev) assert.Equal(t, 2, rev)
assert.Len(t, settings, 2) assert.Len(t, settings, 2)
assert.EqualValues(t, "true", settings[keyName]) assert.Equal(t, "true", settings[keyName])
err = system.SetSettings(db.DefaultContext, map[string]string{keyName: "false"}) err = system.SetSettings(db.DefaultContext, map[string]string{keyName: "false"})
assert.NoError(t, err) assert.NoError(t, err)
rev, settings, err = system.GetAllSettings(db.DefaultContext) rev, settings, err = system.GetAllSettings(db.DefaultContext)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 3, rev) assert.Equal(t, 3, rev)
assert.Len(t, settings, 2) assert.Len(t, settings, 2)
assert.EqualValues(t, "false", settings[keyName]) assert.Equal(t, "false", settings[keyName])
// setting the same value should not trigger DuplicateKey error, and the "version" should be increased // setting the same value should not trigger DuplicateKey error, and the "version" should be increased
err = system.SetSettings(db.DefaultContext, map[string]string{keyName: "false"}) err = system.SetSettings(db.DefaultContext, map[string]string{keyName: "false"})
@ -47,5 +47,5 @@ func TestSettings(t *testing.T) {
rev, settings, err = system.GetAllSettings(db.DefaultContext) rev, settings, err = system.GetAllSettings(db.DefaultContext)
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, settings, 2) assert.Len(t, settings, 2)
assert.EqualValues(t, 4, rev) assert.Equal(t, 4, rev)
} }

View File

@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"xorm.io/builder" "xorm.io/builder"
) )
@ -24,7 +25,7 @@ const (
var consistencyCheckMap = make(map[string]func(t assert.TestingT, bean any)) var consistencyCheckMap = make(map[string]func(t assert.TestingT, bean any))
// CheckConsistencyFor test that all matching database entries are consistent // CheckConsistencyFor test that all matching database entries are consistent
func CheckConsistencyFor(t assert.TestingT, beansToCheck ...any) { func CheckConsistencyFor(t require.TestingT, beansToCheck ...any) {
for _, bean := range beansToCheck { for _, bean := range beansToCheck {
sliceType := reflect.SliceOf(reflect.TypeOf(bean)) sliceType := reflect.SliceOf(reflect.TypeOf(bean))
sliceValue := reflect.MakeSlice(sliceType, 0, 10) sliceValue := reflect.MakeSlice(sliceType, 0, 10)
@ -42,13 +43,11 @@ func CheckConsistencyFor(t assert.TestingT, beansToCheck ...any) {
} }
} }
func checkForConsistency(t assert.TestingT, bean any) { func checkForConsistency(t require.TestingT, bean any) {
tb, err := db.TableInfo(bean) tb, err := db.TableInfo(bean)
assert.NoError(t, err) assert.NoError(t, err)
f := consistencyCheckMap[tb.Name] f := consistencyCheckMap[tb.Name]
if f == nil { require.NotNil(t, f, "unknown bean type: %#v", bean)
assert.FailNow(t, "unknown bean type: %#v", bean)
}
f(t, bean) f(t, bean)
} }
@ -71,8 +70,8 @@ func init() {
AssertCountByCond(t, "follow", builder.Eq{"user_id": user.int("ID")}, user.int("NumFollowing")) AssertCountByCond(t, "follow", builder.Eq{"user_id": user.int("ID")}, user.int("NumFollowing"))
AssertCountByCond(t, "follow", builder.Eq{"follow_id": user.int("ID")}, user.int("NumFollowers")) AssertCountByCond(t, "follow", builder.Eq{"follow_id": user.int("ID")}, user.int("NumFollowers"))
if user.int("Type") != modelsUserTypeOrganization { if user.int("Type") != modelsUserTypeOrganization {
assert.EqualValues(t, 0, user.int("NumMembers"), "Unexpected number of members for user id: %d", user.int("ID")) assert.Equal(t, 0, user.int("NumMembers"), "Unexpected number of members for user id: %d", user.int("ID"))
assert.EqualValues(t, 0, user.int("NumTeams"), "Unexpected number of teams for user id: %d", user.int("ID")) assert.Equal(t, 0, user.int("NumTeams"), "Unexpected number of teams for user id: %d", user.int("ID"))
} }
} }
@ -119,7 +118,7 @@ func init() {
assert.EqualValues(t, issue.int("NumComments"), actual, "Unexpected number of comments for issue id: %d", issue.int("ID")) assert.EqualValues(t, issue.int("NumComments"), actual, "Unexpected number of comments for issue id: %d", issue.int("ID"))
if issue.bool("IsPull") { if issue.bool("IsPull") {
prRow := AssertExistsAndLoadMap(t, "pull_request", builder.Eq{"issue_id": issue.int("ID")}) prRow := AssertExistsAndLoadMap(t, "pull_request", builder.Eq{"issue_id": issue.int("ID")})
assert.EqualValues(t, parseInt(prRow["index"]), issue.int("Index"), "Unexpected index for issue id: %d", issue.int("ID")) assert.Equal(t, parseInt(prRow["index"]), issue.int("Index"), "Unexpected index for issue id: %d", issue.int("ID"))
} }
} }
@ -127,7 +126,7 @@ func init() {
pr := reflectionWrap(bean) pr := reflectionWrap(bean)
issueRow := AssertExistsAndLoadMap(t, "issue", builder.Eq{"id": pr.int("IssueID")}) issueRow := AssertExistsAndLoadMap(t, "issue", builder.Eq{"id": pr.int("IssueID")})
assert.True(t, parseBool(issueRow["is_pull"])) assert.True(t, parseBool(issueRow["is_pull"]))
assert.EqualValues(t, parseInt(issueRow["index"]), pr.int("Index"), "Unexpected index for pull request id: %d", pr.int("ID")) assert.Equal(t, parseInt(issueRow["index"]), pr.int("Index"), "Unexpected index for pull request id: %d", pr.int("ID"))
} }
checkForMilestoneConsistency := func(t assert.TestingT, bean any) { checkForMilestoneConsistency := func(t assert.TestingT, bean any) {

View File

@ -28,7 +28,7 @@ func SyncFile(srcPath, destPath string) error {
} }
if src.Size() == dest.Size() && if src.Size() == dest.Size() &&
src.ModTime() == dest.ModTime() && src.ModTime().Equal(dest.ModTime()) &&
src.Mode() == dest.Mode() { src.Mode() == dest.Mode() {
return nil return nil
} }

View File

@ -205,7 +205,7 @@ func TestEmailAddressValidate(t *testing.T) {
} }
for kase, err := range kases { for kase, err := range kases {
t.Run(kase, func(t *testing.T) { t.Run(kase, func(t *testing.T) {
assert.EqualValues(t, err, user_model.ValidateEmail(kase)) assert.Equal(t, err, user_model.ValidateEmail(kase))
}) })
} }
} }

View File

@ -45,13 +45,14 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess
var cond builder.Cond var cond builder.Cond
cond = builder.Eq{"type": opts.Type} cond = builder.Eq{"type": opts.Type}
if opts.IncludeReserved { if opts.IncludeReserved {
if opts.Type == UserTypeIndividual { switch opts.Type {
case UserTypeIndividual:
cond = cond.Or(builder.Eq{"type": UserTypeUserReserved}).Or( cond = cond.Or(builder.Eq{"type": UserTypeUserReserved}).Or(
builder.Eq{"type": UserTypeBot}, builder.Eq{"type": UserTypeBot},
).Or( ).Or(
builder.Eq{"type": UserTypeRemoteUser}, builder.Eq{"type": UserTypeRemoteUser},
) )
} else if opts.Type == UserTypeOrganization { case UserTypeOrganization:
cond = cond.Or(builder.Eq{"type": UserTypeOrganizationReserved}) cond = cond.Or(builder.Eq{"type": UserTypeOrganizationReserved})
} }
} }

View File

@ -30,15 +30,15 @@ func TestSettings(t *testing.T) {
settings, err := user_model.GetSettings(db.DefaultContext, 99, []string{keyName}) settings, err := user_model.GetSettings(db.DefaultContext, 99, []string{keyName})
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, settings, 1) assert.Len(t, settings, 1)
assert.EqualValues(t, newSetting.SettingValue, settings[keyName].SettingValue) assert.Equal(t, newSetting.SettingValue, settings[keyName].SettingValue)
settingValue, err := user_model.GetUserSetting(db.DefaultContext, 99, keyName) settingValue, err := user_model.GetUserSetting(db.DefaultContext, 99, keyName)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, newSetting.SettingValue, settingValue) assert.Equal(t, newSetting.SettingValue, settingValue)
settingValue, err = user_model.GetUserSetting(db.DefaultContext, 99, "no_such") settingValue, err = user_model.GetUserSetting(db.DefaultContext, 99, "no_such")
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "", settingValue) assert.Empty(t, settingValue)
// updated setting // updated setting
updatedSetting := &user_model.Setting{UserID: 99, SettingKey: keyName, SettingValue: "Updated"} updatedSetting := &user_model.Setting{UserID: 99, SettingKey: keyName, SettingValue: "Updated"}
@ -49,7 +49,7 @@ func TestSettings(t *testing.T) {
settings, err = user_model.GetUserAllSettings(db.DefaultContext, 99) settings, err = user_model.GetUserAllSettings(db.DefaultContext, 99)
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, settings, 1) assert.Len(t, settings, 1)
assert.EqualValues(t, updatedSetting.SettingValue, settings[updatedSetting.SettingKey].SettingValue) assert.Equal(t, updatedSetting.SettingValue, settings[updatedSetting.SettingKey].SettingValue)
// delete setting // delete setting
err = user_model.DeleteUserSetting(db.DefaultContext, 99, keyName) err = user_model.DeleteUserSetting(db.DefaultContext, 99, keyName)

View File

@ -83,7 +83,7 @@ func TestSearchUsers(t *testing.T) {
cassText := fmt.Sprintf("ids: %v, opts: %v", expectedUserOrOrgIDs, opts) cassText := fmt.Sprintf("ids: %v, opts: %v", expectedUserOrOrgIDs, opts)
if assert.Len(t, users, len(expectedUserOrOrgIDs), "case: %s", cassText) { if assert.Len(t, users, len(expectedUserOrOrgIDs), "case: %s", cassText) {
for i, expectedID := range expectedUserOrOrgIDs { for i, expectedID := range expectedUserOrOrgIDs {
assert.EqualValues(t, expectedID, users[i].ID, "case: %s", cassText) assert.Equal(t, expectedID, users[i].ID, "case: %s", cassText)
} }
} }
} }
@ -513,7 +513,7 @@ func Test_ValidateUser(t *testing.T) {
{ID: 2, Visibility: structs.VisibleTypePrivate}: true, {ID: 2, Visibility: structs.VisibleTypePrivate}: true,
} }
for kase, expected := range kases { for kase, expected := range kases {
assert.EqualValues(t, expected, nil == user_model.ValidateUser(kase), "case: %+v", kase) assert.Equal(t, expected, nil == user_model.ValidateUser(kase), "case: %+v", kase)
} }
} }
@ -537,7 +537,7 @@ func Test_NormalizeUserFromEmail(t *testing.T) {
for _, testCase := range testCases { for _, testCase := range testCases {
normalizedName, err := user_model.NormalizeUserName(testCase.Input) normalizedName, err := user_model.NormalizeUserName(testCase.Input)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, testCase.Expected, normalizedName) assert.Equal(t, testCase.Expected, normalizedName)
if testCase.IsNormalizedValid { if testCase.IsNormalizedValid {
assert.NoError(t, user_model.IsUsableUsername(normalizedName)) assert.NoError(t, user_model.IsUsableUsername(normalizedName))
} else { } else {
@ -564,7 +564,7 @@ func TestEmailTo(t *testing.T) {
for _, testCase := range testCases { for _, testCase := range testCases {
t.Run(testCase.result, func(t *testing.T) { t.Run(testCase.result, func(t *testing.T) {
testUser := &user_model.User{FullName: testCase.fullName, Email: testCase.mail} testUser := &user_model.User{FullName: testCase.fullName, Email: testCase.mail}
assert.EqualValues(t, testCase.result, testUser.EmailTo()) assert.Equal(t, testCase.result, testUser.EmailTo())
}) })
} }
} }

View File

@ -198,7 +198,8 @@ func MarkTaskDelivered(ctx context.Context, task *HookTask) (bool, error) {
func CleanupHookTaskTable(ctx context.Context, cleanupType HookTaskCleanupType, olderThan time.Duration, numberToKeep int) error { func CleanupHookTaskTable(ctx context.Context, cleanupType HookTaskCleanupType, olderThan time.Duration, numberToKeep int) error {
log.Trace("Doing: CleanupHookTaskTable") log.Trace("Doing: CleanupHookTaskTable")
if cleanupType == OlderThan { switch cleanupType {
case OlderThan:
deleteOlderThan := time.Now().Add(-olderThan).UnixNano() deleteOlderThan := time.Now().Add(-olderThan).UnixNano()
deletes, err := db.GetEngine(ctx). deletes, err := db.GetEngine(ctx).
Where("is_delivered = ? and delivered < ?", true, deleteOlderThan). Where("is_delivered = ? and delivered < ?", true, deleteOlderThan).
@ -207,7 +208,7 @@ func CleanupHookTaskTable(ctx context.Context, cleanupType HookTaskCleanupType,
return err return err
} }
log.Trace("Deleted %d rows from hook_task", deletes) log.Trace("Deleted %d rows from hook_task", deletes)
} else if cleanupType == PerWebhook { case PerWebhook:
hookIDs := make([]int64, 0, 10) hookIDs := make([]int64, 0, 10)
err := db.GetEngine(ctx). err := db.GetEngine(ctx).
Table("webhook"). Table("webhook").

View File

@ -67,7 +67,7 @@ func TestWebhook_UpdateEvent(t *testing.T) {
} }
func TestWebhook_EventsArray(t *testing.T) { func TestWebhook_EventsArray(t *testing.T) {
assert.EqualValues(t, []string{ assert.Equal(t, []string{
"create", "delete", "fork", "push", "create", "delete", "fork", "push",
"issues", "issue_assign", "issue_label", "issue_milestone", "issue_comment", "issues", "issue_assign", "issue_label", "issue_milestone", "issue_comment",
"pull_request", "pull_request_assign", "pull_request_label", "pull_request_milestone", "pull_request", "pull_request_assign", "pull_request_label", "pull_request_milestone",

View File

@ -52,7 +52,7 @@ func TestLayered(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
bs, err := io.ReadAll(f) bs, err := io.ReadAll(f)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "f1", string(bs)) assert.Equal(t, "f1", string(bs))
_ = f.Close() _ = f.Close()
assertRead := func(expected string, expectedErr error, elems ...string) { assertRead := func(expected string, expectedErr error, elems ...string) {
@ -76,27 +76,27 @@ func TestLayered(t *testing.T) {
files, err := assets.ListFiles(".", true) files, err := assets.ListFiles(".", true)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, []string{"f1", "f2", "fa"}, files) assert.Equal(t, []string{"f1", "f2", "fa"}, files)
files, err = assets.ListFiles(".", false) files, err = assets.ListFiles(".", false)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, []string{"d1", "d2", "da"}, files) assert.Equal(t, []string{"d1", "d2", "da"}, files)
files, err = assets.ListFiles(".") files, err = assets.ListFiles(".")
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, []string{"d1", "d2", "da", "f1", "f2", "fa"}, files) assert.Equal(t, []string{"d1", "d2", "da", "f1", "f2", "fa"}, files)
files, err = assets.ListAllFiles(".", true) files, err = assets.ListAllFiles(".", true)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, []string{"d1/f", "d2/f", "da/f", "f1", "f2", "fa"}, files) assert.Equal(t, []string{"d1/f", "d2/f", "da/f", "f1", "f2", "fa"}, files)
files, err = assets.ListAllFiles(".", false) files, err = assets.ListAllFiles(".", false)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, []string{"d1", "d2", "da", "da/sub1", "da/sub2"}, files) assert.Equal(t, []string{"d1", "d2", "da", "da/sub1", "da/sub2"}, files)
files, err = assets.ListAllFiles(".") files, err = assets.ListAllFiles(".")
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, []string{ assert.Equal(t, []string{
"d1", "d1/f", "d1", "d1/f",
"d2", "d2/f", "d2", "d2/f",
"da", "da/f", "da/sub1", "da/sub2", "da", "da/f", "da/sub1", "da/sub2",
@ -104,6 +104,6 @@ func TestLayered(t *testing.T) {
}, files) }, files)
assert.Empty(t, assets.GetFileLayerName("no-such")) assert.Empty(t, assets.GetFileLayerName("no-such"))
assert.EqualValues(t, "l1", assets.GetFileLayerName("f1")) assert.Equal(t, "l1", assets.GetFileLayerName("f1"))
assert.EqualValues(t, "l2", assets.GetFileLayerName("f2")) assert.Equal(t, "l2", assets.GetFileLayerName("f2"))
} }

View File

@ -94,8 +94,8 @@ func Test_ProcessAvatarImage(t *testing.T) {
assert.NotEqual(t, origin, result) assert.NotEqual(t, origin, result)
decoded, err := png.Decode(bytes.NewReader(result)) decoded, err := png.Decode(bytes.NewReader(result))
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, scaledSize, decoded.Bounds().Max.X) assert.Equal(t, scaledSize, decoded.Bounds().Max.X)
assert.EqualValues(t, scaledSize, decoded.Bounds().Max.Y) assert.Equal(t, scaledSize, decoded.Bounds().Max.Y)
// if origin image is smaller than the default size, use the origin image // if origin image is smaller than the default size, use the origin image
origin = newImgData(1) origin = newImgData(1)

View File

@ -19,8 +19,8 @@ func Test_HashAvatar(t *testing.T) {
var buff bytes.Buffer var buff bytes.Buffer
png.Encode(&buff, myImage) png.Encode(&buff, myImage)
assert.EqualValues(t, "9ddb5bac41d57e72aa876321d0c09d71090c05f94bc625303801be2f3240d2cb", avatar.HashAvatar(1, buff.Bytes())) assert.Equal(t, "9ddb5bac41d57e72aa876321d0c09d71090c05f94bc625303801be2f3240d2cb", avatar.HashAvatar(1, buff.Bytes()))
assert.EqualValues(t, "9a5d44e5d637b9582a976676e8f3de1dccd877c2fe3e66ca3fab1629f2f47609", avatar.HashAvatar(8, buff.Bytes())) assert.Equal(t, "9a5d44e5d637b9582a976676e8f3de1dccd877c2fe3e66ca3fab1629f2f47609", avatar.HashAvatar(8, buff.Bytes()))
assert.EqualValues(t, "ed7399158672088770de6f5211ce15528ebd675e92fc4fc060c025f4b2794ccb", avatar.HashAvatar(1024, buff.Bytes())) assert.Equal(t, "ed7399158672088770de6f5211ce15528ebd675e92fc4fc060c025f4b2794ccb", avatar.HashAvatar(1024, buff.Bytes()))
assert.EqualValues(t, "161178642c7d59eb25a61dddced5e6b66eae1c70880d5f148b1b497b767e72d9", avatar.HashAvatar(1024, []byte{})) assert.Equal(t, "161178642c7d59eb25a61dddced5e6b66eae1c70880d5f148b1b497b767e72d9", avatar.HashAvatar(1024, []byte{}))
} }

View File

@ -4,6 +4,9 @@
package badge package badge
import ( import (
"strings"
"unicode"
actions_model "code.gitea.io/gitea/models/actions" actions_model "code.gitea.io/gitea/models/actions"
) )
@ -11,54 +14,35 @@ import (
// We use 10x scale to calculate more precisely // We use 10x scale to calculate more precisely
// Then scale down to normal size in tmpl file // Then scale down to normal size in tmpl file
type Label struct { type Text struct {
text string
width int
}
func (l Label) Text() string {
return l.text
}
func (l Label) Width() int {
return l.width
}
func (l Label) TextLength() int {
return int(float64(l.width-defaultOffset) * 9.5)
}
func (l Label) X() int {
return l.width*5 + 10
}
type Message struct {
text string text string
width int width int
x int x int
} }
func (m Message) Text() string { func (t Text) Text() string {
return m.text return t.text
} }
func (m Message) Width() int { func (t Text) Width() int {
return m.width return t.width
} }
func (m Message) X() int { func (t Text) X() int {
return m.x return t.x
} }
func (m Message) TextLength() int { func (t Text) TextLength() int {
return int(float64(m.width-defaultOffset) * 9.5) return int(float64(t.width-defaultOffset) * 10)
} }
type Badge struct { type Badge struct {
Color string IDPrefix string
FontSize int FontFamily string
Label Label Color string
Message Message FontSize int
Label Text
Message Text
} }
func (b Badge) Width() int { func (b Badge) Width() int {
@ -66,10 +50,10 @@ func (b Badge) Width() int {
} }
const ( const (
defaultOffset = 9 defaultOffset = 10
defaultFontSize = 11 defaultFontSize = 11
DefaultColor = "#9f9f9f" // Grey DefaultColor = "#9f9f9f" // Grey
defaultFontWidth = 7 // approximate speculation DefaultFontFamily = "DejaVu Sans,Verdana,Geneva,sans-serif"
) )
var StatusColorMap = map[actions_model.Status]string{ var StatusColorMap = map[actions_model.Status]string{
@ -85,20 +69,43 @@ var StatusColorMap = map[actions_model.Status]string{
// GenerateBadge generates badge with given template // GenerateBadge generates badge with given template
func GenerateBadge(label, message, color string) Badge { func GenerateBadge(label, message, color string) Badge {
lw := defaultFontWidth*len(label) + defaultOffset lw := calculateTextWidth(label) + defaultOffset
mw := defaultFontWidth*len(message) + defaultOffset mw := calculateTextWidth(message) + defaultOffset
x := lw*10 + mw*5 - 10
lx := lw * 5
mx := lw*10 + mw*5 - 10
return Badge{ return Badge{
Label: Label{ FontFamily: DefaultFontFamily,
Label: Text{
text: label, text: label,
width: lw, width: lw,
x: lx,
}, },
Message: Message{ Message: Text{
text: message, text: message,
width: mw, width: mw,
x: x, x: mx,
}, },
FontSize: defaultFontSize * 10, FontSize: defaultFontSize * 10,
Color: color, Color: color,
} }
} }
func calculateTextWidth(text string) int {
width := 0
widthData := DejaVuGlyphWidthData()
for _, char := range strings.TrimSpace(text) {
charWidth, ok := widthData[char]
if !ok {
// use the width of 'm' in case of missing glyph width data for a printable character
if unicode.IsPrint(char) {
charWidth = widthData['m']
} else {
charWidth = 0
}
}
width += int(charWidth)
}
return width
}

View File

@ -0,0 +1,208 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package badge
import "sync"
// DejaVuGlyphWidthData is generated by `sfnt.Face.GlyphAdvance(nil, <rune>, 11, font.HintingNone)` with DejaVu Sans
// v2.37 (https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip).
//
// Fonts defined in "DefaultFontFamily" all have similar widths (including "DejaVu Sans"),
// and these widths are fixed and don't seem to change.
//
// A devtest page "/devtest/badge-actions-svg" could be used to check the rendered images.
var DejaVuGlyphWidthData = sync.OnceValue(func() map[rune]uint8 {
return map[rune]uint8{
32: 3,
33: 4,
34: 5,
35: 9,
36: 7,
37: 10,
38: 9,
39: 3,
40: 4,
41: 4,
42: 6,
43: 9,
44: 3,
45: 4,
46: 3,
47: 4,
48: 7,
49: 7,
50: 7,
51: 7,
52: 7,
53: 7,
54: 7,
55: 7,
56: 7,
57: 7,
58: 4,
59: 4,
60: 9,
61: 9,
62: 9,
63: 6,
64: 11,
65: 8,
66: 8,
67: 8,
68: 8,
69: 7,
70: 6,
71: 9,
72: 8,
73: 3,
74: 3,
75: 7,
76: 6,
77: 9,
78: 8,
79: 9,
80: 7,
81: 9,
82: 8,
83: 7,
84: 7,
85: 8,
86: 8,
87: 11,
88: 8,
89: 7,
90: 8,
91: 4,
92: 4,
93: 4,
94: 9,
95: 6,
96: 6,
97: 7,
98: 7,
99: 6,
100: 7,
101: 7,
102: 4,
103: 7,
104: 7,
105: 3,
106: 3,
107: 6,
108: 3,
109: 11,
110: 7,
111: 7,
112: 7,
113: 7,
114: 5,
115: 6,
116: 4,
117: 7,
118: 7,
119: 9,
120: 7,
121: 7,
122: 6,
123: 7,
124: 4,
125: 7,
126: 9,
161: 4,
162: 7,
163: 7,
164: 7,
165: 7,
166: 4,
167: 6,
168: 6,
169: 11,
170: 5,
171: 7,
172: 9,
174: 11,
175: 6,
176: 6,
177: 9,
178: 4,
179: 4,
180: 6,
181: 7,
182: 7,
183: 3,
184: 6,
185: 4,
186: 5,
187: 7,
188: 11,
189: 11,
190: 11,
191: 6,
192: 8,
193: 8,
194: 8,
195: 8,
196: 8,
197: 8,
198: 11,
199: 8,
200: 7,
201: 7,
202: 7,
203: 7,
204: 3,
205: 3,
206: 3,
207: 3,
208: 9,
209: 8,
210: 9,
211: 9,
212: 9,
213: 9,
214: 9,
215: 9,
216: 9,
217: 8,
218: 8,
219: 8,
220: 8,
221: 7,
222: 7,
223: 7,
224: 7,
225: 7,
226: 7,
227: 7,
228: 7,
229: 7,
230: 11,
231: 6,
232: 7,
233: 7,
234: 7,
235: 7,
236: 3,
237: 3,
238: 3,
239: 3,
240: 7,
241: 7,
242: 7,
243: 7,
244: 7,
245: 7,
246: 7,
247: 9,
248: 7,
249: 7,
250: 7,
251: 7,
252: 7,
253: 7,
254: 7,
255: 7,
}
})

View File

@ -60,19 +60,19 @@ func TestGetString(t *testing.T) {
return "", fmt.Errorf("some error") return "", fmt.Errorf("some error")
}) })
assert.Error(t, err) assert.Error(t, err)
assert.Equal(t, "", data) assert.Empty(t, data)
data, err = GetString("key", func() (string, error) { data, err = GetString("key", func() (string, error) {
return "", nil return "", nil
}) })
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, "", data) assert.Empty(t, data)
data, err = GetString("key", func() (string, error) { data, err = GetString("key", func() (string, error) {
return "some data", nil return "some data", nil
}) })
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, "", data) assert.Empty(t, data)
Remove("key") Remove("key")
data, err = GetString("key", func() (string, error) { data, err = GetString("key", func() (string, error) {

View File

@ -22,7 +22,7 @@ func TestWithCacheContext(t *testing.T) {
SetContextData(ctx, field, "my_config1", 1) SetContextData(ctx, field, "my_config1", 1)
v = GetContextData(ctx, field, "my_config1") v = GetContextData(ctx, field, "my_config1")
assert.NotNil(t, v) assert.NotNil(t, v)
assert.EqualValues(t, 1, v.(int)) assert.Equal(t, 1, v.(int))
RemoveContextData(ctx, field, "my_config1") RemoveContextData(ctx, field, "my_config1")
RemoveContextData(ctx, field, "my_config2") // remove a non-exist key RemoveContextData(ctx, field, "my_config2") // remove a non-exist key
@ -34,7 +34,7 @@ func TestWithCacheContext(t *testing.T) {
return 1, nil return 1, nil
}) })
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, vInt) assert.Equal(t, 1, vInt)
v = GetContextData(ctx, field, "my_config1") v = GetContextData(ctx, field, "my_config1")
assert.EqualValues(t, 1, v) assert.EqualValues(t, 1, v)

View File

@ -14,7 +14,7 @@ import (
func TestAmbiguousCharacters(t *testing.T) { func TestAmbiguousCharacters(t *testing.T) {
for locale, ambiguous := range AmbiguousCharacters { for locale, ambiguous := range AmbiguousCharacters {
assert.Equal(t, locale, ambiguous.Locale) assert.Equal(t, locale, ambiguous.Locale)
assert.Equal(t, len(ambiguous.Confusable), len(ambiguous.With)) assert.Len(t, ambiguous.With, len(ambiguous.Confusable))
assert.True(t, sort.SliceIsSorted(ambiguous.Confusable, func(i, j int) bool { assert.True(t, sort.SliceIsSorted(ambiguous.Confusable, func(i, j int) bool {
return ambiguous.Confusable[i] < ambiguous.Confusable[j] return ambiguous.Confusable[i] < ambiguous.Confusable[j]
})) }))

View File

@ -252,7 +252,7 @@ func TestToUTF8WithFallbackReader(t *testing.T) {
input += "// Выключаем" input += "// Выключаем"
rd := ToUTF8WithFallbackReader(bytes.NewReader([]byte(input)), ConvertOpts{}) rd := ToUTF8WithFallbackReader(bytes.NewReader([]byte(input)), ConvertOpts{})
r, _ := io.ReadAll(rd) r, _ := io.ReadAll(rd)
assert.EqualValuesf(t, input, string(r), "testing string len=%d", testLen) assert.Equalf(t, input, string(r), "testing string len=%d", testLen)
} }
truncatedOneByteExtension := failFastBytes truncatedOneByteExtension := failFastBytes

View File

@ -99,10 +99,10 @@ j, ,\x20
for n, c := range cases { for n, c := range cases {
rd, err := CreateReaderAndDetermineDelimiter(nil, strings.NewReader(decodeSlashes(t, c.csv))) rd, err := CreateReaderAndDetermineDelimiter(nil, strings.NewReader(decodeSlashes(t, c.csv)))
assert.NoError(t, err, "case %d: should not throw error: %v\n", n, err) assert.NoError(t, err, "case %d: should not throw error: %v\n", n, err)
assert.EqualValues(t, c.expectedDelimiter, rd.Comma, "case %d: delimiter should be '%c', got '%c'", n, c.expectedDelimiter, rd.Comma) assert.Equal(t, c.expectedDelimiter, rd.Comma, "case %d: delimiter should be '%c', got '%c'", n, c.expectedDelimiter, rd.Comma)
rows, err := rd.ReadAll() rows, err := rd.ReadAll()
assert.NoError(t, err, "case %d: should not throw error: %v\n", n, err) assert.NoError(t, err, "case %d: should not throw error: %v\n", n, err)
assert.EqualValues(t, c.expectedRows, rows, "case %d: rows should be equal", n) assert.Equal(t, c.expectedRows, rows, "case %d: rows should be equal", n)
} }
} }
@ -231,7 +231,7 @@ John Doe john@doe.com This,note,had,a,lot,of,commas,to,test,delimiters`,
for n, c := range cases { for n, c := range cases {
delimiter := determineDelimiter(markup.NewRenderContext(t.Context()).WithRelativePath(c.filename), []byte(decodeSlashes(t, c.csv))) delimiter := determineDelimiter(markup.NewRenderContext(t.Context()).WithRelativePath(c.filename), []byte(decodeSlashes(t, c.csv)))
assert.EqualValues(t, c.expectedDelimiter, delimiter, "case %d: delimiter should be equal, expected '%c' got '%c'", n, c.expectedDelimiter, delimiter) assert.Equal(t, c.expectedDelimiter, delimiter, "case %d: delimiter should be equal, expected '%c' got '%c'", n, c.expectedDelimiter, delimiter)
} }
} }
@ -296,7 +296,7 @@ abc | |123
for n, c := range cases { for n, c := range cases {
modifiedText := removeQuotedString(decodeSlashes(t, c.text)) modifiedText := removeQuotedString(decodeSlashes(t, c.text))
assert.EqualValues(t, c.expectedText, modifiedText, "case %d: modified text should be equal", n) assert.Equal(t, c.expectedText, modifiedText, "case %d: modified text should be equal", n)
} }
} }
@ -451,7 +451,7 @@ jkl`,
for n, c := range cases { for n, c := range cases {
delimiter := guessDelimiter([]byte(decodeSlashes(t, c.csv))) delimiter := guessDelimiter([]byte(decodeSlashes(t, c.csv)))
assert.EqualValues(t, c.expectedDelimiter, delimiter, "case %d: delimiter should be equal, expected '%c' got '%c'", n, c.expectedDelimiter, delimiter) assert.Equal(t, c.expectedDelimiter, delimiter, "case %d: delimiter should be equal, expected '%c' got '%c'", n, c.expectedDelimiter, delimiter)
} }
} }
@ -543,7 +543,7 @@ a|"he said, ""here I am"""`,
for n, c := range cases { for n, c := range cases {
delimiter := guessFromBeforeAfterQuotes([]byte(decodeSlashes(t, c.csv))) delimiter := guessFromBeforeAfterQuotes([]byte(decodeSlashes(t, c.csv)))
assert.EqualValues(t, c.expectedDelimiter, delimiter, "case %d: delimiter should be equal, expected '%c' got '%c'", n, c.expectedDelimiter, delimiter) assert.Equal(t, c.expectedDelimiter, delimiter, "case %d: delimiter should be equal, expected '%c' got '%c'", n, c.expectedDelimiter, delimiter)
} }
} }
@ -579,7 +579,7 @@ func TestFormatError(t *testing.T) {
assert.Error(t, err, "case %d: expected an error to be returned", n) assert.Error(t, err, "case %d: expected an error to be returned", n)
} else { } else {
assert.NoError(t, err, "case %d: no error was expected, got error: %v", n, err) assert.NoError(t, err, "case %d: no error was expected, got error: %v", n, err)
assert.EqualValues(t, c.expectedMessage, message, "case %d: messages should be equal, expected '%s' got '%s'", n, c.expectedMessage, message) assert.Equal(t, c.expectedMessage, message, "case %d: messages should be equal, expected '%s' got '%s'", n, c.expectedMessage, message)
} }
} }
} }

View File

@ -103,11 +103,11 @@ func TestDumper(t *testing.T) {
d.GlobalExcludeAbsPath(filepath.Join(tmpDir, "include/exclude1")) d.GlobalExcludeAbsPath(filepath.Join(tmpDir, "include/exclude1"))
err := d.AddRecursiveExclude("include", filepath.Join(tmpDir, "include"), []string{filepath.Join(tmpDir, "include/exclude2")}) err := d.AddRecursiveExclude("include", filepath.Join(tmpDir, "include"), []string{filepath.Join(tmpDir, "include/exclude2")})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, sortStrings([]string{"include/a", "include/sub", "include/sub/b"}), sortStrings(tw.added)) assert.Equal(t, sortStrings([]string{"include/a", "include/sub", "include/sub/b"}), sortStrings(tw.added))
tw = &testWriter{} tw = &testWriter{}
d = &Dumper{Writer: tw} d = &Dumper{Writer: tw}
err = d.AddRecursiveExclude("include", filepath.Join(tmpDir, "include"), nil) err = d.AddRecursiveExclude("include", filepath.Join(tmpDir, "include"), nil)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, sortStrings([]string{"include/exclude2", "include/exclude2/a-2", "include/a", "include/sub", "include/sub/b", "include/exclude1", "include/exclude1/a-1"}), sortStrings(tw.added)) assert.Equal(t, sortStrings([]string{"include/exclude2", "include/exclude2/a-2", "include/a", "include/sub", "include/sub/b", "include/exclude1", "include/exclude1/a-1"}), sortStrings(tw.added))
} }

View File

@ -14,25 +14,26 @@ type Batch struct {
Writer WriteCloserError Writer WriteCloserError
} }
func (repo *Repository) NewBatch(ctx context.Context) (*Batch, error) { // NewBatch creates a new batch for the given repository, the Close must be invoked before release the batch
func NewBatch(ctx context.Context, repoPath string) (*Batch, error) {
// Now because of some insanity with git cat-file not immediately failing if not run in a valid git directory we need to run git rev-parse first! // Now because of some insanity with git cat-file not immediately failing if not run in a valid git directory we need to run git rev-parse first!
if err := ensureValidGitRepository(ctx, repo.Path); err != nil { if err := ensureValidGitRepository(ctx, repoPath); err != nil {
return nil, err return nil, err
} }
var batch Batch var batch Batch
batch.Writer, batch.Reader, batch.cancel = catFileBatch(ctx, repo.Path) batch.Writer, batch.Reader, batch.cancel = catFileBatch(ctx, repoPath)
return &batch, nil return &batch, nil
} }
func (repo *Repository) NewBatchCheck(ctx context.Context) (*Batch, error) { func NewBatchCheck(ctx context.Context, repoPath string) (*Batch, error) {
// Now because of some insanity with git cat-file not immediately failing if not run in a valid git directory we need to run git rev-parse first! // Now because of some insanity with git cat-file not immediately failing if not run in a valid git directory we need to run git rev-parse first!
if err := ensureValidGitRepository(ctx, repo.Path); err != nil { if err := ensureValidGitRepository(ctx, repoPath); err != nil {
return nil, err return nil, err
} }
var check Batch var check Batch
check.Writer, check.Reader, check.cancel = catFileBatchCheck(ctx, repo.Path) check.Writer, check.Reader, check.cancel = catFileBatchCheck(ctx, repoPath)
return &check, nil return &check, nil
} }

View File

@ -350,9 +350,10 @@ func (c *Command) run(ctx context.Context, skip int, opts *RunOpts) error {
// We need to check if the context is canceled by the program on Windows. // We need to check if the context is canceled by the program on Windows.
// This is because Windows does not have signal checking when terminating the process. // This is because Windows does not have signal checking when terminating the process.
// It always returns exit code 1, unlike Linux, which has many exit codes for signals. // It always returns exit code 1, unlike Linux, which has many exit codes for signals.
// `err.Error()` returns "exit status 1" when using the `git check-attr` command after the context is canceled.
if runtime.GOOS == "windows" && if runtime.GOOS == "windows" &&
err != nil && err != nil &&
err.Error() == "" && (err.Error() == "" || err.Error() == "exit status 1") &&
cmd.ProcessState.ExitCode() == 1 && cmd.ProcessState.ExitCode() == 1 &&
ctx.Err() == context.Canceled { ctx.Err() == context.Canceled {
return ctx.Err() return ctx.Err()

View File

@ -54,8 +54,8 @@ func TestGitArgument(t *testing.T) {
func TestCommandString(t *testing.T) { func TestCommandString(t *testing.T) {
cmd := NewCommandNoGlobals("a", "-m msg", "it's a test", `say "hello"`) cmd := NewCommandNoGlobals("a", "-m msg", "it's a test", `say "hello"`)
assert.EqualValues(t, cmd.prog+` a "-m msg" "it's a test" "say \"hello\""`, cmd.LogString()) assert.Equal(t, cmd.prog+` a "-m msg" "it's a test" "say \"hello\""`, cmd.LogString())
cmd = NewCommandNoGlobals("url: https://a:b@c/", "/root/dir-a/dir-b") cmd = NewCommandNoGlobals("url: https://a:b@c/", "/root/dir-a/dir-b")
assert.EqualValues(t, cmd.prog+` "url: https://sanitized-credential@c/" .../dir-a/dir-b`, cmd.LogString()) assert.Equal(t, cmd.prog+` "url: https://sanitized-credential@c/" .../dir-a/dir-b`, cmd.LogString())
} }

View File

@ -97,7 +97,7 @@ signed commit`
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, commitFromReader) require.NotNil(t, commitFromReader)
assert.EqualValues(t, sha, commitFromReader.ID) assert.EqualValues(t, sha, commitFromReader.ID)
assert.EqualValues(t, `-----BEGIN PGP SIGNATURE----- assert.Equal(t, `-----BEGIN PGP SIGNATURE-----
iQIrBAABCgAtFiEES+fB08xlgTrzSdQvhkUIsBsmec8FAmU/wKoPHGFtYWplckBz iQIrBAABCgAtFiEES+fB08xlgTrzSdQvhkUIsBsmec8FAmU/wKoPHGFtYWplckBz
dXNlLmRlAAoJEIZFCLAbJnnP4s4PQIJATa++WPzR6/H4etT7bsOGoMyguEJYyWOd dXNlLmRlAAoJEIZFCLAbJnnP4s4PQIJATa++WPzR6/H4etT7bsOGoMyguEJYyWOd
@ -114,19 +114,19 @@ HKRr3NlRM/DygzTyj0gN74uoa0goCIbyAQhiT42nm0cuhM7uN/W0ayrlZjGF1cbR
=xybZ =xybZ
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----
`, commitFromReader.Signature.Signature) `, commitFromReader.Signature.Signature)
assert.EqualValues(t, `tree e7f9e96dd79c09b078cac8b303a7d3b9d65ff9b734e86060a4d20409fd379f9e assert.Equal(t, `tree e7f9e96dd79c09b078cac8b303a7d3b9d65ff9b734e86060a4d20409fd379f9e
parent 26e9ccc29fad747e9c5d9f4c9ddeb7eff61cc45ef6a8dc258cbeb181afc055e8 parent 26e9ccc29fad747e9c5d9f4c9ddeb7eff61cc45ef6a8dc258cbeb181afc055e8
author Adam Majer <amajer@suse.de> 1698676906 +0100 author Adam Majer <amajer@suse.de> 1698676906 +0100
committer Adam Majer <amajer@suse.de> 1698676906 +0100 committer Adam Majer <amajer@suse.de> 1698676906 +0100
signed commit`, commitFromReader.Signature.Payload) signed commit`, commitFromReader.Signature.Payload)
assert.EqualValues(t, "Adam Majer <amajer@suse.de>", commitFromReader.Author.String()) assert.Equal(t, "Adam Majer <amajer@suse.de>", commitFromReader.Author.String())
commitFromReader2, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString+"\n\n")) commitFromReader2, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString+"\n\n"))
assert.NoError(t, err) assert.NoError(t, err)
commitFromReader.CommitMessage += "\n\n" commitFromReader.CommitMessage += "\n\n"
commitFromReader.Signature.Payload += "\n\n" commitFromReader.Signature.Payload += "\n\n"
assert.EqualValues(t, commitFromReader, commitFromReader2) assert.Equal(t, commitFromReader, commitFromReader2)
} }
func TestHasPreviousCommitSha256(t *testing.T) { func TestHasPreviousCommitSha256(t *testing.T) {

View File

@ -93,7 +93,7 @@ empty commit`
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, commitFromReader) require.NotNil(t, commitFromReader)
assert.EqualValues(t, sha, commitFromReader.ID) assert.EqualValues(t, sha, commitFromReader.ID)
assert.EqualValues(t, `-----BEGIN PGP SIGNATURE----- assert.Equal(t, `-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG
lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v/QJ7OrfMrVK lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v/QJ7OrfMrVK
@ -110,19 +110,19 @@ mfeFhT57UbE4qukTDIQ0Y0WM40UYRTakRaDY7ubhXgLgx09Cnp9XTVMsHgT6j9/i
=FRsO =FRsO
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----
`, commitFromReader.Signature.Signature) `, commitFromReader.Signature.Signature)
assert.EqualValues(t, `tree f1a6cb52b2d16773290cefe49ad0684b50a4f930 assert.Equal(t, `tree f1a6cb52b2d16773290cefe49ad0684b50a4f930
parent 37991dec2c8e592043f47155ce4808d4580f9123 parent 37991dec2c8e592043f47155ce4808d4580f9123
author silverwind <me@silverwind.io> 1563741793 +0200 author silverwind <me@silverwind.io> 1563741793 +0200
committer silverwind <me@silverwind.io> 1563741793 +0200 committer silverwind <me@silverwind.io> 1563741793 +0200
empty commit`, commitFromReader.Signature.Payload) empty commit`, commitFromReader.Signature.Payload)
assert.EqualValues(t, "silverwind <me@silverwind.io>", commitFromReader.Author.String()) assert.Equal(t, "silverwind <me@silverwind.io>", commitFromReader.Author.String())
commitFromReader2, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString+"\n\n")) commitFromReader2, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString+"\n\n"))
assert.NoError(t, err) assert.NoError(t, err)
commitFromReader.CommitMessage += "\n\n" commitFromReader.CommitMessage += "\n\n"
commitFromReader.Signature.Payload += "\n\n" commitFromReader.Signature.Payload += "\n\n"
assert.EqualValues(t, commitFromReader, commitFromReader2) assert.Equal(t, commitFromReader, commitFromReader2)
} }
func TestCommitWithEncodingFromReader(t *testing.T) { func TestCommitWithEncodingFromReader(t *testing.T) {
@ -159,7 +159,7 @@ ISO-8859-1`
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, commitFromReader) require.NotNil(t, commitFromReader)
assert.EqualValues(t, sha, commitFromReader.ID) assert.EqualValues(t, sha, commitFromReader.ID)
assert.EqualValues(t, `-----BEGIN PGP SIGNATURE----- assert.Equal(t, `-----BEGIN PGP SIGNATURE-----
iQGzBAABCgAdFiEE9HRrbqvYxPT8PXbefPSEkrowAa8FAmYGg7IACgkQfPSEkrow iQGzBAABCgAdFiEE9HRrbqvYxPT8PXbefPSEkrowAa8FAmYGg7IACgkQfPSEkrow
Aa9olwv+P0HhtCM6CRvlUmPaqswRsDPNR4i66xyXGiSxdI9V5oJL7HLiQIM7KrFR Aa9olwv+P0HhtCM6CRvlUmPaqswRsDPNR4i66xyXGiSxdI9V5oJL7HLiQIM7KrFR
@ -174,20 +174,20 @@ jw4YcO5u
=r3UU =r3UU
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----
`, commitFromReader.Signature.Signature) `, commitFromReader.Signature.Signature)
assert.EqualValues(t, `tree ca3fad42080dd1a6d291b75acdfc46e5b9b307e5 assert.Equal(t, `tree ca3fad42080dd1a6d291b75acdfc46e5b9b307e5
parent 47b24e7ab977ed31c5a39989d570847d6d0052af parent 47b24e7ab977ed31c5a39989d570847d6d0052af
author KN4CK3R <admin@oldschoolhack.me> 1711702962 +0100 author KN4CK3R <admin@oldschoolhack.me> 1711702962 +0100
committer KN4CK3R <admin@oldschoolhack.me> 1711702962 +0100 committer KN4CK3R <admin@oldschoolhack.me> 1711702962 +0100
encoding ISO-8859-1 encoding ISO-8859-1
ISO-8859-1`, commitFromReader.Signature.Payload) ISO-8859-1`, commitFromReader.Signature.Payload)
assert.EqualValues(t, "KN4CK3R <admin@oldschoolhack.me>", commitFromReader.Author.String()) assert.Equal(t, "KN4CK3R <admin@oldschoolhack.me>", commitFromReader.Author.String())
commitFromReader2, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString+"\n\n")) commitFromReader2, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString+"\n\n"))
assert.NoError(t, err) assert.NoError(t, err)
commitFromReader.CommitMessage += "\n\n" commitFromReader.CommitMessage += "\n\n"
commitFromReader.Signature.Payload += "\n\n" commitFromReader.Signature.Payload += "\n\n"
assert.EqualValues(t, commitFromReader, commitFromReader2) assert.Equal(t, commitFromReader, commitFromReader2)
} }
func TestHasPreviousCommit(t *testing.T) { func TestHasPreviousCommit(t *testing.T) {
@ -351,10 +351,10 @@ func Test_GetCommitBranchStart(t *testing.T) {
defer repo.Close() defer repo.Close()
commit, err := repo.GetBranchCommit("branch1") commit, err := repo.GetBranchCommit("branch1")
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "2839944139e0de9737a044f78b0e4b40d989a9e3", commit.ID.String()) assert.Equal(t, "2839944139e0de9737a044f78b0e4b40d989a9e3", commit.ID.String())
startCommitID, err := repo.GetCommitBranchStart(os.Environ(), "branch1", commit.ID.String()) startCommitID, err := repo.GetCommitBranchStart(os.Environ(), "branch1", commit.ID.String())
assert.NoError(t, err) assert.NoError(t, err)
assert.NotEmpty(t, startCommitID) assert.NotEmpty(t, startCommitID)
assert.EqualValues(t, "95bb4d39648ee7e325106df01a621c530863a653", startCommitID) assert.Equal(t, "95bb4d39648ee7e325106df01a621c530863a653", startCommitID)
} }

View File

@ -177,8 +177,8 @@ func ExampleCutDiffAroundLine() {
func TestParseDiffHunkString(t *testing.T) { func TestParseDiffHunkString(t *testing.T) {
leftLine, leftHunk, rightLine, rightHunk := ParseDiffHunkString("@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER") leftLine, leftHunk, rightLine, rightHunk := ParseDiffHunkString("@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER")
assert.EqualValues(t, 19, leftLine) assert.Equal(t, 19, leftLine)
assert.EqualValues(t, 3, leftHunk) assert.Equal(t, 3, leftHunk)
assert.EqualValues(t, 19, rightLine) assert.Equal(t, 19, rightLine)
assert.EqualValues(t, 5, rightHunk) assert.Equal(t, 5, rightHunk)
} }

View File

@ -62,13 +62,14 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
var results []*GrepResult var results []*GrepResult
cmd := NewCommand("grep", "--null", "--break", "--heading", "--line-number", "--full-name") cmd := NewCommand("grep", "--null", "--break", "--heading", "--line-number", "--full-name")
cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber)) cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber))
if opts.GrepMode == GrepModeExact { switch opts.GrepMode {
case GrepModeExact:
cmd.AddArguments("--fixed-strings") cmd.AddArguments("--fixed-strings")
cmd.AddOptionValues("-e", strings.TrimLeft(search, "-")) cmd.AddOptionValues("-e", strings.TrimLeft(search, "-"))
} else if opts.GrepMode == GrepModeRegexp { case GrepModeRegexp:
cmd.AddArguments("--perl-regexp") cmd.AddArguments("--perl-regexp")
cmd.AddOptionValues("-e", strings.TrimLeft(search, "-")) cmd.AddOptionValues("-e", strings.TrimLeft(search, "-"))
} else /* words */ { default: /* words */
words := strings.Fields(search) words := strings.Fields(search)
cmd.AddArguments("--fixed-strings", "--ignore-case") cmd.AddArguments("--fixed-strings", "--ignore-case")
for i, word := range words { for i, word := range words {

View File

@ -118,11 +118,12 @@ func (g *LogNameStatusRepoParser) Next(treepath string, paths2ids map[string]int
g.buffull = false g.buffull = false
g.next, err = g.rd.ReadSlice('\x00') g.next, err = g.rd.ReadSlice('\x00')
if err != nil { if err != nil {
if err == bufio.ErrBufferFull { switch err {
case bufio.ErrBufferFull:
g.buffull = true g.buffull = true
} else if err == io.EOF { case io.EOF:
return nil, nil return nil, nil
} else { default:
return nil, err return nil, err
} }
} }
@ -132,11 +133,12 @@ func (g *LogNameStatusRepoParser) Next(treepath string, paths2ids map[string]int
if bytes.Equal(g.next, []byte("commit\000")) { if bytes.Equal(g.next, []byte("commit\000")) {
g.next, err = g.rd.ReadSlice('\x00') g.next, err = g.rd.ReadSlice('\x00')
if err != nil { if err != nil {
if err == bufio.ErrBufferFull { switch err {
case bufio.ErrBufferFull:
g.buffull = true g.buffull = true
} else if err == io.EOF { case io.EOF:
return nil, nil return nil, nil
} else { default:
return nil, err return nil, err
} }
} }
@ -214,11 +216,12 @@ diffloop:
} }
g.next, err = g.rd.ReadSlice('\x00') g.next, err = g.rd.ReadSlice('\x00')
if err != nil { if err != nil {
if err == bufio.ErrBufferFull { switch err {
case bufio.ErrBufferFull:
g.buffull = true g.buffull = true
} else if err == io.EOF { case io.EOF:
return &ret, nil return &ret, nil
} else { default:
return nil, err return nil, err
} }
} }

View File

@ -58,7 +58,7 @@ func TestParseTreeEntriesLong(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, entries, len(testCase.Expected)) assert.Len(t, entries, len(testCase.Expected))
for i, entry := range entries { for i, entry := range entries {
assert.EqualValues(t, testCase.Expected[i], entry) assert.Equal(t, testCase.Expected[i], entry)
} }
} }
} }
@ -91,7 +91,7 @@ func TestParseTreeEntriesShort(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, entries, len(testCase.Expected)) assert.Len(t, entries, len(testCase.Expected))
for i, entry := range entries { for i, entry := range entries {
assert.EqualValues(t, testCase.Expected[i], entry) assert.Equal(t, testCase.Expected[i], entry)
} }
} }
} }

View File

@ -81,21 +81,21 @@ func Test_nulSeparatedAttributeWriter_ReadAttribute(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
attr = <-wr.ReadAttribute() attr = <-wr.ReadAttribute()
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, attributeTriple{ assert.Equal(t, attributeTriple{
Filename: "shouldbe.vendor", Filename: "shouldbe.vendor",
Attribute: AttributeLinguistVendored, Attribute: AttributeLinguistVendored,
Value: "set", Value: "set",
}, attr) }, attr)
attr = <-wr.ReadAttribute() attr = <-wr.ReadAttribute()
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, attributeTriple{ assert.Equal(t, attributeTriple{
Filename: "shouldbe.vendor", Filename: "shouldbe.vendor",
Attribute: AttributeLinguistGenerated, Attribute: AttributeLinguistGenerated,
Value: "unspecified", Value: "unspecified",
}, attr) }, attr)
attr = <-wr.ReadAttribute() attr = <-wr.ReadAttribute()
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, attributeTriple{ assert.Equal(t, attributeTriple{
Filename: "shouldbe.vendor", Filename: "shouldbe.vendor",
Attribute: AttributeLinguistLanguage, Attribute: AttributeLinguistLanguage,
Value: "unspecified", Value: "unspecified",

View File

@ -67,7 +67,7 @@ func OpenRepository(ctx context.Context, repoPath string) (*Repository, error) {
func (repo *Repository) CatFileBatch(ctx context.Context) (WriteCloserError, *bufio.Reader, func(), error) { func (repo *Repository) CatFileBatch(ctx context.Context) (WriteCloserError, *bufio.Reader, func(), error) {
if repo.batch == nil { if repo.batch == nil {
var err error var err error
repo.batch, err = repo.NewBatch(ctx) repo.batch, err = NewBatch(ctx, repo.Path)
if err != nil { if err != nil {
return nil, nil, nil, err return nil, nil, nil, err
} }
@ -81,7 +81,7 @@ func (repo *Repository) CatFileBatch(ctx context.Context) (WriteCloserError, *bu
} }
log.Debug("Opening temporary cat file batch for: %s", repo.Path) log.Debug("Opening temporary cat file batch for: %s", repo.Path)
tempBatch, err := repo.NewBatch(ctx) tempBatch, err := NewBatch(ctx, repo.Path)
if err != nil { if err != nil {
return nil, nil, nil, err return nil, nil, nil, err
} }
@ -92,7 +92,7 @@ func (repo *Repository) CatFileBatch(ctx context.Context) (WriteCloserError, *bu
func (repo *Repository) CatFileBatchCheck(ctx context.Context) (WriteCloserError, *bufio.Reader, func(), error) { func (repo *Repository) CatFileBatchCheck(ctx context.Context) (WriteCloserError, *bufio.Reader, func(), error) {
if repo.check == nil { if repo.check == nil {
var err error var err error
repo.check, err = repo.NewBatchCheck(ctx) repo.check, err = NewBatchCheck(ctx, repo.Path)
if err != nil { if err != nil {
return nil, nil, nil, err return nil, nil, nil, err
} }
@ -106,7 +106,7 @@ func (repo *Repository) CatFileBatchCheck(ctx context.Context) (WriteCloserError
} }
log.Debug("Opening temporary cat file batch-check for: %s", repo.Path) log.Debug("Opening temporary cat file batch-check for: %s", repo.Path)
tempBatchCheck, err := repo.NewBatchCheck(ctx) tempBatchCheck, err := NewBatchCheck(ctx, repo.Path)
if err != nil { if err != nil {
return nil, nil, nil, err return nil, nil, nil, err
} }

View File

@ -21,21 +21,21 @@ func TestRepository_GetBranches(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, branches, 2) assert.Len(t, branches, 2)
assert.EqualValues(t, 3, countAll) assert.Equal(t, 3, countAll)
assert.ElementsMatch(t, []string{"master", "branch2"}, branches) assert.ElementsMatch(t, []string{"master", "branch2"}, branches)
branches, countAll, err = bareRepo1.GetBranchNames(0, 0) branches, countAll, err = bareRepo1.GetBranchNames(0, 0)
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, branches, 3) assert.Len(t, branches, 3)
assert.EqualValues(t, 3, countAll) assert.Equal(t, 3, countAll)
assert.ElementsMatch(t, []string{"master", "branch2", "branch1"}, branches) assert.ElementsMatch(t, []string{"master", "branch2", "branch1"}, branches)
branches, countAll, err = bareRepo1.GetBranchNames(5, 1) branches, countAll, err = bareRepo1.GetBranchNames(5, 1)
assert.NoError(t, err) assert.NoError(t, err)
assert.Empty(t, branches) assert.Empty(t, branches)
assert.EqualValues(t, 3, countAll) assert.Equal(t, 3, countAll)
assert.ElementsMatch(t, []string{}, branches) assert.ElementsMatch(t, []string{}, branches)
} }
@ -71,15 +71,15 @@ func TestGetRefsBySha(t *testing.T) {
// refs/pull/1/head // refs/pull/1/head
branches, err = bareRepo5.GetRefsBySha("c83380d7056593c51a699d12b9c00627bd5743e9", PullPrefix) branches, err = bareRepo5.GetRefsBySha("c83380d7056593c51a699d12b9c00627bd5743e9", PullPrefix)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, []string{"refs/pull/1/head"}, branches) assert.Equal(t, []string{"refs/pull/1/head"}, branches)
branches, err = bareRepo5.GetRefsBySha("d8e0bbb45f200e67d9a784ce55bd90821af45ebd", BranchPrefix) branches, err = bareRepo5.GetRefsBySha("d8e0bbb45f200e67d9a784ce55bd90821af45ebd", BranchPrefix)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, []string{"refs/heads/master", "refs/heads/master-clone"}, branches) assert.Equal(t, []string{"refs/heads/master", "refs/heads/master-clone"}, branches)
branches, err = bareRepo5.GetRefsBySha("58a4bcc53ac13e7ff76127e0fb518b5262bf09af", BranchPrefix) branches, err = bareRepo5.GetRefsBySha("58a4bcc53ac13e7ff76127e0fb518b5262bf09af", BranchPrefix)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, []string{"refs/heads/test-patch-1"}, branches) assert.Equal(t, []string{"refs/heads/test-patch-1"}, branches)
} }
func BenchmarkGetRefsBySha(b *testing.B) { func BenchmarkGetRefsBySha(b *testing.B) {

View File

@ -23,14 +23,14 @@ func TestRepository_GetLanguageStats(t *testing.T) {
stats, err := gitRepo.GetLanguageStats("8fee858da5796dfb37704761701bb8e800ad9ef3") stats, err := gitRepo.GetLanguageStats("8fee858da5796dfb37704761701bb8e800ad9ef3")
require.NoError(t, err) require.NoError(t, err)
assert.EqualValues(t, map[string]int64{ assert.Equal(t, map[string]int64{
"Python": 134, "Python": 134,
"Java": 112, "Java": 112,
}, stats) }, stats)
} }
func TestMergeLanguageStats(t *testing.T) { func TestMergeLanguageStats(t *testing.T) {
assert.EqualValues(t, map[string]int64{ assert.Equal(t, map[string]int64{
"PHP": 1, "PHP": 1,
"python": 10, "python": 10,
"JAVA": 700, "JAVA": 700,

View File

@ -19,11 +19,12 @@ func (repo *Repository) GetRefs() ([]*Reference, error) {
// refType should only be a literal "branch" or "tag" and nothing else // refType should only be a literal "branch" or "tag" and nothing else
func (repo *Repository) ListOccurrences(ctx context.Context, refType, commitSHA string) ([]string, error) { func (repo *Repository) ListOccurrences(ctx context.Context, refType, commitSHA string) ([]string, error) {
cmd := NewCommand() cmd := NewCommand()
if refType == "branch" { switch refType {
case "branch":
cmd.AddArguments("branch") cmd.AddArguments("branch")
} else if refType == "tag" { case "tag":
cmd.AddArguments("tag") cmd.AddArguments("tag")
} else { default:
return nil, util.NewInvalidArgumentErrorf(`can only use "branch" or "tag" for refType, but got %q`, refType) return nil, util.NewInvalidArgumentErrorf(`can only use "branch" or "tag" for refType, but got %q`, refType)
} }
stdout, _, err := cmd.AddArguments("--no-color", "--sort=-creatordate", "--contains").AddDynamicArguments(commitSHA).RunStdString(ctx, &RunOpts{Dir: repo.Path}) stdout, _, err := cmd.AddArguments("--no-color", "--sort=-creatordate", "--contains").AddDynamicArguments(commitSHA).RunStdString(ctx, &RunOpts{Dir: repo.Path})

View File

@ -30,7 +30,7 @@ func TestRepository_GetCodeActivityStats(t *testing.T) {
assert.EqualValues(t, 10, code.Additions) assert.EqualValues(t, 10, code.Additions)
assert.EqualValues(t, 1, code.Deletions) assert.EqualValues(t, 1, code.Deletions)
assert.Len(t, code.Authors, 3) assert.Len(t, code.Authors, 3)
assert.EqualValues(t, "tris.git@shoddynet.org", code.Authors[1].Email) assert.Equal(t, "tris.git@shoddynet.org", code.Authors[1].Email)
assert.EqualValues(t, 3, code.Authors[1].Commits) assert.EqualValues(t, 3, code.Authors[1].Commits)
assert.EqualValues(t, 5, code.Authors[0].Commits) assert.EqualValues(t, 5, code.Authors[0].Commits)
} }

View File

@ -27,12 +27,12 @@ func TestRepository_GetTags(t *testing.T) {
} }
assert.Len(t, tags, 2) assert.Len(t, tags, 2)
assert.Len(t, tags, total) assert.Len(t, tags, total)
assert.EqualValues(t, "signed-tag", tags[0].Name) assert.Equal(t, "signed-tag", tags[0].Name)
assert.EqualValues(t, "36f97d9a96457e2bab511db30fe2db03893ebc64", tags[0].ID.String()) assert.Equal(t, "36f97d9a96457e2bab511db30fe2db03893ebc64", tags[0].ID.String())
assert.EqualValues(t, "tag", tags[0].Type) assert.Equal(t, "tag", tags[0].Type)
assert.EqualValues(t, "test", tags[1].Name) assert.Equal(t, "test", tags[1].Name)
assert.EqualValues(t, "3ad28a9149a2864384548f3d17ed7f38014c9e8a", tags[1].ID.String()) assert.Equal(t, "3ad28a9149a2864384548f3d17ed7f38014c9e8a", tags[1].ID.String())
assert.EqualValues(t, "tag", tags[1].Type) assert.Equal(t, "tag", tags[1].Type)
} }
func TestRepository_GetTag(t *testing.T) { func TestRepository_GetTag(t *testing.T) {
@ -64,18 +64,13 @@ func TestRepository_GetTag(t *testing.T) {
// and try to get the Tag for lightweight tag // and try to get the Tag for lightweight tag
lTag, err := bareRepo1.GetTag(lTagName) lTag, err := bareRepo1.GetTag(lTagName)
if err != nil { require.NoError(t, err)
assert.NoError(t, err) require.NotNil(t, lTag, "nil lTag: %s", lTagName)
return
} assert.Equal(t, lTagName, lTag.Name)
if lTag == nil { assert.Equal(t, lTagCommitID, lTag.ID.String())
assert.NotNil(t, lTag) assert.Equal(t, lTagCommitID, lTag.Object.String())
assert.FailNow(t, "nil lTag: %s", lTagName) assert.Equal(t, "commit", lTag.Type)
}
assert.EqualValues(t, lTagName, lTag.Name)
assert.EqualValues(t, lTagCommitID, lTag.ID.String())
assert.EqualValues(t, lTagCommitID, lTag.Object.String())
assert.EqualValues(t, "commit", lTag.Type)
// ANNOTATED TAGS // ANNOTATED TAGS
aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0"
@ -97,19 +92,14 @@ func TestRepository_GetTag(t *testing.T) {
} }
aTag, err := bareRepo1.GetTag(aTagName) aTag, err := bareRepo1.GetTag(aTagName)
if err != nil { require.NoError(t, err)
assert.NoError(t, err) require.NotNil(t, aTag, "nil aTag: %s", aTagName)
return
} assert.Equal(t, aTagName, aTag.Name)
if aTag == nil { assert.Equal(t, aTagID, aTag.ID.String())
assert.NotNil(t, aTag)
assert.FailNow(t, "nil aTag: %s", aTagName)
}
assert.EqualValues(t, aTagName, aTag.Name)
assert.EqualValues(t, aTagID, aTag.ID.String())
assert.NotEqual(t, aTagID, aTag.Object.String()) assert.NotEqual(t, aTagID, aTag.Object.String())
assert.EqualValues(t, aTagCommitID, aTag.Object.String()) assert.Equal(t, aTagCommitID, aTag.Object.String())
assert.EqualValues(t, "tag", aTag.Type) assert.Equal(t, "tag", aTag.Type)
// RELEASE TAGS // RELEASE TAGS
@ -127,14 +117,14 @@ func TestRepository_GetTag(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
return return
} }
assert.EqualValues(t, rTagCommitID, rTagID) assert.Equal(t, rTagCommitID, rTagID)
oTagID, err := bareRepo1.GetTagID(lTagName) oTagID, err := bareRepo1.GetTagID(lTagName)
if err != nil { if err != nil {
assert.NoError(t, err) assert.NoError(t, err)
return return
} }
assert.EqualValues(t, lTagCommitID, oTagID) assert.Equal(t, lTagCommitID, oTagID)
} }
func TestRepository_GetAnnotatedTag(t *testing.T) { func TestRepository_GetAnnotatedTag(t *testing.T) {
@ -170,9 +160,9 @@ func TestRepository_GetAnnotatedTag(t *testing.T) {
return return
} }
assert.NotNil(t, tag) assert.NotNil(t, tag)
assert.EqualValues(t, aTagName, tag.Name) assert.Equal(t, aTagName, tag.Name)
assert.EqualValues(t, aTagID, tag.ID.String()) assert.Equal(t, aTagID, tag.ID.String())
assert.EqualValues(t, "tag", tag.Type) assert.Equal(t, "tag", tag.Type)
// Annotated tag's Commit ID should fail // Annotated tag's Commit ID should fail
tag2, err := bareRepo1.GetAnnotatedTag(aTagCommitID) tag2, err := bareRepo1.GetAnnotatedTag(aTagCommitID)

View File

@ -42,6 +42,6 @@ func TestParseSignatureFromCommitLine(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
got := parseSignatureFromCommitLine(test.line) got := parseSignatureFromCommitLine(test.line)
assert.EqualValues(t, test.want, got) assert.Equal(t, test.want, got)
} }
} }

View File

@ -19,11 +19,11 @@ func TestGetTemplateSubmoduleCommits(t *testing.T) {
assert.Len(t, submodules, 2) assert.Len(t, submodules, 2)
assert.EqualValues(t, "<°)))><", submodules[0].Path) assert.Equal(t, "<°)))><", submodules[0].Path)
assert.EqualValues(t, "d2932de67963f23d43e1c7ecf20173e92ee6c43c", submodules[0].Commit) assert.Equal(t, "d2932de67963f23d43e1c7ecf20173e92ee6c43c", submodules[0].Commit)
assert.EqualValues(t, "libtest", submodules[1].Path) assert.Equal(t, "libtest", submodules[1].Path)
assert.EqualValues(t, "1234567890123456789012345678901234567890", submodules[1].Commit) assert.Equal(t, "1234567890123456789012345678901234567890", submodules[1].Commit)
} }
func TestAddTemplateSubmoduleIndexes(t *testing.T) { func TestAddTemplateSubmoduleIndexes(t *testing.T) {
@ -42,6 +42,6 @@ func TestAddTemplateSubmoduleIndexes(t *testing.T) {
submodules, err := GetTemplateSubmoduleCommits(DefaultContext, tmpDir) submodules, err := GetTemplateSubmoduleCommits(DefaultContext, tmpDir)
require.NoError(t, err) require.NoError(t, err)
assert.Len(t, submodules, 1) assert.Len(t, submodules, 1)
assert.EqualValues(t, "new-dir", submodules[0].Path) assert.Equal(t, "new-dir", submodules[0].Path)
assert.EqualValues(t, "1234567890123456789012345678901234567890", submodules[0].Commit) assert.Equal(t, "1234567890123456789012345678901234567890", submodules[0].Commit)
} }

View File

@ -33,10 +33,10 @@ func Test_GetTreePathLatestCommit(t *testing.T) {
commitID, err := repo.GetBranchCommitID("master") commitID, err := repo.GetBranchCommitID("master")
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, "544d8f7a3b15927cddf2299b4b562d6ebd71b6a7", commitID) assert.Equal(t, "544d8f7a3b15927cddf2299b4b562d6ebd71b6a7", commitID)
commit, err := repo.GetTreePathLatestCommit("master", "blame.txt") commit, err := repo.GetTreePathLatestCommit("master", "blame.txt")
assert.NoError(t, err) assert.NoError(t, err)
assert.NotNil(t, commit) assert.NotNil(t, commit)
assert.EqualValues(t, "45fb6cbc12f970b04eacd5cd4165edd11c8d7376", commit.ID.String()) assert.Equal(t, "45fb6cbc12f970b04eacd5cd4165edd11c8d7376", commit.ID.String())
} }

View File

@ -133,12 +133,13 @@ func ParseRepositoryURL(ctx context.Context, repoURL string) (*RepositoryURL, er
} }
} }
if parsed.URL.Scheme == "http" || parsed.URL.Scheme == "https" { switch parsed.URL.Scheme {
case "http", "https":
if !httplib.IsCurrentGiteaSiteURL(ctx, repoURL) { if !httplib.IsCurrentGiteaSiteURL(ctx, repoURL) {
return ret, nil return ret, nil
} }
fillPathParts(strings.TrimPrefix(parsed.URL.Path, setting.AppSubURL)) fillPathParts(strings.TrimPrefix(parsed.URL.Path, setting.AppSubURL))
} else if parsed.URL.Scheme == "ssh" || parsed.URL.Scheme == "git+ssh" { case "ssh", "git+ssh":
domainSSH := setting.SSH.Domain domainSSH := setting.SSH.Domain
domainCur := httplib.GuessCurrentHostDomain(ctx) domainCur := httplib.GuessCurrentHostDomain(ctx)
urlDomain, _, _ := net.SplitHostPort(parsed.URL.Host) urlDomain, _, _ := net.SplitHostPort(parsed.URL.Host)
@ -166,9 +167,10 @@ func MakeRepositoryWebLink(repoURL *RepositoryURL) string {
// now, let's guess, for example: // now, let's guess, for example:
// * git@github.com:owner/submodule.git // * git@github.com:owner/submodule.git
// * https://github.com/example/submodule1.git // * https://github.com/example/submodule1.git
if repoURL.GitURL.Scheme == "http" || repoURL.GitURL.Scheme == "https" { switch repoURL.GitURL.Scheme {
case "http", "https":
return strings.TrimSuffix(repoURL.GitURL.String(), ".git") return strings.TrimSuffix(repoURL.GitURL.String(), ".git")
} else if repoURL.GitURL.Scheme == "ssh" || repoURL.GitURL.Scheme == "git+ssh" { case "ssh", "git+ssh":
hostname, _, _ := net.SplitHostPort(repoURL.GitURL.Host) hostname, _, _ := net.SplitHostPort(repoURL.GitURL.Host)
hostname = util.IfZero(hostname, repoURL.GitURL.Host) hostname = util.IfZero(hostname, repoURL.GitURL.Host)
urlPath := strings.TrimSuffix(repoURL.GitURL.Path, ".git") urlPath := strings.TrimSuffix(repoURL.GitURL.Path, ".git")

View File

@ -165,8 +165,8 @@ func TestParseGitURLs(t *testing.T) {
t.Run(kase.kase, func(t *testing.T) { t.Run(kase.kase, func(t *testing.T) {
u, err := ParseGitURL(kase.kase) u, err := ParseGitURL(kase.kase)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, kase.expected.extraMark, u.extraMark) assert.Equal(t, kase.expected.extraMark, u.extraMark)
assert.EqualValues(t, *kase.expected, *u) assert.Equal(t, *kase.expected, *u)
}) })
} }
} }

View File

@ -30,14 +30,14 @@ func TestManager(t *testing.T) {
_ = m.Register(t3) _ = m.Register(t3)
assert.NoError(t, m.ReleaseReopen()) assert.NoError(t, m.ReleaseReopen())
assert.EqualValues(t, 1, t1.count) assert.Equal(t, 1, t1.count)
assert.EqualValues(t, 1, t2.count) assert.Equal(t, 1, t2.count)
assert.EqualValues(t, 1, t3.count) assert.Equal(t, 1, t3.count)
c2() c2()
assert.NoError(t, m.ReleaseReopen()) assert.NoError(t, m.ReleaseReopen())
assert.EqualValues(t, 2, t1.count) assert.Equal(t, 2, t1.count)
assert.EqualValues(t, 1, t2.count) assert.Equal(t, 1, t2.count)
assert.EqualValues(t, 2, t3.count) assert.Equal(t, 2, t3.count)
} }

View File

@ -40,7 +40,7 @@ func (t *traceBuiltinSpan) toString(out *strings.Builder, indent int) {
if t.ts.endTime.IsZero() { if t.ts.endTime.IsZero() {
out.WriteString(" duration: (not ended)") out.WriteString(" duration: (not ended)")
} else { } else {
out.WriteString(fmt.Sprintf(" duration=%.4fs", t.ts.endTime.Sub(t.ts.startTime).Seconds())) fmt.Fprintf(out, " duration=%.4fs", t.ts.endTime.Sub(t.ts.startTime).Seconds())
} }
for _, a := range t.ts.attributes { for _, a := range t.ts.attributes {
out.WriteString(" ") out.WriteString(" ")

View File

@ -114,7 +114,7 @@ c=2
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
out, lexerName, err := File(tt.name, "", []byte(tt.code)) out, lexerName, err := File(tt.name, "", []byte(tt.code))
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, tt.want, out) assert.Equal(t, tt.want, out)
assert.Equal(t, tt.lexerName, lexerName) assert.Equal(t, tt.lexerName, lexerName)
}) })
} }
@ -177,7 +177,7 @@ c=2`),
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
out := PlainText([]byte(tt.code)) out := PlainText([]byte(tt.code))
assert.EqualValues(t, tt.want, out) assert.Equal(t, tt.want, out)
}) })
} }
} }

View File

@ -16,7 +16,6 @@ import (
"code.gitea.io/gitea/modules/analyze" "code.gitea.io/gitea/modules/analyze"
"code.gitea.io/gitea/modules/charset" "code.gitea.io/gitea/modules/charset"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/indexer" "code.gitea.io/gitea/modules/indexer"
path_filter "code.gitea.io/gitea/modules/indexer/code/bleve/token/path" path_filter "code.gitea.io/gitea/modules/indexer/code/bleve/token/path"
"code.gitea.io/gitea/modules/indexer/code/internal" "code.gitea.io/gitea/modules/indexer/code/internal"
@ -217,12 +216,7 @@ func (b *Indexer) addDelete(filename string, repo *repo_model.Repository, batch
func (b *Indexer) Index(ctx context.Context, repo *repo_model.Repository, sha string, changes *internal.RepoChanges) error { func (b *Indexer) Index(ctx context.Context, repo *repo_model.Repository, sha string, changes *internal.RepoChanges) error {
batch := inner_bleve.NewFlushingBatch(b.inner.Indexer, maxBatchSize) batch := inner_bleve.NewFlushingBatch(b.inner.Indexer, maxBatchSize)
if len(changes.Updates) > 0 { if len(changes.Updates) > 0 {
r, err := gitrepo.OpenRepository(ctx, repo) gitBatch, err := git.NewBatch(ctx, repo.RepoPath())
if err != nil {
return err
}
defer r.Close()
gitBatch, err := r.NewBatch(ctx)
if err != nil { if err != nil {
return err return err
} }

View File

@ -15,7 +15,6 @@ import (
"code.gitea.io/gitea/modules/analyze" "code.gitea.io/gitea/modules/analyze"
"code.gitea.io/gitea/modules/charset" "code.gitea.io/gitea/modules/charset"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/indexer" "code.gitea.io/gitea/modules/indexer"
"code.gitea.io/gitea/modules/indexer/code/internal" "code.gitea.io/gitea/modules/indexer/code/internal"
indexer_internal "code.gitea.io/gitea/modules/indexer/internal" indexer_internal "code.gitea.io/gitea/modules/indexer/internal"
@ -209,12 +208,7 @@ func (b *Indexer) addDelete(filename string, repo *repo_model.Repository) elasti
func (b *Indexer) Index(ctx context.Context, repo *repo_model.Repository, sha string, changes *internal.RepoChanges) error { func (b *Indexer) Index(ctx context.Context, repo *repo_model.Repository, sha string, changes *internal.RepoChanges) error {
reqs := make([]elastic.BulkableRequest, 0) reqs := make([]elastic.BulkableRequest, 0)
if len(changes.Updates) > 0 { if len(changes.Updates) > 0 {
r, err := gitrepo.OpenRepository(ctx, repo) batch, err := git.NewBatch(ctx, repo.RepoPath())
if err != nil {
return err
}
defer r.Close()
batch, err := r.NewBatch(ctx)
if err != nil { if err != nil {
return err return err
} }

Some files were not shown because too many files have changed in this diff Show More