@@ -73,9 +73,20 @@ func NewOwners(log *logrus.Entry, filenames []string, r Repo, s int64) Owners {
73
73
// GetApprovers returns a map from ownersFiles -> people that are approvers in them
74
74
func (o Owners ) GetApprovers () map [string ]sets.Set [string ] {
75
75
ownersToApprovers := map [string ]sets.Set [string ]{}
76
+ for _ , toApprove := range o .filenames {
77
+ ownersFile := o .repo .FindApproverOwnersForFile (toApprove )
78
+ approvers := o .repo .Approvers (toApprove ).Set ()
79
+ if _ , ok := ownersToApprovers [ownersFile ]; ! ok {
80
+ ownersToApprovers [ownersFile ] = sets .New [string ]()
81
+ }
82
+ ownersToApprovers [ownersFile ] = ownersToApprovers [ownersFile ].Union (approvers )
83
+ }
76
84
77
- for ownersFilename := range o .GetOwnersSet () {
78
- ownersToApprovers [ownersFilename ] = o .repo .Approvers (ownersFilename ).Set ()
85
+ owners := o .GetOwnersSet ()
86
+ for k := range ownersToApprovers {
87
+ if ! owners .Has (k ) {
88
+ delete (ownersToApprovers , k )
89
+ }
79
90
}
80
91
81
92
return ownersToApprovers
@@ -85,8 +96,20 @@ func (o Owners) GetApprovers() map[string]sets.Set[string] {
85
96
func (o Owners ) GetLeafApprovers () map [string ]sets.Set [string ] {
86
97
ownersToApprovers := map [string ]sets.Set [string ]{}
87
98
88
- for fn := range o .GetOwnersSet () {
89
- ownersToApprovers [fn ] = o .repo .LeafApprovers (fn )
99
+ for _ , toApprove := range o .filenames {
100
+ ownersFile := o .repo .FindApproverOwnersForFile (toApprove )
101
+ approvers := o .repo .LeafApprovers (toApprove )
102
+ if _ , ok := ownersToApprovers [ownersFile ]; ! ok {
103
+ ownersToApprovers [ownersFile ] = sets .New [string ]()
104
+ }
105
+ ownersToApprovers [ownersFile ] = ownersToApprovers [ownersFile ].Union (approvers )
106
+ }
107
+
108
+ owners := o .GetOwnersSet ()
109
+ for k := range ownersToApprovers {
110
+ if ! owners .Has (k ) {
111
+ delete (ownersToApprovers , k )
112
+ }
90
113
}
91
114
92
115
return ownersToApprovers
@@ -122,16 +145,19 @@ func (o Owners) GetReverseMap(approvers map[string]sets.Set[string]) map[string]
122
145
return approverOwnersfiles
123
146
}
124
147
125
- func findMostCoveringApprover (allApprovers []string , reverseMap map [string ]sets.Set [string ], unapproved sets.Set [string ]) string {
148
+ func findMostCoveringApprover (allApprovers []string , coveredApproversSet sets. Set [ string ], reverseMap map [string ]sets.Set [string ], unapproved sets.Set [string ]) string {
126
149
maxCovered := 0
127
150
var bestPerson string
128
151
for _ , approver := range allApprovers {
129
152
filesCanApprove := reverseMap [approver ]
130
- if filesCanApprove .Intersection (unapproved ).Len () > maxCovered {
153
+ if filesCanApprove .Intersection (unapproved ).Len () > maxCovered && ! coveredApproversSet . Has ( approver ) {
131
154
maxCovered = len (filesCanApprove )
132
155
bestPerson = approver
133
156
}
134
157
}
158
+
159
+ // todo: make it better.
160
+
135
161
return bestPerson
136
162
}
137
163
@@ -169,7 +195,7 @@ func (o Owners) KeepCoveringApprovers(reverseMap map[string]sets.Set[string], kn
169
195
func (o Owners ) GetSuggestedApprovers (reverseMap map [string ]sets.Set [string ], potentialApprovers []string ) sets.Set [string ] {
170
196
ap := NewApprovers (o )
171
197
for ! ap .RequirementsMet () {
172
- newApprover := findMostCoveringApprover (potentialApprovers , reverseMap , ap .UnapprovedFiles ())
198
+ newApprover := findMostCoveringApprover (potentialApprovers , ap . GetCurrentApproversSet (), reverseMap , ap .UnapprovedFiles ())
173
199
if newApprover == "" {
174
200
o .log .Debugf ("Couldn't find/suggest approvers for each files. Unapproved: %q" , sets .List (ap .UnapprovedFiles ()))
175
201
return ap .GetCurrentApproversSet ()
@@ -441,9 +467,17 @@ func (ap Approvers) NoIssueApprovers() map[string]Approval {
441
467
// UnapprovedFiles returns owners files that still need approval
442
468
func (ap Approvers ) UnapprovedFiles () sets.Set [string ] {
443
469
unapproved := sets .New [string ]()
444
- for fn , approvers := range ap .GetFilesApprovers () {
445
- if len (approvers ) == 0 {
446
- unapproved .Insert (fn )
470
+ ownersSet := ap .owners .GetOwnersSet ()
471
+ currentApprovers := ap .GetCurrentApproversSetCased ()
472
+
473
+ for _ , toApprove := range ap .owners .filenames {
474
+ ownersFile := ap .owners .repo .FindApproverOwnersForFile (toApprove )
475
+ if ! ownersSet .Has (ownersFile ) {
476
+ continue
477
+ }
478
+
479
+ if CaseInsensitiveIntersection (ap .owners .repo .Approvers (toApprove ).Set (), currentApprovers ).Len () == 0 {
480
+ unapproved .Insert (ownersFile )
447
481
}
448
482
}
449
483
return unapproved
@@ -453,12 +487,14 @@ func (ap Approvers) UnapprovedFiles() sets.Set[string] {
453
487
func (ap Approvers ) GetFiles (baseURL * url.URL , branch string ) []File {
454
488
var allOwnersFiles []File
455
489
filesApprovers := ap .GetFilesApprovers ()
490
+ unapproverdFiles := ap .UnapprovedFiles ()
456
491
for _ , file := range sets .List (ap .owners .GetOwnersSet ()) {
457
- if len ( filesApprovers [ file ]) == 0 {
492
+ if unapproverdFiles . Has ( file ) {
458
493
allOwnersFiles = append (allOwnersFiles , UnapprovedFile {
459
494
baseURL : baseURL ,
460
495
filepath : file ,
461
496
ownersFilename : ap .owners .repo .Filenames ().Owners ,
497
+ approvers : filesApprovers [file ],
462
498
branch : branch ,
463
499
})
464
500
} else {
@@ -582,7 +618,9 @@ type UnapprovedFile struct {
582
618
baseURL * url.URL
583
619
filepath string
584
620
ownersFilename string
585
- branch string
621
+ // approvers is the set of users that partially approved this file change.
622
+ approvers sets.Set [string ]
623
+ branch string
586
624
}
587
625
588
626
func (a ApprovedFile ) String () string {
@@ -608,6 +646,9 @@ func (ua UnapprovedFile) String() string {
608
646
ua .branch ,
609
647
fullOwnersPath ,
610
648
)
649
+ if ua .approvers .Len () > 0 {
650
+ return fmt .Sprintf ("- **[%s](%s)** [%v]\n > Need more approvers for rest parts.\n " , fullOwnersPath , link , strings .Join (sets .List (ua .approvers ), "," ))
651
+ }
611
652
return fmt .Sprintf ("- **[%s](%s)**\n " , fullOwnersPath , link )
612
653
}
613
654
0 commit comments