Projects STRLCPY scorecard Commits 8966abdc
🤬
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■ ■
    clients/git/client.go
     1 +// Copyright 2021 OpenSSF 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 git defines helper functions for clients.RepoClient interface.
     16 +package git
     17 + 
     18 +import (
     19 + "errors"
     20 + "fmt"
     21 + "io"
     22 + "os"
     23 + "path/filepath"
     24 + "regexp"
     25 + "strings"
     26 + "sync"
     27 + 
     28 + "github.com/go-git/go-git/v5"
     29 + "github.com/go-git/go-git/v5/plumbing"
     30 + cp "github.com/otiai10/copy"
     31 + 
     32 + "github.com/ossf/scorecard/v4/clients"
     33 +)
     34 + 
     35 +const repoDir = "repo*"
     36 + 
     37 +var (
     38 + errNilCommitFound = errors.New("nil commit found")
     39 + errEmptyQuery = errors.New("query is empty")
     40 +)
     41 + 
     42 +type Client struct {
     43 + gitRepo *git.Repository
     44 + worktree *git.Worktree
     45 + listCommits *sync.Once
     46 + tempDir string
     47 + errListCommits error
     48 + commits []clients.Commit
     49 + commitDepth int
     50 +}
     51 + 
     52 +func (c *Client) InitRepo(uri, commitSHA string, commitDepth int) error {
     53 + // cleanup previous state, if any.
     54 + c.Close()
     55 + c.listCommits = new(sync.Once)
     56 + c.commits = nil
     57 + 
     58 + // init
     59 + c.commitDepth = commitDepth
     60 + tempDir, err := os.MkdirTemp("", repoDir)
     61 + if err != nil {
     62 + return fmt.Errorf("os.MkdirTemp: %w", err)
     63 + }
     64 + 
     65 + // git clone
     66 + const filePrefix = "file://"
     67 + if strings.HasPrefix(uri, filePrefix) {
     68 + if err := cp.Copy(strings.TrimPrefix(uri, filePrefix), tempDir); err != nil {
     69 + return fmt.Errorf("cp.Copy: %w", err)
     70 + }
     71 + c.gitRepo, err = git.PlainOpen(tempDir)
     72 + if err != nil {
     73 + return fmt.Errorf("git.PlainOpen: %w", err)
     74 + }
     75 + } else {
     76 + c.gitRepo, err = git.PlainClone(tempDir, false /*isBare*/, &git.CloneOptions{
     77 + URL: uri,
     78 + Progress: os.Stdout,
     79 + })
     80 + if err != nil {
     81 + return fmt.Errorf("git.PlainClone: %w", err)
     82 + }
     83 + }
     84 + c.tempDir = tempDir
     85 + c.worktree, err = c.gitRepo.Worktree()
     86 + if err != nil {
     87 + return fmt.Errorf("git.Worktree: %w", err)
     88 + }
     89 + 
     90 + // git checkout
     91 + if commitSHA != clients.HeadSHA {
     92 + if err := c.worktree.Checkout(&git.CheckoutOptions{
     93 + Hash: plumbing.NewHash(commitSHA),
     94 + Force: true, // throw away any unsaved changes.
     95 + }); err != nil {
     96 + return fmt.Errorf("git.Worktree: %w", err)
     97 + }
     98 + }
     99 + 
     100 + return nil
     101 +}
     102 + 
     103 +func (c *Client) ListCommits() ([]clients.Commit, error) {
     104 + c.listCommits.Do(func() {
     105 + commitIter, err := c.gitRepo.Log(&git.LogOptions{
     106 + Order: git.LogOrderCommitterTime,
     107 + })
     108 + if err != nil {
     109 + c.errListCommits = fmt.Errorf("git.CommitObjects: %w", err)
     110 + return
     111 + }
     112 + c.commits = make([]clients.Commit, 0, c.commitDepth)
     113 + for i := 0; i < c.commitDepth; i++ {
     114 + commit, err := commitIter.Next()
     115 + if err != nil && !errors.Is(err, io.EOF) {
     116 + c.errListCommits = fmt.Errorf("commitIter.Next: %w", err)
     117 + return
     118 + }
     119 + // No more commits.
     120 + if errors.Is(err, io.EOF) {
     121 + break
     122 + }
     123 + 
     124 + if commit == nil {
     125 + // Not sure in what case a nil commit is returned. Fail explicitly.
     126 + c.errListCommits = fmt.Errorf("%w", errNilCommitFound)
     127 + return
     128 + }
     129 + 
     130 + c.commits = append(c.commits, clients.Commit{
     131 + SHA: commit.Hash.String(),
     132 + Message: commit.Message,
     133 + CommittedDate: commit.Committer.When,
     134 + Committer: clients.User{
     135 + Login: commit.Committer.Email,
     136 + },
     137 + })
     138 + }
     139 + })
     140 + return c.commits, c.errListCommits
     141 +}
     142 + 
     143 +func (c *Client) Search(request clients.SearchRequest) (clients.SearchResponse, error) {
     144 + // Pattern
     145 + if request.Query == "" {
     146 + return clients.SearchResponse{}, errEmptyQuery
     147 + }
     148 + queryRegexp, err := regexp.Compile(request.Query)
     149 + if err != nil {
     150 + return clients.SearchResponse{}, fmt.Errorf("regexp.Compile: %w", err)
     151 + }
     152 + grepOpts := &git.GrepOptions{
     153 + Patterns: []*regexp.Regexp{queryRegexp},
     154 + }
     155 + 
     156 + // path/filename
     157 + var pathExpr string
     158 + switch {
     159 + case request.Path != "" && request.Filename != "":
     160 + pathExpr = filepath.Join(fmt.Sprintf("^%s", request.Path),
     161 + fmt.Sprintf(".*%s$", request.Filename))
     162 + case request.Path != "":
     163 + pathExpr = fmt.Sprintf("^%s", request.Path)
     164 + case request.Filename != "":
     165 + pathExpr = filepath.Join(".*", fmt.Sprintf("%s$", request.Filename))
     166 + }
     167 + if pathExpr != "" {
     168 + pathRegexp, err := regexp.Compile(pathExpr)
     169 + if err != nil {
     170 + return clients.SearchResponse{}, fmt.Errorf("regexp.Compile: %w", err)
     171 + }
     172 + grepOpts.PathSpecs = append(grepOpts.PathSpecs, pathRegexp)
     173 + }
     174 + 
     175 + // Grep
     176 + grepResults, err := c.worktree.Grep(grepOpts)
     177 + if err != nil {
     178 + return clients.SearchResponse{}, fmt.Errorf("git.Grep: %w", err)
     179 + }
     180 + 
     181 + ret := clients.SearchResponse{}
     182 + for _, grepResult := range grepResults {
     183 + ret.Results = append(ret.Results, clients.SearchResult{
     184 + Path: grepResult.FileName,
     185 + })
     186 + }
     187 + ret.Hits = len(grepResults)
     188 + return ret, nil
     189 +}
     190 + 
     191 +// TODO(#1709): Implement below fns using go-git.
     192 +func (c *Client) SearchCommits(request clients.SearchCommitsOptions) ([]clients.Commit, error) {
     193 + return nil, nil
     194 +}
     195 + 
     196 +func (c *Client) ListFiles(predicate func(string) (bool, error)) ([]string, error) {
     197 + return nil, nil
     198 +}
     199 + 
     200 +func (c *Client) GetFileContent(filename string) ([]byte, error) {
     201 + return nil, nil
     202 +}
     203 + 
     204 +func (c *Client) Close() error {
     205 + if err := os.RemoveAll(c.tempDir); err != nil && !os.IsNotExist(err) {
     206 + return fmt.Errorf("os.RemoveAll: %w", err)
     207 + }
     208 + return nil
     209 +}
     210 + 
  • ■ ■ ■ ■ ■ ■
    clients/git/e2e_test.go
     1 +// Copyright 2021 OpenSSF 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 git
     16 + 
     17 +import (
     18 + . "github.com/onsi/ginkgo/v2"
     19 + . "github.com/onsi/gomega"
     20 + 
     21 + "github.com/ossf/scorecard/v4/clients"
     22 +)
     23 + 
     24 +var _ = DescribeTable("Test ListCommits commit-depth for HEAD",
     25 + func(uri string) {
     26 + const commitSHA = clients.HeadSHA
     27 + const commitDepth = 1
     28 + client := &Client{}
     29 + Expect(client.InitRepo(uri, commitSHA, commitDepth)).To(BeNil())
     30 + commits, err := client.ListCommits()
     31 + Expect(err).To(BeNil())
     32 + Expect(len(commits)).Should(BeEquivalentTo(commitDepth))
     33 + Expect(client.Close()).To(BeNil())
     34 + },
     35 + Entry("GitHub", "https://github.com/ossf/scorecard"),
     36 + Entry("Local", "file://../../"),
     37 + Entry("GitLab", "https://gitlab.haskell.org/haskell/filepath"),
     38 +)
     39 + 
     40 +var _ = DescribeTable("Test ListCommits commit-depth and latest commit at [0]",
     41 + func(uri, commitSHA string) {
     42 + const commitDepth = 10
     43 + client := &Client{}
     44 + Expect(client.InitRepo(uri, commitSHA, commitDepth)).To(BeNil())
     45 + commits, err := client.ListCommits()
     46 + Expect(err).To(BeNil())
     47 + Expect(len(commits)).Should(BeEquivalentTo(commitDepth))
     48 + Expect(commits[0].SHA).Should(BeEquivalentTo(commitSHA))
     49 + Expect(client.Close()).To(BeNil())
     50 + },
     51 + Entry("GitHub", "https://github.com/ossf/scorecard", "c06ac740cc49fea404c54c036000731d5ea6ebe3"),
     52 + Entry("Local", "file://../../", "c06ac740cc49fea404c54c036000731d5ea6ebe3"),
     53 + Entry("GitLab", "https://gitlab.haskell.org/haskell/filepath", "98f8bba9eac8c7183143d290d319be7df76c258b"),
     54 +)
     55 + 
     56 +var _ = DescribeTable("Test ListCommits without enough commits",
     57 + func(uri string) {
     58 + const commitSHA = "dc1835b7ffe526969d65436b621e171e3386771e"
     59 + const commitDepth = 10
     60 + client := &Client{}
     61 + Expect(client.InitRepo(uri, commitSHA, commitDepth)).To(BeNil())
     62 + commits, err := client.ListCommits()
     63 + Expect(err).To(BeNil())
     64 + Expect(len(commits)).Should(BeEquivalentTo(3))
     65 + Expect(commits[0].SHA).Should(BeEquivalentTo(commitSHA))
     66 + Expect(client.Close()).To(BeNil())
     67 + },
     68 + Entry("GitHub", "https://github.com/ossf/scorecard"),
     69 + Entry("Local", "file://../../"),
     70 + // TODO(#1709): Add equivalent test for GitLab.
     71 +)
     72 + 
     73 +var _ = DescribeTable("Test Search across a repo",
     74 + func(uri string) {
     75 + const (
     76 + commitSHA = "c06ac740cc49fea404c54c036000731d5ea6ebe3"
     77 + commitDepth = 10
     78 + )
     79 + client := &Client{}
     80 + Expect(client.InitRepo(uri, commitSHA, commitDepth)).To(BeNil())
     81 + resp, err := client.Search(clients.SearchRequest{
     82 + Query: "github/codeql-action/analyze",
     83 + })
     84 + Expect(err).To(BeNil())
     85 + Expect(resp.Hits).Should(BeNumerically(">=", 1))
     86 + Expect(client.Close()).To(BeNil())
     87 + },
     88 + Entry("GitHub", "https://github.com/ossf/scorecard"),
     89 + Entry("Local", "file://../../"),
     90 + // TODO(#1709): Add equivalent test for GitLab.
     91 +)
     92 + 
     93 +var _ = DescribeTable("Test Search within a path",
     94 + func(uri string) {
     95 + const (
     96 + commitSHA = "c06ac740cc49fea404c54c036000731d5ea6ebe3"
     97 + commitDepth = 10
     98 + )
     99 + client := &Client{}
     100 + Expect(client.InitRepo(uri, commitSHA, commitDepth)).To(BeNil())
     101 + resp, err := client.Search(clients.SearchRequest{
     102 + Query: "github/codeql-action/analyze",
     103 + Path: ".github/workflows",
     104 + })
     105 + Expect(err).To(BeNil())
     106 + Expect(resp.Hits).Should(BeEquivalentTo(1))
     107 + Expect(client.Close()).To(BeNil())
     108 + },
     109 + Entry("GitHub", "https://github.com/ossf/scorecard"),
     110 + Entry("Local", "file://../../"),
     111 + // TODO(#1709): Add equivalent test for GitLab.
     112 +)
     113 + 
     114 +var _ = DescribeTable("Test Search within a filename",
     115 + func(uri string) {
     116 + const (
     117 + commitSHA = "c06ac740cc49fea404c54c036000731d5ea6ebe3"
     118 + commitDepth = 10
     119 + )
     120 + client := &Client{}
     121 + Expect(client.InitRepo(uri, commitSHA, commitDepth)).To(BeNil())
     122 + resp, err := client.Search(clients.SearchRequest{
     123 + Query: "github/codeql-action/analyze",
     124 + Filename: "codeql-analysis.yml",
     125 + })
     126 + Expect(err).To(BeNil())
     127 + Expect(resp.Hits).Should(BeEquivalentTo(1))
     128 + Expect(client.Close()).To(BeNil())
     129 + },
     130 + Entry("GitHub", "https://github.com/ossf/scorecard"),
     131 + Entry("Local", "file://../../"),
     132 + // TODO(#1709): Add equivalent test for GitLab.
     133 +)
     134 + 
     135 +var _ = DescribeTable("Test Search within path and filename",
     136 + func(uri string) {
     137 + const (
     138 + commitSHA = "c06ac740cc49fea404c54c036000731d5ea6ebe3"
     139 + commitDepth = 10
     140 + )
     141 + client := &Client{}
     142 + Expect(client.InitRepo(uri, commitSHA, commitDepth)).To(BeNil())
     143 + resp, err := client.Search(clients.SearchRequest{
     144 + Query: "github/codeql-action/analyze",
     145 + Path: ".github/workflows",
     146 + Filename: "codeql-analysis.yml",
     147 + })
     148 + Expect(err).To(BeNil())
     149 + Expect(resp.Hits).Should(BeEquivalentTo(1))
     150 + Expect(client.Close()).To(BeNil())
     151 + },
     152 + Entry("GitHub", "https://github.com/ossf/scorecard"),
     153 + Entry("Local", "file://../../"),
     154 + // TODO(#1709): Add equivalent test for GitLab.
     155 +)
     156 + 
  • ■ ■ ■ ■ ■ ■
    clients/git/gitrepo_suite_test.go
     1 +// Copyright 2021 OpenSSF 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 git
     16 + 
     17 +import (
     18 + "os"
     19 + "testing"
     20 + 
     21 + . "github.com/onsi/ginkgo/v2"
     22 + . "github.com/onsi/gomega"
     23 +)
     24 + 
     25 +func TestGitRepo(t *testing.T) {
     26 + // TODO(#1709): GitHub tests are taking >10m to run slowing down CI/CD.
     27 + // Need to fix that before re-enabling.
     28 + // TODO(#1709): Local tests require fake Git repo to be available in CI/CD
     29 + // environment.
     30 + if val, exists := os.LookupEnv("RUN_GIT_E2E"); !exists || val == "0" {
     31 + t.Skip()
     32 + }
     33 + if val, exists := os.LookupEnv("SKIP_GINKGO"); exists && val == "1" {
     34 + t.Skip()
     35 + }
     36 + t.Parallel()
     37 + RegisterFailHandler(Fail)
     38 + RunSpecs(t, "GitRepo Suite")
     39 +}
     40 + 
  • ■ ■ ■ ■ ■ ■
    go.mod
    skipped 25 lines
    26 26   github.com/jszwec/csvutil v1.8.0
    27 27   github.com/moby/buildkit v0.11.4
    28 28   github.com/olekukonko/tablewriter v0.0.5
    29  - github.com/onsi/gomega v1.24.2
     29 + github.com/onsi/gomega v1.27.0
    30 30   github.com/shurcooL/githubv4 v0.0.0-20201206200315-234843c633fa
    31 31   github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a // indirect
    32 32   github.com/sirupsen/logrus v1.9.0
    skipped 2 lines
    35 35   go.opencensus.io v0.24.0
    36 36   gocloud.dev v0.26.0
    37 37   golang.org/x/text v0.7.0
    38  - golang.org/x/tools v0.5.1-0.20230117180257-8aba49bb5ea2
     38 + golang.org/x/tools v0.6.0
    39 39   google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6
    40 40   google.golang.org/protobuf v1.28.1
    41 41   gopkg.in/yaml.v2 v2.4.0
    skipped 7 lines
    49 49   github.com/gobwas/glob v0.2.3
    50 50   github.com/google/osv-scanner v1.2.1-0.20230302232134-592acbc2539b
    51 51   github.com/mcuadros/go-jsonschema-generator v0.0.0-20200330054847-ba7a369d4303
    52  - github.com/onsi/ginkgo/v2 v2.7.0
     52 + github.com/onsi/ginkgo/v2 v2.8.3
     53 + github.com/otiai10/copy v1.9.0
    53 54   sigs.k8s.io/release-utils v0.6.0
    54 55  )
    55 56   
    skipped 11 lines
    67 68   github.com/CycloneDX/cyclonedx-go v0.7.0 // indirect
    68 69   github.com/cloudflare/circl v1.1.0 // indirect
    69 70   github.com/davecgh/go-spew v1.1.1 // indirect
     71 + github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
    70 72   github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
    71 73   github.com/google/gofuzz v1.1.0 // indirect
     74 + github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
    72 75   github.com/googleapis/gnostic v0.4.1 // indirect
    73 76   github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
    74 77   github.com/hashicorp/go-retryablehttp v0.7.1 // indirect
    skipped 113 lines
  • ■ ■ ■ ■ ■ ■
    go.sum
    skipped 405 lines
    406 406  github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
    407 407  github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
    408 408  github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
     409 +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
     410 +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
    409 411  github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
    410 412  github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
    411 413  github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
    skipped 113 lines
    525 527  github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
    526 528  github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
    527 529  github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
     530 +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
    528 531  github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
    529 532  github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
    530 533  github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
    skipped 248 lines
    779 782  github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
    780 783  github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
    781 784  github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
    782  -github.com/onsi/ginkgo/v2 v2.7.0 h1:/XxtEV3I3Eif/HobnVx9YmJgk8ENdRsuUmM+fLCFNow=
    783  -github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo=
     785 +github.com/onsi/ginkgo/v2 v2.8.3 h1:RpbK1G8nWPNaCVFBWsOGnEQQGgASi6b8fxcWBvDYjxQ=
     786 +github.com/onsi/ginkgo/v2 v2.8.3/go.mod h1:6OaUA8BCi0aZfmzYT/q9AacwTzDpNbxILUT+TlBq6MY=
    784 787  github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
    785 788  github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
    786 789  github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
    skipped 1 lines
    788 791  github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
    789 792  github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
    790 793  github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
    791  -github.com/onsi/gomega v1.24.2 h1:J/tulyYK6JwBldPViHJReihxxZ+22FHs0piGjQAvoUE=
    792  -github.com/onsi/gomega v1.24.2/go.mod h1:gs3J10IS7Z7r7eXRoNJIrNqU4ToQukCJhFtKrWgHWnk=
     794 +github.com/onsi/gomega v1.27.0 h1:QLidEla4bXUuZVFa4KX6JHCsuGgbi85LC/pCHrt/O08=
     795 +github.com/onsi/gomega v1.27.0/go.mod h1:i189pavgK95OSIipFBa74gC2V4qrQuvjuyGEr3GmbXA=
    793 796  github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
    794 797  github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
    795 798  github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
    796 799  github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
    797 800  github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
     801 +github.com/otiai10/copy v1.9.0 h1:7KFNiCgZ91Ru4qW4CWPf/7jqtxLagGRmIxWldPP9VY4=
     802 +github.com/otiai10/copy v1.9.0/go.mod h1:hsfX19wcn0UWIHUQ3/4fHuehhk2UyArQ9dVFAn3FczI=
     803 +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
     804 +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
     805 +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
     806 +github.com/otiai10/mint v1.4.0 h1:umwcf7gbpEwf7WFzqmWwSv0CzbeMsae2u9ZvpP8j2q4=
     807 +github.com/otiai10/mint v1.4.0/go.mod h1:gifjb2MYOoULtKLqUAEILUG/9KONW6f7YsJ6vQLTlFI=
    798 808  github.com/package-url/packageurl-go v0.1.1-0.20220428063043-89078438f170 h1:DiLBVp4DAcZlBVBEtJpNWZpZVq0AEeCY7Hqk8URVs4o=
    799 809  github.com/package-url/packageurl-go v0.1.1-0.20220428063043-89078438f170/go.mod h1:uQd4a7Rh3ZsVg5j0lNyAfyxIeGde9yrlhjF78GzeW0c=
    800 810  github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
    skipped 546 lines
    1347 1357  golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
    1348 1358  golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
    1349 1359  golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
    1350  -golang.org/x/tools v0.5.1-0.20230117180257-8aba49bb5ea2 h1:v0FhRDmSCNH/0EurAT6T8KRY4aNuUhz6/WwBMxG+gvQ=
    1351  -golang.org/x/tools v0.5.1-0.20230117180257-8aba49bb5ea2/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k=
     1360 +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
     1361 +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
    1352 1362  golang.org/x/vuln v0.0.0-20230118164824-4ec8867cc0e6 h1:XZD8apnMaMVuqE3ZEzf5JJncKMlOsMnnov7U+JRT/d4=
    1353 1363  golang.org/x/vuln v0.0.0-20230118164824-4ec8867cc0e6/go.mod h1:cBP4HMKv0X+x96j8IJWCKk0eqpakBmmHjKGSSC0NaYE=
    1354 1364  golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    skipped 306 lines
Please wait...
Page is in error, reload to recover