Skip to content

Commit 8baf25e

Browse files
committed
Merge remote-tracking branch 'upstream/main'
* upstream/main: Fix halfCommitter and WithTx (go-gitea#22366) Don't lookup mail server when using sendmail (go-gitea#22300) Update index.de-de.md (go-gitea#22363) Move fuzz tests into tests/fuzz (go-gitea#22376) Remove satori/go.uuid (go-gitea#22375) Use context parameter in models/git (go-gitea#22367)
2 parents 544e75a + a357143 commit 8baf25e

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

+328
-204
lines changed

docs/content/page/index.de-de.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
date: "2016-11-08T16:00:00+02:00"
2+
date: "2023-01-07T22:03:00+01:00"
33
title: "Dokumentation"
44
slug: "documentation"
55
url: "/de-de/"
@@ -27,11 +27,11 @@ Gitea ist ein [Gogs](http://gogs.io)-Fork.
2727
* 2 CPU Kerne und 1GB RAM sind für kleine Teams/Projekte ausreichend.
2828
* Gitea sollte unter einem seperaten nicht-root Account auf UNIX-Systemen ausgeführt werden.
2929
* Achtung: Gitea verwaltet die `~/.ssh/authorized_keys` Datei. Gitea unter einem normalen Benutzer auszuführen könnte dazu führen, dass dieser sich nicht mehr anmelden kann.
30-
* [Git](https://git-scm.com/) Version 2.0 oder später wird benötigt.
31-
* Wenn git >= 2.1.2. und [Git large file storage](https://git-lfs.github.com/) aktiviert ist, dann wird es auch in Gitea verwendbar sein.
32-
* Wenn git >= 2.18, dann wird das Rendern von Commit-Graphen automatisch aktiviert.
30+
* [Git](https://git-scm.com/) Version 2.0 oder aktueller wird benötigt.
31+
* Wenn Git >= 2.1.2 und [Git LFS](https://git-lfs.github.com/) vorhanden ist, dann wird Git LFS Support automatisch für Gitea aktiviert.
32+
* Wenn Git >= 2.18, dann wird das Rendern von Commit-Graphen automatisch aktiviert.
3333

3434
## Browser Unterstützung
3535

36-
* Letzten 2 Versions von Chrome, Firefox, Safari und Edge
36+
* Die neuesten zwei Versionen von Chrome, Firefox, Safari und Edge
3737
* Firefox ESR

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -303,12 +303,12 @@ replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1
303303

304304
replace github.com/shurcooL/vfsgen => github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0
305305

306-
replace github.com/satori/go.uuid v1.2.0 => github.com/gofrs/uuid v4.2.0+incompatible
307-
308306
replace github.com/blevesearch/zapx/v15 v15.3.6 => github.com/zeripath/zapx/v15 v15.3.6-alignment-fix
309307

310308
exclude github.com/gofrs/uuid v3.2.0+incompatible
311309

312310
exclude github.com/gofrs/uuid v4.0.0+incompatible
313311

314312
exclude github.com/goccy/go-json v0.4.11
313+
314+
exclude github.com/satori/go.uuid v1.2.0

go.sum

-1
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,6 @@ github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
596596
github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
597597
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
598598
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
599-
github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
600599
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
601600
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
602601
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=

models/db/context.go

+22-5
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,31 @@ type Committer interface {
9898
// halfCommitter is a wrapper of Committer.
9999
// It can be closed early, but can't be committed early, it is useful for reusing a transaction.
100100
type halfCommitter struct {
101-
Committer
101+
committer Committer
102+
committed bool
102103
}
103104

104-
func (*halfCommitter) Commit() error {
105-
// do nothing
105+
func (c *halfCommitter) Commit() error {
106+
c.committed = true
107+
// should do nothing, and the parent committer will commit later
106108
return nil
107109
}
108110

111+
func (c *halfCommitter) Close() error {
112+
if c.committed {
113+
// it's "commit and close", should do nothing, and the parent committer will commit later
114+
return nil
115+
}
116+
117+
// it's "rollback and close", let the parent committer rollback right now
118+
return c.committer.Close()
119+
}
120+
109121
// TxContext represents a transaction Context,
110122
// it will reuse the existing transaction in the parent context or create a new one.
111123
func TxContext(parentCtx context.Context) (*Context, Committer, error) {
112124
if sess, ok := inTransaction(parentCtx); ok {
113-
return newContext(parentCtx, sess, true), &halfCommitter{Committer: sess}, nil
125+
return newContext(parentCtx, sess, true), &halfCommitter{committer: sess}, nil
114126
}
115127

116128
sess := x.NewSession()
@@ -126,7 +138,12 @@ func TxContext(parentCtx context.Context) (*Context, Committer, error) {
126138
// this function will reuse it otherwise will create a new one and close it when finished.
127139
func WithTx(parentCtx context.Context, f func(ctx context.Context) error) error {
128140
if sess, ok := inTransaction(parentCtx); ok {
129-
return f(newContext(parentCtx, sess, true))
141+
err := f(newContext(parentCtx, sess, true))
142+
if err != nil {
143+
// rollback immediately, in case the caller ignores returned error and tries to commit the transaction.
144+
_ = sess.Close()
145+
}
146+
return err
130147
}
131148
return txWithNoCheck(parentCtx, f)
132149
}

models/db/context_committer_test.go

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package db // it's not db_test, because this file is for testing the private type halfCommitter
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
type MockCommitter struct {
14+
wants []string
15+
gots []string
16+
}
17+
18+
func NewMockCommitter(wants ...string) *MockCommitter {
19+
return &MockCommitter{
20+
wants: wants,
21+
}
22+
}
23+
24+
func (c *MockCommitter) Commit() error {
25+
c.gots = append(c.gots, "commit")
26+
return nil
27+
}
28+
29+
func (c *MockCommitter) Close() error {
30+
c.gots = append(c.gots, "close")
31+
return nil
32+
}
33+
34+
func (c *MockCommitter) Assert(t *testing.T) {
35+
assert.Equal(t, c.wants, c.gots, "want operations %v, but got %v", c.wants, c.gots)
36+
}
37+
38+
func Test_halfCommitter(t *testing.T) {
39+
/*
40+
Do something like:
41+
42+
ctx, committer, err := db.TxContext(db.DefaultContext)
43+
if err != nil {
44+
return nil
45+
}
46+
defer committer.Close()
47+
48+
// ...
49+
50+
if err != nil {
51+
return nil
52+
}
53+
54+
// ...
55+
56+
return committer.Commit()
57+
*/
58+
59+
testWithCommitter := func(committer Committer, f func(committer Committer) error) {
60+
if err := f(&halfCommitter{committer: committer}); err == nil {
61+
committer.Commit()
62+
}
63+
committer.Close()
64+
}
65+
66+
t.Run("commit and close", func(t *testing.T) {
67+
mockCommitter := NewMockCommitter("commit", "close")
68+
69+
testWithCommitter(mockCommitter, func(committer Committer) error {
70+
defer committer.Close()
71+
return committer.Commit()
72+
})
73+
74+
mockCommitter.Assert(t)
75+
})
76+
77+
t.Run("rollback and close", func(t *testing.T) {
78+
mockCommitter := NewMockCommitter("close", "close")
79+
80+
testWithCommitter(mockCommitter, func(committer Committer) error {
81+
defer committer.Close()
82+
if true {
83+
return fmt.Errorf("error")
84+
}
85+
return committer.Commit()
86+
})
87+
88+
mockCommitter.Assert(t)
89+
})
90+
91+
t.Run("close and commit", func(t *testing.T) {
92+
mockCommitter := NewMockCommitter("close", "close")
93+
94+
testWithCommitter(mockCommitter, func(committer Committer) error {
95+
committer.Close()
96+
committer.Commit()
97+
return fmt.Errorf("error")
98+
})
99+
100+
mockCommitter.Assert(t)
101+
})
102+
}

models/git/branches.go

+26-26
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,19 @@ func (protectBranch *ProtectedBranch) IsProtected() bool {
6767
}
6868

6969
// CanUserPush returns if some user could push to this protected branch
70-
func (protectBranch *ProtectedBranch) CanUserPush(userID int64) bool {
70+
func (protectBranch *ProtectedBranch) CanUserPush(ctx context.Context, userID int64) bool {
7171
if !protectBranch.CanPush {
7272
return false
7373
}
7474

7575
if !protectBranch.EnableWhitelist {
76-
if user, err := user_model.GetUserByID(db.DefaultContext, userID); err != nil {
76+
if user, err := user_model.GetUserByID(ctx, userID); err != nil {
7777
log.Error("GetUserByID: %v", err)
7878
return false
79-
} else if repo, err := repo_model.GetRepositoryByID(db.DefaultContext, protectBranch.RepoID); err != nil {
79+
} else if repo, err := repo_model.GetRepositoryByID(ctx, protectBranch.RepoID); err != nil {
8080
log.Error("repo_model.GetRepositoryByID: %v", err)
8181
return false
82-
} else if writeAccess, err := access_model.HasAccessUnit(db.DefaultContext, user, repo, unit.TypeCode, perm.AccessModeWrite); err != nil {
82+
} else if writeAccess, err := access_model.HasAccessUnit(ctx, user, repo, unit.TypeCode, perm.AccessModeWrite); err != nil {
8383
log.Error("HasAccessUnit: %v", err)
8484
return false
8585
} else {
@@ -95,7 +95,7 @@ func (protectBranch *ProtectedBranch) CanUserPush(userID int64) bool {
9595
return false
9696
}
9797

98-
in, err := organization.IsUserInTeams(db.DefaultContext, userID, protectBranch.WhitelistTeamIDs)
98+
in, err := organization.IsUserInTeams(ctx, userID, protectBranch.WhitelistTeamIDs)
9999
if err != nil {
100100
log.Error("IsUserInTeams: %v", err)
101101
return false
@@ -320,19 +320,19 @@ func UpdateProtectBranch(ctx context.Context, repo *repo_model.Repository, prote
320320
}
321321

322322
// GetProtectedBranches get all protected branches
323-
func GetProtectedBranches(repoID int64) ([]*ProtectedBranch, error) {
323+
func GetProtectedBranches(ctx context.Context, repoID int64) ([]*ProtectedBranch, error) {
324324
protectedBranches := make([]*ProtectedBranch, 0)
325-
return protectedBranches, db.GetEngine(db.DefaultContext).Find(&protectedBranches, &ProtectedBranch{RepoID: repoID})
325+
return protectedBranches, db.GetEngine(ctx).Find(&protectedBranches, &ProtectedBranch{RepoID: repoID})
326326
}
327327

328328
// IsProtectedBranch checks if branch is protected
329-
func IsProtectedBranch(repoID int64, branchName string) (bool, error) {
329+
func IsProtectedBranch(ctx context.Context, repoID int64, branchName string) (bool, error) {
330330
protectedBranch := &ProtectedBranch{
331331
RepoID: repoID,
332332
BranchName: branchName,
333333
}
334334

335-
has, err := db.GetEngine(db.DefaultContext).Exist(protectedBranch)
335+
has, err := db.GetEngine(ctx).Exist(protectedBranch)
336336
if err != nil {
337337
return true, err
338338
}
@@ -413,13 +413,13 @@ func updateTeamWhitelist(ctx context.Context, repo *repo_model.Repository, curre
413413
}
414414

415415
// DeleteProtectedBranch removes ProtectedBranch relation between the user and repository.
416-
func DeleteProtectedBranch(repoID, id int64) (err error) {
416+
func DeleteProtectedBranch(ctx context.Context, repoID, id int64) (err error) {
417417
protectedBranch := &ProtectedBranch{
418418
RepoID: repoID,
419419
ID: id,
420420
}
421421

422-
if affected, err := db.GetEngine(db.DefaultContext).Delete(protectedBranch); err != nil {
422+
if affected, err := db.GetEngine(ctx).Delete(protectedBranch); err != nil {
423423
return err
424424
} else if affected != 1 {
425425
return fmt.Errorf("delete protected branch ID(%v) failed", id)
@@ -440,28 +440,28 @@ type DeletedBranch struct {
440440
}
441441

442442
// AddDeletedBranch adds a deleted branch to the database
443-
func AddDeletedBranch(repoID int64, branchName, commit string, deletedByID int64) error {
443+
func AddDeletedBranch(ctx context.Context, repoID int64, branchName, commit string, deletedByID int64) error {
444444
deletedBranch := &DeletedBranch{
445445
RepoID: repoID,
446446
Name: branchName,
447447
Commit: commit,
448448
DeletedByID: deletedByID,
449449
}
450450

451-
_, err := db.GetEngine(db.DefaultContext).Insert(deletedBranch)
451+
_, err := db.GetEngine(ctx).Insert(deletedBranch)
452452
return err
453453
}
454454

455455
// GetDeletedBranches returns all the deleted branches
456-
func GetDeletedBranches(repoID int64) ([]*DeletedBranch, error) {
456+
func GetDeletedBranches(ctx context.Context, repoID int64) ([]*DeletedBranch, error) {
457457
deletedBranches := make([]*DeletedBranch, 0)
458-
return deletedBranches, db.GetEngine(db.DefaultContext).Where("repo_id = ?", repoID).Desc("deleted_unix").Find(&deletedBranches)
458+
return deletedBranches, db.GetEngine(ctx).Where("repo_id = ?", repoID).Desc("deleted_unix").Find(&deletedBranches)
459459
}
460460

461461
// GetDeletedBranchByID get a deleted branch by its ID
462-
func GetDeletedBranchByID(repoID, id int64) (*DeletedBranch, error) {
462+
func GetDeletedBranchByID(ctx context.Context, repoID, id int64) (*DeletedBranch, error) {
463463
deletedBranch := &DeletedBranch{}
464-
has, err := db.GetEngine(db.DefaultContext).Where("repo_id = ?", repoID).And("id = ?", id).Get(deletedBranch)
464+
has, err := db.GetEngine(ctx).Where("repo_id = ?", repoID).And("id = ?", id).Get(deletedBranch)
465465
if err != nil {
466466
return nil, err
467467
}
@@ -472,13 +472,13 @@ func GetDeletedBranchByID(repoID, id int64) (*DeletedBranch, error) {
472472
}
473473

474474
// RemoveDeletedBranchByID removes a deleted branch from the database
475-
func RemoveDeletedBranchByID(repoID, id int64) (err error) {
475+
func RemoveDeletedBranchByID(ctx context.Context, repoID, id int64) (err error) {
476476
deletedBranch := &DeletedBranch{
477477
RepoID: repoID,
478478
ID: id,
479479
}
480480

481-
if affected, err := db.GetEngine(db.DefaultContext).Delete(deletedBranch); err != nil {
481+
if affected, err := db.GetEngine(ctx).Delete(deletedBranch); err != nil {
482482
return err
483483
} else if affected != 1 {
484484
return fmt.Errorf("remove deleted branch ID(%v) failed", id)
@@ -498,8 +498,8 @@ func (deletedBranch *DeletedBranch) LoadUser(ctx context.Context) {
498498
}
499499

500500
// RemoveDeletedBranchByName removes all deleted branches
501-
func RemoveDeletedBranchByName(repoID int64, branch string) error {
502-
_, err := db.GetEngine(db.DefaultContext).Where("repo_id=? AND name=?", repoID, branch).Delete(new(DeletedBranch))
501+
func RemoveDeletedBranchByName(ctx context.Context, repoID int64, branch string) error {
502+
_, err := db.GetEngine(ctx).Where("repo_id=? AND name=?", repoID, branch).Delete(new(DeletedBranch))
503503
return err
504504
}
505505

@@ -509,7 +509,7 @@ func RemoveOldDeletedBranches(ctx context.Context, olderThan time.Duration) {
509509
log.Trace("Doing: DeletedBranchesCleanup")
510510

511511
deleteBefore := time.Now().Add(-olderThan)
512-
_, err := db.GetEngine(db.DefaultContext).Where("deleted_unix < ?", deleteBefore.Unix()).Delete(new(DeletedBranch))
512+
_, err := db.GetEngine(ctx).Where("deleted_unix < ?", deleteBefore.Unix()).Delete(new(DeletedBranch))
513513
if err != nil {
514514
log.Error("DeletedBranchesCleanup: %v", err)
515515
}
@@ -526,19 +526,19 @@ type RenamedBranch struct {
526526
}
527527

528528
// FindRenamedBranch check if a branch was renamed
529-
func FindRenamedBranch(repoID int64, from string) (branch *RenamedBranch, exist bool, err error) {
529+
func FindRenamedBranch(ctx context.Context, repoID int64, from string) (branch *RenamedBranch, exist bool, err error) {
530530
branch = &RenamedBranch{
531531
RepoID: repoID,
532532
From: from,
533533
}
534-
exist, err = db.GetEngine(db.DefaultContext).Get(branch)
534+
exist, err = db.GetEngine(ctx).Get(branch)
535535

536536
return branch, exist, err
537537
}
538538

539539
// RenameBranch rename a branch
540-
func RenameBranch(repo *repo_model.Repository, from, to string, gitAction func(isDefault bool) error) (err error) {
541-
ctx, committer, err := db.TxContext(db.DefaultContext)
540+
func RenameBranch(ctx context.Context, repo *repo_model.Repository, from, to string, gitAction func(isDefault bool) error) (err error) {
541+
ctx, committer, err := db.TxContext(ctx)
542542
if err != nil {
543543
return err
544544
}

0 commit comments

Comments
 (0)