@@ -30,9 +30,28 @@ type OwnersInfo struct {
3030 RequiredReviewers []string `json:"required_reviewers,omitempty"`
3131 Labels []string `json:"labels,omitempty"`
3232 EmeritusApprovers []string `json:"emeritus_approvers,omitempty"`
33+ EmeritusReviewers []string `json:"emeritus_reviewers,omitempty"`
3334 Options DirOptions `json:"options,omitempty"`
3435}
3536
37+ func (o * OwnersInfo ) EmeritusApproversCount () int {
38+ count := len (o .EmeritusApprovers )
39+ for _ , f := range o .Filters {
40+ count += len (f .EmeritusApprovers )
41+ }
42+
43+ return count
44+ }
45+
46+ func (o * OwnersInfo ) EmeritusReviewersCount () int {
47+ count := len (o .EmeritusReviewers )
48+ for _ , f := range o .Filters {
49+ count += len (f .EmeritusReviewers )
50+ }
51+
52+ return count
53+ }
54+
3655type DirOptions struct {
3756 NoParentOwners bool `json:"no_parent_owners,omitempty"`
3857}
@@ -42,6 +61,7 @@ type FiltersInfo struct {
4261 Reviewers []string `json:"reviewers,omitempty"`
4362 Labels []string `json:"labels,omitempty"`
4463 EmeritusApprovers []string `json:"emeritus_approvers,omitempty"`
64+ EmeritusReviewers []string `json:"emeritus_reviewers,omitempty"`
4565 RequiredReviewers []string `json:"required_reviewers,omitempty"`
4666}
4767
@@ -88,7 +108,6 @@ type Group struct {
88108 Subprojects []Subproject `yaml:",omitempty" json:",omitempty"`
89109}
90110
91-
92111// PrefixToGroupMap returns a map of prefix to groups, useful for iteration over all groups
93112func (c * Context ) PrefixToGroupMap () map [string ][]Group {
94113 return map [string ][]Group {
@@ -190,3 +209,93 @@ func (x FoldedString) MarshalYAML() (interface{}, error) {
190209 Value : string (x ),
191210 }, nil
192211}
212+
213+ // EmeritusCounts holds mappings of path of an OWNERS file
214+ // that has emeritus_{approvers,reviewers} to how many of
215+ // them are there.
216+ type EmeritusCounts struct {
217+ ReviewerCounts map [string ]int
218+ ApproverCounts map [string ]int
219+ }
220+
221+ func NewEmeritusCounts () * EmeritusCounts {
222+ return & EmeritusCounts {
223+ ReviewerCounts : make (map [string ]int ),
224+ ApproverCounts : make (map [string ]int ),
225+ }
226+ }
227+
228+ // EmeritusDiff captures the values calculated as the difference
229+ // between two EmeritusCounts along with some additional info.
230+ type EmeritusDiffFields struct {
231+ AddedCount int
232+ RemovedCount int
233+ OwnersFilesWhereAdded int
234+ OwnersFilesWhereDel int
235+ AvgAddPerFile float64
236+ AvgDelPerFile float64
237+ }
238+
239+ func (d EmeritusDiffFields ) PrettyPrint () {
240+ fmt .Println ("Number of OWNERS files where additions were done:" , d .OwnersFilesWhereAdded )
241+ fmt .Println ("Number of OWNERS files where deletions were done:" , d .OwnersFilesWhereDel )
242+ fmt .Println ("Total number added:" , d .AddedCount )
243+ fmt .Println ("Total number deleted:" , d .RemovedCount )
244+ fmt .Println ("Avg number added per OWNERS file:" , d .AvgAddPerFile )
245+ fmt .Println ("Avg number deleted per OWNERS file:" , d .AvgDelPerFile )
246+ }
247+
248+ type EmeritusDiff struct {
249+ Reviewers EmeritusDiffFields
250+ Approvers EmeritusDiffFields
251+ }
252+
253+ func CalculateEmeritusDiff (from , to * EmeritusCounts ) EmeritusDiff {
254+ diff := EmeritusDiff {}
255+
256+ for path , count := range from .ReviewerCounts {
257+ if countTo , ok := to .ReviewerCounts [path ]; ok {
258+ if countTo == count {
259+ continue
260+ }
261+ if countTo > count {
262+ diff .Reviewers .OwnersFilesWhereAdded ++
263+ diff .Reviewers .AddedCount += (countTo - count )
264+ } else {
265+ diff .Reviewers .OwnersFilesWhereDel ++
266+ diff .Reviewers .RemovedCount += (count - countTo )
267+ }
268+ }
269+ }
270+
271+ for path , count := range from .ApproverCounts {
272+ if countTo , ok := to .ApproverCounts [path ]; ok {
273+ if countTo == count {
274+ continue
275+ }
276+ if countTo > count {
277+ diff .Approvers .OwnersFilesWhereAdded ++
278+ diff .Approvers .AddedCount += (countTo - count )
279+ } else {
280+ diff .Approvers .OwnersFilesWhereDel ++
281+ diff .Approvers .RemovedCount += (count - countTo )
282+ }
283+ }
284+ }
285+
286+ if diff .Reviewers .OwnersFilesWhereAdded != 0 {
287+ diff .Reviewers .AvgAddPerFile = float64 (diff .Reviewers .AddedCount ) / float64 (diff .Reviewers .OwnersFilesWhereAdded )
288+ }
289+ if diff .Reviewers .OwnersFilesWhereDel != 0 {
290+ diff .Reviewers .AvgDelPerFile = float64 (diff .Reviewers .RemovedCount ) / float64 (diff .Reviewers .OwnersFilesWhereDel )
291+ }
292+
293+ if diff .Approvers .OwnersFilesWhereAdded != 0 {
294+ diff .Approvers .AvgAddPerFile = float64 (diff .Approvers .AddedCount ) / float64 (diff .Approvers .OwnersFilesWhereAdded )
295+ }
296+ if diff .Approvers .OwnersFilesWhereDel != 0 {
297+ diff .Approvers .AvgDelPerFile = float64 (diff .Approvers .RemovedCount ) / float64 (diff .Approvers .OwnersFilesWhereDel )
298+ }
299+
300+ return diff
301+ }
0 commit comments