mirror of
https://github.com/ossf/scorecard.git
synced 2024-09-17 11:57:12 +03:00
Remove Owner/Repo strings from CheckRequest (#997)
Co-authored-by: Azeem Shaikh <azeems@google.com>
This commit is contained in:
parent
e730e911e6
commit
bc37c74b28
@ -22,8 +22,8 @@ import (
|
|||||||
|
|
||||||
// CheckRequest struct encapsulates all data to be passed into a CheckFn.
|
// CheckRequest struct encapsulates all data to be passed into a CheckFn.
|
||||||
type CheckRequest struct {
|
type CheckRequest struct {
|
||||||
Ctx context.Context
|
Ctx context.Context
|
||||||
RepoClient clients.RepoClient
|
RepoClient clients.RepoClient
|
||||||
Dlogger DetailLogger
|
Dlogger DetailLogger
|
||||||
Owner, Repo string
|
Repo clients.Repo
|
||||||
}
|
}
|
||||||
|
@ -31,9 +31,9 @@ const checkRetries = 3
|
|||||||
|
|
||||||
// Runner runs a check with retries.
|
// Runner runs a check with retries.
|
||||||
type Runner struct {
|
type Runner struct {
|
||||||
|
CheckRequest CheckRequest
|
||||||
CheckName string
|
CheckName string
|
||||||
Repo string
|
Repo string
|
||||||
CheckRequest CheckRequest
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckFn defined for convenience.
|
// CheckFn defined for convenience.
|
||||||
|
@ -39,7 +39,7 @@ type response struct {
|
|||||||
|
|
||||||
// CIIBestPractices runs CII-Best-Practices check.
|
// CIIBestPractices runs CII-Best-Practices check.
|
||||||
func CIIBestPractices(c *checker.CheckRequest) checker.CheckResult {
|
func CIIBestPractices(c *checker.CheckRequest) checker.CheckResult {
|
||||||
repoURL := fmt.Sprintf("https://github.com/%s/%s", c.Owner, c.Repo)
|
repoURL := fmt.Sprintf("https://%s", c.Repo.URL())
|
||||||
url := fmt.Sprintf("https://bestpractices.coreinfrastructure.org/projects.json?url=%s", repoURL)
|
url := fmt.Sprintf("https://bestpractices.coreinfrastructure.org/projects.json?url=%s", repoURL)
|
||||||
req, err := http.NewRequestWithContext(c.Ctx, "GET", url, nil)
|
req, err := http.NewRequestWithContext(c.Ctx, "GET", url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ossf/scorecard/v2/checker"
|
"github.com/ossf/scorecard/v2/checker"
|
||||||
|
"github.com/ossf/scorecard/v2/clients"
|
||||||
sce "github.com/ossf/scorecard/v2/errors"
|
sce "github.com/ossf/scorecard/v2/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -48,9 +49,9 @@ func isMatchingPath(pattern, fullpath string, caseSensitive bool) (bool, error)
|
|||||||
return match, nil
|
return match, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func isScorecardTestFile(owner, repo, fullpath string) bool {
|
func isScorecardTestFile(repo clients.Repo, fullpath string) bool {
|
||||||
// testdata/ or /some/dir/testdata/some/other
|
// testdata/ or /some/dir/testdata/some/other
|
||||||
return owner == "ossf" && repo == "scorecard" && (strings.HasPrefix(fullpath, "testdata/") ||
|
return repo.IsScorecardRepo() && (strings.HasPrefix(fullpath, "testdata/") ||
|
||||||
strings.Contains(fullpath, "/testdata/"))
|
strings.Contains(fullpath, "/testdata/"))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +79,7 @@ func CheckFilesContent(shellPathFnPattern string,
|
|||||||
) error {
|
) error {
|
||||||
predicate := func(filepath string) (bool, error) {
|
predicate := func(filepath string) (bool, error) {
|
||||||
// Filter out Scorecard's own test files.
|
// Filter out Scorecard's own test files.
|
||||||
if isScorecardTestFile(c.Owner, c.Repo, filepath) {
|
if isScorecardTestFile(c.Repo, filepath) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
// Filter out files based on path/names using the pattern.
|
// Filter out files based on path/names using the pattern.
|
||||||
|
@ -30,10 +30,11 @@ import (
|
|||||||
const CheckFuzzing = "Fuzzing"
|
const CheckFuzzing = "Fuzzing"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ossFuzzRepo clients.RepoClient
|
ossFuzzRepo clients.Repo
|
||||||
errOssFuzzRepo error
|
ossFuzzRepoClient clients.RepoClient
|
||||||
logger *zap.Logger
|
errOssFuzzRepo error
|
||||||
once sync.Once
|
logger *zap.Logger
|
||||||
|
once sync.Once
|
||||||
)
|
)
|
||||||
|
|
||||||
//nolint:gochecknoinits
|
//nolint:gochecknoinits
|
||||||
@ -48,8 +49,13 @@ func Fuzzing(c *checker.CheckRequest) checker.CheckResult {
|
|||||||
if errOssFuzzRepo != nil {
|
if errOssFuzzRepo != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ossFuzzRepo = githubrepo.CreateGithubRepoClient(c.Ctx, logger)
|
ossFuzzRepo, errOssFuzzRepo = githubrepo.MakeGithubRepo("google/oss-fuzz")
|
||||||
errOssFuzzRepo = ossFuzzRepo.InitRepo("google", "oss-fuzz")
|
if errOssFuzzRepo != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ossFuzzRepoClient = githubrepo.CreateGithubRepoClient(c.Ctx, logger)
|
||||||
|
errOssFuzzRepo = ossFuzzRepoClient.InitRepo(ossFuzzRepo)
|
||||||
})
|
})
|
||||||
if errOssFuzzRepo != nil {
|
if errOssFuzzRepo != nil {
|
||||||
e := sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("InitRepo: %v", errOssFuzzRepo))
|
e := sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("InitRepo: %v", errOssFuzzRepo))
|
||||||
@ -60,7 +66,7 @@ func Fuzzing(c *checker.CheckRequest) checker.CheckResult {
|
|||||||
Query: c.RepoClient.URL(),
|
Query: c.RepoClient.URL(),
|
||||||
Filename: "project.yaml",
|
Filename: "project.yaml",
|
||||||
}
|
}
|
||||||
result, err := ossFuzzRepo.Search(req)
|
result, err := ossFuzzRepoClient.Search(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e := sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("Client.Search.Code: %v", err))
|
e := sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("Client.Search.Code: %v", err))
|
||||||
return checker.CreateRuntimeErrorResult(CheckFuzzing, e)
|
return checker.CreateRuntimeErrorResult(CheckFuzzing, e)
|
||||||
|
@ -72,19 +72,21 @@ func SecurityPolicy(c *checker.CheckRequest) checker.CheckResult {
|
|||||||
|
|
||||||
// checking for community default within the .github folder
|
// checking for community default within the .github folder
|
||||||
// https://docs.github.com/en/github/building-a-strong-community/creating-a-default-community-health-file
|
// https://docs.github.com/en/github/building-a-strong-community/creating-a-default-community-health-file
|
||||||
dotGitHub := c
|
|
||||||
dotGitHub.Repo = ".github"
|
|
||||||
logger, err := githubrepo.NewLogger(zap.InfoLevel)
|
logger, err := githubrepo.NewLogger(zap.InfoLevel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return checker.CreateRuntimeErrorResult(CheckSecurityPolicy, err)
|
return checker.CreateRuntimeErrorResult(CheckSecurityPolicy, err)
|
||||||
}
|
}
|
||||||
dotGitHubClient := githubrepo.CreateGithubRepoClient(c.Ctx, logger)
|
dotGitHub := &checker.CheckRequest{
|
||||||
err = dotGitHubClient.InitRepo(c.Owner, c.Repo)
|
Ctx: c.Ctx,
|
||||||
|
Dlogger: c.Dlogger,
|
||||||
|
RepoClient: githubrepo.CreateGithubRepoClient(c.Ctx, logger),
|
||||||
|
Repo: c.Repo.Org(),
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dotGitHub.RepoClient.InitRepo(dotGitHub.Repo)
|
||||||
switch {
|
switch {
|
||||||
case err == nil:
|
case err == nil:
|
||||||
defer dotGitHubClient.Close()
|
defer dotGitHub.RepoClient.Close()
|
||||||
dotGitHub.RepoClient = dotGitHubClient
|
|
||||||
onFile = func(name string, dl checker.DetailLogger, data FileCbData) (bool, error) {
|
onFile = func(name string, dl checker.DetailLogger, data FileCbData) (bool, error) {
|
||||||
pdata := FileGetCbDataAsBoolPointer(data)
|
pdata := FileGetCbDataAsBoolPointer(data)
|
||||||
if strings.EqualFold(name, "security.md") ||
|
if strings.EqualFold(name, "security.md") ||
|
||||||
|
@ -17,6 +17,7 @@ package githubrepo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
@ -30,6 +31,8 @@ import (
|
|||||||
sce "github.com/ossf/scorecard/v2/errors"
|
sce "github.com/ossf/scorecard/v2/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var errInputRepoType = errors.New("input repo should be of type repoURL")
|
||||||
|
|
||||||
// Client is GitHub-specific implementation of RepoClient.
|
// Client is GitHub-specific implementation of RepoClient.
|
||||||
type Client struct {
|
type Client struct {
|
||||||
owner string
|
owner string
|
||||||
@ -49,9 +52,14 @@ type Client struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// InitRepo sets up the GitHub repo in local storage for improving performance and GitHub token usage efficiency.
|
// InitRepo sets up the GitHub repo in local storage for improving performance and GitHub token usage efficiency.
|
||||||
func (client *Client) InitRepo(owner, repoName string) error {
|
func (client *Client) InitRepo(inputRepo clients.Repo) error {
|
||||||
|
ghRepo, ok := inputRepo.(*repoURL)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("%w: %v", errInputRepoType, inputRepo)
|
||||||
|
}
|
||||||
|
|
||||||
// Sanity check.
|
// Sanity check.
|
||||||
repo, _, err := client.repoClient.Repositories.Get(client.ctx, owner, repoName)
|
repo, _, err := client.repoClient.Repositories.Get(client.ctx, ghRepo.owner, ghRepo.repo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sce.WithMessage(sce.ErrRepoUnreachable, err.Error())
|
return sce.WithMessage(sce.ErrRepoUnreachable, err.Error())
|
||||||
}
|
}
|
||||||
|
135
clients/githubrepo/repo_url.go
Normal file
135
clients/githubrepo/repo_url.go
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
// Copyright 2020 Security Scorecard Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package githubrepo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/ossf/scorecard/v2/clients"
|
||||||
|
sce "github.com/ossf/scorecard/v2/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
githubOrgRepo = ".github"
|
||||||
|
scorecardOwner = "ossf"
|
||||||
|
scorecardRepo = "scorecard"
|
||||||
|
)
|
||||||
|
|
||||||
|
type repoURL struct {
|
||||||
|
host, owner, repo string
|
||||||
|
metadata []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses input string into repoURL struct.
|
||||||
|
// Accepts "owner/repo" or "github.com/owner/repo".
|
||||||
|
func (r *repoURL) parse(input string) error {
|
||||||
|
var t string
|
||||||
|
|
||||||
|
const two = 2
|
||||||
|
const three = 3
|
||||||
|
|
||||||
|
c := strings.Split(input, "/")
|
||||||
|
|
||||||
|
switch l := len(c); {
|
||||||
|
// This will takes care for repo/owner format.
|
||||||
|
// By default it will use github.com
|
||||||
|
case l == two:
|
||||||
|
t = "github.com/" + c[0] + "/" + c[1]
|
||||||
|
case l >= three:
|
||||||
|
t = input
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow skipping scheme for ease-of-use, default to https.
|
||||||
|
if !strings.Contains(t, "://") {
|
||||||
|
t = "https://" + t
|
||||||
|
}
|
||||||
|
|
||||||
|
u, e := url.Parse(t)
|
||||||
|
if e != nil {
|
||||||
|
return sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("url.Parse: %v", e))
|
||||||
|
}
|
||||||
|
|
||||||
|
const splitLen = 2
|
||||||
|
split := strings.SplitN(strings.Trim(u.Path, "/"), "/", splitLen)
|
||||||
|
if len(split) != splitLen {
|
||||||
|
return sce.WithMessage(sce.ErrorInvalidURL, fmt.Sprintf("%v. Exepted full repository url", input))
|
||||||
|
}
|
||||||
|
|
||||||
|
r.host, r.owner, r.repo = u.Host, split[0], split[1]
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// URL implements Repo.URL.
|
||||||
|
func (r *repoURL) URL() string {
|
||||||
|
return fmt.Sprintf("%s/%s/%s", r.host, r.owner, r.repo)
|
||||||
|
}
|
||||||
|
|
||||||
|
// String implements Repo.String.
|
||||||
|
func (r *repoURL) String() string {
|
||||||
|
return fmt.Sprintf("%s-%s-%s", r.host, r.owner, r.repo)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Org implements Repo.Org.
|
||||||
|
func (r *repoURL) Org() clients.Repo {
|
||||||
|
return &repoURL{
|
||||||
|
host: r.host,
|
||||||
|
owner: r.owner,
|
||||||
|
repo: githubOrgRepo,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsValid implements Repo.IsValid.
|
||||||
|
func (r *repoURL) IsValid() error {
|
||||||
|
switch r.host {
|
||||||
|
case "github.com":
|
||||||
|
default:
|
||||||
|
return sce.WithMessage(sce.ErrorUnsupportedHost, r.host)
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.TrimSpace(r.owner) == "" || strings.TrimSpace(r.repo) == "" {
|
||||||
|
return sce.WithMessage(sce.ErrorInvalidURL,
|
||||||
|
fmt.Sprintf("%v. Expected the full reposiroty url", r.URL()))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *repoURL) AppendMetadata(metadata ...string) {
|
||||||
|
r.metadata = append(r.metadata, metadata...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Metadata implements Repo.Metadata.
|
||||||
|
func (r *repoURL) Metadata() []string {
|
||||||
|
return r.metadata
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsScorecardRepo implements Repo.IsScorecardRepo.
|
||||||
|
func (r *repoURL) IsScorecardRepo() bool {
|
||||||
|
return r.owner == scorecardOwner && r.repo == scorecardRepo
|
||||||
|
}
|
||||||
|
|
||||||
|
// MakeGithubRepo takes input of form "owner/repo" or "github.com/owner/repo"
|
||||||
|
// and returns an implementation of clients.Repo interface.
|
||||||
|
func MakeGithubRepo(input string) (clients.Repo, error) {
|
||||||
|
var repo repoURL
|
||||||
|
if err := repo.parse(input); err != nil {
|
||||||
|
return nil, fmt.Errorf("error during parse: %w", err)
|
||||||
|
}
|
||||||
|
if err := repo.IsValid(); err != nil {
|
||||||
|
return nil, fmt.Errorf("error in IsValid: %w", err)
|
||||||
|
}
|
||||||
|
return &repo, nil
|
||||||
|
}
|
102
clients/githubrepo/repo_url_test.go
Normal file
102
clients/githubrepo/repo_url_test.go
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
// Copyright 2020 Security Scorecard Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package githubrepo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRepoURL_IsValid(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
inputURL string
|
||||||
|
expected repoURL
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Valid http address",
|
||||||
|
expected: repoURL{
|
||||||
|
host: "github.com",
|
||||||
|
owner: "foo",
|
||||||
|
repo: "kubeflow",
|
||||||
|
},
|
||||||
|
inputURL: "https://github.com/foo/kubeflow",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Valid http address with trailing slash",
|
||||||
|
expected: repoURL{
|
||||||
|
host: "github.com",
|
||||||
|
owner: "foo",
|
||||||
|
repo: "kubeflow",
|
||||||
|
},
|
||||||
|
inputURL: "https://github.com/foo/kubeflow/",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Non github repository",
|
||||||
|
expected: repoURL{
|
||||||
|
host: "gitlab.com",
|
||||||
|
owner: "foo",
|
||||||
|
repo: "kubeflow",
|
||||||
|
},
|
||||||
|
inputURL: "https://gitlab.com/foo/kubeflow",
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "github repository",
|
||||||
|
expected: repoURL{
|
||||||
|
host: "github.com",
|
||||||
|
owner: "foo",
|
||||||
|
repo: "kubeflow",
|
||||||
|
},
|
||||||
|
inputURL: "foo/kubeflow",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "github repository",
|
||||||
|
expected: repoURL{
|
||||||
|
host: "github.com",
|
||||||
|
owner: "foo",
|
||||||
|
repo: "kubeflow",
|
||||||
|
},
|
||||||
|
inputURL: "https://github.com/foo/kubeflow",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
tt := tt // Re-initializing variable so it is not changed while executing the closure below
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
r := repoURL{
|
||||||
|
host: tt.expected.host,
|
||||||
|
owner: tt.expected.owner,
|
||||||
|
repo: tt.expected.repo,
|
||||||
|
}
|
||||||
|
if err := r.parse(tt.inputURL); err != nil {
|
||||||
|
t.Errorf("repoURL.parse() error = %v", err)
|
||||||
|
}
|
||||||
|
if err := r.IsValid(); (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("repoURL.IsValid() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
}
|
||||||
|
if !tt.wantErr && !cmp.Equal(tt.expected, r, cmp.AllowUnexported(repoURL{})) {
|
||||||
|
t.Errorf("Got diff: %s", cmp.Diff(tt.expected, r))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -94,17 +94,17 @@ func (mr *MockRepoClientMockRecorder) GetFileContent(filename interface{}) *gomo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// InitRepo mocks base method.
|
// InitRepo mocks base method.
|
||||||
func (m *MockRepoClient) InitRepo(owner, repo string) error {
|
func (m *MockRepoClient) InitRepo(repo clients.Repo) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "InitRepo", owner, repo)
|
ret := m.ctrl.Call(m, "InitRepo", repo)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
return ret0
|
return ret0
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitRepo indicates an expected call of InitRepo.
|
// InitRepo indicates an expected call of InitRepo.
|
||||||
func (mr *MockRepoClientMockRecorder) InitRepo(owner, repo interface{}) *gomock.Call {
|
func (mr *MockRepoClientMockRecorder) InitRepo(repo interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitRepo", reflect.TypeOf((*MockRepoClient)(nil).InitRepo), owner, repo)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitRepo", reflect.TypeOf((*MockRepoClient)(nil).InitRepo), repo)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsArchived mocks base method.
|
// IsArchived mocks base method.
|
||||||
|
150
clients/mockrepo/repo.go
Normal file
150
clients/mockrepo/repo.go
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
// Copyright 2021 Security Scorecard Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
|
// Source: clients/repo.go
|
||||||
|
|
||||||
|
// Package mockrepo is a generated GoMock package.
|
||||||
|
package mockrepo
|
||||||
|
|
||||||
|
import (
|
||||||
|
reflect "reflect"
|
||||||
|
|
||||||
|
gomock "github.com/golang/mock/gomock"
|
||||||
|
clients "github.com/ossf/scorecard/v2/clients"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MockRepo is a mock of Repo interface.
|
||||||
|
type MockRepo struct {
|
||||||
|
ctrl *gomock.Controller
|
||||||
|
recorder *MockRepoMockRecorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockRepoMockRecorder is the mock recorder for MockRepo.
|
||||||
|
type MockRepoMockRecorder struct {
|
||||||
|
mock *MockRepo
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMockRepo creates a new mock instance.
|
||||||
|
func NewMockRepo(ctrl *gomock.Controller) *MockRepo {
|
||||||
|
mock := &MockRepo{ctrl: ctrl}
|
||||||
|
mock.recorder = &MockRepoMockRecorder{mock}
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||||
|
func (m *MockRepo) EXPECT() *MockRepoMockRecorder {
|
||||||
|
return m.recorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendMetadata mocks base method.
|
||||||
|
func (m *MockRepo) AppendMetadata(metadata ...string) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
varargs := []interface{}{}
|
||||||
|
for _, a := range metadata {
|
||||||
|
varargs = append(varargs, a)
|
||||||
|
}
|
||||||
|
m.ctrl.Call(m, "AppendMetadata", varargs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendMetadata indicates an expected call of AppendMetadata.
|
||||||
|
func (mr *MockRepoMockRecorder) AppendMetadata(metadata ...interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendMetadata", reflect.TypeOf((*MockRepo)(nil).AppendMetadata), metadata...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsScorecardRepo mocks base method.
|
||||||
|
func (m *MockRepo) IsScorecardRepo() bool {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "IsScorecardRepo")
|
||||||
|
ret0, _ := ret[0].(bool)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsScorecardRepo indicates an expected call of IsScorecardRepo.
|
||||||
|
func (mr *MockRepoMockRecorder) IsScorecardRepo() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsScorecardRepo", reflect.TypeOf((*MockRepo)(nil).IsScorecardRepo))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsValid mocks base method.
|
||||||
|
func (m *MockRepo) IsValid() error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "IsValid")
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsValid indicates an expected call of IsValid.
|
||||||
|
func (mr *MockRepoMockRecorder) IsValid() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsValid", reflect.TypeOf((*MockRepo)(nil).IsValid))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Metadata mocks base method.
|
||||||
|
func (m *MockRepo) Metadata() []string {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Metadata")
|
||||||
|
ret0, _ := ret[0].([]string)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Metadata indicates an expected call of Metadata.
|
||||||
|
func (mr *MockRepoMockRecorder) Metadata() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Metadata", reflect.TypeOf((*MockRepo)(nil).Metadata))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Org mocks base method.
|
||||||
|
func (m *MockRepo) Org() clients.Repo {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Org")
|
||||||
|
ret0, _ := ret[0].(clients.Repo)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Org indicates an expected call of Org.
|
||||||
|
func (mr *MockRepoMockRecorder) Org() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Org", reflect.TypeOf((*MockRepo)(nil).Org))
|
||||||
|
}
|
||||||
|
|
||||||
|
// String mocks base method.
|
||||||
|
func (m *MockRepo) String() string {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "String")
|
||||||
|
ret0, _ := ret[0].(string)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// String indicates an expected call of String.
|
||||||
|
func (mr *MockRepoMockRecorder) String() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockRepo)(nil).String))
|
||||||
|
}
|
||||||
|
|
||||||
|
// URL mocks base method.
|
||||||
|
func (m *MockRepo) URL() string {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "URL")
|
||||||
|
ret0, _ := ret[0].(string)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// URL indicates an expected call of URL.
|
||||||
|
func (mr *MockRepoMockRecorder) URL() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "URL", reflect.TypeOf((*MockRepo)(nil).URL))
|
||||||
|
}
|
27
clients/repo.go
Normal file
27
clients/repo.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// Copyright 2021 Security Scorecard Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package clients
|
||||||
|
|
||||||
|
// Repo interface uniquely identifies a repo.
|
||||||
|
type Repo interface {
|
||||||
|
URL() string
|
||||||
|
String() string
|
||||||
|
Org() Repo
|
||||||
|
IsValid() error
|
||||||
|
Metadata() []string
|
||||||
|
AppendMetadata(metadata ...string)
|
||||||
|
// TODO: Find a better alterntive.
|
||||||
|
IsScorecardRepo() bool
|
||||||
|
}
|
@ -17,7 +17,7 @@ package clients
|
|||||||
|
|
||||||
// RepoClient interface is used by Scorecard checks to access a repo.
|
// RepoClient interface is used by Scorecard checks to access a repo.
|
||||||
type RepoClient interface {
|
type RepoClient interface {
|
||||||
InitRepo(owner, repo string) error
|
InitRepo(repo Repo) error
|
||||||
URL() string
|
URL() string
|
||||||
IsArchived() (bool, error)
|
IsArchived() (bool, error)
|
||||||
ListFiles(predicate func(string) (bool, error)) ([]string, error)
|
ListFiles(predicate func(string) (bool, error)) ([]string, error)
|
||||||
|
@ -32,15 +32,16 @@ var _ = Describe("E2E TEST:"+checks.CheckBinaryArtifacts, func() {
|
|||||||
Context("E2E TEST:Binary artifacts are not present in source code", func() {
|
Context("E2E TEST:Binary artifacts are not present in source code", func() {
|
||||||
It("Should return not binary artifacts in source code", func() {
|
It("Should return not binary artifacts in source code", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf/scorecard")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf", "scorecard")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf",
|
Repo: repo,
|
||||||
Repo: "scorecard",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
@ -61,15 +62,16 @@ var _ = Describe("E2E TEST:"+checks.CheckBinaryArtifacts, func() {
|
|||||||
})
|
})
|
||||||
It("Should return binary artifacts present in source code", func() {
|
It("Should return binary artifacts present in source code", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf-tests/scorecard-check-binary-artifacts-e2e")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf-tests", "scorecard-check-binary-artifacts-e2e")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf-tests",
|
Repo: repo,
|
||||||
Repo: "scorecard-check-binary-artifacts-e2e",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
// TODO: upload real binaries to the repo as well.
|
// TODO: upload real binaries to the repo as well.
|
||||||
|
@ -30,14 +30,15 @@ var _ = Describe("E2E TEST:"+checks.CheckBranchProtection, func() {
|
|||||||
Context("E2E TEST:Validating branch protection", func() {
|
Context("E2E TEST:Validating branch protection", func() {
|
||||||
It("Should fail to return branch protection on other repositories", func() {
|
It("Should fail to return branch protection on other repositories", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("apache/airflow")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("apache", "airflow")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "apache",
|
Repo: repo,
|
||||||
Repo: "airflow",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
@ -58,14 +59,15 @@ var _ = Describe("E2E TEST:"+checks.CheckBranchProtection, func() {
|
|||||||
Context("E2E TEST:Validating branch protection", func() {
|
Context("E2E TEST:Validating branch protection", func() {
|
||||||
It("Should fail to return branch protection on other repositories", func() {
|
It("Should fail to return branch protection on other repositories", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf-tests/scorecard-check-branch-protection-e2e")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf-tests", "scorecard-check-branch-protection-e2e")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf-tests",
|
Repo: repo,
|
||||||
Repo: "scorecard-check-branch-protection-e2e",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -30,14 +30,15 @@ var _ = Describe("E2E TEST:"+checks.CheckCITests, func() {
|
|||||||
Context("E2E TEST:Validating use of CI tests", func() {
|
Context("E2E TEST:Validating use of CI tests", func() {
|
||||||
It("Should return use of CI tests", func() {
|
It("Should return use of CI tests", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("apache/airflow")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("apache", "airflow")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "apache",
|
Repo: repo,
|
||||||
Repo: "airflow",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
|
|
||||||
"github.com/ossf/scorecard/v2/checker"
|
"github.com/ossf/scorecard/v2/checker"
|
||||||
"github.com/ossf/scorecard/v2/checks"
|
"github.com/ossf/scorecard/v2/checks"
|
||||||
|
"github.com/ossf/scorecard/v2/clients/githubrepo"
|
||||||
scut "github.com/ossf/scorecard/v2/utests"
|
scut "github.com/ossf/scorecard/v2/utests"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -29,11 +30,13 @@ var _ = Describe("E2E TEST:CIIBestPractices", func() {
|
|||||||
Context("E2E TEST:Validating use of CII Best Practices", func() {
|
Context("E2E TEST:Validating use of CII Best Practices", func() {
|
||||||
It("Should return use of CII Best Practices", func() {
|
It("Should return use of CII Best Practices", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("tensorflow/tensorflow")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: nil,
|
RepoClient: nil,
|
||||||
Owner: "tensorflow",
|
Repo: repo,
|
||||||
Repo: "tensorflow",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -32,15 +32,16 @@ var _ = Describe("E2E TEST:CodeReview", func() {
|
|||||||
Context("E2E TEST:Validating use of code reviews", func() {
|
Context("E2E TEST:Validating use of code reviews", func() {
|
||||||
It("Should return use of code reviews", func() {
|
It("Should return use of code reviews", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("apache/airflow")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("apache", "airflow")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "apache",
|
Repo: repo,
|
||||||
Repo: "airflow",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -30,14 +30,15 @@ var _ = Describe("E2E TEST:"+checks.CheckContributors, func() {
|
|||||||
Context("E2E TEST:Validating project contributors", func() {
|
Context("E2E TEST:Validating project contributors", func() {
|
||||||
It("Should return valid project contributors", func() {
|
It("Should return valid project contributors", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf/scorecard")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf", "scorecard")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf",
|
Repo: repo,
|
||||||
Repo: "scorecard",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
@ -57,14 +58,15 @@ var _ = Describe("E2E TEST:"+checks.CheckContributors, func() {
|
|||||||
})
|
})
|
||||||
It("Should return valid project contributors", func() {
|
It("Should return valid project contributors", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("apache/airflow")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("apache", "airflow")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
checkRequest := checker.CheckRequest{
|
checkRequest := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "apache",
|
Repo: repo,
|
||||||
Repo: "airflow",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -32,15 +32,16 @@ var _ = Describe("E2E TEST:"+checks.CheckDependencyUpdateTool, func() {
|
|||||||
Context("E2E TEST:Validating dependencies are updated with a tool", func() {
|
Context("E2E TEST:Validating dependencies are updated with a tool", func() {
|
||||||
It("Should return repo uses dependabot", func() {
|
It("Should return repo uses dependabot", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf/scorecard")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf", "scorecard")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf",
|
Repo: repo,
|
||||||
Repo: "scorecard",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
@ -61,15 +62,16 @@ var _ = Describe("E2E TEST:"+checks.CheckDependencyUpdateTool, func() {
|
|||||||
})
|
})
|
||||||
It("Should return repo uses renovatebot", func() {
|
It("Should return repo uses renovatebot", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("netlify/netlify-cms")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("netlify", "netlify-cms")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "netlify",
|
Repo: repo,
|
||||||
Repo: "netlify-cms",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -30,14 +30,15 @@ var _ = Describe("E2E TEST:"+checks.CheckFuzzing, func() {
|
|||||||
Context("E2E TEST:Validating use of fuzzing tools", func() {
|
Context("E2E TEST:Validating use of fuzzing tools", func() {
|
||||||
It("Should return use of fuzzing tools", func() {
|
It("Should return use of fuzzing tools", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("tensorflow/tensorflow")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("tensorflow", "tensorflow")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "tensorflow",
|
Repo: repo,
|
||||||
Repo: "tensorflow",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -31,14 +31,15 @@ var _ = Describe("E2E TEST:"+checks.CheckMaintained, func() {
|
|||||||
Context("E2E TEST:Validating maintained status", func() {
|
Context("E2E TEST:Validating maintained status", func() {
|
||||||
It("Should return valid maintained status", func() {
|
It("Should return valid maintained status", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("apache/airflow")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("apache", "airflow")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "apache",
|
Repo: repo,
|
||||||
Repo: "airflow",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -30,14 +30,15 @@ var _ = Describe("E2E TEST:"+checks.CheckPackaging, func() {
|
|||||||
Context("E2E TEST:Validating use of packaging in CI/CD", func() {
|
Context("E2E TEST:Validating use of packaging in CI/CD", func() {
|
||||||
It("Should return use of packaging in CI/CD", func() {
|
It("Should return use of packaging in CI/CD", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf-tests/scorecard-check-packaging-e2e")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf-tests", "scorecard-check-packaging-e2e")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf-tests",
|
Repo: repo,
|
||||||
Repo: "scorecard-check-packaging-e2e",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -29,14 +29,15 @@ var _ = Describe("E2E TEST:"+checks.CheckTokenPermissions, func() {
|
|||||||
Context("E2E TEST:Validating token permission check", func() {
|
Context("E2E TEST:Validating token permission check", func() {
|
||||||
It("Should return token permission works", func() {
|
It("Should return token permission works", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf-tests/scorecard-check-token-permissions-e2e")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf-tests", "scorecard-check-token-permissions-e2e")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf-tests",
|
Repo: repo,
|
||||||
Repo: "scorecard-check-token-permissions-e2e",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -31,15 +31,16 @@ var _ = Describe("E2E TEST:"+checks.CheckPinnedDependencies, func() {
|
|||||||
Context("E2E TEST:Validating dependencies check is working", func() {
|
Context("E2E TEST:Validating dependencies check is working", func() {
|
||||||
It("Should return dependencies check is working", func() {
|
It("Should return dependencies check is working", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf-tests/scorecard-check-pinned-dependencies-e2e")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf-tests", "scorecard-check-pinned-dependencies-e2e")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf-tests",
|
Repo: repo,
|
||||||
Repo: "scorecard-check-pinned-dependencies-e2e",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -30,14 +30,15 @@ var _ = Describe("E2E TEST:"+checks.CheckSAST, func() {
|
|||||||
Context("E2E TEST:Validating use of SAST tools", func() {
|
Context("E2E TEST:Validating use of SAST tools", func() {
|
||||||
It("Should return use of SAST tools", func() {
|
It("Should return use of SAST tools", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("apache/airflow")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("apache", "airflow")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "apache",
|
Repo: repo,
|
||||||
Repo: "airflow",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -29,15 +29,16 @@ var _ = Describe("E2E TEST:SecurityPolicy", func() {
|
|||||||
Context("E2E TEST:Validating security policy", func() {
|
Context("E2E TEST:Validating security policy", func() {
|
||||||
It("Should return valid security policy", func() {
|
It("Should return valid security policy", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("tensorflow/tensorflow")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("tensorflow", "tensorflow")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "tensorflow",
|
Repo: repo,
|
||||||
Repo: "tensorflow",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
@ -57,15 +58,16 @@ var _ = Describe("E2E TEST:SecurityPolicy", func() {
|
|||||||
})
|
})
|
||||||
It("Should return valid security policy for rust repositories", func() {
|
It("Should return valid security policy for rust repositories", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("randombit/botan")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("randombit", "botan")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "randombit",
|
Repo: repo,
|
||||||
Repo: "botan",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -30,14 +30,15 @@ var _ = Describe("E2E TEST:"+checks.CheckSignedReleases, func() {
|
|||||||
Context("E2E TEST:Validating signed releases", func() {
|
Context("E2E TEST:Validating signed releases", func() {
|
||||||
It("Should return valid signed releases", func() {
|
It("Should return valid signed releases", func() {
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf-tests/scorecard-check-signed-releases-e2e")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf-tests", "scorecard-check-signed-releases-e2e")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf-tests",
|
Repo: repo,
|
||||||
Repo: "scorecard-check-signed-releases-e2e",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -29,16 +29,17 @@ import (
|
|||||||
var _ = Describe("E2E TEST:Vulnerabilities", func() {
|
var _ = Describe("E2E TEST:Vulnerabilities", func() {
|
||||||
Context("E2E TEST:Validating vulnerabilities status", func() {
|
Context("E2E TEST:Validating vulnerabilities status", func() {
|
||||||
It("Should return that there are no vulnerabilities", func() {
|
It("Should return that there are no vulnerabilities", func() {
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf/scorecard")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf", "scorecard")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
req := checker.CheckRequest{
|
req := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf",
|
Repo: repo,
|
||||||
Repo: "scorecard",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
@ -58,16 +59,17 @@ var _ = Describe("E2E TEST:Vulnerabilities", func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
It("Should return that there are vulnerabilities", func() {
|
It("Should return that there are vulnerabilities", func() {
|
||||||
|
repo, err := githubrepo.MakeGithubRepo("ossf-tests/scorecard-check-vulnerabilities-open62541")
|
||||||
|
Expect(err).Should(BeNil())
|
||||||
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
repoClient := githubrepo.CreateGithubRepoClient(context.Background(), logger)
|
||||||
err := repoClient.InitRepo("ossf-tests", "scorecard-check-vulnerabilities-open62541")
|
err = repoClient.InitRepo(repo)
|
||||||
Expect(err).Should(BeNil())
|
Expect(err).Should(BeNil())
|
||||||
|
|
||||||
dl := scut.TestDetailLogger{}
|
dl := scut.TestDetailLogger{}
|
||||||
checkRequest := checker.CheckRequest{
|
checkRequest := checker.CheckRequest{
|
||||||
Ctx: context.Background(),
|
Ctx: context.Background(),
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: "ossf-tests",
|
Repo: repo,
|
||||||
Repo: "scorecard-check-vulnerabilities-open62541",
|
|
||||||
Dlogger: &dl,
|
Dlogger: &dl,
|
||||||
}
|
}
|
||||||
expected := scut.TestReturn{
|
expected := scut.TestReturn{
|
||||||
|
@ -23,6 +23,10 @@ import (
|
|||||||
var (
|
var (
|
||||||
ErrScorecardInternal = errors.New("internal error")
|
ErrScorecardInternal = errors.New("internal error")
|
||||||
ErrRepoUnreachable = errors.New("repo unreachable")
|
ErrRepoUnreachable = errors.New("repo unreachable")
|
||||||
|
// ErrorUnsupportedHost indicates the repo's host is unsupported.
|
||||||
|
ErrorUnsupportedHost = errors.New("unsupported host")
|
||||||
|
// ErrorInvalidURL indicates the repo's full URL was not passed.
|
||||||
|
ErrorInvalidURL = errors.New("invalid repo flag")
|
||||||
)
|
)
|
||||||
|
|
||||||
// WithMessage wraps any of the errors listed above.
|
// WithMessage wraps any of the errors listed above.
|
||||||
|
@ -26,6 +26,7 @@ import (
|
|||||||
|
|
||||||
"github.com/ossf/scorecard/v2/checker"
|
"github.com/ossf/scorecard/v2/checker"
|
||||||
"github.com/ossf/scorecard/v2/clients"
|
"github.com/ossf/scorecard/v2/clients"
|
||||||
|
"github.com/ossf/scorecard/v2/clients/githubrepo"
|
||||||
sce "github.com/ossf/scorecard/v2/errors"
|
sce "github.com/ossf/scorecard/v2/errors"
|
||||||
"github.com/ossf/scorecard/v2/repos"
|
"github.com/ossf/scorecard/v2/repos"
|
||||||
"github.com/ossf/scorecard/v2/stats"
|
"github.com/ossf/scorecard/v2/stats"
|
||||||
@ -37,13 +38,12 @@ func logStats(ctx context.Context, startTime time.Time) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func runEnabledChecks(ctx context.Context,
|
func runEnabledChecks(ctx context.Context,
|
||||||
repo repos.RepoURL, checksToRun checker.CheckNameToFnMap, repoClient clients.RepoClient,
|
repo clients.Repo, checksToRun checker.CheckNameToFnMap, repoClient clients.RepoClient,
|
||||||
resultsCh chan checker.CheckResult) {
|
resultsCh chan checker.CheckResult) {
|
||||||
request := checker.CheckRequest{
|
request := checker.CheckRequest{
|
||||||
Ctx: ctx,
|
Ctx: ctx,
|
||||||
RepoClient: repoClient,
|
RepoClient: repoClient,
|
||||||
Owner: repo.Owner,
|
Repo: repo,
|
||||||
Repo: repo.Repo,
|
|
||||||
}
|
}
|
||||||
wg := sync.WaitGroup{}
|
wg := sync.WaitGroup{}
|
||||||
for checkName, checkFn := range checksToRun {
|
for checkName, checkFn := range checksToRun {
|
||||||
@ -66,18 +66,22 @@ func runEnabledChecks(ctx context.Context,
|
|||||||
|
|
||||||
// RunScorecards runs enabled Scorecard checks on a RepoURL.
|
// RunScorecards runs enabled Scorecard checks on a RepoURL.
|
||||||
func RunScorecards(ctx context.Context,
|
func RunScorecards(ctx context.Context,
|
||||||
repo repos.RepoURL,
|
repoURL repos.RepoURL,
|
||||||
checksToRun checker.CheckNameToFnMap,
|
checksToRun checker.CheckNameToFnMap,
|
||||||
repoClient clients.RepoClient) (ScorecardResult, error) {
|
repoClient clients.RepoClient) (ScorecardResult, error) {
|
||||||
ctx, err := tag.New(ctx, tag.Upsert(stats.Repo, repo.URL()))
|
ctx, err := tag.New(ctx, tag.Upsert(stats.Repo, repoURL.URL()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ScorecardResult{}, sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("tag.New: %v", err))
|
return ScorecardResult{}, sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("tag.New: %v", err))
|
||||||
}
|
}
|
||||||
defer logStats(ctx, time.Now())
|
defer logStats(ctx, time.Now())
|
||||||
|
|
||||||
if err := repoClient.InitRepo(repo.Owner, repo.Repo); err != nil {
|
repo, err := githubrepo.MakeGithubRepo(repoURL.URL())
|
||||||
|
if err != nil {
|
||||||
|
return ScorecardResult{}, sce.WithMessage(err, "")
|
||||||
|
}
|
||||||
|
if err := repoClient.InitRepo(repo); err != nil {
|
||||||
// No need to call sce.WithMessage() since InitRepo will do that for us.
|
// No need to call sce.WithMessage() since InitRepo will do that for us.
|
||||||
// nolint: wrapcheck
|
//nolint:wrapcheck
|
||||||
return ScorecardResult{}, err
|
return ScorecardResult{}, err
|
||||||
}
|
}
|
||||||
defer repoClient.Close()
|
defer repoClient.Close()
|
||||||
|
@ -33,7 +33,8 @@ var (
|
|||||||
ErrorInvalidURL = errors.New("invalid repo flag")
|
ErrorInvalidURL = errors.New("invalid repo flag")
|
||||||
)
|
)
|
||||||
|
|
||||||
//nolint:revive
|
// nolint:revive
|
||||||
|
// TODO: Remove RepoURL and replace all instances with clients.Repo interface.
|
||||||
type RepoURL struct {
|
type RepoURL struct {
|
||||||
Host, Owner, Repo string
|
Host, Owner, Repo string
|
||||||
Metadata []string
|
Metadata []string
|
||||||
|
Loading…
Reference in New Issue
Block a user