diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2020-02-03 16:47:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-03 09:47:04 +0100 |
commit | 48ce135cc9d54d1c5cf876411453414a53183968 (patch) | |
tree | e87064c6693e135d4732ba8c8289a267e560d985 /models | |
parent | e959d1a48baf6a59943949e0d6840e1512cd8934 (diff) | |
download | gitea-48ce135cc9d54d1c5cf876411453414a53183968.tar.gz gitea-48ce135cc9d54d1c5cf876411453414a53183968.zip |
Move PushUpdateAddDeleteTags to repository module from models (#10106)
* Move PushUpdateAddDeleteTags to repository module from models
* Fix deadlock on sqlite
Diffstat (limited to 'models')
-rw-r--r-- | models/helper_environment.go | 13 | ||||
-rw-r--r-- | models/release.go | 16 | ||||
-rw-r--r-- | models/update.go | 158 | ||||
-rw-r--r-- | models/user.go | 13 |
4 files changed, 38 insertions, 162 deletions
diff --git a/models/helper_environment.go b/models/helper_environment.go index 112df96823..bc9d4c8fce 100644 --- a/models/helper_environment.go +++ b/models/helper_environment.go @@ -10,6 +10,19 @@ import ( "strings" ) +// env keys for git hooks need +const ( + EnvRepoName = "GITEA_REPO_NAME" + EnvRepoUsername = "GITEA_REPO_USER_NAME" + EnvRepoIsWiki = "GITEA_REPO_IS_WIKI" + EnvPusherName = "GITEA_PUSHER_NAME" + EnvPusherEmail = "GITEA_PUSHER_EMAIL" + EnvPusherID = "GITEA_PUSHER_ID" + EnvKeyID = "GITEA_KEY_ID" + EnvIsDeployKey = "GITEA_IS_DEPLOY_KEY" + EnvIsInternal = "GITEA_INTERNAL_PUSH" +) + // InternalPushingEnvironment returns an os environment to switch off hooks on push // It is recommended to avoid using this unless you are pushing within a transaction // or if you absolutely are sure that post-receive and pre-receive will do nothing diff --git a/models/release.go b/models/release.go index ebd2b6d384..0f670f374f 100644 --- a/models/release.go +++ b/models/release.go @@ -119,9 +119,15 @@ func InsertRelease(rel *Release) error { return err } +// InsertReleasesContext insert releases +func InsertReleasesContext(ctx DBContext, rels []*Release) error { + _, err := ctx.e.Insert(rels) + return err +} + // UpdateRelease updates all columns of a release -func UpdateRelease(rel *Release) error { - _, err := x.ID(rel.ID).AllCols().Update(rel) +func UpdateRelease(ctx DBContext, rel *Release) error { + _, err := ctx.e.ID(rel.ID).AllCols().Update(rel) return err } @@ -212,10 +218,10 @@ func GetReleasesByRepoID(repoID int64, opts FindReleasesOptions) ([]*Release, er } // GetReleasesByRepoIDAndNames returns a list of releases of repository according repoID and tagNames. -func GetReleasesByRepoIDAndNames(repoID int64, tagNames []string) (rels []*Release, err error) { - err = x. - Desc("created_unix"). +func GetReleasesByRepoIDAndNames(ctx DBContext, repoID int64, tagNames []string) (rels []*Release, err error) { + err = ctx.e. In("tag_name", tagNames). + Desc("created_unix"). Find(&rels, Release{RepoID: repoID}) return rels, err } diff --git a/models/update.go b/models/update.go index 17ee9ad5fa..8e18450db7 100644 --- a/models/update.go +++ b/models/update.go @@ -7,42 +7,8 @@ package models import ( "fmt" "strings" - "time" - - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/timeutil" -) - -// env keys for git hooks need -const ( - EnvRepoName = "GITEA_REPO_NAME" - EnvRepoUsername = "GITEA_REPO_USER_NAME" - EnvRepoIsWiki = "GITEA_REPO_IS_WIKI" - EnvPusherName = "GITEA_PUSHER_NAME" - EnvPusherEmail = "GITEA_PUSHER_EMAIL" - EnvPusherID = "GITEA_PUSHER_ID" - EnvKeyID = "GITEA_KEY_ID" - EnvIsDeployKey = "GITEA_IS_DEPLOY_KEY" - EnvIsInternal = "GITEA_INTERNAL_PUSH" ) -// PushUpdateAddDeleteTags updates a number of added and delete tags -func PushUpdateAddDeleteTags(repo *Repository, gitRepo *git.Repository, addTags, delTags []string) error { - sess := x.NewSession() - defer sess.Close() - if err := sess.Begin(); err != nil { - return fmt.Errorf("Unable to begin sess in PushUpdateDeleteTags: %v", err) - } - if err := pushUpdateDeleteTags(sess, repo, delTags); err != nil { - return err - } - if err := pushUpdateAddTags(sess, repo, gitRepo, addTags); err != nil { - return err - } - - return sess.Commit() -} - // PushUpdateDeleteTags updates a number of delete tags func PushUpdateDeleteTags(repo *Repository, tags []string) error { sess := x.NewSession() @@ -57,6 +23,11 @@ func PushUpdateDeleteTags(repo *Repository, tags []string) error { return sess.Commit() } +// PushUpdateDeleteTagsContext updates a number of delete tags with context +func PushUpdateDeleteTagsContext(ctx DBContext, repo *Repository, tags []string) error { + return pushUpdateDeleteTags(ctx.e, repo, tags) +} + func pushUpdateDeleteTags(e Engine, repo *Repository, tags []string) error { if len(tags) == 0 { return nil @@ -111,125 +82,6 @@ func PushUpdateDeleteTag(repo *Repository, tagName string) error { return nil } -// PushUpdateAddTags updates a number of add tags -func PushUpdateAddTags(repo *Repository, gitRepo *git.Repository, tags []string) error { - sess := x.NewSession() - defer sess.Close() - if err := sess.Begin(); err != nil { - return fmt.Errorf("Unable to begin sess in PushUpdateAddTags: %v", err) - } - if err := pushUpdateAddTags(sess, repo, gitRepo, tags); err != nil { - return err - } - - return sess.Commit() -} -func pushUpdateAddTags(e Engine, repo *Repository, gitRepo *git.Repository, tags []string) error { - if len(tags) == 0 { - return nil - } - - lowerTags := make([]string, 0, len(tags)) - for _, tag := range tags { - lowerTags = append(lowerTags, strings.ToLower(tag)) - } - - releases := make([]Release, 0, len(tags)) - if err := e.Where("repo_id = ?", repo.ID). - In("lower_tag_name", lowerTags).Find(&releases); err != nil { - return fmt.Errorf("GetRelease: %v", err) - } - relMap := make(map[string]*Release) - for _, rel := range releases { - relMap[rel.LowerTagName] = &rel - } - - newReleases := make([]*Release, 0, len(lowerTags)-len(relMap)) - - emailToUser := make(map[string]*User) - - for i, lowerTag := range lowerTags { - tag, err := gitRepo.GetTag(tags[i]) - if err != nil { - return fmt.Errorf("GetTag: %v", err) - } - commit, err := tag.Commit() - if err != nil { - return fmt.Errorf("Commit: %v", err) - } - - sig := tag.Tagger - if sig == nil { - sig = commit.Author - } - if sig == nil { - sig = commit.Committer - } - var author *User - var createdAt = time.Unix(1, 0) - - if sig != nil { - var ok bool - author, ok = emailToUser[sig.Email] - if !ok { - author, err = GetUserByEmail(sig.Email) - if err != nil && !IsErrUserNotExist(err) { - return fmt.Errorf("GetUserByEmail: %v", err) - } - } - createdAt = sig.When - } - - commitsCount, err := commit.CommitsCount() - if err != nil { - return fmt.Errorf("CommitsCount: %v", err) - } - - rel, has := relMap[lowerTag] - - if !has { - rel = &Release{ - RepoID: repo.ID, - Title: "", - TagName: tags[i], - LowerTagName: lowerTag, - Target: "", - Sha1: commit.ID.String(), - NumCommits: commitsCount, - Note: "", - IsDraft: false, - IsPrerelease: false, - IsTag: true, - CreatedUnix: timeutil.TimeStamp(createdAt.Unix()), - } - if author != nil { - rel.PublisherID = author.ID - } - - newReleases = append(newReleases, rel) - } else { - rel.Sha1 = commit.ID.String() - rel.CreatedUnix = timeutil.TimeStamp(createdAt.Unix()) - rel.NumCommits = commitsCount - rel.IsDraft = false - if rel.IsTag && author != nil { - rel.PublisherID = author.ID - } - if _, err = e.ID(rel.ID).AllCols().Update(rel); err != nil { - return fmt.Errorf("Update: %v", err) - } - } - } - - if len(newReleases) > 0 { - if _, err := e.Insert(newReleases); err != nil { - return fmt.Errorf("Insert: %v", err) - } - } - - return nil -} - // SaveOrUpdateTag must be called for any push actions to add tag func SaveOrUpdateTag(repo *Repository, newRel *Release) error { rel, err := GetRelease(repo.ID, newRel.TagName) diff --git a/models/user.go b/models/user.go index ee66acf1a6..fda3bb5eab 100644 --- a/models/user.go +++ b/models/user.go @@ -1452,6 +1452,11 @@ func ValidateCommitsWithEmails(oldCommits *list.List) *list.List { // GetUserByEmail returns the user object by given e-mail if exists. func GetUserByEmail(email string) (*User, error) { + return GetUserByEmailContext(DefaultDBContext(), email) +} + +// GetUserByEmailContext returns the user object by given e-mail if exists with db context +func GetUserByEmailContext(ctx DBContext, email string) (*User, error) { if len(email) == 0 { return nil, ErrUserNotExist{0, email, 0} } @@ -1459,7 +1464,7 @@ func GetUserByEmail(email string) (*User, error) { email = strings.ToLower(email) // First try to find the user by primary email user := &User{Email: email} - has, err := x.Get(user) + has, err := ctx.e.Get(user) if err != nil { return nil, err } @@ -1469,19 +1474,19 @@ func GetUserByEmail(email string) (*User, error) { // Otherwise, check in alternative list for activated email addresses emailAddress := &EmailAddress{Email: email, IsActivated: true} - has, err = x.Get(emailAddress) + has, err = ctx.e.Get(emailAddress) if err != nil { return nil, err } if has { - return GetUserByID(emailAddress.UID) + return getUserByID(ctx.e, emailAddress.UID) } // Finally, if email address is the protected email address: if strings.HasSuffix(email, fmt.Sprintf("@%s", setting.Service.NoReplyAddress)) { username := strings.TrimSuffix(email, fmt.Sprintf("@%s", setting.Service.NoReplyAddress)) user := &User{LowerName: username} - has, err := x.Get(user) + has, err := ctx.e.Get(user) if err != nil { return nil, err } |