summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorYarden Shoham <git@yardenshoham.com>2023-05-14 00:59:01 +0300
committerGitHub <noreply@github.com>2023-05-13 21:59:01 +0000
commit4810fe55e3e73edb962052df46bef125eb1817b3 (patch)
treef5f842d1d961a831f0d5daefb8b8e5f68e574115 /models
parent68081c4721b9aeabe368f3eaeb8a4922c15d6918 (diff)
downloadgitea-4810fe55e3e73edb962052df46bef125eb1817b3.tar.gz
gitea-4810fe55e3e73edb962052df46bef125eb1817b3.zip
Add status indicator on main home screen for each repo (#24638)
It will show the calculated commit status state of the latest commit on the default branch for each repository in the dashboard repo list - Closes #15620 # Before ![image](https://github.com/go-gitea/gitea/assets/20454870/aa1326c7-43c0-458a-a798-3102c766bcf9) # After ![image](https://github.com/go-gitea/gitea/assets/20454870/8658cc03-2224-442a-b1c8-bf64126e4575) --------- Signed-off-by: Yarden Shoham <git@yardenshoham.com> Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: Giteabot <teabot@gitea.io>
Diffstat (limited to 'models')
-rw-r--r--models/git/commit_status.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/models/git/commit_status.go b/models/git/commit_status.go
index 82cbb23637..6028e46649 100644
--- a/models/git/commit_status.go
+++ b/models/git/commit_status.go
@@ -23,6 +23,7 @@ import (
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/timeutil"
+ "xorm.io/builder"
"xorm.io/xorm"
)
@@ -240,6 +241,55 @@ func GetLatestCommitStatus(ctx context.Context, repoID int64, sha string, listOp
return statuses, count, db.GetEngine(ctx).In("id", ids).Find(&statuses)
}
+// GetLatestCommitStatusForPairs returns all statuses with a unique context for a given list of repo-sha pairs
+func GetLatestCommitStatusForPairs(ctx context.Context, repoIDsToLatestCommitSHAs map[int64]string, listOptions db.ListOptions) (map[int64][]*CommitStatus, error) {
+ type result struct {
+ ID int64
+ RepoID int64
+ }
+
+ results := make([]result, 0, len(repoIDsToLatestCommitSHAs))
+
+ sess := db.GetEngine(ctx).Table(&CommitStatus{})
+
+ // Create a disjunction of conditions for each repoID and SHA pair
+ conds := make([]builder.Cond, 0, len(repoIDsToLatestCommitSHAs))
+ for repoID, sha := range repoIDsToLatestCommitSHAs {
+ conds = append(conds, builder.Eq{"repo_id": repoID, "sha": sha})
+ }
+ sess = sess.Where(builder.Or(conds...)).
+ Select("max( id ) as id, repo_id").
+ GroupBy("context_hash, repo_id").OrderBy("max( id ) desc")
+
+ sess = db.SetSessionPagination(sess, &listOptions)
+
+ err := sess.Find(&results)
+ if err != nil {
+ return nil, err
+ }
+
+ ids := make([]int64, 0, len(results))
+ repoStatuses := make(map[int64][]*CommitStatus)
+ for _, result := range results {
+ ids = append(ids, result.ID)
+ }
+
+ statuses := make([]*CommitStatus, 0, len(ids))
+ if len(ids) > 0 {
+ err = db.GetEngine(ctx).In("id", ids).Find(&statuses)
+ if err != nil {
+ return nil, err
+ }
+
+ // Group the statuses by repo ID
+ for _, status := range statuses {
+ repoStatuses[status.RepoID] = append(repoStatuses[status.RepoID], status)
+ }
+ }
+
+ return repoStatuses, nil
+}
+
// FindRepoRecentCommitStatusContexts returns repository's recent commit status contexts
func FindRepoRecentCommitStatusContexts(ctx context.Context, repoID int64, before time.Duration) ([]string, error) {
start := timeutil.TimeStampNow().AddDuration(-before)