Skip to content

Commit 4115a88

Browse files
committed
Merge remote-tracking branch 'upstream/main'
* upstream/main: Use template context function for avatar rendering (go-gitea#26385) Add transaction when creating pull request created dirty data (go-gitea#26259) Fix admin queue page title (go-gitea#26409)
2 parents b7be5b3 + a370efc commit 4115a88

Some content is hidden

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

65 files changed

+293
-251
lines changed

models/issues/pull.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -533,13 +533,12 @@ func (pr *PullRequest) SetMerged(ctx context.Context) (bool, error) {
533533
}
534534

535535
// NewPullRequest creates new pull request with labels for repository.
536-
func NewPullRequest(outerCtx context.Context, repo *repo_model.Repository, issue *Issue, labelIDs []int64, uuids []string, pr *PullRequest) (err error) {
537-
ctx, committer, err := db.TxContext(outerCtx)
536+
func NewPullRequest(ctx context.Context, repo *repo_model.Repository, issue *Issue, labelIDs []int64, uuids []string, pr *PullRequest) (err error) {
537+
ctx, committer, err := db.TxContext(ctx)
538538
if err != nil {
539539
return err
540540
}
541541
defer committer.Close()
542-
ctx.WithContext(outerCtx)
543542

544543
idx, err := db.GetNextResourceIndex(ctx, "issue_index", repo.ID)
545544
if err != nil {
@@ -948,14 +947,14 @@ func PullRequestCodeOwnersReview(ctx context.Context, pull *Issue, pr *PullReque
948947

949948
for _, u := range uniqUsers {
950949
if u.ID != pull.Poster.ID {
951-
if _, err := AddReviewRequest(pull, u, pull.Poster); err != nil {
950+
if _, err := AddReviewRequest(ctx, pull, u, pull.Poster); err != nil {
952951
log.Warn("Failed add assignee user: %s to PR review: %s#%d, error: %s", u.Name, pr.BaseRepo.Name, pr.ID, err)
953952
return err
954953
}
955954
}
956955
}
957956
for _, t := range uniqTeams {
958-
if _, err := AddTeamReviewRequest(pull, t, pull.Poster); err != nil {
957+
if _, err := AddTeamReviewRequest(ctx, pull, t, pull.Poster); err != nil {
959958
log.Warn("Failed add assignee team: %s to PR review: %s#%d, error: %s", t.Name, pr.BaseRepo.Name, pr.ID, err)
960959
return err
961960
}

models/issues/pull_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,14 @@ func TestLoadRequestedReviewers(t *testing.T) {
8888
user1, err := user_model.GetUserByID(db.DefaultContext, 1)
8989
assert.NoError(t, err)
9090

91-
comment, err := issues_model.AddReviewRequest(issue, user1, &user_model.User{})
91+
comment, err := issues_model.AddReviewRequest(db.DefaultContext, issue, user1, &user_model.User{})
9292
assert.NoError(t, err)
9393
assert.NotNil(t, comment)
9494

9595
assert.NoError(t, pull.LoadRequestedReviewers(db.DefaultContext))
9696
assert.Len(t, pull.RequestedReviewers, 1)
9797

98-
comment, err = issues_model.RemoveReviewRequest(issue, user1, &user_model.User{})
98+
comment, err = issues_model.RemoveReviewRequest(db.DefaultContext, issue, user1, &user_model.User{})
9999
assert.NoError(t, err)
100100
assert.NotNil(t, comment)
101101

models/issues/review.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -560,8 +560,8 @@ func InsertReviews(reviews []*Review) error {
560560
}
561561

562562
// AddReviewRequest add a review request from one reviewer
563-
func AddReviewRequest(issue *Issue, reviewer, doer *user_model.User) (*Comment, error) {
564-
ctx, committer, err := db.TxContext(db.DefaultContext)
563+
func AddReviewRequest(ctx context.Context, issue *Issue, reviewer, doer *user_model.User) (*Comment, error) {
564+
ctx, committer, err := db.TxContext(ctx)
565565
if err != nil {
566566
return nil, err
567567
}
@@ -615,8 +615,8 @@ func AddReviewRequest(issue *Issue, reviewer, doer *user_model.User) (*Comment,
615615
}
616616

617617
// RemoveReviewRequest remove a review request from one reviewer
618-
func RemoveReviewRequest(issue *Issue, reviewer, doer *user_model.User) (*Comment, error) {
619-
ctx, committer, err := db.TxContext(db.DefaultContext)
618+
func RemoveReviewRequest(ctx context.Context, issue *Issue, reviewer, doer *user_model.User) (*Comment, error) {
619+
ctx, committer, err := db.TxContext(ctx)
620620
if err != nil {
621621
return nil, err
622622
}
@@ -676,8 +676,8 @@ func restoreLatestOfficialReview(ctx context.Context, issueID, reviewerID int64)
676676
}
677677

678678
// AddTeamReviewRequest add a review request from one team
679-
func AddTeamReviewRequest(issue *Issue, reviewer *organization.Team, doer *user_model.User) (*Comment, error) {
680-
ctx, committer, err := db.TxContext(db.DefaultContext)
679+
func AddTeamReviewRequest(ctx context.Context, issue *Issue, reviewer *organization.Team, doer *user_model.User) (*Comment, error) {
680+
ctx, committer, err := db.TxContext(ctx)
681681
if err != nil {
682682
return nil, err
683683
}
@@ -735,8 +735,8 @@ func AddTeamReviewRequest(issue *Issue, reviewer *organization.Team, doer *user_
735735
}
736736

737737
// RemoveTeamReviewRequest remove a review request from one team
738-
func RemoveTeamReviewRequest(issue *Issue, reviewer *organization.Team, doer *user_model.User) (*Comment, error) {
739-
ctx, committer, err := db.TxContext(db.DefaultContext)
738+
func RemoveTeamReviewRequest(ctx context.Context, issue *Issue, reviewer *organization.Team, doer *user_model.User) (*Comment, error) {
739+
ctx, committer, err := db.TxContext(ctx)
740740
if err != nil {
741741
return nil, err
742742
}

modules/context/context.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ func Contexter() func(next http.Handler) http.Handler {
141141
// TODO: "install.go" also shares the same logic, which should be refactored to a general function
142142
ctx.TemplateContext = NewTemplateContext(ctx)
143143
ctx.TemplateContext["Locale"] = ctx.Locale
144+
ctx.TemplateContext["AvatarUtils"] = templates.NewAvatarUtils(ctx)
144145

145146
ctx.Data.MergeFrom(middleware.CommonTemplateContextData())
146147
ctx.Data["Context"] = ctx // TODO: use "ctx" in template and remove this

modules/ssh/ssh.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"os"
1818
"os/exec"
1919
"path/filepath"
20+
"reflect"
2021
"strconv"
2122
"strings"
2223
"sync"
@@ -164,6 +165,10 @@ func sessionHandler(session ssh.Session) {
164165
}
165166

166167
func publicKeyHandler(ctx ssh.Context, key ssh.PublicKey) bool {
168+
// FIXME: the "ssh.Context" is not thread-safe, so db operations should use the immutable parent "Context"
169+
// TODO: Remove after https://github.com/gliderlabs/ssh/pull/211
170+
parentCtx := reflect.ValueOf(ctx).Elem().FieldByName("Context").Interface().(context.Context)
171+
167172
if log.IsDebug() { // <- FingerprintSHA256 is kinda expensive so only calculate it if necessary
168173
log.Debug("Handle Public Key: Fingerprint: %s from %s", gossh.FingerprintSHA256(key), ctx.RemoteAddr())
169174
}
@@ -189,7 +194,7 @@ func publicKeyHandler(ctx ssh.Context, key ssh.PublicKey) bool {
189194
// look for the exact principal
190195
principalLoop:
191196
for _, principal := range cert.ValidPrincipals {
192-
pkey, err := asymkey_model.SearchPublicKeyByContentExact(ctx, principal)
197+
pkey, err := asymkey_model.SearchPublicKeyByContentExact(parentCtx, principal)
193198
if err != nil {
194199
if asymkey_model.IsErrKeyNotExist(err) {
195200
log.Debug("Principal Rejected: %s Unknown Principal: %s", ctx.RemoteAddr(), principal)
@@ -246,7 +251,7 @@ func publicKeyHandler(ctx ssh.Context, key ssh.PublicKey) bool {
246251
log.Debug("Handle Public Key: %s Fingerprint: %s is not a certificate", ctx.RemoteAddr(), gossh.FingerprintSHA256(key))
247252
}
248253

249-
pkey, err := asymkey_model.SearchPublicKeyByContent(ctx, strings.TrimSpace(string(gossh.MarshalAuthorizedKey(key))))
254+
pkey, err := asymkey_model.SearchPublicKeyByContent(parentCtx, strings.TrimSpace(string(gossh.MarshalAuthorizedKey(key))))
250255
if err != nil {
251256
if asymkey_model.IsErrKeyNotExist(err) {
252257
log.Warn("Unknown public key: %s from %s", gossh.FingerprintSHA256(key), ctx.RemoteAddr())

modules/templates/helper.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,11 @@ func NewFuncMap() template.FuncMap {
5252

5353
// -----------------------------------------------------------------
5454
// svg / avatar / icon
55-
"svg": svg.RenderHTML,
56-
"avatar": Avatar,
57-
"avatarHTML": AvatarHTML,
58-
"avatarByAction": AvatarByAction,
59-
"avatarByEmail": AvatarByEmail,
60-
"EntryIcon": base.EntryIcon,
61-
"MigrationIcon": MigrationIcon,
62-
"ActionIcon": ActionIcon,
55+
"svg": svg.RenderHTML,
56+
"avatarHTML": AvatarHTML,
57+
"EntryIcon": base.EntryIcon,
58+
"MigrationIcon": MigrationIcon,
59+
"ActionIcon": ActionIcon,
6360

6461
"SortArrow": SortArrow,
6562

modules/templates/util_avatar.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ import (
1818
"code.gitea.io/gitea/modules/setting"
1919
)
2020

21+
type AvatarUtils struct {
22+
ctx context.Context
23+
}
24+
25+
func NewAvatarUtils(ctx context.Context) *AvatarUtils {
26+
return &AvatarUtils{ctx: ctx}
27+
}
28+
2129
// AvatarHTML creates the HTML for an avatar
2230
func AvatarHTML(src string, size int, class, name string) template.HTML {
2331
sizeStr := fmt.Sprintf(`%d`, size)
@@ -30,44 +38,44 @@ func AvatarHTML(src string, size int, class, name string) template.HTML {
3038
}
3139

3240
// Avatar renders user avatars. args: user, size (int), class (string)
33-
func Avatar(ctx context.Context, item any, others ...any) template.HTML {
41+
func (au *AvatarUtils) Avatar(item any, others ...any) template.HTML {
3442
size, class := gitea_html.ParseSizeAndClass(avatars.DefaultAvatarPixelSize, avatars.DefaultAvatarClass, others...)
3543

3644
switch t := item.(type) {
3745
case *user_model.User:
38-
src := t.AvatarLinkWithSize(ctx, size*setting.Avatar.RenderedSizeFactor)
46+
src := t.AvatarLinkWithSize(au.ctx, size*setting.Avatar.RenderedSizeFactor)
3947
if src != "" {
4048
return AvatarHTML(src, size, class, t.DisplayName())
4149
}
4250
case *repo_model.Collaborator:
43-
src := t.AvatarLinkWithSize(ctx, size*setting.Avatar.RenderedSizeFactor)
51+
src := t.AvatarLinkWithSize(au.ctx, size*setting.Avatar.RenderedSizeFactor)
4452
if src != "" {
4553
return AvatarHTML(src, size, class, t.DisplayName())
4654
}
4755
case *organization.Organization:
48-
src := t.AsUser().AvatarLinkWithSize(ctx, size*setting.Avatar.RenderedSizeFactor)
56+
src := t.AsUser().AvatarLinkWithSize(au.ctx, size*setting.Avatar.RenderedSizeFactor)
4957
if src != "" {
5058
return AvatarHTML(src, size, class, t.AsUser().DisplayName())
5159
}
5260
}
5361

54-
return template.HTML("")
62+
return ""
5563
}
5664

5765
// AvatarByAction renders user avatars from action. args: action, size (int), class (string)
58-
func AvatarByAction(ctx context.Context, action *activities_model.Action, others ...any) template.HTML {
59-
action.LoadActUser(ctx)
60-
return Avatar(ctx, action.ActUser, others...)
66+
func (au *AvatarUtils) AvatarByAction(action *activities_model.Action, others ...any) template.HTML {
67+
action.LoadActUser(au.ctx)
68+
return au.Avatar(action.ActUser, others...)
6169
}
6270

6371
// AvatarByEmail renders avatars by email address. args: email, name, size (int), class (string)
64-
func AvatarByEmail(ctx context.Context, email, name string, others ...any) template.HTML {
72+
func (au *AvatarUtils) AvatarByEmail(email, name string, others ...any) template.HTML {
6573
size, class := gitea_html.ParseSizeAndClass(avatars.DefaultAvatarPixelSize, avatars.DefaultAvatarClass, others...)
66-
src := avatars.GenerateEmailAvatarFastLink(ctx, email, size*setting.Avatar.RenderedSizeFactor)
74+
src := avatars.GenerateEmailAvatarFastLink(au.ctx, email, size*setting.Avatar.RenderedSizeFactor)
6775

6876
if src != "" {
6977
return AvatarHTML(src, size, class, name)
7078
}
7179

72-
return template.HTML("")
80+
return ""
7381
}

routers/web/admin/queue.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func Queues(ctx *context.Context) {
1616
if !setting.IsProd {
1717
initTestQueueOnce()
1818
}
19-
ctx.Data["Title"] = ctx.Tr("admin.monitor.queue")
19+
ctx.Data["Title"] = ctx.Tr("admin.monitor.queues")
2020
ctx.Data["PageIsAdminMonitorQueue"] = true
2121
ctx.Data["Queues"] = queue.GetManager().ManagedQueues()
2222
ctx.HTML(http.StatusOK, tplQueue)

routers/web/repo/blame.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ func renderBlame(ctx *context.Context, blameParts []git.BlamePart, commitNames m
235235

236236
var lexerName string
237237

238+
avatarUtils := templates.NewAvatarUtils(ctx)
238239
i := 0
239240
commitCnt := 0
240241
for _, part := range blameParts {
@@ -257,9 +258,9 @@ func renderBlame(ctx *context.Context, blameParts []git.BlamePart, commitNames m
257258

258259
var avatar string
259260
if commit.User != nil {
260-
avatar = string(templates.Avatar(ctx, commit.User, 18, "gt-mr-3"))
261+
avatar = string(avatarUtils.Avatar(commit.User, 18, "gt-mr-3"))
261262
} else {
262-
avatar = string(templates.AvatarByEmail(ctx, commit.Author.Email, commit.Author.Name, 18, "gt-mr-3"))
263+
avatar = string(avatarUtils.AvatarByEmail(commit.Author.Email, commit.Author.Name, 18, "gt-mr-3"))
263264
}
264265

265266
br.Avatar = gotemplate.HTML(avatar)

routers/web/repo/issue.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2290,7 +2290,7 @@ func UpdateIssueAssignee(ctx *context.Context) {
22902290
return
22912291
}
22922292

2293-
_, _, err = issue_service.ToggleAssignee(ctx, issue, ctx.Doer, assigneeID)
2293+
_, _, err = issue_service.ToggleAssigneeWithNotify(ctx, issue, ctx.Doer, assigneeID)
22942294
if err != nil {
22952295
ctx.ServerError("ToggleAssignee", err)
22962296
return

0 commit comments

Comments
 (0)