diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2019-06-30 15:57:59 +0800 |
---|---|---|
committer | zeripath <art27@cantab.net> | 2019-06-30 08:57:59 +0100 |
commit | ff85dd3e12c05be98d9132de2e629523d096f712 (patch) | |
tree | c0b5d69eef2fd859204437bd8b206e06a7b8a47d /models | |
parent | 1e46eedce721e22e3e1e94eec6e0afccd36147c1 (diff) | |
download | gitea-ff85dd3e12c05be98d9132de2e629523d096f712.tar.gz gitea-ff85dd3e12c05be98d9132de2e629523d096f712.zip |
Add commit statuses reports on pull request view (#6845)
* Add commit statuses reports on pull view
* Add some translations
* improve the UI
* fix fmt
* fix tests
* add a new test git repo to fix tests
* fix bug when headRepo or headBranch missing
* fix tests
* fix tests
* fix consistency
* fix tests
* fix tests
* change the test repo
* fix tests
* fix tests
* fix migration
* keep db size consistency
* fix translation
* change commit hash status table unique index
* remove unused table
* use char instead varchar
* make hashCommitStatusContext private
* split merge section with status check on pull view ui
* fix tests; fix arc-green theme on pull ui
Diffstat (limited to 'models')
-rw-r--r-- | models/commit_status.go (renamed from models/status.go) | 104 | ||||
-rw-r--r-- | models/commit_status_test.go (renamed from models/status_test.go) | 0 | ||||
-rw-r--r-- | models/fixtures/issue.yml | 11 | ||||
-rw-r--r-- | models/fixtures/pull_request.yml | 14 | ||||
-rw-r--r-- | models/fixtures/repository.yml | 4 | ||||
-rw-r--r-- | models/migrations/migrations.go | 2 | ||||
-rw-r--r-- | models/migrations/v87.go | 2 | ||||
-rw-r--r-- | models/migrations/v88.go | 66 |
8 files changed, 129 insertions, 74 deletions
diff --git a/models/status.go b/models/commit_status.go index 384f5693dc..74a2756303 100644 --- a/models/status.go +++ b/models/commit_status.go @@ -6,16 +6,14 @@ package models import ( "container/list" + "crypto/sha1" "fmt" "strings" - "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" - - "github.com/go-xorm/xorm" ) // CommitStatusState holds the state of a Status @@ -61,6 +59,7 @@ type CommitStatus struct { SHA string `xorm:"VARCHAR(64) NOT NULL INDEX UNIQUE(repo_sha_index)"` TargetURL string `xorm:"TEXT"` Description string `xorm:"TEXT"` + ContextHash string `xorm:"char(40) index"` Context string `xorm:"TEXT"` Creator *User `xorm:"-"` CreatorID int64 @@ -146,7 +145,7 @@ func GetLatestCommitStatus(repo *Repository, sha string, page int) ([]*CommitSta Table(&CommitStatus{}). Where("repo_id = ?", repo.ID).And("sha = ?", sha). Select("max( id ) as id"). - GroupBy("context").OrderBy("max( id ) desc").Find(&ids) + GroupBy("context_hash").OrderBy("max( id ) desc").Find(&ids) if err != nil { return nil, err } @@ -157,27 +156,6 @@ func GetLatestCommitStatus(repo *Repository, sha string, page int) ([]*CommitSta return statuses, x.In("id", ids).Find(&statuses) } -// GetCommitStatus populates a given status for a given commit. -// NOTE: If ID or Index isn't given, and only Context, TargetURL and/or Description -// is given, the CommitStatus created _last_ will be returned. -func GetCommitStatus(repo *Repository, sha string, status *CommitStatus) (*CommitStatus, error) { - conds := &CommitStatus{ - Context: status.Context, - State: status.State, - TargetURL: status.TargetURL, - Description: status.Description, - } - has, err := x.Where("repo_id = ?", repo.ID).And("sha = ?", sha).Desc("created_unix").Get(conds) - if err != nil { - return nil, fmt.Errorf("GetCommitStatus[%s, %s]: %v", repo.RepoPath(), sha, err) - } - if !has { - return nil, fmt.Errorf("GetCommitStatus[%s, %s]: not found", repo.RepoPath(), sha) - } - - return conds, nil -} - // NewCommitStatusOptions holds options for creating a CommitStatus type NewCommitStatusOptions struct { Repo *Repository @@ -186,31 +164,31 @@ type NewCommitStatusOptions struct { CommitStatus *CommitStatus } -func newCommitStatus(sess *xorm.Session, opts NewCommitStatusOptions) error { - opts.CommitStatus.Description = strings.TrimSpace(opts.CommitStatus.Description) - opts.CommitStatus.Context = strings.TrimSpace(opts.CommitStatus.Context) - opts.CommitStatus.TargetURL = strings.TrimSpace(opts.CommitStatus.TargetURL) - opts.CommitStatus.SHA = opts.SHA - opts.CommitStatus.CreatorID = opts.Creator.ID - +// NewCommitStatus save commit statuses into database +func NewCommitStatus(opts NewCommitStatusOptions) error { if opts.Repo == nil { - return fmt.Errorf("newCommitStatus[nil, %s]: no repository specified", opts.SHA) + return fmt.Errorf("NewCommitStatus[nil, %s]: no repository specified", opts.SHA) } - opts.CommitStatus.RepoID = opts.Repo.ID - repoPath := opts.Repo.repoPath(sess) + repoPath := opts.Repo.RepoPath() if opts.Creator == nil { - return fmt.Errorf("newCommitStatus[%s, %s]: no user specified", repoPath, opts.SHA) + return fmt.Errorf("NewCommitStatus[%s, %s]: no user specified", repoPath, opts.SHA) } - gitRepo, err := git.OpenRepository(repoPath) - if err != nil { - return fmt.Errorf("OpenRepository[%s]: %v", repoPath, err) - } - if _, err := gitRepo.GetCommit(opts.SHA); err != nil { - return fmt.Errorf("GetCommit[%s]: %v", opts.SHA, err) + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %v", opts.Repo.ID, opts.Creator.ID, opts.SHA, err) } + opts.CommitStatus.Description = strings.TrimSpace(opts.CommitStatus.Description) + opts.CommitStatus.Context = strings.TrimSpace(opts.CommitStatus.Context) + opts.CommitStatus.TargetURL = strings.TrimSpace(opts.CommitStatus.TargetURL) + opts.CommitStatus.SHA = opts.SHA + opts.CommitStatus.CreatorID = opts.Creator.ID + opts.CommitStatus.RepoID = opts.Repo.ID + // Get the next Status Index var nextIndex int64 lastCommitStatus := &CommitStatus{ @@ -220,46 +198,25 @@ func newCommitStatus(sess *xorm.Session, opts NewCommitStatusOptions) error { has, err := sess.Desc("index").Limit(1).Get(lastCommitStatus) if err != nil { if err := sess.Rollback(); err != nil { - log.Error("newCommitStatus: sess.Rollback: %v", err) + log.Error("NewCommitStatus: sess.Rollback: %v", err) } - return fmt.Errorf("newCommitStatus[%s, %s]: %v", repoPath, opts.SHA, err) + return fmt.Errorf("NewCommitStatus[%s, %s]: %v", repoPath, opts.SHA, err) } if has { - log.Debug("newCommitStatus[%s, %s]: found", repoPath, opts.SHA) + log.Debug("NewCommitStatus[%s, %s]: found", repoPath, opts.SHA) nextIndex = lastCommitStatus.Index } opts.CommitStatus.Index = nextIndex + 1 - log.Debug("newCommitStatus[%s, %s]: %d", repoPath, opts.SHA, opts.CommitStatus.Index) + log.Debug("NewCommitStatus[%s, %s]: %d", repoPath, opts.SHA, opts.CommitStatus.Index) + + opts.CommitStatus.ContextHash = hashCommitStatusContext(opts.CommitStatus.Context) // Insert new CommitStatus if _, err = sess.Insert(opts.CommitStatus); err != nil { if err := sess.Rollback(); err != nil { - log.Error("newCommitStatus: sess.Rollback: %v", err) + log.Error("Insert CommitStatus: sess.Rollback: %v", err) } - return fmt.Errorf("newCommitStatus[%s, %s]: %v", repoPath, opts.SHA, err) - } - - return nil -} - -// NewCommitStatus creates a new CommitStatus given a bunch of parameters -// NOTE: All text-values will be trimmed from whitespaces. -// Requires: Repo, Creator, SHA -func NewCommitStatus(repo *Repository, creator *User, sha string, status *CommitStatus) error { - sess := x.NewSession() - defer sess.Close() - - if err := sess.Begin(); err != nil { - return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %v", repo.ID, creator.ID, sha, err) - } - - if err := newCommitStatus(sess, NewCommitStatusOptions{ - Repo: repo, - Creator: creator, - SHA: sha, - CommitStatus: status, - }); err != nil { - return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %v", repo.ID, creator.ID, sha, err) + return fmt.Errorf("Insert CommitStatus[%s, %s]: %v", repoPath, opts.SHA, err) } return sess.Commit() @@ -295,3 +252,8 @@ func ParseCommitsWithStatus(oldCommits *list.List, repo *Repository) *list.List } return newCommits } + +// hashCommitStatusContext hash context +func hashCommitStatusContext(context string) string { + return fmt.Sprintf("%x", sha1.Sum([]byte(context))) +} diff --git a/models/status_test.go b/models/commit_status_test.go index 78d2370f9d..78d2370f9d 100644 --- a/models/status_test.go +++ b/models/commit_status_test.go diff --git a/models/fixtures/issue.yml b/models/fixtures/issue.yml index 01bd8b86f6..585242a14d 100644 --- a/models/fixtures/issue.yml +++ b/models/fixtures/issue.yml @@ -86,3 +86,14 @@ created_unix: 946684830 updated_unix: 978307200 +- + id: 8 + repo_id: 10 + index: 1 + poster_id: 11 + name: pr2 + content: a pull request + is_closed: false + is_pull: true + created_unix: 946684820 + updated_unix: 978307180
\ No newline at end of file diff --git a/models/fixtures/pull_request.yml b/models/fixtures/pull_request.yml index d8313f9f90..baaaf6bb8a 100644 --- a/models/fixtures/pull_request.yml +++ b/models/fixtures/pull_request.yml @@ -26,3 +26,17 @@ base_branch: master merge_base: fedcba9876543210 has_merged: false + +- + id: 3 + type: 0 # gitea pull request + status: 2 # mergable + issue_id: 8 + index: 1 + head_repo_id: 11 + base_repo_id: 10 + head_user_name: user13 + head_branch: branch2 + base_branch: master + merge_base: 0abcb056019adb83 + has_merged: false
\ No newline at end of file diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index 609f421a90..f43fae3d67 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -118,7 +118,7 @@ is_private: false num_issues: 0 num_closed_issues: 0 - num_pulls: 0 + num_pulls: 1 num_closed_pulls: 0 is_mirror: false num_forks: 1 @@ -496,4 +496,4 @@ num_stars: 0 num_forks: 0 num_issues: 0 - is_mirror: false + is_mirror: false
\ No newline at end of file diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index e8fb42c492..7a5b0c4184 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -229,6 +229,8 @@ var migrations = []Migration{ NewMigration("add http method to webhook", addHTTPMethodToWebhook), // v87 -> v88 NewMigration("add avatar field to repository", addAvatarFieldToRepository), + // v88 -> v89 + NewMigration("add commit status context field to commit_status", addCommitStatusContext), } // Migrate database to current version diff --git a/models/migrations/v87.go b/models/migrations/v87.go index 94711ac669..c8c7011a08 100644 --- a/models/migrations/v87.go +++ b/models/migrations/v87.go @@ -1,4 +1,4 @@ -// Copyright 2019 Gitea. All rights reserved. +// Copyright 2019 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. diff --git a/models/migrations/v88.go b/models/migrations/v88.go new file mode 100644 index 0000000000..fef425db0a --- /dev/null +++ b/models/migrations/v88.go @@ -0,0 +1,66 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "crypto/sha1" + "fmt" + + "github.com/go-xorm/xorm" +) + +func hashContext(context string) string { + return fmt.Sprintf("%x", sha1.Sum([]byte(context))) +} + +func addCommitStatusContext(x *xorm.Engine) error { + type CommitStatus struct { + ID int64 `xorm:"pk autoincr"` + ContextHash string `xorm:"char(40) index"` + Context string `xorm:"TEXT"` + } + + if err := x.Sync2(new(CommitStatus)); err != nil { + return err + } + + sess := x.NewSession() + defer sess.Close() + + var start = 0 + for { + var statuses = make([]*CommitStatus, 0, 100) + err := sess.OrderBy("id").Limit(100, start).Find(&statuses) + if err != nil { + return err + } + if len(statuses) == 0 { + break + } + + if err = sess.Begin(); err != nil { + return err + } + + for _, status := range statuses { + status.ContextHash = hashContext(status.Context) + if _, err := sess.ID(status.ID).Cols("context_hash").Update(status); err != nil { + return err + } + } + + if err := sess.Commit(); err != nil { + return err + } + + if len(statuses) < 100 { + break + } + + start += len(statuses) + } + + return nil +} |