Skip to content

Commit 1e488a8

Browse files
Fix for repos which do not squash PR commits (#1637)
Co-authored-by: Azeem Shaikh <azeems@google.com>
1 parent f3332ce commit 1e488a8

File tree

4 files changed

+108
-40
lines changed

4 files changed

+108
-40
lines changed

checks/evaluation/code_review.go

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ func CodeReview(name string, dl checker.DetailLogger,
3636
return checker.CreateRuntimeErrorResult(name, e)
3737
}
3838

39-
totalCommits := 0
39+
if len(r.DefaultBranchCommits) == 0 {
40+
return checker.CreateInconclusiveResult(name, "no commits found")
41+
}
42+
4043
totalReviewed := map[string]int{
4144
// The 3 platforms we support.
4245
reviewPlatformGitHub: 0,
@@ -47,37 +50,25 @@ func CodeReview(name string, dl checker.DetailLogger,
4750
for i := range r.DefaultBranchCommits {
4851
commit := r.DefaultBranchCommits[i]
4952

50-
// New commit to consider.
51-
totalCommits++
52-
5353
rs := getApprovedReviewSystem(&commit, dl)
54-
// No commits.
5554
if rs == "" {
55+
dl.Warn(&checker.LogMessage{
56+
Text: fmt.Sprintf("no reviews found for commit: %s", commit.SHA),
57+
Version: 3,
58+
})
5659
continue
5760
}
5861

5962
totalReviewed[rs]++
6063
}
6164

62-
if totalCommits == 0 {
63-
return checker.CreateInconclusiveResult(name, "no commits found")
64-
}
65-
6665
if totalReviewed[reviewPlatformGitHub] == 0 &&
6766
totalReviewed[reviewPlatformGerrit] == 0 &&
6867
totalReviewed[reviewPlatformProw] == 0 {
69-
// Only show all warnings if all fail.
70-
// We should not show warning if at least one succeeds, as this is confusing.
71-
for k := range totalReviewed {
72-
dl.Warn(&checker.LogMessage{
73-
Text: fmt.Sprintf("no %s reviews found", k),
74-
Version: 3,
75-
})
76-
}
77-
7868
return checker.CreateMinScoreResult(name, "no reviews found")
7969
}
8070

71+
totalCommits := len(r.DefaultBranchCommits)
8172
// Consider a single review system.
8273
nbReviews, reviewSystem := computeReviews(totalReviewed)
8374
if nbReviews == totalCommits {
@@ -134,8 +125,8 @@ func isReviewedOnGitHub(c *checker.DefaultBranchCommit, dl checker.DetailLogger)
134125
for _, r := range mr.Reviews {
135126
if r.State == "APPROVED" {
136127
dl.Debug(&checker.LogMessage{
137-
Text: fmt.Sprintf("%s #%d merge request approved",
138-
reviewPlatformGitHub, mr.Number),
128+
Text: fmt.Sprintf("commit %s was reviewed through %s #%d approved merge request",
129+
c.SHA, reviewPlatformGitHub, mr.Number),
139130
Version: 3,
140131
})
141132
return true
@@ -148,8 +139,8 @@ func isReviewedOnGitHub(c *checker.DefaultBranchCommit, dl checker.DetailLogger)
148139
if c.Committer.Login != "" &&
149140
c.Committer.Login != mr.Author.Login {
150141
dl.Debug(&checker.LogMessage{
151-
Text: fmt.Sprintf("%s #%d merge request approved",
152-
reviewPlatformGitHub, mr.Number),
142+
Text: fmt.Sprintf("commit %s was reviewed through %s #%d merge request",
143+
c.SHA, reviewPlatformGitHub, mr.Number),
153144
Version: 3,
154145
})
155146
return true
@@ -161,7 +152,7 @@ func isReviewedOnGitHub(c *checker.DefaultBranchCommit, dl checker.DetailLogger)
161152
func isReviewedOnProw(c *checker.DefaultBranchCommit, dl checker.DetailLogger) bool {
162153
if isBot(c.Committer.Login) {
163154
dl.Debug(&checker.LogMessage{
164-
Text: fmt.Sprintf("skip commit from bot account: %s", c.Committer.Login),
155+
Text: fmt.Sprintf("skip commit %s from bot account: %s", c.SHA, c.Committer.Login),
165156
Version: 3,
166157
})
167158
return true
@@ -171,8 +162,8 @@ func isReviewedOnProw(c *checker.DefaultBranchCommit, dl checker.DetailLogger) b
171162
for _, l := range c.MergeRequest.Labels {
172163
if l == "lgtm" || l == "approved" {
173164
dl.Debug(&checker.LogMessage{
174-
Text: fmt.Sprintf("%s #%d merge request approved",
175-
reviewPlatformProw, c.MergeRequest.Number),
165+
Text: fmt.Sprintf("commit %s review was through %s #%d approved merge request",
166+
c.SHA, reviewPlatformProw, c.MergeRequest.Number),
176167
Version: 3,
177168
})
178169
return true
@@ -185,7 +176,7 @@ func isReviewedOnProw(c *checker.DefaultBranchCommit, dl checker.DetailLogger) b
185176
func isReviewedOnGerrit(c *checker.DefaultBranchCommit, dl checker.DetailLogger) bool {
186177
if isBot(c.Committer.Login) {
187178
dl.Debug(&checker.LogMessage{
188-
Text: fmt.Sprintf("skip commit from bot account: %s", c.Committer.Login),
179+
Text: fmt.Sprintf("skip commit %s from bot account: %s", c.SHA, c.Committer.Login),
189180
Version: 3,
190181
})
191182
return true
@@ -195,7 +186,7 @@ func isReviewedOnGerrit(c *checker.DefaultBranchCommit, dl checker.DetailLogger)
195186
if strings.Contains(m, "\nReviewed-on: ") &&
196187
strings.Contains(m, "\nReviewed-by: ") {
197188
dl.Debug(&checker.LogMessage{
198-
Text: fmt.Sprintf("%s commit approved", reviewPlatformGerrit),
189+
Text: fmt.Sprintf("commit %s was approved through %s", c.SHA, reviewPlatformGerrit),
199190
Version: 3,
200191
})
201192
return true
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Copyright 2021 Security Scorecard Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package evaluation
16+
17+
import (
18+
"testing"
19+
20+
"github.com/ossf/scorecard/v4/checker"
21+
sce "github.com/ossf/scorecard/v4/errors"
22+
scut "github.com/ossf/scorecard/v4/utests"
23+
)
24+
25+
func TestCodeReview(t *testing.T) {
26+
t.Parallel()
27+
28+
// nolint:govet // ignore since this is a test.
29+
tests := []struct {
30+
name string
31+
expected scut.TestReturn
32+
rawData *checker.CodeReviewData
33+
}{
34+
{
35+
name: "NullRawData",
36+
expected: scut.TestReturn{
37+
Error: sce.ErrScorecardInternal,
38+
Score: checker.InconclusiveResultScore,
39+
},
40+
rawData: nil,
41+
},
42+
{
43+
name: "NoCommits",
44+
expected: scut.TestReturn{
45+
Score: checker.InconclusiveResultScore,
46+
},
47+
rawData: &checker.CodeReviewData{},
48+
},
49+
{
50+
name: "NoReviews",
51+
expected: scut.TestReturn{
52+
Score: checker.MinResultScore,
53+
NumberOfWarn: 2,
54+
},
55+
rawData: &checker.CodeReviewData{
56+
DefaultBranchCommits: []checker.DefaultBranchCommit{
57+
{
58+
SHA: "1",
59+
},
60+
{
61+
SHA: "2",
62+
},
63+
},
64+
},
65+
},
66+
}
67+
68+
for _, tt := range tests {
69+
tt := tt // Re-initializing variable so it is not changed while executing the closure below
70+
t.Run(tt.name, func(t *testing.T) {
71+
t.Parallel()
72+
73+
dl := &scut.TestDetailLogger{}
74+
res := CodeReview(tt.name, dl, tt.rawData)
75+
if !scut.ValidateTestReturn(t, tt.name, &tt.expected, &res, dl) {
76+
t.Error()
77+
}
78+
})
79+
}
80+
}

clients/githubrepo/graphql.go

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,10 @@ type graphqlData struct {
6969
Author struct {
7070
Login githubv4.String
7171
}
72-
Number githubv4.Int
73-
HeadRefOid githubv4.String
74-
MergedAt githubv4.DateTime
75-
MergeCommit struct {
76-
// NOTE: only used for sanity check.
77-
// Use original commit oid instead.
78-
Oid githubv4.GitObjectID
79-
}
80-
Labels struct {
72+
Number githubv4.Int
73+
HeadRefOid githubv4.String
74+
MergedAt githubv4.DateTime
75+
Labels struct {
8176
Nodes []struct {
8277
Name githubv4.String
8378
}
@@ -205,8 +200,10 @@ func commitsFrom(data *graphqlData, repoOwner, repoName string) ([]clients.Commi
205200
var associatedPR clients.PullRequest
206201
for i := range commit.AssociatedPullRequests.Nodes {
207202
pr := commit.AssociatedPullRequests.Nodes[i]
208-
if pr.MergeCommit.Oid != commit.Oid ||
209-
string(pr.Repository.Owner.Login) != repoOwner ||
203+
// NOTE: PR mergeCommit may not match commit.SHA in case repositories
204+
// have `enableSquashCommit` disabled. So we accept any associatedPR
205+
// to handle this case.
206+
if string(pr.Repository.Owner.Login) != repoOwner ||
210207
string(pr.Repository.Name) != repoName {
211208
continue
212209
}

e2e/code_review_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ var _ = Describe("E2E TEST:CodeReview", func() {
4848
expected := scut.TestReturn{
4949
Error: nil,
5050
Score: checker.MinResultScore,
51-
NumberOfWarn: 3,
51+
NumberOfWarn: 30,
5252
NumberOfInfo: 0,
5353
NumberOfDebug: 0,
5454
}
@@ -73,7 +73,7 @@ var _ = Describe("E2E TEST:CodeReview", func() {
7373
expected := scut.TestReturn{
7474
Error: nil,
7575
Score: checker.MinResultScore,
76-
NumberOfWarn: 3,
76+
NumberOfWarn: 30,
7777
NumberOfInfo: 0,
7878
NumberOfDebug: 0,
7979
}

0 commit comments

Comments
 (0)