Skip to content

Commit 48ce135

Browse files
authored
Move PushUpdateAddDeleteTags to repository module from models (#10106)
* Move PushUpdateAddDeleteTags to repository module from models * Fix deadlock on sqlite
1 parent e959d1a commit 48ce135

File tree

8 files changed

+176
-166
lines changed

8 files changed

+176
-166
lines changed

models/helper_environment.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,19 @@ import (
1010
"strings"
1111
)
1212

13+
// env keys for git hooks need
14+
const (
15+
EnvRepoName = "GITEA_REPO_NAME"
16+
EnvRepoUsername = "GITEA_REPO_USER_NAME"
17+
EnvRepoIsUncyclo = "GITEA_REPO_IS_WIKI"
18+
EnvPusherName = "GITEA_PUSHER_NAME"
19+
EnvPusherEmail = "GITEA_PUSHER_EMAIL"
20+
EnvPusherID = "GITEA_PUSHER_ID"
21+
EnvKeyID = "GITEA_KEY_ID"
22+
EnvIsDeployKey = "GITEA_IS_DEPLOY_KEY"
23+
EnvIsInternal = "GITEA_INTERNAL_PUSH"
24+
)
25+
1326
// InternalPushingEnvironment returns an os environment to switch off hooks on push
1427
// It is recommended to avoid using this unless you are pushing within a transaction
1528
// or if you absolutely are sure that post-receive and pre-receive will do nothing

models/release.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,15 @@ func InsertRelease(rel *Release) error {
119119
return err
120120
}
121121

122+
// InsertReleasesContext insert releases
123+
func InsertReleasesContext(ctx DBContext, rels []*Release) error {
124+
_, err := ctx.e.Insert(rels)
125+
return err
126+
}
127+
122128
// UpdateRelease updates all columns of a release
123-
func UpdateRelease(rel *Release) error {
124-
_, err := x.ID(rel.ID).AllCols().Update(rel)
129+
func UpdateRelease(ctx DBContext, rel *Release) error {
130+
_, err := ctx.e.ID(rel.ID).AllCols().Update(rel)
125131
return err
126132
}
127133

@@ -212,10 +218,10 @@ func GetReleasesByRepoID(repoID int64, opts FindReleasesOptions) ([]*Release, er
212218
}
213219

214220
// GetReleasesByRepoIDAndNames returns a list of releases of repository according repoID and tagNames.
215-
func GetReleasesByRepoIDAndNames(repoID int64, tagNames []string) (rels []*Release, err error) {
216-
err = x.
217-
Desc("created_unix").
221+
func GetReleasesByRepoIDAndNames(ctx DBContext, repoID int64, tagNames []string) (rels []*Release, err error) {
222+
err = ctx.e.
218223
In("tag_name", tagNames).
224+
Desc("created_unix").
219225
Find(&rels, Release{RepoID: repoID})
220226
return rels, err
221227
}

models/update.go

Lines changed: 5 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,8 @@ package models
77
import (
88
"fmt"
99
"strings"
10-
"time"
11-
12-
"code.gitea.io/gitea/modules/git"
13-
"code.gitea.io/gitea/modules/timeutil"
14-
)
15-
16-
// env keys for git hooks need
17-
const (
18-
EnvRepoName = "GITEA_REPO_NAME"
19-
EnvRepoUsername = "GITEA_REPO_USER_NAME"
20-
EnvRepoIsUncyclo = "GITEA_REPO_IS_WIKI"
21-
EnvPusherName = "GITEA_PUSHER_NAME"
22-
EnvPusherEmail = "GITEA_PUSHER_EMAIL"
23-
EnvPusherID = "GITEA_PUSHER_ID"
24-
EnvKeyID = "GITEA_KEY_ID"
25-
EnvIsDeployKey = "GITEA_IS_DEPLOY_KEY"
26-
EnvIsInternal = "GITEA_INTERNAL_PUSH"
2710
)
2811

29-
// PushUpdateAddDeleteTags updates a number of added and delete tags
30-
func PushUpdateAddDeleteTags(repo *Repository, gitRepo *git.Repository, addTags, delTags []string) error {
31-
sess := x.NewSession()
32-
defer sess.Close()
33-
if err := sess.Begin(); err != nil {
34-
return fmt.Errorf("Unable to begin sess in PushUpdateDeleteTags: %v", err)
35-
}
36-
if err := pushUpdateDeleteTags(sess, repo, delTags); err != nil {
37-
return err
38-
}
39-
if err := pushUpdateAddTags(sess, repo, gitRepo, addTags); err != nil {
40-
return err
41-
}
42-
43-
return sess.Commit()
44-
}
45-
4612
// PushUpdateDeleteTags updates a number of delete tags
4713
func PushUpdateDeleteTags(repo *Repository, tags []string) error {
4814
sess := x.NewSession()
@@ -57,6 +23,11 @@ func PushUpdateDeleteTags(repo *Repository, tags []string) error {
5723
return sess.Commit()
5824
}
5925

26+
// PushUpdateDeleteTagsContext updates a number of delete tags with context
27+
func PushUpdateDeleteTagsContext(ctx DBContext, repo *Repository, tags []string) error {
28+
return pushUpdateDeleteTags(ctx.e, repo, tags)
29+
}
30+
6031
func pushUpdateDeleteTags(e Engine, repo *Repository, tags []string) error {
6132
if len(tags) == 0 {
6233
return nil
@@ -111,125 +82,6 @@ func PushUpdateDeleteTag(repo *Repository, tagName string) error {
11182
return nil
11283
}
11384

114-
// PushUpdateAddTags updates a number of add tags
115-
func PushUpdateAddTags(repo *Repository, gitRepo *git.Repository, tags []string) error {
116-
sess := x.NewSession()
117-
defer sess.Close()
118-
if err := sess.Begin(); err != nil {
119-
return fmt.Errorf("Unable to begin sess in PushUpdateAddTags: %v", err)
120-
}
121-
if err := pushUpdateAddTags(sess, repo, gitRepo, tags); err != nil {
122-
return err
123-
}
124-
125-
return sess.Commit()
126-
}
127-
func pushUpdateAddTags(e Engine, repo *Repository, gitRepo *git.Repository, tags []string) error {
128-
if len(tags) == 0 {
129-
return nil
130-
}
131-
132-
lowerTags := make([]string, 0, len(tags))
133-
for _, tag := range tags {
134-
lowerTags = append(lowerTags, strings.ToLower(tag))
135-
}
136-
137-
releases := make([]Release, 0, len(tags))
138-
if err := e.Where("repo_id = ?", repo.ID).
139-
In("lower_tag_name", lowerTags).Find(&releases); err != nil {
140-
return fmt.Errorf("GetRelease: %v", err)
141-
}
142-
relMap := make(map[string]*Release)
143-
for _, rel := range releases {
144-
relMap[rel.LowerTagName] = &rel
145-
}
146-
147-
newReleases := make([]*Release, 0, len(lowerTags)-len(relMap))
148-
149-
emailToUser := make(map[string]*User)
150-
151-
for i, lowerTag := range lowerTags {
152-
tag, err := gitRepo.GetTag(tags[i])
153-
if err != nil {
154-
return fmt.Errorf("GetTag: %v", err)
155-
}
156-
commit, err := tag.Commit()
157-
if err != nil {
158-
return fmt.Errorf("Commit: %v", err)
159-
}
160-
161-
sig := tag.Tagger
162-
if sig == nil {
163-
sig = commit.Author
164-
}
165-
if sig == nil {
166-
sig = commit.Committer
167-
}
168-
var author *User
169-
var createdAt = time.Unix(1, 0)
170-
171-
if sig != nil {
172-
var ok bool
173-
author, ok = emailToUser[sig.Email]
174-
if !ok {
175-
author, err = GetUserByEmail(sig.Email)
176-
if err != nil && !IsErrUserNotExist(err) {
177-
return fmt.Errorf("GetUserByEmail: %v", err)
178-
}
179-
}
180-
createdAt = sig.When
181-
}
182-
183-
commitsCount, err := commit.CommitsCount()
184-
if err != nil {
185-
return fmt.Errorf("CommitsCount: %v", err)
186-
}
187-
188-
rel, has := relMap[lowerTag]
189-
190-
if !has {
191-
rel = &Release{
192-
RepoID: repo.ID,
193-
Title: "",
194-
TagName: tags[i],
195-
LowerTagName: lowerTag,
196-
Target: "",
197-
Sha1: commit.ID.String(),
198-
NumCommits: commitsCount,
199-
Note: "",
200-
IsDraft: false,
201-
IsPrerelease: false,
202-
IsTag: true,
203-
CreatedUnix: timeutil.TimeStamp(createdAt.Unix()),
204-
}
205-
if author != nil {
206-
rel.PublisherID = author.ID
207-
}
208-
209-
newReleases = append(newReleases, rel)
210-
} else {
211-
rel.Sha1 = commit.ID.String()
212-
rel.CreatedUnix = timeutil.TimeStamp(createdAt.Unix())
213-
rel.NumCommits = commitsCount
214-
rel.IsDraft = false
215-
if rel.IsTag && author != nil {
216-
rel.PublisherID = author.ID
217-
}
218-
if _, err = e.ID(rel.ID).AllCols().Update(rel); err != nil {
219-
return fmt.Errorf("Update: %v", err)
220-
}
221-
}
222-
}
223-
224-
if len(newReleases) > 0 {
225-
if _, err := e.Insert(newReleases); err != nil {
226-
return fmt.Errorf("Insert: %v", err)
227-
}
228-
}
229-
230-
return nil
231-
}
232-
23385
// SaveOrUpdateTag must be called for any push actions to add tag
23486
func SaveOrUpdateTag(repo *Repository, newRel *Release) error {
23587
rel, err := GetRelease(repo.ID, newRel.TagName)

models/user.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,14 +1452,19 @@ func ValidateCommitsWithEmails(oldCommits *list.List) *list.List {
14521452

14531453
// GetUserByEmail returns the user object by given e-mail if exists.
14541454
func GetUserByEmail(email string) (*User, error) {
1455+
return GetUserByEmailContext(DefaultDBContext(), email)
1456+
}
1457+
1458+
// GetUserByEmailContext returns the user object by given e-mail if exists with db context
1459+
func GetUserByEmailContext(ctx DBContext, email string) (*User, error) {
14551460
if len(email) == 0 {
14561461
return nil, ErrUserNotExist{0, email, 0}
14571462
}
14581463

14591464
email = strings.ToLower(email)
14601465
// First try to find the user by primary email
14611466
user := &User{Email: email}
1462-
has, err := x.Get(user)
1467+
has, err := ctx.e.Get(user)
14631468
if err != nil {
14641469
return nil, err
14651470
}
@@ -1469,19 +1474,19 @@ func GetUserByEmail(email string) (*User, error) {
14691474

14701475
// Otherwise, check in alternative list for activated email addresses
14711476
emailAddress := &EmailAddress{Email: email, IsActivated: true}
1472-
has, err = x.Get(emailAddress)
1477+
has, err = ctx.e.Get(emailAddress)
14731478
if err != nil {
14741479
return nil, err
14751480
}
14761481
if has {
1477-
return GetUserByID(emailAddress.UID)
1482+
return getUserByID(ctx.e, emailAddress.UID)
14781483
}
14791484

14801485
// Finally, if email address is the protected email address:
14811486
if strings.HasSuffix(email, fmt.Sprintf("@%s", setting.Service.NoReplyAddress)) {
14821487
username := strings.TrimSuffix(email, fmt.Sprintf("@%s", setting.Service.NoReplyAddress))
14831488
user := &User{LowerName: username}
1484-
has, err := x.Get(user)
1489+
has, err := ctx.e.Get(user)
14851490
if err != nil {
14861491
return nil, err
14871492
}

modules/repofiles/update.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,7 @@ func createCommitRepoActions(repo *models.Repository, gitRepo *git.Repository, o
732732
Commits: commits,
733733
})
734734
}
735-
if err := models.PushUpdateAddDeleteTags(repo, gitRepo, addTags, delTags); err != nil {
735+
if err := repo_module.PushUpdateAddDeleteTags(repo, gitRepo, addTags, delTags); err != nil {
736736
return nil, fmt.Errorf("PushUpdateAddDeleteTags: %v", err)
737737
}
738738
return actions, nil

0 commit comments

Comments
 (0)