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  }