@@ -346,6 +346,53 @@ func GetLatestCommitStatusForPairs(ctx context.Context, repoIDsToLatestCommitSHA
346
346
return repoStatuses , nil
347
347
}
348
348
349
+ // GetLatestCommitStatusForRepoCommitIDs returns all statuses with a unique context for a given list of repo-sha pairs
350
+ func GetLatestCommitStatusForRepoCommitIDs (ctx context.Context , repoID int64 , commitIDs []string ) (map [string ][]* CommitStatus , error ) {
351
+ type result struct {
352
+ ID int64
353
+ Sha string
354
+ }
355
+
356
+ results := make ([]result , 0 , len (commitIDs ))
357
+
358
+ sess := db .GetEngine (ctx ).Table (& CommitStatus {})
359
+
360
+ // Create a disjunction of conditions for each repoID and SHA pair
361
+ conds := make ([]builder.Cond , 0 , len (commitIDs ))
362
+ for _ , sha := range commitIDs {
363
+ conds = append (conds , builder.Eq {"sha" : sha })
364
+ }
365
+ sess = sess .Where (builder.Eq {"repo_id" : repoID }.And (builder .Or (conds ... ))).
366
+ Select ("max( id ) as id, sha" ).
367
+ GroupBy ("context_hash, sha" ).OrderBy ("max( id ) desc" )
368
+
369
+ err := sess .Find (& results )
370
+ if err != nil {
371
+ return nil , err
372
+ }
373
+
374
+ ids := make ([]int64 , 0 , len (results ))
375
+ repoStatuses := make (map [string ][]* CommitStatus )
376
+ for _ , result := range results {
377
+ ids = append (ids , result .ID )
378
+ }
379
+
380
+ statuses := make ([]* CommitStatus , 0 , len (ids ))
381
+ if len (ids ) > 0 {
382
+ err = db .GetEngine (ctx ).In ("id" , ids ).Find (& statuses )
383
+ if err != nil {
384
+ return nil , err
385
+ }
386
+
387
+ // Group the statuses by repo ID
388
+ for _ , status := range statuses {
389
+ repoStatuses [status .SHA ] = append (repoStatuses [status .SHA ], status )
390
+ }
391
+ }
392
+
393
+ return repoStatuses , nil
394
+ }
395
+
349
396
// FindRepoRecentCommitStatusContexts returns repository's recent commit status contexts
350
397
func FindRepoRecentCommitStatusContexts (ctx context.Context , repoID int64 , before time.Duration ) ([]string , error ) {
351
398
start := timeutil .TimeStampNow ().AddDuration (- before )
0 commit comments