// Get returns the specified code review. // // If no review request exists, the returned review is nil. func Get(revision string) *Review { requestNotes := repository.GetNotes(request.Ref, revision) requests := request.ParseAllValid(requestNotes) if requests == nil { return nil } review := Review{ Revision: revision, Request: requests[len(requests)-1], } review.Comments = review.loadComments() review.Resolved = updateThreadsStatus(review.Comments) review.Submitted = repository.IsAncestor(revision, review.Request.TargetRef) // TODO(ojarjur): Optionally fetch the CI status of the last commit // in the review for which there are comments. return &review }
// GetCurrent returns the current, open code review. // // If there are multiple matching reviews, then an error is returned. func GetCurrent() (*Review, error) { reviewRef := repository.GetHeadRef() currentCommit := repository.GetCommitHash(reviewRef) var matchingReviews []Review for _, review := range ListOpen() { if review.Request.ReviewRef == reviewRef { matchingReviews = append(matchingReviews, review) } } if matchingReviews == nil { return nil, nil } if len(matchingReviews) != 1 { return nil, fmt.Errorf("There are %d open reviews for the ref \"%s\"", len(matchingReviews), reviewRef) } r := &matchingReviews[0] reports := ci.ParseAllValid(repository.GetNotes(ci.Ref, currentCommit)) r.Reports = reports return r, nil }
// loadComments reads in the log-structured sequence of comments for a review, // and then builds the corresponding tree-structured comment threads. func (r *Review) loadComments() []CommentThread { commentNotes := repository.GetNotes(comment.Ref, r.Revision) commentsByHash := comment.ParseAllValid(commentNotes) return buildCommentThreads(commentsByHash) }