Skip to content

Commit 110fc57

Browse files
authored
Move some code into models/git (#19879)
* Move access and repo permission to models/perm/access * fix test * Move some git related files into sub package models/git * Fix build * fix git test * move lfs to sub package * move more git related functions to models/git * Move functions sequence * Some improvements per @KN4CK3R and @delvh
1 parent a9dc9b0 commit 110fc57

Some content is hidden

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

67 files changed

+549
-495
lines changed

cmd/migrate_storage.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import (
99
"fmt"
1010
"strings"
1111

12-
"code.gitea.io/gitea/models"
1312
"code.gitea.io/gitea/models/db"
13+
git_model "code.gitea.io/gitea/models/git"
1414
"code.gitea.io/gitea/models/migrations"
1515
repo_model "code.gitea.io/gitea/models/repo"
1616
user_model "code.gitea.io/gitea/models/user"
@@ -88,7 +88,7 @@ func migrateAttachments(dstStorage storage.ObjectStorage) error {
8888
}
8989

9090
func migrateLFS(dstStorage storage.ObjectStorage) error {
91-
return models.IterateLFS(func(mo *models.LFSMetaObject) error {
91+
return git_model.IterateLFS(func(mo *git_model.LFSMetaObject) error {
9292
_, err := storage.Copy(dstStorage, mo.RelativePath(), storage.LFS, mo.RelativePath())
9393
return err
9494
})

cmd/serv.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import (
1717
"strings"
1818
"time"
1919

20-
"code.gitea.io/gitea/models"
2120
asymkey_model "code.gitea.io/gitea/models/asymkey"
21+
git_model "code.gitea.io/gitea/models/git"
2222
"code.gitea.io/gitea/models/perm"
2323
"code.gitea.io/gitea/modules/git"
2424
"code.gitea.io/gitea/modules/json"
@@ -276,7 +276,7 @@ func runServ(c *cli.Context) error {
276276
return fail("Internal error", "Failed to sign JWT token: %v", err)
277277
}
278278

279-
tokenAuthentication := &models.LFSTokenResponse{
279+
tokenAuthentication := &git_model.LFSTokenResponse{
280280
Header: make(map[string]string),
281281
Href: url,
282282
}

integrations/api_repo_lfs_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"strings"
1313
"testing"
1414

15-
"code.gitea.io/gitea/models"
15+
git_model "code.gitea.io/gitea/models/git"
1616
repo_model "code.gitea.io/gitea/models/repo"
1717
"code.gitea.io/gitea/models/unittest"
1818
user_model "code.gitea.io/gitea/models/user"
@@ -76,7 +76,7 @@ func TestAPILFSBatch(t *testing.T) {
7676

7777
content := []byte("dummy1")
7878
oid := storeObjectInRepo(t, repo.ID, &content)
79-
defer models.RemoveLFSMetaObjectByOid(repo.ID, oid)
79+
defer git_model.RemoveLFSMetaObjectByOid(repo.ID, oid)
8080

8181
session := loginUser(t, "user2")
8282

@@ -260,9 +260,9 @@ func TestAPILFSBatch(t *testing.T) {
260260
content := []byte("dummy0")
261261
storeObjectInRepo(t, repo2.ID, &content)
262262

263-
meta, err := models.GetLFSMetaObjectByOid(repo.ID, p.Oid)
263+
meta, err := git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid)
264264
assert.Nil(t, meta)
265-
assert.Equal(t, models.ErrLFSObjectNotExist, err)
265+
assert.Equal(t, git_model.ErrLFSObjectNotExist, err)
266266

267267
req := newRequest(t, &lfs.BatchRequest{
268268
Operation: "upload",
@@ -275,7 +275,7 @@ func TestAPILFSBatch(t *testing.T) {
275275
assert.Nil(t, br.Objects[0].Error)
276276
assert.Empty(t, br.Objects[0].Actions)
277277

278-
meta, err = models.GetLFSMetaObjectByOid(repo.ID, p.Oid)
278+
meta, err = git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid)
279279
assert.NoError(t, err)
280280
assert.NotNil(t, meta)
281281

@@ -336,7 +336,7 @@ func TestAPILFSUpload(t *testing.T) {
336336

337337
content := []byte("dummy3")
338338
oid := storeObjectInRepo(t, repo.ID, &content)
339-
defer models.RemoveLFSMetaObjectByOid(repo.ID, oid)
339+
defer git_model.RemoveLFSMetaObjectByOid(repo.ID, oid)
340340

341341
session := loginUser(t, "user2")
342342

@@ -365,9 +365,9 @@ func TestAPILFSUpload(t *testing.T) {
365365
err = contentStore.Put(p, bytes.NewReader([]byte("dummy5")))
366366
assert.NoError(t, err)
367367

368-
meta, err := models.GetLFSMetaObjectByOid(repo.ID, p.Oid)
368+
meta, err := git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid)
369369
assert.Nil(t, meta)
370-
assert.Equal(t, models.ErrLFSObjectNotExist, err)
370+
assert.Equal(t, git_model.ErrLFSObjectNotExist, err)
371371

372372
t.Run("InvalidAccess", func(t *testing.T) {
373373
req := newRequest(t, p, "invalid")
@@ -378,7 +378,7 @@ func TestAPILFSUpload(t *testing.T) {
378378
req := newRequest(t, p, "dummy5")
379379

380380
session.MakeRequest(t, req, http.StatusOK)
381-
meta, err = models.GetLFSMetaObjectByOid(repo.ID, p.Oid)
381+
meta, err = git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid)
382382
assert.NoError(t, err)
383383
assert.NotNil(t, meta)
384384
})
@@ -426,7 +426,7 @@ func TestAPILFSUpload(t *testing.T) {
426426
assert.NoError(t, err)
427427
assert.True(t, exist)
428428

429-
meta, err := models.GetLFSMetaObjectByOid(repo.ID, p.Oid)
429+
meta, err := git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid)
430430
assert.NoError(t, err)
431431
assert.NotNil(t, meta)
432432
})
@@ -441,7 +441,7 @@ func TestAPILFSVerify(t *testing.T) {
441441

442442
content := []byte("dummy3")
443443
oid := storeObjectInRepo(t, repo.ID, &content)
444-
defer models.RemoveLFSMetaObjectByOid(repo.ID, oid)
444+
defer git_model.RemoveLFSMetaObjectByOid(repo.ID, oid)
445445

446446
session := loginUser(t, "user2")
447447

integrations/lfs_getobject_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"net/http/httptest"
1313
"testing"
1414

15-
"code.gitea.io/gitea/models"
15+
git_model "code.gitea.io/gitea/models/git"
1616
repo_model "code.gitea.io/gitea/models/repo"
1717
"code.gitea.io/gitea/modules/git"
1818
"code.gitea.io/gitea/modules/json"
@@ -28,7 +28,7 @@ func storeObjectInRepo(t *testing.T, repositoryID int64, content *[]byte) string
2828
pointer, err := lfs.GeneratePointer(bytes.NewReader(*content))
2929
assert.NoError(t, err)
3030

31-
_, err = models.NewLFSMetaObject(&models.LFSMetaObject{Pointer: pointer, RepositoryID: repositoryID})
31+
_, err = git_model.NewLFSMetaObject(&git_model.LFSMetaObject{Pointer: pointer, RepositoryID: repositoryID})
3232
assert.NoError(t, err)
3333
contentStore := lfs.NewContentStore()
3434
exist, err := contentStore.Exists(pointer)
@@ -44,7 +44,7 @@ func storeAndGetLfs(t *testing.T, content *[]byte, extraHeader *http.Header, exp
4444
repo, err := repo_model.GetRepositoryByOwnerAndName("user2", "repo1")
4545
assert.NoError(t, err)
4646
oid := storeObjectInRepo(t, repo.ID, content)
47-
defer models.RemoveLFSMetaObjectByOid(repo.ID, oid)
47+
defer git_model.RemoveLFSMetaObjectByOid(repo.ID, oid)
4848

4949
session := loginUser(t, "user2")
5050

integrations/repo_tag_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"testing"
1111

1212
"code.gitea.io/gitea/models"
13+
git_model "code.gitea.io/gitea/models/git"
1314
repo_model "code.gitea.io/gitea/models/repo"
1415
"code.gitea.io/gitea/models/unittest"
1516
user_model "code.gitea.io/gitea/models/user"
@@ -32,12 +33,12 @@ func TestCreateNewTagProtected(t *testing.T) {
3233
err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-1", "first tag")
3334
assert.NoError(t, err)
3435

35-
err = models.InsertProtectedTag(&models.ProtectedTag{
36+
err = git_model.InsertProtectedTag(&git_model.ProtectedTag{
3637
RepoID: repo.ID,
3738
NamePattern: "v-*",
3839
})
3940
assert.NoError(t, err)
40-
err = models.InsertProtectedTag(&models.ProtectedTag{
41+
err = git_model.InsertProtectedTag(&git_model.ProtectedTag{
4142
RepoID: repo.ID,
4243
NamePattern: "v-1.1",
4344
AllowlistUserIDs: []int64{repo.OwnerID},
@@ -87,11 +88,11 @@ func TestCreateNewTagProtected(t *testing.T) {
8788
assert.NoError(t, err)
8889
}
8990

90-
protectedTags, err := models.GetProtectedTags(repo.ID)
91+
protectedTags, err := git_model.GetProtectedTags(repo.ID)
9192
assert.NoError(t, err)
9293

9394
for _, protectedTag := range protectedTags {
94-
err = models.DeleteProtectedTag(protectedTag)
95+
err = git_model.DeleteProtectedTag(protectedTag)
9596
assert.NoError(t, err)
9697
}
9798
}

models/branch.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package models
6+
7+
import (
8+
"context"
9+
10+
"code.gitea.io/gitea/models/db"
11+
git_model "code.gitea.io/gitea/models/git"
12+
"code.gitea.io/gitea/modules/log"
13+
)
14+
15+
// HasEnoughApprovals returns true if pr has enough granted approvals.
16+
func HasEnoughApprovals(ctx context.Context, protectBranch *git_model.ProtectedBranch, pr *PullRequest) bool {
17+
if protectBranch.RequiredApprovals == 0 {
18+
return true
19+
}
20+
return GetGrantedApprovalsCount(ctx, protectBranch, pr) >= protectBranch.RequiredApprovals
21+
}
22+
23+
// GetGrantedApprovalsCount returns the number of granted approvals for pr. A granted approval must be authored by a user in an approval whitelist.
24+
func GetGrantedApprovalsCount(ctx context.Context, protectBranch *git_model.ProtectedBranch, pr *PullRequest) int64 {
25+
sess := db.GetEngine(ctx).Where("issue_id = ?", pr.IssueID).
26+
And("type = ?", ReviewTypeApprove).
27+
And("official = ?", true).
28+
And("dismissed = ?", false)
29+
if protectBranch.DismissStaleApprovals {
30+
sess = sess.And("stale = ?", false)
31+
}
32+
approvals, err := sess.Count(new(Review))
33+
if err != nil {
34+
log.Error("GetGrantedApprovalsCount: %v", err)
35+
return 0
36+
}
37+
38+
return approvals
39+
}
40+
41+
// MergeBlockedByRejectedReview returns true if merge is blocked by rejected reviews
42+
func MergeBlockedByRejectedReview(ctx context.Context, protectBranch *git_model.ProtectedBranch, pr *PullRequest) bool {
43+
if !protectBranch.BlockOnRejectedReviews {
44+
return false
45+
}
46+
rejectExist, err := db.GetEngine(ctx).Where("issue_id = ?", pr.IssueID).
47+
And("type = ?", ReviewTypeReject).
48+
And("official = ?", true).
49+
And("dismissed = ?", false).
50+
Exist(new(Review))
51+
if err != nil {
52+
log.Error("MergeBlockedByRejectedReview: %v", err)
53+
return true
54+
}
55+
56+
return rejectExist
57+
}
58+
59+
// MergeBlockedByOfficialReviewRequests block merge because of some review request to official reviewer
60+
// of from official review
61+
func MergeBlockedByOfficialReviewRequests(ctx context.Context, protectBranch *git_model.ProtectedBranch, pr *PullRequest) bool {
62+
if !protectBranch.BlockOnOfficialReviewRequests {
63+
return false
64+
}
65+
has, err := db.GetEngine(ctx).Where("issue_id = ?", pr.IssueID).
66+
And("type = ?", ReviewTypeRequest).
67+
And("official = ?", true).
68+
Exist(new(Review))
69+
if err != nil {
70+
log.Error("MergeBlockedByOfficialReviewRequests: %v", err)
71+
return true
72+
}
73+
74+
return has
75+
}
76+
77+
// MergeBlockedByOutdatedBranch returns true if merge is blocked by an outdated head branch
78+
func MergeBlockedByOutdatedBranch(protectBranch *git_model.ProtectedBranch, pr *PullRequest) bool {
79+
return protectBranch.BlockOnOutdatedBranch && pr.CommitsBehind > 0
80+
}

models/commit.go

Lines changed: 0 additions & 26 deletions
This file was deleted.

models/error.go

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package models
88
import (
99
"fmt"
1010

11-
"code.gitea.io/gitea/models/perm"
1211
repo_model "code.gitea.io/gitea/models/repo"
1312
"code.gitea.io/gitea/modules/git"
1413
)
@@ -145,83 +144,6 @@ func (err ErrAccessTokenEmpty) Error() string {
145144
return "access token is empty"
146145
}
147146

148-
//.____ ____________________
149-
//| | \_ _____/ _____/
150-
//| | | __) \_____ \
151-
//| |___| \ / \
152-
//|_______ \___ / /_______ /
153-
// \/ \/ \/
154-
155-
// ErrLFSLockNotExist represents a "LFSLockNotExist" kind of error.
156-
type ErrLFSLockNotExist struct {
157-
ID int64
158-
RepoID int64
159-
Path string
160-
}
161-
162-
// IsErrLFSLockNotExist checks if an error is a ErrLFSLockNotExist.
163-
func IsErrLFSLockNotExist(err error) bool {
164-
_, ok := err.(ErrLFSLockNotExist)
165-
return ok
166-
}
167-
168-
func (err ErrLFSLockNotExist) Error() string {
169-
return fmt.Sprintf("lfs lock does not exist [id: %d, rid: %d, path: %s]", err.ID, err.RepoID, err.Path)
170-
}
171-
172-
// ErrLFSUnauthorizedAction represents a "LFSUnauthorizedAction" kind of error.
173-
type ErrLFSUnauthorizedAction struct {
174-
RepoID int64
175-
UserName string
176-
Mode perm.AccessMode
177-
}
178-
179-
// IsErrLFSUnauthorizedAction checks if an error is a ErrLFSUnauthorizedAction.
180-
func IsErrLFSUnauthorizedAction(err error) bool {
181-
_, ok := err.(ErrLFSUnauthorizedAction)
182-
return ok
183-
}
184-
185-
func (err ErrLFSUnauthorizedAction) Error() string {
186-
if err.Mode == perm.AccessModeWrite {
187-
return fmt.Sprintf("User %s doesn't have write access for lfs lock [rid: %d]", err.UserName, err.RepoID)
188-
}
189-
return fmt.Sprintf("User %s doesn't have read access for lfs lock [rid: %d]", err.UserName, err.RepoID)
190-
}
191-
192-
// ErrLFSLockAlreadyExist represents a "LFSLockAlreadyExist" kind of error.
193-
type ErrLFSLockAlreadyExist struct {
194-
RepoID int64
195-
Path string
196-
}
197-
198-
// IsErrLFSLockAlreadyExist checks if an error is a ErrLFSLockAlreadyExist.
199-
func IsErrLFSLockAlreadyExist(err error) bool {
200-
_, ok := err.(ErrLFSLockAlreadyExist)
201-
return ok
202-
}
203-
204-
func (err ErrLFSLockAlreadyExist) Error() string {
205-
return fmt.Sprintf("lfs lock already exists [rid: %d, path: %s]", err.RepoID, err.Path)
206-
}
207-
208-
// ErrLFSFileLocked represents a "LFSFileLocked" kind of error.
209-
type ErrLFSFileLocked struct {
210-
RepoID int64
211-
Path string
212-
UserName string
213-
}
214-
215-
// IsErrLFSFileLocked checks if an error is a ErrLFSFileLocked.
216-
func IsErrLFSFileLocked(err error) bool {
217-
_, ok := err.(ErrLFSFileLocked)
218-
return ok
219-
}
220-
221-
func (err ErrLFSFileLocked) Error() string {
222-
return fmt.Sprintf("File is lfs locked [repo: %d, locked by: %s, path: %s]", err.RepoID, err.UserName, err.Path)
223-
}
224-
225147
// ErrNoPendingRepoTransfer is an error type for repositories without a pending
226148
// transfer request
227149
type ErrNoPendingRepoTransfer struct {

0 commit comments

Comments
 (0)