Skip to content

Commit 94a747f

Browse files
committed
Merge remote-tracking branch 'giteaofficial/main'
* giteaofficial/main: Fix basic auth with webauthn (go-gitea#32531) Fix and refactor markdown rendering (go-gitea#32522) Fix large image overflow in comment page (go-gitea#31740) Improve testing and try to fix MySQL hanging (go-gitea#32515) Fix `recentupdate` sorting bugs (go-gitea#32505)
2 parents d1df5e1 + c3dedcf commit 94a747f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+553
-521
lines changed

.github/workflows/pull-db-tests.yml

+7-3
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,15 @@ jobs:
154154
runs-on: ubuntu-latest
155155
services:
156156
mysql:
157-
image: mysql:8.0
157+
# the bitnami mysql image has more options than the official one, it's easier to customize
158+
image: bitnami/mysql:8.0
158159
env:
159-
MYSQL_ALLOW_EMPTY_PASSWORD: true
160+
ALLOW_EMPTY_PASSWORD: true
160161
MYSQL_DATABASE: testgitea
161162
ports:
162163
- "3306:3306"
164+
options: >-
165+
--mount type=tmpfs,destination=/bitnami/mysql/data
163166
elasticsearch:
164167
image: elasticsearch:7.5.0
165168
env:
@@ -188,7 +191,8 @@ jobs:
188191
- name: run migration tests
189192
run: make test-mysql-migration
190193
- name: run tests
191-
run: make integration-test-coverage
194+
# run: make integration-test-coverage (at the moment, no coverage is really handled)
195+
run: make test-mysql
192196
env:
193197
TAGS: bindata
194198
RACE_ENABLED: true

models/migrations/base/tests.go

+5-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
"code.gitea.io/gitea/models/unittest"
1616
"code.gitea.io/gitea/modules/base"
1717
"code.gitea.io/gitea/modules/git"
18-
"code.gitea.io/gitea/modules/log"
1918
"code.gitea.io/gitea/modules/setting"
2019
"code.gitea.io/gitea/modules/testlogger"
2120

@@ -91,21 +90,19 @@ func PrepareTestEnv(t *testing.T, skip int, syncModels ...any) (*xorm.Engine, fu
9190
}
9291

9392
func MainTest(m *testing.M) {
94-
log.RegisterEventWriter("test", testlogger.NewTestLoggerWriter)
93+
testlogger.Init()
9594

9695
giteaRoot := base.SetupGiteaRoot()
9796
if giteaRoot == "" {
98-
fmt.Println("Environment variable $GITEA_ROOT not set")
99-
os.Exit(1)
97+
testlogger.Fatalf("Environment variable $GITEA_ROOT not set\n")
10098
}
10199
giteaBinary := "gitea"
102100
if runtime.GOOS == "windows" {
103101
giteaBinary += ".exe"
104102
}
105103
setting.AppPath = filepath.Join(giteaRoot, giteaBinary)
106104
if _, err := os.Stat(setting.AppPath); err != nil {
107-
fmt.Printf("Could not find gitea binary at %s\n", setting.AppPath)
108-
os.Exit(1)
105+
testlogger.Fatalf("Could not find gitea binary at %s\n", setting.AppPath)
109106
}
110107

111108
giteaConf := os.Getenv("GITEA_CONF")
@@ -122,17 +119,15 @@ func MainTest(m *testing.M) {
122119

123120
tmpDataPath, err := os.MkdirTemp("", "data")
124121
if err != nil {
125-
fmt.Printf("Unable to create temporary data path %v\n", err)
126-
os.Exit(1)
122+
testlogger.Fatalf("Unable to create temporary data path %v\n", err)
127123
}
128124

129125
setting.CustomPath = filepath.Join(setting.AppWorkPath, "custom")
130126
setting.AppDataPath = tmpDataPath
131127

132128
unittest.InitSettings()
133129
if err = git.InitFull(context.Background()); err != nil {
134-
fmt.Printf("Unable to InitFull: %v\n", err)
135-
os.Exit(1)
130+
testlogger.Fatalf("Unable to InitFull: %v\n", err)
136131
}
137132
setting.LoadDBSetting()
138133
setting.InitLoggersForTest()

models/repo/repo.go

+31-18
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"fmt"
99
"html/template"
10+
"maps"
1011
"net"
1112
"net/url"
1213
"path/filepath"
@@ -165,10 +166,10 @@ type Repository struct {
165166

166167
Status RepositoryStatus `xorm:"NOT NULL DEFAULT 0"`
167168

168-
RenderingMetas map[string]string `xorm:"-"`
169-
DocumentRenderingMetas map[string]string `xorm:"-"`
170-
Units []*RepoUnit `xorm:"-"`
171-
PrimaryLanguage *LanguageStat `xorm:"-"`
169+
commonRenderingMetas map[string]string `xorm:"-"`
170+
171+
Units []*RepoUnit `xorm:"-"`
172+
PrimaryLanguage *LanguageStat `xorm:"-"`
172173

173174
IsFork bool `xorm:"INDEX NOT NULL DEFAULT false"`
174175
ForkID int64 `xorm:"INDEX"`
@@ -473,9 +474,8 @@ func (repo *Repository) MustOwner(ctx context.Context) *user_model.User {
473474
return repo.Owner
474475
}
475476

476-
// ComposeMetas composes a map of metas for properly rendering issue links and external issue trackers.
477-
func (repo *Repository) ComposeMetas(ctx context.Context) map[string]string {
478-
if len(repo.RenderingMetas) == 0 {
477+
func (repo *Repository) composeCommonMetas(ctx context.Context) map[string]string {
478+
if len(repo.commonRenderingMetas) == 0 {
479479
metas := map[string]string{
480480
"user": repo.OwnerName,
481481
"repo": repo.Name,
@@ -508,21 +508,34 @@ func (repo *Repository) ComposeMetas(ctx context.Context) map[string]string {
508508
metas["org"] = strings.ToLower(repo.OwnerName)
509509
}
510510

511-
repo.RenderingMetas = metas
511+
repo.commonRenderingMetas = metas
512512
}
513-
return repo.RenderingMetas
513+
return repo.commonRenderingMetas
514+
}
515+
516+
// ComposeMetas composes a map of metas for properly rendering comments or comment-like contents (commit message)
517+
func (repo *Repository) ComposeMetas(ctx context.Context) map[string]string {
518+
metas := maps.Clone(repo.composeCommonMetas(ctx))
519+
metas["markdownLineBreakStyle"] = "comment"
520+
metas["markupAllowShortIssuePattern"] = "true"
521+
return metas
514522
}
515523

516-
// ComposeDocumentMetas composes a map of metas for properly rendering documents
524+
// ComposeWikiMetas composes a map of metas for properly rendering wikis
525+
func (repo *Repository) ComposeWikiMetas(ctx context.Context) map[string]string {
526+
// does wiki need the "teams" and "org" from common metas?
527+
metas := maps.Clone(repo.composeCommonMetas(ctx))
528+
metas["markdownLineBreakStyle"] = "document"
529+
metas["markupAllowShortIssuePattern"] = "true"
530+
return metas
531+
}
532+
533+
// ComposeDocumentMetas composes a map of metas for properly rendering documents (repo files)
517534
func (repo *Repository) ComposeDocumentMetas(ctx context.Context) map[string]string {
518-
if len(repo.DocumentRenderingMetas) == 0 {
519-
metas := map[string]string{}
520-
for k, v := range repo.ComposeMetas(ctx) {
521-
metas[k] = v
522-
}
523-
repo.DocumentRenderingMetas = metas
524-
}
525-
return repo.DocumentRenderingMetas
535+
// does document(file) need the "teams" and "org" from common metas?
536+
metas := maps.Clone(repo.composeCommonMetas(ctx))
537+
metas["markdownLineBreakStyle"] = "document"
538+
return metas
526539
}
527540

528541
// GetBaseRepo populates repo.BaseRepo for a fork repository and

models/repo/repo_test.go

+33-34
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
// Copyright 2017 The Gitea Authors. All rights reserved.
22
// SPDX-License-Identifier: MIT
33

4-
package repo_test
4+
package repo
55

66
import (
77
"testing"
88

99
"code.gitea.io/gitea/models/db"
10-
repo_model "code.gitea.io/gitea/models/repo"
1110
"code.gitea.io/gitea/models/unit"
1211
"code.gitea.io/gitea/models/unittest"
1312
user_model "code.gitea.io/gitea/models/user"
@@ -20,18 +19,18 @@ import (
2019
)
2120

2221
var (
23-
countRepospts = repo_model.CountRepositoryOptions{OwnerID: 10}
24-
countReposptsPublic = repo_model.CountRepositoryOptions{OwnerID: 10, Private: optional.Some(false)}
25-
countReposptsPrivate = repo_model.CountRepositoryOptions{OwnerID: 10, Private: optional.Some(true)}
22+
countRepospts = CountRepositoryOptions{OwnerID: 10}
23+
countReposptsPublic = CountRepositoryOptions{OwnerID: 10, Private: optional.Some(false)}
24+
countReposptsPrivate = CountRepositoryOptions{OwnerID: 10, Private: optional.Some(true)}
2625
)
2726

2827
func TestGetRepositoryCount(t *testing.T) {
2928
assert.NoError(t, unittest.PrepareTestDatabase())
3029

3130
ctx := db.DefaultContext
32-
count, err1 := repo_model.CountRepositories(ctx, countRepospts)
33-
privateCount, err2 := repo_model.CountRepositories(ctx, countReposptsPrivate)
34-
publicCount, err3 := repo_model.CountRepositories(ctx, countReposptsPublic)
31+
count, err1 := CountRepositories(ctx, countRepospts)
32+
privateCount, err2 := CountRepositories(ctx, countReposptsPrivate)
33+
publicCount, err3 := CountRepositories(ctx, countReposptsPublic)
3534
assert.NoError(t, err1)
3635
assert.NoError(t, err2)
3736
assert.NoError(t, err3)
@@ -42,45 +41,45 @@ func TestGetRepositoryCount(t *testing.T) {
4241
func TestGetPublicRepositoryCount(t *testing.T) {
4342
assert.NoError(t, unittest.PrepareTestDatabase())
4443

45-
count, err := repo_model.CountRepositories(db.DefaultContext, countReposptsPublic)
44+
count, err := CountRepositories(db.DefaultContext, countReposptsPublic)
4645
assert.NoError(t, err)
4746
assert.Equal(t, int64(1), count)
4847
}
4948

5049
func TestGetPrivateRepositoryCount(t *testing.T) {
5150
assert.NoError(t, unittest.PrepareTestDatabase())
5251

53-
count, err := repo_model.CountRepositories(db.DefaultContext, countReposptsPrivate)
52+
count, err := CountRepositories(db.DefaultContext, countReposptsPrivate)
5453
assert.NoError(t, err)
5554
assert.Equal(t, int64(2), count)
5655
}
5756

5857
func TestRepoAPIURL(t *testing.T) {
5958
assert.NoError(t, unittest.PrepareTestDatabase())
60-
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
59+
repo := unittest.AssertExistsAndLoadBean(t, &Repository{ID: 10})
6160

6261
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user12/repo10", repo.APIURL())
6362
}
6463

6564
func TestWatchRepo(t *testing.T) {
6665
assert.NoError(t, unittest.PrepareTestDatabase())
6766

68-
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
67+
repo := unittest.AssertExistsAndLoadBean(t, &Repository{ID: 3})
6968
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
7069

71-
assert.NoError(t, repo_model.WatchRepo(db.DefaultContext, user, repo, true))
72-
unittest.AssertExistsAndLoadBean(t, &repo_model.Watch{RepoID: repo.ID, UserID: user.ID})
73-
unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repo.ID})
70+
assert.NoError(t, WatchRepo(db.DefaultContext, user, repo, true))
71+
unittest.AssertExistsAndLoadBean(t, &Watch{RepoID: repo.ID, UserID: user.ID})
72+
unittest.CheckConsistencyFor(t, &Repository{ID: repo.ID})
7473

75-
assert.NoError(t, repo_model.WatchRepo(db.DefaultContext, user, repo, false))
76-
unittest.AssertNotExistsBean(t, &repo_model.Watch{RepoID: repo.ID, UserID: user.ID})
77-
unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repo.ID})
74+
assert.NoError(t, WatchRepo(db.DefaultContext, user, repo, false))
75+
unittest.AssertNotExistsBean(t, &Watch{RepoID: repo.ID, UserID: user.ID})
76+
unittest.CheckConsistencyFor(t, &Repository{ID: repo.ID})
7877
}
7978

8079
func TestMetas(t *testing.T) {
8180
assert.NoError(t, unittest.PrepareTestDatabase())
8281

83-
repo := &repo_model.Repository{Name: "testRepo"}
82+
repo := &Repository{Name: "testRepo"}
8483
repo.Owner = &user_model.User{Name: "testOwner"}
8584
repo.OwnerName = repo.Owner.Name
8685

@@ -90,16 +89,16 @@ func TestMetas(t *testing.T) {
9089
assert.Equal(t, "testRepo", metas["repo"])
9190
assert.Equal(t, "testOwner", metas["user"])
9291

93-
externalTracker := repo_model.RepoUnit{
92+
externalTracker := RepoUnit{
9493
Type: unit.TypeExternalTracker,
95-
Config: &repo_model.ExternalTrackerConfig{
94+
Config: &ExternalTrackerConfig{
9695
ExternalTrackerFormat: "https://someurl.com/{user}/{repo}/{issue}",
9796
},
9897
}
9998

10099
testSuccess := func(expectedStyle string) {
101-
repo.Units = []*repo_model.RepoUnit{&externalTracker}
102-
repo.RenderingMetas = nil
100+
repo.Units = []*RepoUnit{&externalTracker}
101+
repo.commonRenderingMetas = nil
103102
metas := repo.ComposeMetas(db.DefaultContext)
104103
assert.Equal(t, expectedStyle, metas["style"])
105104
assert.Equal(t, "testRepo", metas["repo"])
@@ -118,7 +117,7 @@ func TestMetas(t *testing.T) {
118117
externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleRegexp
119118
testSuccess(markup.IssueNameStyleRegexp)
120119

121-
repo, err := repo_model.GetRepositoryByID(db.DefaultContext, 3)
120+
repo, err := GetRepositoryByID(db.DefaultContext, 3)
122121
assert.NoError(t, err)
123122

124123
metas = repo.ComposeMetas(db.DefaultContext)
@@ -132,15 +131,15 @@ func TestGetRepositoryByURL(t *testing.T) {
132131
assert.NoError(t, unittest.PrepareTestDatabase())
133132

134133
t.Run("InvalidPath", func(t *testing.T) {
135-
repo, err := repo_model.GetRepositoryByURL(db.DefaultContext, "something")
134+
repo, err := GetRepositoryByURL(db.DefaultContext, "something")
136135

137136
assert.Nil(t, repo)
138137
assert.Error(t, err)
139138
})
140139

141140
t.Run("ValidHttpURL", func(t *testing.T) {
142141
test := func(t *testing.T, url string) {
143-
repo, err := repo_model.GetRepositoryByURL(db.DefaultContext, url)
142+
repo, err := GetRepositoryByURL(db.DefaultContext, url)
144143

145144
assert.NotNil(t, repo)
146145
assert.NoError(t, err)
@@ -155,7 +154,7 @@ func TestGetRepositoryByURL(t *testing.T) {
155154

156155
t.Run("ValidGitSshURL", func(t *testing.T) {
157156
test := func(t *testing.T, url string) {
158-
repo, err := repo_model.GetRepositoryByURL(db.DefaultContext, url)
157+
repo, err := GetRepositoryByURL(db.DefaultContext, url)
159158

160159
assert.NotNil(t, repo)
161160
assert.NoError(t, err)
@@ -173,7 +172,7 @@ func TestGetRepositoryByURL(t *testing.T) {
173172

174173
t.Run("ValidImplicitSshURL", func(t *testing.T) {
175174
test := func(t *testing.T, url string) {
176-
repo, err := repo_model.GetRepositoryByURL(db.DefaultContext, url)
175+
repo, err := GetRepositoryByURL(db.DefaultContext, url)
177176

178177
assert.NotNil(t, repo)
179178
assert.NoError(t, err)
@@ -200,21 +199,21 @@ func TestComposeSSHCloneURL(t *testing.T) {
200199
setting.SSH.Domain = "domain"
201200
setting.SSH.Port = 22
202201
setting.Repository.UseCompatSSHURI = false
203-
assert.Equal(t, "git@domain:user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
202+
assert.Equal(t, "git@domain:user/repo.git", ComposeSSHCloneURL("user", "repo"))
204203
setting.Repository.UseCompatSSHURI = true
205-
assert.Equal(t, "ssh://git@domain/user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
204+
assert.Equal(t, "ssh://git@domain/user/repo.git", ComposeSSHCloneURL("user", "repo"))
206205
// test SSH_DOMAIN while use non-standard SSH port
207206
setting.SSH.Port = 123
208207
setting.Repository.UseCompatSSHURI = false
209-
assert.Equal(t, "ssh://git@domain:123/user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
208+
assert.Equal(t, "ssh://git@domain:123/user/repo.git", ComposeSSHCloneURL("user", "repo"))
210209
setting.Repository.UseCompatSSHURI = true
211-
assert.Equal(t, "ssh://git@domain:123/user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
210+
assert.Equal(t, "ssh://git@domain:123/user/repo.git", ComposeSSHCloneURL("user", "repo"))
212211

213212
// test IPv6 SSH_DOMAIN
214213
setting.Repository.UseCompatSSHURI = false
215214
setting.SSH.Domain = "::1"
216215
setting.SSH.Port = 22
217-
assert.Equal(t, "git@[::1]:user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
216+
assert.Equal(t, "git@[::1]:user/repo.git", ComposeSSHCloneURL("user", "repo"))
218217
setting.SSH.Port = 123
219-
assert.Equal(t, "ssh://git@[::1]:123/user/repo.git", repo_model.ComposeSSHCloneURL("user", "repo"))
218+
assert.Equal(t, "ssh://git@[::1]:123/user/repo.git", ComposeSSHCloneURL("user", "repo"))
220219
}

models/repo/search.go

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ var OrderByMap = map[string]map[string]db.SearchOrderBy{
3636
var OrderByFlatMap = map[string]db.SearchOrderBy{
3737
"newest": OrderByMap["desc"]["created"],
3838
"oldest": OrderByMap["asc"]["created"],
39+
"recentupdate": OrderByMap["desc"]["updated"],
3940
"leastupdate": OrderByMap["asc"]["updated"],
4041
"reversealphabetically": OrderByMap["desc"]["alpha"],
4142
"alphabetically": OrderByMap["asc"]["alpha"],

modules/log/color.go

+6
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,19 @@ type ColoredValue struct {
8686
colors []ColorAttribute
8787
}
8888

89+
var _ fmt.Formatter = (*ColoredValue)(nil)
90+
8991
func (c *ColoredValue) Format(f fmt.State, verb rune) {
9092
_, _ = f.Write(ColorBytes(c.colors...))
9193
s := fmt.Sprintf(fmt.FormatString(f, verb), c.v)
9294
_, _ = f.Write([]byte(s))
9395
_, _ = f.Write(resetBytes)
9496
}
9597

98+
func (c *ColoredValue) Value() any {
99+
return c.v
100+
}
101+
96102
func NewColoredValue(v any, color ...ColorAttribute) *ColoredValue {
97103
return &ColoredValue{v: v, colors: color}
98104
}

0 commit comments

Comments
 (0)