github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/syz-cluster/pkg/triage/tree.go (about) 1 // Copyright 2024 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package triage 5 6 import ( 7 "sort" 8 "strings" 9 10 "github.com/google/syzkaller/syz-cluster/pkg/api" 11 ) 12 13 // SelectTrees returns an ordered list of git trees to apply the series to. 14 func SelectTrees(series *api.Series, trees []*api.Tree) []*api.Tree { 15 seriesCc := map[string]bool{} 16 for _, cc := range series.Cc { 17 seriesCc[strings.ToLower(cc)] = true 18 } 19 tagsMap := map[string]bool{} 20 for _, tag := range series.SubjectTags { 21 tagsMap[tag] = true 22 } 23 var result []*api.Tree 24 for _, tree := range trees { 25 if tagsMap[tree.Name] { 26 // If the tree was directly mentioned in the patch subject, always take it. 27 result = append(result, tree) 28 continue 29 } 30 intersects := false 31 for _, cc := range tree.EmailLists { 32 if seriesCc[strings.ToLower(cc)] { 33 intersects = true 34 break 35 } 36 } 37 if len(tree.EmailLists) > 0 && !intersects { 38 continue 39 } 40 result = append(result, tree) 41 } 42 sort.SliceStable(result, func(i, j int) bool { 43 // First the trees from the patch subject, then everything else. 44 return tagsMap[result[i].Name] && !tagsMap[result[j].Name] 45 }) 46 return result 47 }