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  }