|
|
|
@ -346,6 +346,53 @@ func GetLatestCommitStatusForPairs(ctx context.Context, repoIDsToLatestCommitSHA |
|
|
|
|
return repoStatuses, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// GetLatestCommitStatusForRepoCommitIDs returns all statuses with a unique context for a given list of repo-sha pairs
|
|
|
|
|
func GetLatestCommitStatusForRepoCommitIDs(ctx context.Context, repoID int64, commitIDs []string) (map[string][]*CommitStatus, error) { |
|
|
|
|
type result struct { |
|
|
|
|
ID int64 |
|
|
|
|
Sha string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
results := make([]result, 0, len(commitIDs)) |
|
|
|
|
|
|
|
|
|
sess := db.GetEngine(ctx).Table(&CommitStatus{}) |
|
|
|
|
|
|
|
|
|
// Create a disjunction of conditions for each repoID and SHA pair
|
|
|
|
|
conds := make([]builder.Cond, 0, len(commitIDs)) |
|
|
|
|
for _, sha := range commitIDs { |
|
|
|
|
conds = append(conds, builder.Eq{"sha": sha}) |
|
|
|
|
} |
|
|
|
|
sess = sess.Where(builder.Eq{"repo_id": repoID}.And(builder.Or(conds...))). |
|
|
|
|
Select("max( id ) as id, sha"). |
|
|
|
|
GroupBy("context_hash, sha").OrderBy("max( id ) desc") |
|
|
|
|
|
|
|
|
|
err := sess.Find(&results) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ids := make([]int64, 0, len(results)) |
|
|
|
|
repoStatuses := make(map[string][]*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.SHA] = append(repoStatuses[status.SHA], 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) |
|
|
|
|