github.com/wtfutil/wtf@v0.43.0/modules/gerrit/gerrit_repo.go (about) 1 package gerrit 2 3 import ( 4 glb "github.com/andygrunwald/go-gerrit" 5 ) 6 7 type GerritProject struct { 8 gerrit *glb.Client 9 Path string 10 11 Changes *[]glb.ChangeInfo 12 ReviewCount int 13 IncomingReviews []glb.ChangeInfo 14 OutgoingReviews []glb.ChangeInfo 15 } 16 17 func NewGerritProject(path string, gerrit *glb.Client) *GerritProject { 18 project := GerritProject{ 19 gerrit: gerrit, 20 Path: path, 21 } 22 23 return &project 24 } 25 26 // Refresh reloads the gerrit data via the Gerrit API 27 func (project *GerritProject) Refresh(username string) { 28 project.Changes, _ = project.loadChanges() 29 30 project.ReviewCount = project.countReviews(project.Changes) 31 project.IncomingReviews = project.myIncomingReviews(project.Changes, username) 32 project.OutgoingReviews = project.myOutgoingReviews(project.Changes, username) 33 34 } 35 36 /* -------------------- Counts -------------------- */ 37 38 func (project *GerritProject) countReviews(changes *[]glb.ChangeInfo) int { 39 if changes == nil { 40 return 0 41 } 42 43 return len(*changes) 44 } 45 46 /* -------------------- Unexported Functions -------------------- */ 47 48 // myOutgoingReviews returns a list of my outgoing reviews created by username on this project 49 func (project *GerritProject) myOutgoingReviews(changes *[]glb.ChangeInfo, username string) []glb.ChangeInfo { 50 var ors []glb.ChangeInfo 51 52 if changes == nil { 53 return ors 54 } 55 56 for _, change := range *changes { 57 user := change.Owner 58 59 if user.Username == username { 60 ors = append(ors, change) 61 } 62 } 63 64 return ors 65 } 66 67 // myIncomingReviews returns a list of merge requests for which username has been requested to ChangeInfo 68 func (project *GerritProject) myIncomingReviews(changes *[]glb.ChangeInfo, username string) []glb.ChangeInfo { 69 var irs []glb.ChangeInfo 70 71 if changes == nil { 72 return irs 73 } 74 75 for _, change := range *changes { 76 reviewers := change.Reviewers 77 78 for _, reviewer := range reviewers["REVIEWER"] { 79 if reviewer.Username == username { 80 irs = append(irs, change) 81 } 82 } 83 } 84 85 return irs 86 } 87 88 func (project *GerritProject) loadChanges() (*[]glb.ChangeInfo, error) { 89 opt := &glb.QueryChangeOptions{} 90 opt.Query = []string{"(projects:" + project.Path + "+ is:open + owner:self) " + " OR " + 91 "(projects:" + project.Path + " + is:open + ((reviewer:self + -owner:self + -star:ignore) + OR + assignee:self))"} 92 opt.AdditionalFields = []string{"DETAILED_LABELS", "DETAILED_ACCOUNTS"} 93 changes, _, err := project.gerrit.Changes.QueryChanges(opt) 94 95 if err != nil { 96 return nil, err 97 } 98 99 return changes, err 100 }