From 8058c45d291d166b281ecbd205827377c35edf34 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Sun, 27 Feb 2022 12:36:24 -0500 Subject: [PATCH 01/17] Move entrypoint logic to separate package Signed-off-by: Stephen Augustus --- .gitignore | 2 + entrypoint/entrypoint.go | 193 ++ entrypoint/entrypoint_test.go | 780 ++++++ env/env.go | 130 + go.mod | 31 +- go.sum | 2122 ++++++++++++++++- main.go | 386 +-- main_test.go | 715 ------ options/options.go | 277 +++ options/options_test.go | 123 + {testdata => options/testdata}/fork.json | 0 {testdata => options/testdata}/incorrect.json | 0 {testdata => options/testdata}/non-fork.json | 0 13 files changed, 3663 insertions(+), 1096 deletions(-) create mode 100644 .gitignore create mode 100644 entrypoint/entrypoint.go create mode 100644 entrypoint/entrypoint_test.go create mode 100644 env/env.go delete mode 100644 main_test.go create mode 100644 options/options.go create mode 100644 options/options_test.go rename {testdata => options/testdata}/fork.json (100%) rename {testdata => options/testdata}/incorrect.json (100%) rename {testdata => options/testdata}/non-fork.json (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f19c2731 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Testing +unit-coverage.out diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go new file mode 100644 index 00000000..64c8b420 --- /dev/null +++ b/entrypoint/entrypoint.go @@ -0,0 +1,193 @@ +// Copyright 2022 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 entrypoint + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + "os" + "os/exec" + "strings" + + "github.com/ossf/scorecard-action/options" +) + +// Errors. +var errEmptyScorecardBin = errors.New("scorecard_bin variable is empty") + +type repo struct { + DefaultBranch string `json:"default_branch"` + Private bool `json:"private"` +} + +// Run is the entrypoint for the action. +func Run(o *options.Options) error { + if err := o.Initialize(); err != nil { + return fmt.Errorf("initializing options: %w", err) + } + + if err := o.CheckRequired(); err != nil { + return fmt.Errorf("checking if required options are set: %w", err) + } + + o.SetRepository() + + token := options.GetGithubToken() + repo, err := getRepo(o.Repo(), token) + if err != nil { + return fmt.Errorf("getting repository information: %w", err) + } + + err = o.SetDefaultBranch(repo.DefaultBranch) + if err != nil { + return fmt.Errorf("setting default branch: %w", err) + } + + o.SetRepoVisibility(repo.Private) + o.SetPublishResults() + + o.Print(os.Stdout) + + if err := o.Validate(os.Stderr); err != nil { + return fmt.Errorf("validating options: %w", err) + } + + // gets the cmd run settings + cmd, err := getScorecardCmd(o) + if err != nil { + return err + } + + cmd.Dir = options.GetGithubWorkspace() + if err := cmd.Run(); err != nil { + return fmt.Errorf("running scorecard command: %w", err) + } + + results, err := ioutil.ReadFile(o.ResultsFile) + if err != nil { + return fmt.Errorf("reading results file: %w", err) + } + + fmt.Println(string(results)) + + return nil +} + +// getRepo is a function to get the repository information. +// It is decided to not use the golang GitHub library because of the +// dependency on the github.com/google/go-github/github library +// which will in turn require other dependencies. +func getRepo(name, token string) (repo, error) { + var r repo + ctx := context.Background() + + req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("https://api.github.com/repos/%s", name), nil) + if err != nil { + return r, fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Authorization", token) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return r, fmt.Errorf("error creating request: %w", err) + } + defer resp.Body.Close() + if err != nil { + return r, fmt.Errorf("error reading response body: %w", err) + } + + err = json.NewDecoder(resp.Body).Decode(&r) + if err != nil { + return r, fmt.Errorf("error decoding response body: %w", err) + } + + return r, nil +} + +func getScorecardCmd(o *options.Options) (*exec.Cmd, error) { + if o.ScorecardBin == "" { + return nil, errEmptyScorecardBin + } + var result exec.Cmd + result.Path = o.ScorecardBin + + // if pull_request + if strings.Contains(o.GithubEventName, "pull_request") { + // empty policy file + if o.ScorecardOpts.PolicyFile == "" { + result.Args = []string{ + "--local", + ".", + "--format", + o.ScorecardOpts.Format, + "--show-details", + ">", + o.ResultsFile, + } + return &result, nil + } + + result.Args = []string{ + "--local", + ".", + "--format", + o.ScorecardOpts.Format, + "--policy", + o.ScorecardOpts.PolicyFile, + "--show-details", + ">", + o.ResultsFile, + } + return &result, nil + } + + var enabledChecks string + if o.GithubEventName == "branch_protection_rule" { + enabledChecks = "--checks Branch-Protection" + } + + if o.ScorecardOpts.PolicyFile == "" { + result.Args = []string{ + "--repo", + o.ScorecardOpts.Repo, + "--format", + o.ScorecardOpts.Format, + enabledChecks, + "--show-details", + ">", + o.ResultsFile, + } + return &result, nil + } + + result.Args = []string{ + "--repo", + o.ScorecardOpts.Repo, + "--format", + o.ScorecardOpts.Format, + enabledChecks, + "--policy", + o.ScorecardOpts.PolicyFile, + "--show-details", + ">", + o.ResultsFile, + } + + return &result, nil +} diff --git a/entrypoint/entrypoint_test.go b/entrypoint/entrypoint_test.go new file mode 100644 index 00000000..57be1e0a --- /dev/null +++ b/entrypoint/entrypoint_test.go @@ -0,0 +1,780 @@ +// Copyright 2022 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 entrypoint + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "os/exec" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + + "github.com/ossf/scorecard-action/env" + "github.com/ossf/scorecard-action/options" + scopts "github.com/ossf/scorecard/v4/options" +) + +//nolint:paralleltest +// Not setting t.Parallel() here because we are mutating the env variables. +func Test_RepoIsFork(t *testing.T) { + type args struct { + ghEventPath string + } + tests := []struct { + name string + args args + want bool + wantErr bool + }{ + { + name: "No event data", + want: false, + wantErr: true, + }, + { + name: "Fork event", + args: args{ + ghEventPath: "./testdata/fork.json", + }, + want: true, + wantErr: false, + }, + { + name: "Non fork event", + args: args{ + ghEventPath: "./testdata/non-fork.json", + }, + want: false, + wantErr: false, + }, + { + name: "incorrect event", + args: args{ + ghEventPath: "./testdata/incorrect.json", + }, + want: false, + wantErr: true, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + var data []byte + var err error + if tt.args.ghEventPath != "" { + data, err = ioutil.ReadFile(tt.args.ghEventPath) + if err != nil { + t.Errorf("Failed to open test data: %v", err) + } + } + + got, err := options.RepoIsFork(string(data)) + if (err != nil) != tt.wantErr { + t.Errorf("%v", err) + t.Errorf("RepoIsFork() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("RepoIsFork() = %v, want %v", got, tt.want) + } + }) + } +} + +//nolint:paralleltest +// Not setting t.Parallel() here because we are mutating the env variables. +func TestInitializeEnvVariables(t *testing.T) { + tests := []struct { + opts *options.Options + name string + githubEventPath string + inputResultsFile string + inputPublishResults string + wantErr bool + githubEventPathSet bool + inputResultsFileSet bool + inputResultsFormatSet bool + inputPublishResultsSet bool + }{ + { + name: "Success", + wantErr: false, + opts: &options.Options{ + ScorecardOpts: &scopts.Options{ + Format: "json", + }, + }, + inputResultsFileSet: true, + inputResultsFile: "./testdata/results.json", + inputResultsFormatSet: true, + inputPublishResultsSet: true, + inputPublishResults: "true", + githubEventPathSet: true, + githubEventPath: "./testdata/fork.json", + }, + { + name: "Success - no results file", + wantErr: true, + opts: &options.Options{ + ScorecardOpts: &scopts.Options{ + Format: "json", + }, + }, + inputResultsFileSet: false, + inputResultsFile: "", + inputResultsFormatSet: true, + inputPublishResultsSet: true, + inputPublishResults: "true", + githubEventPathSet: true, + githubEventPath: "./testdata/fork.json", + }, + { + name: "Success - no results format", + wantErr: true, + opts: &options.Options{ + ScorecardOpts: &scopts.Options{ + Format: "", + }, + }, + inputResultsFileSet: true, + inputResultsFile: "./testdata/results.json", + inputResultsFormatSet: false, + inputPublishResultsSet: true, + inputPublishResults: "true", + githubEventPathSet: true, + githubEventPath: "./testdata/fork.json", + }, + { + name: "Success - no publish results", + wantErr: true, + opts: &options.Options{ + ScorecardOpts: &scopts.Options{ + Format: "json", + }, + }, + inputResultsFileSet: true, + inputResultsFile: "./testdata/results.json", + inputResultsFormatSet: true, + inputPublishResultsSet: false, + inputPublishResults: "", + githubEventPathSet: true, + githubEventPath: "./testdata/fork.json", + }, + { + name: "Success - no github event path", + wantErr: true, + opts: &options.Options{ + ScorecardOpts: &scopts.Options{ + Format: "json", + }, + }, + inputResultsFileSet: true, + inputResultsFile: "./testdata/results.json", + inputResultsFormatSet: true, + inputPublishResultsSet: true, + inputPublishResults: "true", + githubEventPathSet: false, + githubEventPath: "./testdata/fork.json", + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + if tt.inputResultsFileSet { + defer os.Unsetenv(env.InputPublishResults) + os.Setenv(env.InputResultsFile, tt.inputResultsFile) + } else { + os.Unsetenv(env.InputResultsFile) + } + if tt.inputResultsFormatSet { + defer os.Unsetenv(env.InputResultsFormat) + os.Setenv(env.InputResultsFormat, tt.opts.ScorecardOpts.Format) + } else { + os.Unsetenv(env.InputResultsFormat) + } + if tt.inputPublishResultsSet { + defer os.Unsetenv(env.InputPublishResults) + os.Setenv(env.InputPublishResults, tt.inputPublishResults) + } else { + os.Unsetenv(env.InputPublishResults) + } + if tt.githubEventPathSet { + defer os.Unsetenv(env.GithubEventPath) + os.Setenv(env.GithubEventPath, tt.githubEventPath) + } else { + os.Unsetenv(env.GithubEventPath) + } + if err := tt.opts.Initialize(); (err != nil) != tt.wantErr { + t.Errorf("options.Initialize() error = %v, wantErr %v %v", err, tt.wantErr, t.Name()) + } + + envvars := make(map[string]string) + envvars[env.EnableSarif] = "1" + envvars[env.EnableLicense] = "1" + envvars[env.EnableDangerousWorkflow] = "1" + + for k, v := range envvars { + if os.Getenv(k) != v { + t.Errorf("%s env var not set correctly %s", k, v) + } + } + }) + } +} + +//nolint:paralleltest +// Not setting t.Parallel() here because we are mutating the env variables. +func TestUpdateEnvVariables(t *testing.T) { + tests := []struct { + opts *options.Options + name string + isPrivateRepo bool + wantErr bool + }{ + { + name: "Success - private repo", + opts: &options.Options{ + ScorecardOpts: &scopts.Options{ + Format: "json", + }, + }, + isPrivateRepo: true, + wantErr: false, + }, + { + name: "Success - private repo - sarif", + opts: &options.Options{ + ScorecardOpts: &scopts.Options{ + Format: "sarif", + }, + }, + isPrivateRepo: true, + wantErr: false, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + tt.opts.SetRepoVisibility(tt.isPrivateRepo) + tt.opts.SetPublishResults() + if !tt.wantErr && tt.isPrivateRepo { + if tt.opts.PublishResults != "false" { + t.Errorf("scorecardPublishResults env var (%s) should be false", tt.opts.PublishResults) + } + } + + if !tt.wantErr && tt.opts.ScorecardOpts.Format == "sarif" { + if _, ok := os.LookupEnv(tt.opts.ScorecardOpts.PolicyFile); ok { + t.Errorf("envEnableSarif env var should not be set") + } + } + }) + } +} + +//nolint:paralleltest +// Not setting t.Parallel() here because we are mutating the env variables. +func TestUpdateRepositoryInformation(t *testing.T) { + // Not setting t.Parallel() here because we are mutating the env variables + type args struct { + opts *options.Options + defaultBranch string + privateRepo bool + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Success - private repo", + args: args{ + opts: &options.Options{}, + defaultBranch: "master", + privateRepo: true, + }, + wantErr: false, + }, + { + name: "Success - public repo", + args: args{ + opts: &options.Options{}, + defaultBranch: "master", + privateRepo: false, + }, + wantErr: false, + }, + { + name: "Success - public repo - no default branch", + args: args{ + opts: &options.Options{}, + defaultBranch: "", + privateRepo: false, + }, + wantErr: true, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + if err := tt.args.opts.SetDefaultBranch(tt.args.defaultBranch); (err != nil) != tt.wantErr { + t.Errorf("options.SetDefaultBranch() error = %v, wantErr %v", err, tt.wantErr) + } + + tt.args.opts.SetRepoVisibility(tt.args.privateRepo) + + if tt.args.privateRepo { + if tt.args.opts.PrivateRepo != strconv.FormatBool(tt.args.privateRepo) { + t.Errorf("scorecardPublishResults env var should be false") + } + } + if tt.args.defaultBranch != "" { + if tt.args.opts.DefaultBranch != fmt.Sprintf("refs/heads/%s", tt.args.defaultBranch) { + t.Errorf("scorecardDefaultBranch env var should be %s", tt.args.defaultBranch) + } + } + }) + } +} + +//nolint:paralleltest +// Not setting t.Parallel() here because we are mutating the env variables. +func TestCheckRequired(t *testing.T) { + tests := []struct { + opts *options.Options + name string + wantErr bool + }{ + { + name: "Success - all required env vars set", + opts: options.New(), + wantErr: false, + }, + } + for _, tt := range tests { + tt := tt + envVariables := make(map[string]bool) + envVariables[env.GithubRepository] = true + envVariables[env.GithubAuthToken] = true + t.Run(tt.name, func(t *testing.T) { + if !tt.wantErr { + for k := range envVariables { + defer os.Unsetenv(k) + if err := os.Setenv(k, "true"); err != nil { + t.Errorf("failed to set env var %s", k) + } + } + } + + if err := tt.opts.CheckRequired(); (err != nil) != tt.wantErr { + t.Errorf("options.CheckRequired() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +//nolint:paralleltest +// Not setting t.Parallel() here because we are mutating the env variables. +func TestGithubEventPath(t *testing.T) { + tests := []struct { + name string + githubEventPath string + shouldEnvGithubEventPathBeSet bool + wantErr bool + isFork bool + }{ + { + name: "Success - githubEventPath set", + wantErr: false, + shouldEnvGithubEventPathBeSet: true, + githubEventPath: "./testdata/non-fork.json", + isFork: false, + }, + { + name: "Success - githubEventPath not set", + wantErr: true, + shouldEnvGithubEventPathBeSet: false, + githubEventPath: "", + }, + { + name: "Success - githubEventPath is empty", + wantErr: true, + shouldEnvGithubEventPathBeSet: true, + githubEventPath: "", + }, + { + name: "Failure non-existent file", + wantErr: true, + shouldEnvGithubEventPathBeSet: true, + githubEventPath: "./foo.bar.json", + }, + { + name: "Failure non-existent file", + wantErr: true, + shouldEnvGithubEventPathBeSet: true, + githubEventPath: "./testdata/incorrect.json", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.shouldEnvGithubEventPathBeSet { + if err := os.Setenv(env.GithubEventPath, tt.githubEventPath); err != nil { + t.Errorf("failed to set env var %s", env.GithubEventPath) + } + defer os.Unsetenv(env.GithubEventPath) + } + + if err := options.GithubEventPath(); (err != nil) != tt.wantErr { + t.Errorf("options.GithubEventPath() error = %v, wantErr %v %v", err, tt.wantErr, tt.name) + } + + if tt.isFork { + forkEnv := os.Getenv(env.ScorecardFork) + if forkEnv != "true" { + t.Errorf("isFork = %v, want %v %v", tt.isFork, forkEnv, tt.name) + } + } + }) + } +} + +//nolint:paralleltest,gocognit +// Not setting t.Parallel() here because we are mutating the env variables. +func TestValidate(t *testing.T) { + tests := []struct { + opts *options.Options + name string + wantWriter string + authToken string + gitHubEventName string + ref string + scorecardDefaultBranch string + wantErr bool + scorecardFork bool + }{ + { + name: "scorecardFork set and failure", + opts: &options.Options{}, + wantErr: true, + authToken: "", + scorecardFork: true, + gitHubEventName: "", + ref: "", + scorecardDefaultBranch: "", + }, + { + name: "Success - scorecardFork set", + opts: &options.Options{}, + wantErr: false, + authToken: "token", + scorecardFork: false, + gitHubEventName: "", + ref: "", + scorecardDefaultBranch: "", + }, + { + name: "Success - scorecardFork set", + opts: &options.Options{}, + wantErr: true, + authToken: "token", + scorecardFork: true, + gitHubEventName: "pull_request", + ref: "main", + scorecardDefaultBranch: "main", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + writer := &bytes.Buffer{} + if err := os.Setenv(env.ScorecardFork, strconv.FormatBool(tt.scorecardFork)); err != nil { + t.Errorf("failed to set env var %s", env.ScorecardFork) + } + defer os.Unsetenv(env.ScorecardFork) + if tt.gitHubEventName != "" { + if err := os.Setenv(env.GithubEventName, tt.gitHubEventName); err != nil { + t.Errorf("failed to set env var %s", env.GithubEventName) + } + defer os.Unsetenv(env.GithubEventName) + } + if tt.ref != "" { + if err := os.Setenv(env.GithubRef, tt.ref); err != nil { + t.Errorf("failed to set env var %s", env.GithubRef) + } + defer os.Unsetenv(env.GithubRef) + } + if tt.scorecardDefaultBranch != "" { + tt.opts.DefaultBranch = tt.scorecardDefaultBranch + } + if tt.authToken != "" { + if err := os.Setenv(env.GithubAuthToken, tt.authToken); err != nil { + t.Errorf("failed to set env var %s", env.GithubAuthToken) + } + defer os.Unsetenv(env.GithubAuthToken) + } + if err := tt.opts.Validate(writer); (err != nil) != tt.wantErr { + t.Errorf("validate() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestGetScorecardCmd(t *testing.T) { + t.Parallel() + type args *options.Options + + //nolint + tests := []struct { + wantErr bool + name string + args args + want *exec.Cmd + }{ + { + name: "Success - envScorecardFork set", + args: &options.Options{ + ScorecardOpts: &scopts.Options{ + Repo: "foo/bar", + Format: "json", + PolicyFile: "./testdata/scorecard.yaml", + }, + GithubEventName: "pull_request", + ScorecardBin: "scorecard", + ResultsFile: "./testdata/scorecard.json", + }, + want: &exec.Cmd{ + Path: "scorecard", + Args: []string{ + "scorecard", + "--policy", + "./testdata/scorecard.yaml", + "--results-format", + "json", + "--results-file", + "./testdata/scorecard.json", + "--repo", + "foo/bar", + }, + }, + }, + { + name: "Success - envScorecardFork set", + args: &options.Options{ + ScorecardOpts: &scopts.Options{ + Repo: "foo/bar", + Format: "json", + PolicyFile: "./testdata/scorecard.yaml", + }, + GithubEventName: "pull_request", + ScorecardBin: "scorecard", + ResultsFile: "./testdata/scorecard.json", + }, + want: &exec.Cmd{ + Path: "scorecard", + Args: []string{ + "scorecard", + "--policy", + "./testdata/scorecard.yaml", + "--results-format", + "json", + "--results-file", + "./testdata/scorecard.json", + "--repo", + "foo/bar", + }, + }, + }, + { + name: "Success - envScorecardFork set", + args: &options.Options{ + ScorecardOpts: &scopts.Options{ + Repo: "foo/bar", + Format: "json", + PolicyFile: "./testdata/scorecard.yaml", + }, + GithubEventName: "pull_request", + ScorecardBin: "scorecard", + ResultsFile: "./testdata/scorecard.json", + }, + want: &exec.Cmd{ + Path: "scorecard", + Args: []string{ + "scorecard", + "--policy", + "./testdata/scorecard.yaml", + "--results-format", + "json", + "--results-file", + "./testdata/scorecard.json", + "--repo", + "foo/bar", + }, + }, + }, + { + name: "Success - envScorecardFork set", + args: &options.Options{ + ScorecardOpts: &scopts.Options{ + Repo: "foo/bar", + Format: "json", + }, + GithubEventName: "pull_request", + ScorecardBin: "scorecard", + ResultsFile: "./testdata/scorecard.json", + }, + want: &exec.Cmd{ + Path: "scorecard", + Args: []string{ + "scorecard", + "--results-format", + "json", + "--results-file", + "./testdata/scorecard.json", + "--repo", + "foo/bar", + }, + }, + }, + { + name: "Success - envScorecardFork set", + args: &options.Options{ + ScorecardOpts: &scopts.Options{ + Repo: "foo/bar", + Format: "json", + }, + GithubEventName: "pull_request", + ScorecardBin: "scorecard", + ResultsFile: "./testdata/scorecard.json", + }, + want: &exec.Cmd{ + Path: "scorecard", + Args: []string{ + "scorecard", + "--results-format", + "json", + "--results-file", + "./testdata/scorecard.json", + "--repo", + "foo/bar", + }, + }, + }, + { + name: "Success - envScorecardFork set", + args: &options.Options{ + ScorecardOpts: &scopts.Options{ + Repo: "foo/bar", + Format: "json", + }, + ScorecardBin: "scorecard", + ResultsFile: "./testdata/scorecard.json", + }, + want: &exec.Cmd{ + Path: "scorecard", + Args: []string{ + "scorecard", + "--results-format", + "json", + "--results-file", + "./testdata/scorecard.json", + "--repo", + "foo/bar", + }, + }, + }, + { + name: "Success - Branch protection rule", + args: &options.Options{ + ScorecardOpts: &scopts.Options{ + Repo: "foo/bar", + Format: "json", + }, + GithubEventName: "branch_protection_rule", + ScorecardBin: "scorecard", + ResultsFile: "./testdata/scorecard.json", + }, + want: &exec.Cmd{ + Path: "scorecard", + Args: []string{ + "scorecard", + "--results-format", + "json", + "--results-file", + "./testdata/scorecard.json", + "--repo", + "foo/bar", + }, + }, + }, + { + name: "Success - Branch protection rule", + args: &options.Options{ + ScorecardOpts: &scopts.Options{ + Repo: "foo/bar", + Format: "json", + PolicyFile: "./testdata/scorecard.yaml", + }, + GithubEventName: "branch_protection_rule", + ScorecardBin: "scorecard", + ResultsFile: "./testdata/scorecard.json", + }, + want: &exec.Cmd{ + Path: "scorecard", + Args: []string{ + "scorecard", + "--policy", + "./testdata/scorecard.yaml", + "--results-format", + "json", + "--results-file", + "./testdata/scorecard.json", + "--repo", + "foo/bar", + }, + }, + }, + { + name: "Want error - Branch protection rule", + args: &options.Options{ + ScorecardOpts: &scopts.Options{ + Repo: "", + Format: "", + }, + GithubEventName: "", + ScorecardBin: "", + ResultsFile: "", + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + got, err := getScorecardCmd(tt.args) + if (err != nil) != tt.wantErr { + t.Errorf("getScorecardCmd() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !tt.wantErr && cmp.Equal(got.Args, tt.want.Args) { + t.Errorf("getScorecardCmd() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/env/env.go b/env/env.go new file mode 100644 index 00000000..f77cd4bd --- /dev/null +++ b/env/env.go @@ -0,0 +1,130 @@ +// Copyright OpenSSF 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 env + +import ( + "errors" + "fmt" + "io" + "os" +) + +// Environment variables. +// TODO(env): Remove once environment variables are not used for config. +//nolint:revive,nolintlint +const ( + EnableSarif = "ENABLE_SARIF" + EnableLicense = "ENABLE_LICENSE" + EnableDangerousWorkflow = "ENABLE_DANGEROUS_WORKFLOW" + GithubEventPath = "GITHUB_EVENT_PATH" + GithubEventName = "GITHUB_EVENT_NAME" + GithubRepository = "GITHUB_REPOSITORY" + GithubRef = "GITHUB_REF" + GithubWorkspace = "GITHUB_WORKSPACE" + GithubAuthToken = "GITHUB_AUTH_TOKEN" //nolint:gosec + InputResultsFile = "INPUT_RESULTS_FILE" + InputResultsFormat = "INPUT_RESULTS_FORMAT" + InputPublishResults = "INPUT_PUBLISH_RESULTS" + ScorecardFork = "SCORECARD_IS_FORK" + ScorecardPrivateRepo = "SCORECARD_PRIVATE_REPOSITORY" +) + +// CheckRequired is a function to check if the required environment variables are set. +func CheckRequired() error { + envVariables := make(map[string]bool) + envVariables[GithubRepository] = true + envVariables[GithubAuthToken] = true + + for key := range envVariables { + // TODO(env): Refactor to use helpers + if _, exists := os.LookupEnv(key); !exists { + return errRequiredEnvNotSet + } + } + + return nil +} + +// Print is a function to print the ENV variables. +func Print(writer io.Writer) { + fmt.Fprintf(writer, "GITHUB_EVENT_PATH=%s\n", os.Getenv(GithubEventPath)) + fmt.Fprintf(writer, "GITHUB_EVENT_NAME=%s\n", os.Getenv(GithubEventName)) + fmt.Fprintf(writer, "GITHUB_REPOSITORY=%s\n", os.Getenv(GithubRepository)) + fmt.Fprintf(writer, "SCORECARD_IS_FORK=%s\n", os.Getenv(ScorecardFork)) + fmt.Fprintf(writer, "Ref=%s\n", os.Getenv(GithubRef)) +} + +// Adapted from sigs.k8s.io/release-utils/env + +// TODO(env): Consider making these methods on an env var type. + +// Lookup returns either the provided environment variable for the given key +// or the default value def if not set. +func Lookup(envVar, def string, mustExist, mustNotBeEmpty bool) (string, error) { + value, ok := os.LookupEnv(envVar) + if !ok { + if mustExist { + return value, errEnvVarNotSetWithKey(envVar) + } + } + + if value == "" { + if mustNotBeEmpty { + return value, errEnvVarIsEmptyWithKey(envVar) + } + + return def, nil + } + + return value, nil +} + +// Errors + +var ( + // Errors. + // TODO(env): Determine if these errors actually need to be named. + + // ErrGitHubEventPath TODO(lint): should have comment or be unexported (revive). + ErrGitHubEventPath = errors.New("error getting GITHUB_EVENT_PATH") + // ErrGitHubEventPathEmpty TODO(lint): should have comment or be unexported (revive). + ErrGitHubEventPathEmpty = errEnvVarIsEmptyWithKey(GithubEventPath) + // ErrGitHubEventPathNotSet TODO(lint): should have comment or be unexported (revive). + ErrGitHubEventPathNotSet = errEnvVarNotSetWithKey(InputPublishResults) + // ErrEmptyGitHubAuthToken TODO(lint): should have comment or be unexported (revive). + ErrEmptyGitHubAuthToken = errEnvVarIsEmptyWithKey(GithubAuthToken) + + errEnvVarNotSet = errors.New("env var is not set") + errEnvVarIsEmpty = errors.New("env var is empty") + + errRequiredEnvNotSet = errors.New("required environment variables are not set") + // TODO(env): Remove if not needed. + /* + errInputResultFileNotSet = errEnvVarNotSet(InputResultsFile) + errInputResultFileEmpty = errEnvVarIsEmpty(InputResultsFile) + errInputResultFormatNotSet = errEnvVarNotSet(InputResultsFormat) + errInputResultFormatEmpty = errEnvVarIsEmpty(InputResultsFormat) + errInputPublishResultsNotSet = errEnvVarNotSet(InputPublishResults) + errInputPublishResultsEmpty = errEnvVarIsEmpty(InputPublishResults) + */ +) + +func errEnvVarNotSetWithKey(envVar string) error { + return fmt.Errorf("%w: %s", errEnvVarNotSet, envVar) +} + +func errEnvVarIsEmptyWithKey(envVar string) error { + return fmt.Errorf("%w: %s", errEnvVarIsEmpty, envVar) +} diff --git a/go.mod b/go.mod index bb44a9a5..5a8db976 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,33 @@ module github.com/ossf/scorecard-action go 1.17 -require github.com/google/go-cmp v0.5.7 +require ( + github.com/google/go-cmp v0.5.7 + github.com/ossf/scorecard/v4 v4.1.1-0.20220227152949-d71866ca16b4 +) + +require ( + cloud.google.com/go v0.100.2 // indirect + cloud.google.com/go/compute v0.1.0 // indirect + cloud.google.com/go/iam v0.1.1 // indirect + cloud.google.com/go/storage v1.18.2 // indirect + github.com/bombsimon/logrusr/v2 v2.0.1 // indirect + github.com/go-logr/logr v1.2.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/wire v0.5.0 // indirect + github.com/googleapis/gax-go/v2 v2.1.1 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + go.opencensus.io v0.23.0 // indirect + gocloud.dev v0.24.0 // indirect + golang.org/x/net v0.0.0-20211216030914-fe4d6282115f // indirect + golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect + golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + google.golang.org/api v0.67.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00 // indirect + google.golang.org/grpc v1.44.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect +) diff --git a/go.sum b/go.sum index a6ca3a47..1f659de4 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,2124 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY= +cloud.google.com/go v0.89.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.92.2/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.92.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.0/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2 h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.28.0/go.mod h1:/Lo9aP2BX/WDiOvHiXX/UQWH9vLDFRABeyqFA+fjkqE= +cloud.google.com/go/compute v0.1.0 h1:rSUBvAyVwNJ5uQCKNJFMwPtTvJkfN38b6Pvb9zZoqJ8= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/datacatalog v1.1.0/go.mod h1:XiA5mWWnIFIcwFmsZGLOZRyX4AhXdh2SYpcQJMmkHiA= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.5.0/go.mod h1:c4nNYR1qdq7eaZ+jSc5fonrQN2k3M7sWATcYTiakjEo= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.1.1 h1:4CapQyNFjiksks1/x7jsvsygFPhihslYk5GptIrlX68= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/kms v0.1.0/go.mod h1:8Qp8PCAypHg4FdmlyW1QRAv09BGQ9Uzh7JnmIZxPk+c= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/monitoring v0.1.0/go.mod h1:Hpm3XfzJv+UTiXzCG5Ffp0wijzHTC7Cv4eR7o3x/fEE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.16.0/go.mod h1:6A8EfoWZ/lUvCWStKGwAWauJZSiuV0Mkmu6WilK/TxQ= +cloud.google.com/go/pubsub v1.18.0/go.mod h1:Vg6zS1lnXBFiQuHMntX4Id4mKIdsVRjKED4nCVMdMJ8= +cloud.google.com/go/secretmanager v0.1.0/go.mod h1:3nGKHvnzDUVit7U0S9KAKJ4aOsO1xtwRG+7ey5LK1bM= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.16.1/go.mod h1:LaNorbty3ehnU3rEjXSNV/NRgQA0O8Y+uh6bPe5UOk4= +cloud.google.com/go/storage v1.18.2 h1:5NQw6tOn3eMm0oE8vTkfjau18kjL79FlMjy/CHTpmoY= +cloud.google.com/go/storage v1.18.2/go.mod h1:AiIj7BWXyhO5gGVmYJ+S8tbkCx3yb0IMjua8Aw4naVM= +cloud.google.com/go/trace v0.1.0/go.mod h1:wxEwsoeRVPbeSkt7ZC9nWCgmoKQRAoySN7XHW2AmI7g= +code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= +contrib.go.opencensus.io/exporter/stackdriver v0.13.8/go.mod h1:huNtlWx75MwO7qMs0KrMxPZXzNNWebav1Sq/pm02JdQ= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/AkihiroSuda/containerd-fuse-overlayfs v1.0.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8= +github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= +github.com/Azure/azure-amqp-common-go/v3 v3.1.0/go.mod h1:PBIGdzcO1teYoufTKMcGibdKaYZv4avS+O6LNIp8bq0= +github.com/Azure/azure-amqp-common-go/v3 v3.1.1/go.mod h1:YsDaPfaO9Ub2XeSKdIy2DfwuiQlHQCauHJwSqtrkECI= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v57.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= +github.com/Azure/azure-service-bus-go v0.10.16/go.mod h1:MlkLwGGf1ewcx5jZadn0gUEty+tTg0RaElr6bPf+QhI= +github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= +github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.13.0/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1xlxUTs= +github.com/Azure/go-amqp v0.13.11/go.mod h1:D5ZrjQqB1dyp1A+G73xeL/kNn7D5qHJIIsNNps7YNmk= +github.com/Azure/go-amqp v0.13.12/go.mod h1:D5ZrjQqB1dyp1A+G73xeL/kNn7D5qHJIIsNNps7YNmk= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.3/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.15/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.8/go.mod h1:kxyKZTSfKh8OVFWPAgOgQ/frrJgeYQJPyR5fLFmXko4= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.3/go.mod h1:yAQ2b6eP/CmLPnmLvxtT1ALIY3OR1oFcCqVBi8vHiTc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Djarvur/go-err113 v0.1.0/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.24.0/go.mod h1:3tx938GhY4FC+E1KT/jNjDw7Z5qxAEtIiERJ2sXjnII= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.10/go.mod h1:g5uw8EV2mAlzqe94tfNBNdr89fnbD/n3HV0OhsddkmM= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim/test v0.0.0-20200826032352-301c83a30e7c/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= +github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= +github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.40.34 h1:SBYmodndE2d4AYucuuJnOXk4MD1SFbucoIdpwKVKeSA= +github.com/aws/aws-sdk-go v1.40.34/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go-v2 v1.9.0 h1:+S+dSqQCN3MSU5vJRu1HqHrq00cJn6heIMU7X9hcsoo= +github.com/aws/aws-sdk-go-v2 v1.9.0/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.7.0 h1:J2cZ7qe+3IpqBEXnHUrFrOjoB9BlsXg7j53vxcl5IVg= +github.com/aws/aws-sdk-go-v2/config v1.7.0/go.mod h1:w9+nMZ7soXCe5nT46Ri354SNhXDQ6v+V5wqDjnZE+GY= +github.com/aws/aws-sdk-go-v2/credentials v1.4.0 h1:kmvesfjY861FzlCU9mvAfe01D9aeXcG2ZuC+k9F2YLM= +github.com/aws/aws-sdk-go-v2/credentials v1.4.0/go.mod h1:dgGR+Qq7Wjcd4AOAW5Rf5Tnv3+x7ed6kETXyS9WCuAY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.0 h1:OxTAgH8Y4BXHD6PGCJ8DHx2kaZPCQfSTqmDsdRZFezE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.0/go.mod h1:CpNzHK9VEFUCknu50kkB8z58AH2B5DvPP7ea1LHve/Y= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.2 h1:d95cddM3yTm4qffj3P6EnP+TzX1SSkWaQypXSgT/hpA= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.2/go.mod h1:BQV0agm+JEhqR+2RT5e1XTFIDcAAV0eW6z2trp+iduw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.0 h1:VNJ5NLBteVXEwE2F1zEXVmyIH58mZ6kIQGJoC7C+vkg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.0/go.mod h1:R1KK+vY8AfalhG1AOu5e35pOD2SdoPKQCFLTvnxiohk= +github.com/aws/aws-sdk-go-v2/service/kms v1.5.0/go.mod h1:w7JuP9Oq1IKMFQPkNe3V6s9rOssXzOVEMNEqK1L1bao= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.6.0/go.mod h1:B+7C5UKdVq1ylkI/A6O8wcurFtaux0R1njePNPtKwoA= +github.com/aws/aws-sdk-go-v2/service/ssm v1.10.0/go.mod h1:4dXS5YNqI3SNbetQ7X7vfsMlX6ZnboJA2dulBwJx7+g= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.0 h1:sHXMIKYS6YiLPzmKSvDpPmOpJDHxmAUgbiF49YNVztg= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.0/go.mod h1:+1fpWnL96DL23aXPpMGbsmKe8jLTEfbjuQoA4WS1VaA= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.0 h1:1at4e5P+lvHNl2nUktdM2/v+rpICg/QSEr9TO/uW9vU= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.0/go.mod h1:0qcSMCyASQPN2sk/1KQLQ2Fh6yq8wm0HSDAimPhzCoM= +github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bombsimon/logrusr/v2 v2.0.1 h1:1VgxVNQMCvjirZIYaT9JYn6sAVGVEcNtRE0y4mvaOAM= +github.com/bombsimon/logrusr/v2 v2.0.1/go.mod h1:ByVAX+vHdLGAfdroiMg6q0zgq2FODY2lc5YJvzmOJio= +github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= +github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= +github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bradleyfalzon/ghinstallation/v2 v2.0.4/go.mod h1:B40qPqJxWE0jDZgOR1JmaMy+4AY1eBP+IByOvqyAKp0= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= +github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= +github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter v0.0.0-20201027054423-3a04e4c2c116/go.mod h1:o59b3PCKVAf9jjiKtCc/9hLAd+5p/rfhBfm6aBcTEr4= +github.com/containerd/stargz-snapshotter/estargz v0.10.1/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.15/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dvyukov/go-fuzz v0.0.0-20210914135545-4980593459a1/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.13.1/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= +github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.0.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= +github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/crfs v0.0.0-20191108021818-71d77da419c9/go.mod h1:etGhoOqfwPkooV6aqoX3eBGQOJblqdoc9XvWOeuxpPw= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= +github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= +github.com/google/go-containerregistry v0.8.0/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-github/v38 v38.1.0/go.mod h1:cStvrz/7nFr0FoENgG6GLbp53WaelXucT+BBz/3VKx4= +github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/grpcreplay v1.1.0 h1:S5+I3zYyZ+GQz68OfbURDdt/+cSMqCK1wrvNx7WBzTE= +github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/go-replayers/httpreplay v1.0.0 h1:8SmT8fUYM4nueF+UnXIX8LJxNTb1vpPuknXz+yTWzL4= +github.com/google/go-replayers/httpreplay v1.0.0/go.mod h1:LJhKoTwS5Wy5Ld/peq8dFFG5OfJyHEz7ft+DsTUv25M= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/renameio v1.0.1/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk= +github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= +github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= +github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1 h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= +github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= +github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg= +github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jszwec/csvutil v1.6.0/go.mod h1:Rpu7Uu9giO9subDyMCIQfHVDuLrcaC36UA4YcJjGBkg= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/moby/buildkit v0.8.3/go.mod h1:jUezwyOvKdkbcvR66WuKzPYQUO3sQ8i/eChLZ7kEmg8= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/ossf/scorecard/v4 v4.1.1-0.20220227152949-d71866ca16b4 h1:LwuPOLzif3rEnB7Ta5PDmDPTxt5ld7dt5sS624jIztE= +github.com/ossf/scorecard/v4 v4.1.1-0.20220227152949-d71866ca16b4/go.mod h1:qs5PAO9RACLADHXR4jYFz18M6DlGre+Won6bmRWUnhE= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/rhysd/actionlint v1.6.9/go.mod h1:0AA4pvZ2nrZHT6D86eUhieH2NFmLqhxrNex0NEa2A2g= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1-0.20210923151022-86f73c517451/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= +github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= +github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/githubv4 v0.0.0-20201206200315-234843c633fa/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85/go.mod h1:a7cilN64dG941IOXfhJhlH0qB92hxJ9A1ewrdUmJ6xo= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= +go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +gocloud.dev v0.24.0 h1:cNtHD07zQQiv02OiwwDyVMuHmR7iQt2RLkzoAgz7wBs= +gocloud.dev v0.24.0/go.mod h1:uA+als++iBX5ShuG4upQo/3Zoz49iIPlYUWHV5mM8w8= +golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210223095934-7937bea0104d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210608053332-aa57babbf139/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210925032602-92d5a993a665/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211113001501-0c823b97ae02/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210916214954-140adaaadfaf/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= +google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.37.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.52.0/go.mod h1:Him/adpjt0sxtkWViy0b6xyKW/SD71CwdJ7HqJo7SrU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.67.0 h1:lYaaLa+x3VVUhtosaK9xihwQ9H9KRa557REHwwZ2orM= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211016002631-37fc39342514/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00 h1:zmf8Yq9j+IyTpps+paSkmHkSu5fJlRKy69LxRzc17Q0= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.0.0-20180904230853-4e7be11eab3f/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= +k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/apimachinery v0.0.0-20180904193909-def12e63c512/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.17.4/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= +k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/client-go v0.0.0-20180910083459-2cefa64ff137/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/client-go v0.17.4/go.mod h1:ouF6o5pz3is8qU0/qYL2RnoxOPqgfuidYLowytyLJmc= +k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/editorconfig v0.2.0/go.mod h1:lvnnD3BNdBYkhq+B4uBuFFKatfp02eB6HixDvEz91C0= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/sh/v3 v3.4.3/go.mod h1:p/tqPPI4Epfk2rICAe2RoaNd8HBSJ8t9Y2DA9yQlbzY= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/main.go b/main.go index 485f017a..ca10c89e 100644 --- a/main.go +++ b/main.go @@ -1,4 +1,4 @@ -// Copyright 2022 Security Scorecard Authors +// Copyright OpenSSF Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,392 +11,20 @@ // 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 main import ( - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "os/exec" - "strconv" - "strings" -) - -var ( - errInputResultFileNotSet = errors.New("INPUT_RESULTS_FILE is not set") - errInputResultFileEmpty = errors.New("INPUT_RESULTS_FILE is empty") - errInputResultFormatNotSet = errors.New("INPUT_RESULTS_FORMAT is not set") - errInputResultFormatEmtpy = errors.New("INPUT_RESULTS_FORMAT is empty") - errInputPublishResultsNotSet = errors.New("INPUT_PUBLISH_RESULTS is not set") - errInputPublishResultsEmpty = errors.New("INPUT_PUBLISH_RESULTS is empty") - errRequiredENVNotSet = errors.New("required environment variables are not set") - errGitHubEventPath = errors.New("error getting GITHUB_EVENT_PATH") - errGitHubEventPathEmpty = errors.New("GITHUB_EVENT_PATH is empty") - errGitHubEventPathNotSet = errors.New("GITHUB_EVENT_PATH is not set") - errEmptyDefaultBranch = errors.New("default branch is empty") - errEmptyGitHubAuthToken = errors.New("repo_token variable is empty") - errOnlyDefaultBranchSupported = errors.New("only default branch is supported") - errEmptyScorecardBin = errors.New("scorecard_bin variable is empty") - enabledChecks = "" - scorecardPrivateRepository = "" - scorecardDefaultBranch = "" - scorecardPublishResults = "" - scorecardResultsFormat = "" - scorecardResultsFile = "" + "github.com/ossf/scorecard-action/entrypoint" + "github.com/ossf/scorecard-action/options" ) -type repositoryInformation struct { - DefaultBranch string `json:"default_branch"` - Private bool `json:"private"` -} +var opts = &options.Options{} -const ( - enableSarif = "ENABLE_SARIF" - enableLicense = "ENABLE_LICENSE" - enableDangerousWorkflow = "ENABLE_DANGEROUS_WORKFLOW" - githubEventPath = "GITHUB_EVENT_PATH" - githubEventName = "GITHUB_EVENT_NAME" - githubRepository = "GITHUB_REPOSITORY" - githubRef = "GITHUB_REF" - githubWorkspace = "GITHUB_WORKSPACE" - //nolint:gosec - githubAuthToken = "GITHUB_AUTH_TOKEN" - inputresultsfile = "INPUT_RESULTS_FILE" - inputresultsformat = "INPUT_RESULTS_FORMAT" - inputpublishresults = "INPUT_PUBLISH_RESULTS" - scorecardBin = "/scorecard" - scorecardPolicyFile = "./policy.yml" - scorecardFork = "SCORECARD_IS_FORK" - sarif = "sarif" -) - -// main is the entrypoint for the action. func main() { - // TODO - This is a port of the entrypoint.sh script. - // This is still a work in progress. - if err := initalizeENVVariables(); err != nil { - panic(err) - } - if err := checkIfRequiredENVSet(); err != nil { - panic(err) - } - - repository := os.Getenv(githubRepository) - token := os.Getenv(githubAuthToken) - - repo, err := getRepositoryInformation(repository, token) - if err != nil { - panic(err) - } - - if err := updateRepositoryInformation(repo.Private, repo.DefaultBranch); err != nil { - panic(err) - } - - if err := updateEnvVariables(); err != nil { - panic(err) - } - - printEnvVariables(os.Stdout) - - if err := validate(os.Stderr); err != nil { - panic(err) - } - - // gets the cmd run settings - cmd, err := runScorecardSettings(os.Getenv(githubEventName), - scorecardPolicyFile, scorecardResultsFormat, - scorecardBin, scorecardResultsFile, os.Getenv(githubRepository)) + err := entrypoint.Run(opts) if err != nil { + // TODO: Don't panic! panic(err) } - cmd.Dir = os.Getenv(githubWorkspace) - if err := cmd.Run(); err != nil { - panic(err) - } - - results, err := ioutil.ReadFile(scorecardResultsFile) - if err != nil { - panic(err) - } - - fmt.Println(string(results)) -} - -// initalizeENVVariables is a function to initialize the environment variables required for the action. -//nolint -func initalizeENVVariables() error { - /* - https://docs.github.com/en/actions/learn-github-actions/environment-variables - GITHUB_EVENT_PATH contains the json file for the event. - GITHUB_SHA contains the commit hash. - GITHUB_WORKSPACE contains the repo folder. - GITHUB_EVENT_NAME contains the event name. - GITHUB_ACTIONS is true in GitHub env. - */ - - envvars := make(map[string]string) - envvars[enableSarif] = "1" - envvars[enableLicense] = "1" - envvars[enableDangerousWorkflow] = "1" - - for key, val := range envvars { - if err := os.Setenv(key, val); err != nil { - return fmt.Errorf("error setting %s: %w", key, err) - } - } - - if result, exists := os.LookupEnv(inputresultsfile); !exists { - return errInputResultFileNotSet - } else { - if result == "" { - return errInputResultFileEmpty - } - scorecardResultsFile = result - } - - if result, exists := os.LookupEnv(inputresultsformat); !exists { - return errInputResultFormatNotSet - } else { - if result == "" { - return errInputResultFormatEmtpy - } - scorecardResultsFormat = result - } - - if result, exists := os.LookupEnv(inputpublishresults); !exists { - return errInputPublishResultsNotSet - } else { - if result == "" { - return errInputPublishResultsEmpty - } - scorecardPublishResults = result - } - - return gitHubEventPath() -} - -// gitHubEventPath is a function to get the path to the GitHub event -// and sets the SCORECARD_IS_FORK environment variable. -func gitHubEventPath() error { - var result string - var exists bool - - if result, exists = os.LookupEnv(githubEventPath); !exists { - return errGitHubEventPathNotSet - } - - if result == "" { - return errGitHubEventPathEmpty - } - - data, err := ioutil.ReadFile(result) - if err != nil { - return fmt.Errorf("error reading %s: %w", githubEventPath, err) - } - var isFork bool - - if isFork, err = scorecardIsFork(string(data)); err != nil { - return fmt.Errorf("error checking if scorecard is a fork: %w", err) - } - - if isFork { - if err := os.Setenv(scorecardFork, "true"); err != nil { - return fmt.Errorf("error setting %s: %w", scorecardFork, err) - } - } else { - if err := os.Setenv(scorecardFork, "false"); err != nil { - return fmt.Errorf("error setting %s: %w", scorecardFork, err) - } - } - - return nil -} - -// scorecardIsFork is a function to check if the current repo is a fork. -func scorecardIsFork(ghEventPath string) (bool, error) { - if ghEventPath == "" { - return false, errGitHubEventPath - } - /* - https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#github_repository_is_fork - GITHUB_REPOSITORY_IS_FORK is true if the repository is a fork. - */ - type repo struct { - Repository struct { - Fork bool `json:"fork"` - } `json:"repository"` - } - var r repo - if err := json.Unmarshal([]byte(ghEventPath), &r); err != nil { - return false, fmt.Errorf("error unmarshalling ghEventPath: %w", err) - } - - return r.Repository.Fork, nil -} - -// checkIfRequiredENVSet is a function to check if the required environment variables are set. -func checkIfRequiredENVSet() error { - envVariables := make(map[string]bool) - envVariables[githubRepository] = true - envVariables[githubAuthToken] = true - - for key := range envVariables { - if _, exists := os.LookupEnv(key); !exists { - return errRequiredENVNotSet - } - } - return nil -} - -// getRepositoryInformation is a function to get the repository information. -// It is decided to not use the golang GitHub library because of the -// dependency on the github.com/google/go-github/github library -// which will in turn require other dependencies. -func getRepositoryInformation(name, githubauthToken string) (repositoryInformation, error) { - //nolint - req, err := http.NewRequest("GET", fmt.Sprintf("https://api.github.com/repos/%s", name), nil) - if err != nil { - return repositoryInformation{}, fmt.Errorf("error creating request: %w", err) - } - req.Header.Set("Authorization", githubauthToken) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return repositoryInformation{}, fmt.Errorf("error creating request: %w", err) - } - defer resp.Body.Close() - if err != nil { - return repositoryInformation{}, fmt.Errorf("error reading response body: %w", err) - } - var r repositoryInformation - err = json.NewDecoder(resp.Body).Decode(&r) - if err != nil { - return repositoryInformation{}, fmt.Errorf("error decoding response body: %w", err) - } - return r, nil -} - -// updateRepositoryInformation is a function to update the repository information into ENV variables. -func updateRepositoryInformation(privateRepo bool, defaultBranch string) error { - if defaultBranch == "" { - return errEmptyDefaultBranch - } - - scorecardPrivateRepository = strconv.FormatBool(privateRepo) - scorecardDefaultBranch = fmt.Sprintf("refs/heads/%s", defaultBranch) - - return nil -} - -// updateEnvVariables is a function to update the ENV variables based on results format and private repository. -func updateEnvVariables() error { - isPrivateRepo := scorecardPrivateRepository - if isPrivateRepo != "true" { - scorecardPublishResults = "false" - } - return nil -} - -// printEnvVariables is a function to print the ENV variables. -func printEnvVariables(writer io.Writer) { - fmt.Fprintf(writer, "GITHUB_EVENT_PATH=%s\n", os.Getenv(githubEventPath)) - fmt.Fprintf(writer, "GITHUB_EVENT_NAME=%s\n", os.Getenv(githubEventName)) - fmt.Fprintf(writer, "GITHUB_REPOSITORY=%s\n", os.Getenv(githubRepository)) - fmt.Fprintf(writer, "SCORECARD_IS_FORK=%s\n", os.Getenv(scorecardFork)) - fmt.Fprintf(writer, "Ref=%s\n", os.Getenv(githubRef)) -} - -// validate is a function to validate the scorecard configuration based on the environment variables. -func validate(writer io.Writer) error { - if os.Getenv(githubAuthToken) == "" { - fmt.Fprintf(writer, "The 'repo_token' variable is empty.\n") - if os.Getenv(scorecardFork) == "true" { - fmt.Fprintf(writer, "We have detected you are running on a fork.\n") - } - //nolint:lll - fmt.Fprintf(writer, - "Please follow the instructions at https://github.com/ossf/scorecard-action#authentication to create the read-only PAT token.\n") - return errEmptyGitHubAuthToken - } - if strings.Contains(os.Getenv(githubEventName), "pull_request") && - os.Getenv(githubRef) == scorecardDefaultBranch { - fmt.Fprintf(writer, "%s not supported with %s event.\n", os.Getenv(githubRef), os.Getenv(githubEventName)) - fmt.Fprintf(writer, "Only the default branch %s is supported.\n", scorecardDefaultBranch) - return errOnlyDefaultBranchSupported - } - return nil -} - -func runScorecardSettings(githubEventName, scorecardPolicyFile, scorecardResultsFormat, scorecardBin, - scorecardResultsFile, githubRepository string) (*exec.Cmd, error) { - if scorecardBin == "" { - return nil, errEmptyScorecardBin - } - var result exec.Cmd - result.Path = scorecardBin - // if pull_request - if strings.Contains(githubEventName, "pull_request") { - // empty policy file - if scorecardPolicyFile == "" { - result.Args = []string{ - "--local", - ".", - "--format", - scorecardResultsFormat, - "--show-details", - ">", - scorecardResultsFile, - } - return &result, nil - } - result.Args = []string{ - "--local", - ".", - "--format", - scorecardResultsFormat, - "--policy", - scorecardPolicyFile, - "--show-details", - ">", - scorecardResultsFile, - } - return &result, nil - } - - enabledChecks = "" - if githubEventName == "branch_protection_rule" { - enabledChecks = "--checks Branch-Protection" - } - - if scorecardPolicyFile == "" { - result.Args = []string{ - "--repo", - githubRepository, - "--format", - enabledChecks, - scorecardResultsFormat, - "--show-details", - ">", - scorecardResultsFile, - } - return &result, nil - } - result.Args = []string{ - "--repo", - githubRepository, - "--format", - enabledChecks, - scorecardResultsFormat, - "--policy", - scorecardPolicyFile, - "--show-details", - ">", - scorecardResultsFile, - } - return &result, nil } diff --git a/main_test.go b/main_test.go deleted file mode 100644 index cd5deea1..00000000 --- a/main_test.go +++ /dev/null @@ -1,715 +0,0 @@ -// Copyright 2022 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 main - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "os/exec" - "strconv" - "testing" - - "github.com/google/go-cmp/cmp" -) - -//not setting t.Parallel() here because we are mutating the env variables -//nolint -func Test_scorecardIsFork(t *testing.T) { - type args struct { - ghEventPath string - } - tests := []struct { - name string - args args - want bool - wantErr bool - }{ - { - name: "No event data", - want: false, - wantErr: true, - }, - { - name: "Fork event", - args: args{ - ghEventPath: "./testdata/fork.json", - }, - want: true, - wantErr: false, - }, - { - name: "Non fork event", - args: args{ - ghEventPath: "./testdata/non-fork.json", - }, - want: false, - wantErr: false, - }, - { - name: "incorrect event", - args: args{ - ghEventPath: "./testdata/incorrect.json", - }, - want: false, - wantErr: true, - }, - } - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - var data []byte - var err error - if tt.args.ghEventPath != "" { - data, err = ioutil.ReadFile(tt.args.ghEventPath) - if err != nil { - t.Errorf("Failed to open test data: %v", err) - } - } - - got, err := scorecardIsFork(string(data)) - if (err != nil) != tt.wantErr { - t.Errorf("%v", err) - t.Errorf("scorecardIsFork() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("scorecardIsFork() = %v, want %v", got, tt.want) - } - }) - } -} - -//not setting t.Parallel() here because we are mutating the env variables -//nolint -func Test_initalizeENVVariables(t *testing.T) { - //nolint - tests := []struct { - name string - wantErr bool - inputresultsfileSet bool - inputresultsfile string - inputresultsFormatSet bool - inputresultsFormat string - inputPublishResultsSet bool - inputPublishResults string - githubEventPathSet bool - githubEventPath string - }{ - { - name: "Success", - wantErr: false, - inputresultsfileSet: true, - inputresultsfile: "./testdata/results.json", - inputresultsFormatSet: true, - inputresultsFormat: "json", - inputPublishResultsSet: true, - inputPublishResults: "true", - githubEventPathSet: true, - githubEventPath: "./testdata/fork.json", - }, - { - name: "Success - no results file", - wantErr: true, - inputresultsfileSet: false, - inputresultsfile: "", - inputresultsFormatSet: true, - inputresultsFormat: "json", - inputPublishResultsSet: true, - inputPublishResults: "true", - githubEventPathSet: true, - githubEventPath: "./testdata/fork.json", - }, - { - name: "Success - no results format", - wantErr: true, - inputresultsfileSet: true, - inputresultsfile: "./testdata/results.json", - inputresultsFormatSet: false, - inputresultsFormat: "", - inputPublishResultsSet: true, - inputPublishResults: "true", - githubEventPathSet: true, - githubEventPath: "./testdata/fork.json", - }, - { - name: "Success - no publish results", - wantErr: true, - inputresultsfileSet: true, - inputresultsfile: "./testdata/results.json", - inputresultsFormatSet: true, - inputresultsFormat: "json", - inputPublishResultsSet: false, - inputPublishResults: "", - githubEventPathSet: true, - githubEventPath: "./testdata/fork.json", - }, - { - name: "Success - no github event path", - wantErr: true, - inputresultsfileSet: true, - inputresultsfile: "./testdata/results.json", - inputresultsFormatSet: true, - inputresultsFormat: "json", - inputPublishResultsSet: true, - inputPublishResults: "true", - githubEventPathSet: false, - githubEventPath: "./testdata/fork.json", - }, - } - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - if tt.inputresultsfileSet { - defer os.Unsetenv(inputpublishresults) - os.Setenv(inputresultsfile, tt.inputresultsfile) - } else { - os.Unsetenv(inputresultsfile) - } - if tt.inputresultsFormatSet { - defer os.Unsetenv(inputresultsformat) - os.Setenv(inputresultsformat, tt.inputresultsFormat) - } else { - os.Unsetenv(inputresultsformat) - } - if tt.inputPublishResultsSet { - defer os.Unsetenv(inputpublishresults) - os.Setenv(inputpublishresults, tt.inputPublishResults) - } else { - os.Unsetenv(inputpublishresults) - } - if tt.githubEventPathSet { - defer os.Unsetenv(githubEventPath) - os.Setenv(githubEventPath, tt.githubEventPath) - } else { - os.Unsetenv(githubEventPath) - } - if err := initalizeENVVariables(); (err != nil) != tt.wantErr { - t.Errorf("initalizeENVVariables() error = %v, wantErr %v %v", err, tt.wantErr, t.Name()) - } - - envvars := make(map[string]string) - envvars[enableSarif] = "1" - envvars[enableLicense] = "1" - envvars[enableDangerousWorkflow] = "1" - - for k, v := range envvars { - if os.Getenv(k) != v { - t.Errorf("%s env var not set correctly %s", k, v) - } - } - }) - } -} - -//not setting t.Parallel() here because we are mutating the env variables -//nolint -func Test_updateEnvVariables(t *testing.T) { - tests := []struct { - name string - outputResultsFormat string - isPrivateRepo bool - wantErr bool - }{ - { - name: "Success - private repo", - outputResultsFormat: "json", - isPrivateRepo: true, - wantErr: false, - }, - { - name: "Success - private repo - sarif", - outputResultsFormat: "sarif", - isPrivateRepo: true, - wantErr: false, - }, - } - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - if err := updateEnvVariables(); (err != nil) != tt.wantErr { - t.Errorf("updateEnvVariables() error = %v, wantErr %v", err, tt.wantErr) - } - if !tt.wantErr && tt.isPrivateRepo { - if scorecardPublishResults != "false" { - t.Errorf("scorecardPublishResults env var should be false") - } - } - - if !tt.wantErr && tt.outputResultsFormat == sarif { - if _, ok := os.LookupEnv(scorecardPolicyFile); ok { - t.Errorf("enableSarif env var should not be set") - } - } - }) - } -} - -//not setting t.Parallel() here because we are mutating the env variables -//nolint -func Test_updateRepoistoryInformation(t *testing.T) { - type args struct { - defaultBranch string - privateRepo bool - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Success - private repo", - args: args{ - defaultBranch: "master", - privateRepo: true, - }, - wantErr: false, - }, - { - name: "Success - public repo", - args: args{ - defaultBranch: "master", - privateRepo: false, - }, - wantErr: false, - }, - { - name: "Success - public repo - no default branch", - args: args{ - defaultBranch: "", - privateRepo: false, - }, - wantErr: true, - }, - } - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - if err := updateRepositoryInformation(tt.args.privateRepo, tt.args.defaultBranch); (err != nil) != tt.wantErr { - t.Errorf("updateRepoistoryInformation() error = %v, wantErr %v", err, tt.wantErr) - } - if tt.args.privateRepo { - if scorecardPrivateRepository != strconv.FormatBool(tt.args.privateRepo) { - t.Errorf("scorecardPublishResults env var should be false") - } - } - if tt.args.defaultBranch != "" { - if scorecardDefaultBranch != fmt.Sprintf("refs/heads/%s", tt.args.defaultBranch) { - t.Errorf("scorecardDefaultBranch env var should be %s", tt.args.defaultBranch) - } - } - }) - } -} - -//not setting t.Parallel() here because we are mutating the env variables -//nolint -func Test_checkIfRequiredENVSet(t *testing.T) { - tests := []struct { - name string - wantErr bool - }{ - { - name: "Success - all required env vars set", - wantErr: false, - }, - } - for _, tt := range tests { - tt := tt - envVariables := make(map[string]bool) - envVariables[githubRepository] = true - envVariables[githubAuthToken] = true - t.Run(tt.name, func(t *testing.T) { - if !tt.wantErr { - for k := range envVariables { - defer os.Unsetenv(k) - if err := os.Setenv(k, "true"); err != nil { - t.Errorf("failed to set env var %s", k) - } - } - } - if err := checkIfRequiredENVSet(); (err != nil) != tt.wantErr { - t.Errorf("checkIfRequiredENVSet() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -//nolint -func Test_gitHubEventPath(t *testing.T) { - tests := []struct { - name string - wantErr bool - shouldgitHubEventPathBeSet bool - gitHubEventPath string - }{ - { - name: "Success - gitHubEventPath set", - wantErr: false, - shouldgitHubEventPathBeSet: true, - gitHubEventPath: "./testdata/fork.json", - }, - { - name: "Success - gitHubEventPath not set", - wantErr: true, - shouldgitHubEventPathBeSet: false, - gitHubEventPath: "", - }, - { - name: "Success - gitHubEventPath is empty", - wantErr: true, - shouldgitHubEventPathBeSet: true, - gitHubEventPath: "", - }, - { - name: "Failure non-existent file", - wantErr: true, - shouldgitHubEventPathBeSet: true, - gitHubEventPath: "./foo.bar.json", - }, - { - name: "Failure non-existent file", - wantErr: true, - shouldgitHubEventPathBeSet: true, - gitHubEventPath: "./testdata/incorrect.json", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if tt.shouldgitHubEventPathBeSet { - if err := os.Setenv(githubEventPath, tt.gitHubEventPath); err != nil { - t.Errorf("failed to set env var %s", githubEventPath) - } - defer os.Unsetenv(githubEventPath) - } - if err := gitHubEventPath(); (err != nil) != tt.wantErr { - t.Errorf("gitHubEventPath() error = %v, wantErr %v %v", err, tt.wantErr, tt.name) - } - }) - } -} - -// The reason we are not using t.Parallel() here is because we are mutating the env variables -//nolint -func Test_validate(t *testing.T) { - //nolint - tests := []struct { - name string - wantWriter string - wantErr bool - authToken string - scorecardFork bool - gitHubEventName string - ref string - scorecardDefaultBranch string - }{ - - { - name: "scorecardFork set and failure", - wantErr: true, - authToken: "", - scorecardFork: true, - gitHubEventName: "", - ref: "", - scorecardDefaultBranch: "", - }, - { - name: "Success - scorecardFork set", - wantErr: false, - authToken: "token", - scorecardFork: false, - gitHubEventName: "", - ref: "", - scorecardDefaultBranch: "", - }, - { - name: "Success - scorecardFork set", - wantErr: true, - authToken: "token", - scorecardFork: true, - gitHubEventName: "pull_request", - ref: "main", - scorecardDefaultBranch: "main", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - writer := &bytes.Buffer{} - if err := os.Setenv(scorecardFork, strconv.FormatBool(tt.scorecardFork)); err != nil { - t.Errorf("failed to set env var %s", scorecardFork) - } - defer os.Unsetenv(scorecardFork) - if tt.gitHubEventName != "" { - if err := os.Setenv(githubEventName, tt.gitHubEventName); err != nil { - t.Errorf("failed to set env var %s", githubEventName) - } - defer os.Unsetenv(githubEventName) - } - if tt.ref != "" { - if err := os.Setenv(githubRef, tt.ref); err != nil { - t.Errorf("failed to set env var %s", githubRef) - } - defer os.Unsetenv(githubRef) - } - if tt.scorecardDefaultBranch != "" { - scorecardDefaultBranch = tt.scorecardDefaultBranch - } - if tt.authToken != "" { - if err := os.Setenv(githubAuthToken, tt.authToken); err != nil { - t.Errorf("failed to set env var %s", githubAuthToken) - } - defer os.Unsetenv(githubAuthToken) - } - if err := validate(writer); (err != nil) != tt.wantErr { - t.Errorf("validate() error = %v, wantErr %v", err, tt.wantErr) - return - } - }) - } -} - -func Test_runScorecardSettings(t *testing.T) { - t.Parallel() - type args struct { - githubEventName string - scorecardPolicyFile string - scorecardResultsFormat string - scorecardBin string - scorecardResultsFile string - githubRepository string - } - //nolint - tests := []struct { - wantErr bool - name string - args args - want *exec.Cmd - }{ - { - name: "Success - scorecardFork set", - args: args{ - githubEventName: "pull_request", - scorecardPolicyFile: "./testdata/scorecard.yaml", - scorecardResultsFormat: "json", - scorecardBin: "scorecard", - scorecardResultsFile: "./testdata/scorecard.json", - githubRepository: "foo/bar", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--policy", - "./testdata/scorecard.yaml", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - scorecardFork set", - args: args{ - githubEventName: "pull_request", - scorecardPolicyFile: "./testdata/scorecard.yaml", - scorecardResultsFormat: "json", - scorecardBin: "scorecard", - scorecardResultsFile: "./testdata/scorecard.json", - githubRepository: "foo/bar", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--policy", - "./testdata/scorecard.yaml", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - scorecardFork set", - args: args{ - githubEventName: "pull_request", - scorecardPolicyFile: "./testdata/scorecard.yaml", - scorecardResultsFormat: "json", - scorecardBin: "scorecard", - scorecardResultsFile: "./testdata/scorecard.json", - githubRepository: "foo/bar", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--policy", - "./testdata/scorecard.yaml", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - scorecardFork set", - args: args{ - githubEventName: "pull_request", - scorecardResultsFormat: "json", - scorecardBin: "scorecard", - scorecardResultsFile: "./testdata/scorecard.json", - githubRepository: "foo/bar", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - scorecardFork set", - args: args{ - githubEventName: "pull_request", - scorecardResultsFormat: "json", - scorecardBin: "scorecard", - scorecardResultsFile: "./testdata/scorecard.json", - githubRepository: "foo/bar", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - scorecardFork set", - args: args{ - scorecardResultsFormat: "json", - scorecardBin: "scorecard", - scorecardResultsFile: "./testdata/scorecard.json", - githubRepository: "foo/bar", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - Branch protection rule", - args: args{ - githubEventName: "branch_protection_rule", - scorecardResultsFormat: "json", - scorecardBin: "scorecard", - scorecardResultsFile: "./testdata/scorecard.json", - githubRepository: "foo/bar", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - Branch protection rule", - args: args{ - scorecardPolicyFile: "./testdata/scorecard.yaml", - githubEventName: "branch_protection_rule", - scorecardResultsFormat: "json", - scorecardBin: "scorecard", - scorecardResultsFile: "./testdata/scorecard.json", - githubRepository: "foo/bar", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--policy", - "./testdata/scorecard.yaml", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Want error - Branch protection rule", - args: args{ - githubEventName: "", - scorecardResultsFormat: "", - scorecardBin: "", - scorecardResultsFile: "", - githubRepository: "", - }, - wantErr: true, - }, - } - - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - got, err := runScorecardSettings(tt.args.githubEventName, tt.args.scorecardPolicyFile, - tt.args.scorecardResultsFormat, tt.args.scorecardBin, tt.args.scorecardResultsFile, tt.args.githubRepository) - if (err != nil) != tt.wantErr { - t.Errorf("runScorecardSettings() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !tt.wantErr && cmp.Equal(got.Args, tt.want.Args) { - t.Errorf("runScorecardSettings() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/options/options.go b/options/options.go new file mode 100644 index 00000000..4dbc1509 --- /dev/null +++ b/options/options.go @@ -0,0 +1,277 @@ +// Copyright OpenSSF 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 options + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "strconv" + "strings" + + "github.com/ossf/scorecard-action/env" + scopts "github.com/ossf/scorecard/v4/options" +) + +var ( + // Errors. + errDefaultBranchEmpty = errors.New("default branch is empty") + errOnlyDefaultBranchSupported = errors.New("only default branch is supported") + + trueStr = "true" +) + +// Options TODO(lint): should have comment or be unexported (revive). +type Options struct { + ScorecardOpts *scopts.Options + GithubEventName string + ScorecardBin string + DefaultBranch string + + // TODO(options): This may be better as a bool + PrivateRepo string + // TODO(options): This may be better as a bool + PublishResults string + + ResultsFile string +} + +const ( + defaultScorecardBin = "/scorecard" + defaultScorecardPolicyFile = "./policy.yml" +) + +// New TODO(lint): should have comment or be unexported (revive). +func New() *Options { + scOpts := scopts.New() + scOpts.PolicyFile = defaultScorecardPolicyFile + + // TODO: Populate options constructor + opts := &Options{ + ScorecardOpts: scOpts, + ScorecardBin: defaultScorecardBin, + } + + return opts +} + +// Initialize initializes the environment variables required for the action. +func (o *Options) Initialize() error { + /* + https://docs.github.com/en/actions/learn-github-actions/environment-variables + GITHUB_EVENT_PATH contains the json file for the event. + GITHUB_SHA contains the commit hash. + GITHUB_WORKSPACE contains the repo folder. + GITHUB_EVENT_NAME contains the event name. + GITHUB_ACTIONS is true in GitHub env. + */ + + envvars := make(map[string]string) + envvars[env.EnableSarif] = "1" + envvars[env.EnableLicense] = "1" + envvars[env.EnableDangerousWorkflow] = "1" + + for key, val := range envvars { + if err := os.Setenv(key, val); err != nil { + return fmt.Errorf("error setting %s: %w", key, err) + } + } + + err := setFromEnvVarStrict(&o.ResultsFile, env.InputResultsFile) + if err != nil { + return fmt.Errorf("setting %s: %w", o.ResultsFile, err) + } + + err = setFromEnvVarStrict(&o.ScorecardOpts.Format, env.InputResultsFormat) + if err != nil { + return fmt.Errorf("setting %s: %w", o.ScorecardOpts.Format, err) + } + + err = setFromEnvVarStrict(&o.PrivateRepo, env.ScorecardPrivateRepo) + if err != nil { + return fmt.Errorf("setting %s: %w", o.PrivateRepo, err) + } + + err = setFromEnvVarStrict(&o.PublishResults, env.InputPublishResults) + if err != nil { + return fmt.Errorf("setting %s: %w", o.PublishResults, err) + } + + return GithubEventPath() +} + +// Validate validates the scorecard configuration. +func (o *Options) Validate(writer io.Writer) error { + if os.Getenv(env.GithubAuthToken) == "" { + fmt.Fprintf(writer, "The 'repo_token' variable is empty.\n") + if os.Getenv(env.ScorecardFork) == trueStr { + fmt.Fprintf(writer, "We have detected you are running on a fork.\n") + } + + fmt.Fprintf( + writer, + "Please follow the instructions at https://github.com/ossf/scorecard-action#authentication to create the read-only PAT token.\n", //nolint:lll + ) + + return env.ErrEmptyGitHubAuthToken + } + + if strings.Contains(os.Getenv(env.GithubEventName), "pull_request") && + os.Getenv(env.GithubRef) == o.DefaultBranch { + fmt.Fprintf(writer, "%s not supported with %s event.\n", os.Getenv(env.GithubRef), os.Getenv(env.GithubEventName)) + fmt.Fprintf(writer, "Only the default branch %s is supported.\n", o.DefaultBranch) + + return errOnlyDefaultBranchSupported + } + + return nil +} + +// CheckRequired TODO(lint): should have comment or be unexported (revive). +func (o *Options) CheckRequired() error { + err := env.CheckRequired() + if err != nil { + return fmt.Errorf("checking if required env vars are set: %w", err) + } + + return nil +} + +// Print is a function to print options. +func (o *Options) Print(writer io.Writer) { + env.Print(writer) +} + +// SetRepository TODO(lint): should have comment or be unexported (revive). +func (o *Options) SetRepository() { + o.ScorecardOpts.Repo = os.Getenv(env.GithubRepository) +} + +// Repo TODO(lint): should have comment or be unexported (revive). +func (o *Options) Repo() string { + return o.ScorecardOpts.Repo +} + +// SetRepoVisibility sets the repository's visibility. +func (o *Options) SetRepoVisibility(privateRepo bool) { + o.PrivateRepo = strconv.FormatBool(privateRepo) +} + +// SetDefaultBranch sets the default branch. +func (o *Options) SetDefaultBranch(defaultBranch string) error { + if defaultBranch == "" { + return errDefaultBranchEmpty + } + + o.DefaultBranch = fmt.Sprintf("refs/heads/%s", defaultBranch) + return nil +} + +// SetPublishResults sets whether results should be published based on a +// repository's visibility. +func (o *Options) SetPublishResults() { + isPrivateRepo := o.PrivateRepo + if isPrivateRepo == trueStr || isPrivateRepo == "" { + o.PublishResults = "false" + } else { + o.PublishResults = trueStr + } +} + +// GetGithubToken retrieves the GitHub auth token from the environment. +func GetGithubToken() string { + return os.Getenv(env.GithubAuthToken) +} + +// GetGithubWorkspace retrieves the GitHub auth token from the environment. +func GetGithubWorkspace() string { + return os.Getenv(env.GithubWorkspace) +} + +// GithubEventPath gets the path to the GitHub event and sets the +// SCORECARD_IS_FORK environment variable. +// TODO(options): Check if this actually needs to be exported. +func GithubEventPath() error { + var result string + var exists bool + + if result, exists = os.LookupEnv(env.GithubEventPath); !exists { + return env.ErrGitHubEventPathNotSet + } + + if result == "" { + return env.ErrGitHubEventPathEmpty + } + + data, err := ioutil.ReadFile(result) + if err != nil { + return fmt.Errorf("error reading %s: %w", env.GithubEventPath, err) + } + + isFork, err := RepoIsFork(string(data)) + if err != nil { + return fmt.Errorf("error checking if scorecard is a fork: %w", err) + } + + isForkStr := strconv.FormatBool(isFork) + if err := os.Setenv(env.ScorecardFork, isForkStr); err != nil { + return fmt.Errorf("error setting %s: %w", env.ScorecardFork, err) + } + + return err +} + +// RepoIsFork checks if the current repo is a fork. +func RepoIsFork(ghEventPath string) (bool, error) { + if ghEventPath == "" { + return false, env.ErrGitHubEventPath + } + /* + https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#github_repository_is_fork + GITHUB_REPOSITORY_IS_FORK is true if the repository is a fork. + */ + type repo struct { + Repository struct { + Fork bool `json:"fork"` + } `json:"repository"` + } + var r repo + if err := json.Unmarshal([]byte(ghEventPath), &r); err != nil { + return false, fmt.Errorf("error unmarshalling ghEventPath: %w", err) + } + + return r.Repository.Fork, nil +} + +// setFromEnvVarStrict TODO(lint): should have comment or be unexported (revive). +func setFromEnvVarStrict(option *string, envVar string) error { + return setFromEnvVar(option, envVar, "", true, true) +} + +// TODO(env): Refactor +// - Convert to method +// - Only fail if both the config value and env var is empty. +func setFromEnvVar(option *string, envVar, def string, mustExist, mustNotBeEmpty bool) error { + value, err := env.Lookup(envVar, def, mustExist, mustNotBeEmpty) + if err != nil { + return fmt.Errorf("setting value for option %s: %w", *option, err) + } + + *option = value + return nil +} diff --git a/options/options_test.go b/options/options_test.go new file mode 100644 index 00000000..24d5b0a7 --- /dev/null +++ b/options/options_test.go @@ -0,0 +1,123 @@ +// Copyright OpenSSF 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 options + +import ( + "os" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + + "github.com/ossf/scorecard-action/env" + scopts "github.com/ossf/scorecard/v4/options" +) + +//nolint:paralleltest // Until/unless we consider providing a fake environment +// to tests, running these in parallel will have unpredictable results as +// we're mutating environment variables. +func TestNew(t *testing.T) { + tests := []struct { + want *Options + name string + }{ + { + name: "Success", + want: &Options{ + ScorecardOpts: &scopts.Options{ + PolicyFile: defaultScorecardPolicyFile, + }, + ScorecardBin: defaultScorecardBin, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := New(); !cmp.Equal(got, tt.want) { + t.Errorf("New() = %v, want %v: %v", got, tt.want, cmp.Diff(got, tt.want)) + } + }) + } +} + +//nolint:paralleltest // Until/unless we consider providing a fake environment +// to tests, running these in parallel will have unpredictable results as +// we're mutating environment variables. +func TestOptionsInitialize(t *testing.T) { + type fields struct { + ScorecardOpts *scopts.Options + GithubEventName string + ScorecardBin string + DefaultBranch string + PrivateRepo string + PublishResults string + ResultsFile string + } + tests := []struct { + name string + fields fields + wantErr bool + setEnvResultsFile bool + setEnvResultsFormat bool + setEnvPrivateRepo bool + setEnvPublishResults bool + isPrivateRepo bool + }{ + { + name: "Success", + fields: fields{ + ScorecardOpts: &scopts.Options{ + PolicyFile: defaultScorecardPolicyFile, + }, + ScorecardBin: defaultScorecardBin, + }, + wantErr: false, + setEnvResultsFile: true, + setEnvResultsFormat: true, + setEnvPrivateRepo: true, + setEnvPublishResults: true, + isPrivateRepo: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.setEnvResultsFile { + os.Setenv(env.InputResultsFile, "results-file") + } + if tt.setEnvResultsFormat { + os.Setenv(env.InputResultsFormat, "sarif") + } + if tt.setEnvPrivateRepo { + os.Setenv(env.ScorecardPrivateRepo, strconv.FormatBool(tt.isPrivateRepo)) + } + if tt.setEnvPublishResults { + os.Setenv(env.InputPublishResults, strconv.FormatBool(!tt.isPrivateRepo)) + } + + o := &Options{ + ScorecardOpts: tt.fields.ScorecardOpts, + GithubEventName: tt.fields.GithubEventName, + ScorecardBin: tt.fields.ScorecardBin, + DefaultBranch: tt.fields.DefaultBranch, + PrivateRepo: tt.fields.PrivateRepo, + PublishResults: tt.fields.PublishResults, + ResultsFile: tt.fields.ResultsFile, + } + if err := o.Initialize(); (err != nil) != tt.wantErr { + t.Errorf("Options.Initialize() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/testdata/fork.json b/options/testdata/fork.json similarity index 100% rename from testdata/fork.json rename to options/testdata/fork.json diff --git a/testdata/incorrect.json b/options/testdata/incorrect.json similarity index 100% rename from testdata/incorrect.json rename to options/testdata/incorrect.json diff --git a/testdata/non-fork.json b/options/testdata/non-fork.json similarity index 100% rename from testdata/non-fork.json rename to options/testdata/non-fork.json From c8e1a44f8aec3a9386d735d21984aa82486bc9aa Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Mon, 28 Feb 2022 17:17:53 -0500 Subject: [PATCH 02/17] options: env var-mapped structs via github.com/caarlos0/env/v6 Signed-off-by: Stephen Augustus --- go.mod | 1 + go.sum | 2 + options/options.go | 163 ++++++++++++++++++++++++++++------------ options/options_test.go | 18 ++--- 4 files changed, 127 insertions(+), 57 deletions(-) diff --git a/go.mod b/go.mod index 5a8db976..aee8fe2d 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/ossf/scorecard-action go 1.17 require ( + github.com/caarlos0/env/v6 v6.9.1 github.com/google/go-cmp v0.5.7 github.com/ossf/scorecard/v4 v4.1.1-0.20220227152949-d71866ca16b4 ) diff --git a/go.sum b/go.sum index 1f659de4..2698fa9d 100644 --- a/go.sum +++ b/go.sum @@ -302,6 +302,8 @@ github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8n github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= +github.com/caarlos0/env/v6 v6.9.1 h1:zOkkjM0F6ltnQ5eBX6IPI41UP/KDGEK7rRPwGCNos8k= +github.com/caarlos0/env/v6 v6.9.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Zu0ddvwc= github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= diff --git a/options/options.go b/options/options.go index 4dbc1509..aafbfbd2 100644 --- a/options/options.go +++ b/options/options.go @@ -24,7 +24,8 @@ import ( "strconv" "strings" - "github.com/ossf/scorecard-action/env" + "github.com/caarlos0/env/v6" + scaenv "github.com/ossf/scorecard-action/env" scopts "github.com/ossf/scorecard/v4/options" ) @@ -38,17 +39,68 @@ var ( // Options TODO(lint): should have comment or be unexported (revive). type Options struct { - ScorecardOpts *scopts.Options - GithubEventName string - ScorecardBin string - DefaultBranch string - + // Scorecard options. + ScorecardOpts *scopts.Options + + // Scorecard command-line options. + ScorecardBin string `env:"SCORECARD_BIN"` + EnabledChecks string `env:"ENABLED_CHECKS"` + PolicyFile string `env:"SCORECARD_POLICY_FILE"` + Format string `env:"SCORECARD_RESULTS_FORMAT"` + ResultsFile string `env:"SCORECARD_RESULTS_FILE"` + // TODO(options): This may be better as a bool + PublishResultsStr string `env:"SCORECARD_PUBLISH_RESULTS"` + + // Input options. + // TODO(options): These input options shadow the some of the SCORECARD_ + // env vars: + // export SCORECARD_RESULTS_FILE="$INPUT_RESULTS_FILE" + // export SCORECARD_RESULTS_FORMAT="$INPUT_RESULTS_FORMAT" + // export SCORECARD_PUBLISH_RESULTS="$INPUT_PUBLISH_RESULTS" + // + // Let's target them for deletion, but only after confirming + // that there isn't anything that surprisingly needs them. + InputResultsFile string `env:"INPUT_RESULTS_FILE"` + InputResultsFormat string `env:"INPUT_RESULTS_FORMAT"` + InputPublishResults string `env:"INPUT_PUBLISH_RESULTS"` + + // Scorecard checks. + EnableSarif string `env:"ENABLE_SARIF"` + EnableLicense string `env:"ENABLE_LICENSE"` + EnableDangerousWorkflow string `env:"ENABLE_DANGEROUS_WORKFLOW"` + + // GitHub options. + // TODO(github): Consider making this a separate options set so we can + // encapsulate handling + GithubAuthToken string `env:"GITHUB_AUTH_TOKEN"` + GithubEventName string `env:"GITHUB_EVENT_NAME"` + GithubEventPath string `env:"GITHUB_EVENT_PATH"` + GithubRef string `env:"GITHUB_REF"` + GithubRepository string `env:"GITHUB_REPOSITORY"` + GithubWorkspace string `env:"GITHUB_WORKSPACE"` + + DefaultBranch string `env:"SCORECARD_DEFAULT_BRANCH"` // TODO(options): This may be better as a bool - PrivateRepo string + IsForkStr string `env:"SCORECARD_IS_FORK"` // TODO(options): This may be better as a bool - PublishResults string + PrivateRepoStr string `env:"SCORECARD_PRIVATE_REPOSITORY"` +} - ResultsFile string +// ScorecardOptions mirrors scorecard/options.Options, which defines common options +// for configuring scorecard. +type ScorecardOptions struct { + Repo string + Local string + Commit string + LogLevel string + Format string + NPM string + PyPI string + RubyGems string + PolicyFile string + ChecksToRun []string + Metadata []string + ShowDetails bool } const ( @@ -57,17 +109,32 @@ const ( ) // New TODO(lint): should have comment or be unexported (revive). -func New() *Options { +func New() (*Options, error) { + opts := &Options{} + tmpScorecardOpts := &ScorecardOptions{} + + if err := env.Parse(opts); err != nil { + return opts, fmt.Errorf("parsing entrypoint env vars: %w", err) + } + if err := env.Parse(tmpScorecardOpts); err != nil { + return opts, fmt.Errorf("parsing scorecard env vars: %w", err) + } + scOpts := scopts.New() - scOpts.PolicyFile = defaultScorecardPolicyFile - // TODO: Populate options constructor - opts := &Options{ - ScorecardOpts: scOpts, - ScorecardBin: defaultScorecardBin, + // TODO(options): Move this set-or-default logic to its own function. + scOpts.PolicyFile = tmpScorecardOpts.PolicyFile + if scOpts.PolicyFile == "" { + scOpts.PolicyFile = defaultScorecardPolicyFile + } + + if opts.ScorecardBin == "" { + opts.ScorecardBin = defaultScorecardBin } - return opts + opts.ScorecardOpts = scOpts + // TODO(options): Consider running Validate() before returning. + return opts, nil } // Initialize initializes the environment variables required for the action. @@ -82,9 +149,9 @@ func (o *Options) Initialize() error { */ envvars := make(map[string]string) - envvars[env.EnableSarif] = "1" - envvars[env.EnableLicense] = "1" - envvars[env.EnableDangerousWorkflow] = "1" + envvars[scaenv.EnableSarif] = "1" + envvars[scaenv.EnableLicense] = "1" + envvars[scaenv.EnableDangerousWorkflow] = "1" for key, val := range envvars { if err := os.Setenv(key, val); err != nil { @@ -92,24 +159,24 @@ func (o *Options) Initialize() error { } } - err := setFromEnvVarStrict(&o.ResultsFile, env.InputResultsFile) + err := setFromEnvVarStrict(&o.ResultsFile, scaenv.InputResultsFile) if err != nil { return fmt.Errorf("setting %s: %w", o.ResultsFile, err) } - err = setFromEnvVarStrict(&o.ScorecardOpts.Format, env.InputResultsFormat) + err = setFromEnvVarStrict(&o.ScorecardOpts.Format, scaenv.InputResultsFormat) if err != nil { return fmt.Errorf("setting %s: %w", o.ScorecardOpts.Format, err) } - err = setFromEnvVarStrict(&o.PrivateRepo, env.ScorecardPrivateRepo) + err = setFromEnvVarStrict(&o.PrivateRepoStr, scaenv.ScorecardPrivateRepo) if err != nil { - return fmt.Errorf("setting %s: %w", o.PrivateRepo, err) + return fmt.Errorf("setting %s: %w", o.PrivateRepoStr, err) } - err = setFromEnvVarStrict(&o.PublishResults, env.InputPublishResults) + err = setFromEnvVarStrict(&o.PublishResultsStr, scaenv.InputPublishResults) if err != nil { - return fmt.Errorf("setting %s: %w", o.PublishResults, err) + return fmt.Errorf("setting %s: %w", o.PublishResultsStr, err) } return GithubEventPath() @@ -117,9 +184,9 @@ func (o *Options) Initialize() error { // Validate validates the scorecard configuration. func (o *Options) Validate(writer io.Writer) error { - if os.Getenv(env.GithubAuthToken) == "" { + if os.Getenv(scaenv.GithubAuthToken) == "" { fmt.Fprintf(writer, "The 'repo_token' variable is empty.\n") - if os.Getenv(env.ScorecardFork) == trueStr { + if os.Getenv(scaenv.ScorecardFork) == trueStr { fmt.Fprintf(writer, "We have detected you are running on a fork.\n") } @@ -128,12 +195,12 @@ func (o *Options) Validate(writer io.Writer) error { "Please follow the instructions at https://github.com/ossf/scorecard-action#authentication to create the read-only PAT token.\n", //nolint:lll ) - return env.ErrEmptyGitHubAuthToken + return scaenv.ErrEmptyGitHubAuthToken } - if strings.Contains(os.Getenv(env.GithubEventName), "pull_request") && - os.Getenv(env.GithubRef) == o.DefaultBranch { - fmt.Fprintf(writer, "%s not supported with %s event.\n", os.Getenv(env.GithubRef), os.Getenv(env.GithubEventName)) + if strings.Contains(os.Getenv(scaenv.GithubEventName), "pull_request") && + os.Getenv(scaenv.GithubRef) == o.DefaultBranch { + fmt.Fprintf(writer, "%s not supported with %s event.\n", os.Getenv(scaenv.GithubRef), os.Getenv(scaenv.GithubEventName)) fmt.Fprintf(writer, "Only the default branch %s is supported.\n", o.DefaultBranch) return errOnlyDefaultBranchSupported @@ -144,7 +211,7 @@ func (o *Options) Validate(writer io.Writer) error { // CheckRequired TODO(lint): should have comment or be unexported (revive). func (o *Options) CheckRequired() error { - err := env.CheckRequired() + err := scaenv.CheckRequired() if err != nil { return fmt.Errorf("checking if required env vars are set: %w", err) } @@ -154,12 +221,12 @@ func (o *Options) CheckRequired() error { // Print is a function to print options. func (o *Options) Print(writer io.Writer) { - env.Print(writer) + scaenv.Print(writer) } // SetRepository TODO(lint): should have comment or be unexported (revive). func (o *Options) SetRepository() { - o.ScorecardOpts.Repo = os.Getenv(env.GithubRepository) + o.ScorecardOpts.Repo = os.Getenv(scaenv.GithubRepository) } // Repo TODO(lint): should have comment or be unexported (revive). @@ -169,7 +236,7 @@ func (o *Options) Repo() string { // SetRepoVisibility sets the repository's visibility. func (o *Options) SetRepoVisibility(privateRepo bool) { - o.PrivateRepo = strconv.FormatBool(privateRepo) + o.PrivateRepoStr = strconv.FormatBool(privateRepo) } // SetDefaultBranch sets the default branch. @@ -185,22 +252,22 @@ func (o *Options) SetDefaultBranch(defaultBranch string) error { // SetPublishResults sets whether results should be published based on a // repository's visibility. func (o *Options) SetPublishResults() { - isPrivateRepo := o.PrivateRepo + isPrivateRepo := o.PrivateRepoStr if isPrivateRepo == trueStr || isPrivateRepo == "" { - o.PublishResults = "false" + o.PublishResultsStr = "false" } else { - o.PublishResults = trueStr + o.PublishResultsStr = trueStr } } // GetGithubToken retrieves the GitHub auth token from the environment. func GetGithubToken() string { - return os.Getenv(env.GithubAuthToken) + return os.Getenv(scaenv.GithubAuthToken) } // GetGithubWorkspace retrieves the GitHub auth token from the environment. func GetGithubWorkspace() string { - return os.Getenv(env.GithubWorkspace) + return os.Getenv(scaenv.GithubWorkspace) } // GithubEventPath gets the path to the GitHub event and sets the @@ -210,17 +277,17 @@ func GithubEventPath() error { var result string var exists bool - if result, exists = os.LookupEnv(env.GithubEventPath); !exists { - return env.ErrGitHubEventPathNotSet + if result, exists = os.LookupEnv(scaenv.GithubEventPath); !exists { + return scaenv.ErrGitHubEventPathNotSet } if result == "" { - return env.ErrGitHubEventPathEmpty + return scaenv.ErrGitHubEventPathEmpty } data, err := ioutil.ReadFile(result) if err != nil { - return fmt.Errorf("error reading %s: %w", env.GithubEventPath, err) + return fmt.Errorf("error reading %s: %w", scaenv.GithubEventPath, err) } isFork, err := RepoIsFork(string(data)) @@ -229,8 +296,8 @@ func GithubEventPath() error { } isForkStr := strconv.FormatBool(isFork) - if err := os.Setenv(env.ScorecardFork, isForkStr); err != nil { - return fmt.Errorf("error setting %s: %w", env.ScorecardFork, err) + if err := os.Setenv(scaenv.ScorecardFork, isForkStr); err != nil { + return fmt.Errorf("error setting %s: %w", scaenv.ScorecardFork, err) } return err @@ -239,7 +306,7 @@ func GithubEventPath() error { // RepoIsFork checks if the current repo is a fork. func RepoIsFork(ghEventPath string) (bool, error) { if ghEventPath == "" { - return false, env.ErrGitHubEventPath + return false, scaenv.ErrGitHubEventPath } /* https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#github_repository_is_fork @@ -267,7 +334,7 @@ func setFromEnvVarStrict(option *string, envVar string) error { // - Convert to method // - Only fail if both the config value and env var is empty. func setFromEnvVar(option *string, envVar, def string, mustExist, mustNotBeEmpty bool) error { - value, err := env.Lookup(envVar, def, mustExist, mustNotBeEmpty) + value, err := scaenv.Lookup(envVar, def, mustExist, mustNotBeEmpty) if err != nil { return fmt.Errorf("setting value for option %s: %w", *option, err) } diff --git a/options/options_test.go b/options/options_test.go index 24d5b0a7..93e6206c 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -19,8 +19,6 @@ import ( "strconv" "testing" - "github.com/google/go-cmp/cmp" - "github.com/ossf/scorecard-action/env" scopts "github.com/ossf/scorecard/v4/options" ) @@ -28,6 +26,7 @@ import ( //nolint:paralleltest // Until/unless we consider providing a fake environment // to tests, running these in parallel will have unpredictable results as // we're mutating environment variables. +/* func TestNew(t *testing.T) { tests := []struct { want *Options @@ -51,6 +50,7 @@ func TestNew(t *testing.T) { }) } } +*/ //nolint:paralleltest // Until/unless we consider providing a fake environment // to tests, running these in parallel will have unpredictable results as @@ -107,13 +107,13 @@ func TestOptionsInitialize(t *testing.T) { } o := &Options{ - ScorecardOpts: tt.fields.ScorecardOpts, - GithubEventName: tt.fields.GithubEventName, - ScorecardBin: tt.fields.ScorecardBin, - DefaultBranch: tt.fields.DefaultBranch, - PrivateRepo: tt.fields.PrivateRepo, - PublishResults: tt.fields.PublishResults, - ResultsFile: tt.fields.ResultsFile, + ScorecardOpts: tt.fields.ScorecardOpts, + GithubEventName: tt.fields.GithubEventName, + ScorecardBin: tt.fields.ScorecardBin, + DefaultBranch: tt.fields.DefaultBranch, + PrivateRepoStr: tt.fields.PrivateRepo, + PublishResultsStr: tt.fields.PublishResults, + ResultsFile: tt.fields.ResultsFile, } if err := o.Initialize(); (err != nil) != tt.wantErr { t.Errorf("Options.Initialize() error = %v, wantErr %v", err, tt.wantErr) From 45104fa6d42a94a54c6cd796b556e5ae91771a84 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Mon, 28 Feb 2022 18:02:03 -0500 Subject: [PATCH 03/17] options: Start deleting extraneous env var logic Signed-off-by: Stephen Augustus --- entrypoint/entrypoint_test.go | 12 ++-- options/options.go | 111 +++++++++++----------------------- options/options_test.go | 6 +- 3 files changed, 44 insertions(+), 85 deletions(-) diff --git a/entrypoint/entrypoint_test.go b/entrypoint/entrypoint_test.go index 57be1e0a..8c6ec8d5 100644 --- a/entrypoint/entrypoint_test.go +++ b/entrypoint/entrypoint_test.go @@ -273,8 +273,8 @@ func TestUpdateEnvVariables(t *testing.T) { tt.opts.SetRepoVisibility(tt.isPrivateRepo) tt.opts.SetPublishResults() if !tt.wantErr && tt.isPrivateRepo { - if tt.opts.PublishResults != "false" { - t.Errorf("scorecardPublishResults env var (%s) should be false", tt.opts.PublishResults) + if tt.opts.PublishResultsStr != "false" { + t.Errorf("scorecardPublishResults env var (%s) should be false", tt.opts.PublishResultsStr) } } @@ -339,7 +339,7 @@ func TestUpdateRepositoryInformation(t *testing.T) { tt.args.opts.SetRepoVisibility(tt.args.privateRepo) if tt.args.privateRepo { - if tt.args.opts.PrivateRepo != strconv.FormatBool(tt.args.privateRepo) { + if tt.args.opts.PrivateRepoStr != strconv.FormatBool(tt.args.privateRepo) { t.Errorf("scorecardPublishResults env var should be false") } } @@ -352,9 +352,10 @@ func TestUpdateRepositoryInformation(t *testing.T) { } } -//nolint:paralleltest -// Not setting t.Parallel() here because we are mutating the env variables. +/* func TestCheckRequired(t *testing.T) { + //nolint:paralleltest + // Not setting t.Parallel() here because we are mutating the env variables. tests := []struct { opts *options.Options name string @@ -387,6 +388,7 @@ func TestCheckRequired(t *testing.T) { }) } } +*/ //nolint:paralleltest // Not setting t.Parallel() here because we are mutating the env variables. diff --git a/options/options.go b/options/options.go index aafbfbd2..4bcb43a2 100644 --- a/options/options.go +++ b/options/options.go @@ -25,6 +25,7 @@ import ( "strings" "github.com/caarlos0/env/v6" + scaenv "github.com/ossf/scorecard-action/env" scopts "github.com/ossf/scorecard/v4/options" ) @@ -72,6 +73,8 @@ type Options struct { // GitHub options. // TODO(github): Consider making this a separate options set so we can // encapsulate handling + // TODO(auth): We probably want to remove the token from options to prevent + // it from being easily read. GithubAuthToken string `env:"GITHUB_AUTH_TOKEN"` GithubEventName string `env:"GITHUB_EVENT_NAME"` GithubEventPath string `env:"GITHUB_EVENT_PATH"` @@ -86,23 +89,6 @@ type Options struct { PrivateRepoStr string `env:"SCORECARD_PRIVATE_REPOSITORY"` } -// ScorecardOptions mirrors scorecard/options.Options, which defines common options -// for configuring scorecard. -type ScorecardOptions struct { - Repo string - Local string - Commit string - LogLevel string - Format string - NPM string - PyPI string - RubyGems string - PolicyFile string - ChecksToRun []string - Metadata []string - ShowDetails bool -} - const ( defaultScorecardBin = "/scorecard" defaultScorecardPolicyFile = "./policy.yml" @@ -111,19 +97,16 @@ const ( // New TODO(lint): should have comment or be unexported (revive). func New() (*Options, error) { opts := &Options{} - tmpScorecardOpts := &ScorecardOptions{} - if err := env.Parse(opts); err != nil { return opts, fmt.Errorf("parsing entrypoint env vars: %w", err) } - if err := env.Parse(tmpScorecardOpts); err != nil { - return opts, fmt.Errorf("parsing scorecard env vars: %w", err) - } + // TODO(options): Push options into scorecard.Options once/if it supports + // validation. scOpts := scopts.New() // TODO(options): Move this set-or-default logic to its own function. - scOpts.PolicyFile = tmpScorecardOpts.PolicyFile + scOpts.PolicyFile = opts.PolicyFile if scOpts.PolicyFile == "" { scOpts.PolicyFile = defaultScorecardPolicyFile } @@ -133,6 +116,25 @@ func New() (*Options, error) { } opts.ScorecardOpts = scOpts + + if opts.ResultsFile == "" { + opts.ResultsFile = opts.InputResultsFile + // TODO(options): We should check if this is empty. + } + + if opts.Format == "" { + opts.Format = opts.InputResultsFormat + } + opts.ScorecardOpts.Format = opts.Format + + if opts.PublishResultsStr == "" { + opts.PublishResultsStr = opts.InputPublishResults + if opts.PublishResultsStr == "" { + opts.PublishResultsStr = "false" + } + } + + // TODO(options): Consider running Initialize() before returning. // TODO(options): Consider running Validate() before returning. return opts, nil } @@ -148,45 +150,18 @@ func (o *Options) Initialize() error { GITHUB_ACTIONS is true in GitHub env. */ - envvars := make(map[string]string) - envvars[scaenv.EnableSarif] = "1" - envvars[scaenv.EnableLicense] = "1" - envvars[scaenv.EnableDangerousWorkflow] = "1" - - for key, val := range envvars { - if err := os.Setenv(key, val); err != nil { - return fmt.Errorf("error setting %s: %w", key, err) - } - } - - err := setFromEnvVarStrict(&o.ResultsFile, scaenv.InputResultsFile) - if err != nil { - return fmt.Errorf("setting %s: %w", o.ResultsFile, err) - } - - err = setFromEnvVarStrict(&o.ScorecardOpts.Format, scaenv.InputResultsFormat) - if err != nil { - return fmt.Errorf("setting %s: %w", o.ScorecardOpts.Format, err) - } - - err = setFromEnvVarStrict(&o.PrivateRepoStr, scaenv.ScorecardPrivateRepo) - if err != nil { - return fmt.Errorf("setting %s: %w", o.PrivateRepoStr, err) - } - - err = setFromEnvVarStrict(&o.PublishResultsStr, scaenv.InputPublishResults) - if err != nil { - return fmt.Errorf("setting %s: %w", o.PublishResultsStr, err) - } + o.EnableSarif = "1" + o.EnableLicense = "1" + o.EnableDangerousWorkflow = "1" return GithubEventPath() } // Validate validates the scorecard configuration. func (o *Options) Validate(writer io.Writer) error { - if os.Getenv(scaenv.GithubAuthToken) == "" { + if o.GithubAuthToken == "" { fmt.Fprintf(writer, "The 'repo_token' variable is empty.\n") - if os.Getenv(scaenv.ScorecardFork) == trueStr { + if o.IsForkStr == trueStr { fmt.Fprintf(writer, "We have detected you are running on a fork.\n") } @@ -198,9 +173,9 @@ func (o *Options) Validate(writer io.Writer) error { return scaenv.ErrEmptyGitHubAuthToken } - if strings.Contains(os.Getenv(scaenv.GithubEventName), "pull_request") && - os.Getenv(scaenv.GithubRef) == o.DefaultBranch { - fmt.Fprintf(writer, "%s not supported with %s event.\n", os.Getenv(scaenv.GithubRef), os.Getenv(scaenv.GithubEventName)) + if strings.Contains(os.Getenv(o.GithubEventName), "pull_request") && + os.Getenv(o.GithubRef) == o.DefaultBranch { + fmt.Fprintf(writer, "%s not supported with %s event.\n", os.Getenv(o.GithubRef), os.Getenv(o.GithubEventName)) fmt.Fprintf(writer, "Only the default branch %s is supported.\n", o.DefaultBranch) return errOnlyDefaultBranchSupported @@ -226,7 +201,7 @@ func (o *Options) Print(writer io.Writer) { // SetRepository TODO(lint): should have comment or be unexported (revive). func (o *Options) SetRepository() { - o.ScorecardOpts.Repo = os.Getenv(scaenv.GithubRepository) + o.ScorecardOpts.Repo = os.Getenv(o.GithubRepository) } // Repo TODO(lint): should have comment or be unexported (revive). @@ -324,21 +299,3 @@ func RepoIsFork(ghEventPath string) (bool, error) { return r.Repository.Fork, nil } - -// setFromEnvVarStrict TODO(lint): should have comment or be unexported (revive). -func setFromEnvVarStrict(option *string, envVar string) error { - return setFromEnvVar(option, envVar, "", true, true) -} - -// TODO(env): Refactor -// - Convert to method -// - Only fail if both the config value and env var is empty. -func setFromEnvVar(option *string, envVar, def string, mustExist, mustNotBeEmpty bool) error { - value, err := scaenv.Lookup(envVar, def, mustExist, mustNotBeEmpty) - if err != nil { - return fmt.Errorf("setting value for option %s: %w", *option, err) - } - - *option = value - return nil -} diff --git a/options/options_test.go b/options/options_test.go index 93e6206c..f1d610f1 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -23,11 +23,11 @@ import ( scopts "github.com/ossf/scorecard/v4/options" ) -//nolint:paralleltest // Until/unless we consider providing a fake environment -// to tests, running these in parallel will have unpredictable results as -// we're mutating environment variables. /* func TestNew(t *testing.T) { + //nolint:paralleltest // Until/unless we consider providing a fake environment + // to tests, running these in parallel will have unpredictable results as + // we're mutating environment variables. tests := []struct { want *Options name string From 132dd011ae492040d9fd8adb0bc18879a84b639c Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Mon, 28 Feb 2022 19:53:03 -0500 Subject: [PATCH 04/17] Start test cleanups Signed-off-by: Stephen Augustus --- entrypoint/entrypoint.go | 6 +- entrypoint/entrypoint_test.go | 782 ---------------------------------- {env => options}/env.go | 67 ++- options/options.go | 51 +-- options/options_test.go | 82 ++-- 5 files changed, 98 insertions(+), 890 deletions(-) delete mode 100644 entrypoint/entrypoint_test.go rename {env => options}/env.go (55%) diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go index 64c8b420..9ef28061 100644 --- a/entrypoint/entrypoint.go +++ b/entrypoint/entrypoint.go @@ -46,7 +46,11 @@ func Run(o *options.Options) error { return fmt.Errorf("checking if required options are set: %w", err) } - o.SetRepository() + // The repository should have already been initialized, so if for whatever + // reason it hasn't, we should exit here with an appropriate error + if o.RepoIsSet() { + return fmt.Errorf("repository cannot be empty") //nolint:goerr113 // TODO(lint): Fix + } token := options.GetGithubToken() repo, err := getRepo(o.Repo(), token) diff --git a/entrypoint/entrypoint_test.go b/entrypoint/entrypoint_test.go deleted file mode 100644 index 8c6ec8d5..00000000 --- a/entrypoint/entrypoint_test.go +++ /dev/null @@ -1,782 +0,0 @@ -// Copyright 2022 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 entrypoint - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "os/exec" - "strconv" - "testing" - - "github.com/google/go-cmp/cmp" - - "github.com/ossf/scorecard-action/env" - "github.com/ossf/scorecard-action/options" - scopts "github.com/ossf/scorecard/v4/options" -) - -//nolint:paralleltest -// Not setting t.Parallel() here because we are mutating the env variables. -func Test_RepoIsFork(t *testing.T) { - type args struct { - ghEventPath string - } - tests := []struct { - name string - args args - want bool - wantErr bool - }{ - { - name: "No event data", - want: false, - wantErr: true, - }, - { - name: "Fork event", - args: args{ - ghEventPath: "./testdata/fork.json", - }, - want: true, - wantErr: false, - }, - { - name: "Non fork event", - args: args{ - ghEventPath: "./testdata/non-fork.json", - }, - want: false, - wantErr: false, - }, - { - name: "incorrect event", - args: args{ - ghEventPath: "./testdata/incorrect.json", - }, - want: false, - wantErr: true, - }, - } - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - var data []byte - var err error - if tt.args.ghEventPath != "" { - data, err = ioutil.ReadFile(tt.args.ghEventPath) - if err != nil { - t.Errorf("Failed to open test data: %v", err) - } - } - - got, err := options.RepoIsFork(string(data)) - if (err != nil) != tt.wantErr { - t.Errorf("%v", err) - t.Errorf("RepoIsFork() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("RepoIsFork() = %v, want %v", got, tt.want) - } - }) - } -} - -//nolint:paralleltest -// Not setting t.Parallel() here because we are mutating the env variables. -func TestInitializeEnvVariables(t *testing.T) { - tests := []struct { - opts *options.Options - name string - githubEventPath string - inputResultsFile string - inputPublishResults string - wantErr bool - githubEventPathSet bool - inputResultsFileSet bool - inputResultsFormatSet bool - inputPublishResultsSet bool - }{ - { - name: "Success", - wantErr: false, - opts: &options.Options{ - ScorecardOpts: &scopts.Options{ - Format: "json", - }, - }, - inputResultsFileSet: true, - inputResultsFile: "./testdata/results.json", - inputResultsFormatSet: true, - inputPublishResultsSet: true, - inputPublishResults: "true", - githubEventPathSet: true, - githubEventPath: "./testdata/fork.json", - }, - { - name: "Success - no results file", - wantErr: true, - opts: &options.Options{ - ScorecardOpts: &scopts.Options{ - Format: "json", - }, - }, - inputResultsFileSet: false, - inputResultsFile: "", - inputResultsFormatSet: true, - inputPublishResultsSet: true, - inputPublishResults: "true", - githubEventPathSet: true, - githubEventPath: "./testdata/fork.json", - }, - { - name: "Success - no results format", - wantErr: true, - opts: &options.Options{ - ScorecardOpts: &scopts.Options{ - Format: "", - }, - }, - inputResultsFileSet: true, - inputResultsFile: "./testdata/results.json", - inputResultsFormatSet: false, - inputPublishResultsSet: true, - inputPublishResults: "true", - githubEventPathSet: true, - githubEventPath: "./testdata/fork.json", - }, - { - name: "Success - no publish results", - wantErr: true, - opts: &options.Options{ - ScorecardOpts: &scopts.Options{ - Format: "json", - }, - }, - inputResultsFileSet: true, - inputResultsFile: "./testdata/results.json", - inputResultsFormatSet: true, - inputPublishResultsSet: false, - inputPublishResults: "", - githubEventPathSet: true, - githubEventPath: "./testdata/fork.json", - }, - { - name: "Success - no github event path", - wantErr: true, - opts: &options.Options{ - ScorecardOpts: &scopts.Options{ - Format: "json", - }, - }, - inputResultsFileSet: true, - inputResultsFile: "./testdata/results.json", - inputResultsFormatSet: true, - inputPublishResultsSet: true, - inputPublishResults: "true", - githubEventPathSet: false, - githubEventPath: "./testdata/fork.json", - }, - } - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - if tt.inputResultsFileSet { - defer os.Unsetenv(env.InputPublishResults) - os.Setenv(env.InputResultsFile, tt.inputResultsFile) - } else { - os.Unsetenv(env.InputResultsFile) - } - if tt.inputResultsFormatSet { - defer os.Unsetenv(env.InputResultsFormat) - os.Setenv(env.InputResultsFormat, tt.opts.ScorecardOpts.Format) - } else { - os.Unsetenv(env.InputResultsFormat) - } - if tt.inputPublishResultsSet { - defer os.Unsetenv(env.InputPublishResults) - os.Setenv(env.InputPublishResults, tt.inputPublishResults) - } else { - os.Unsetenv(env.InputPublishResults) - } - if tt.githubEventPathSet { - defer os.Unsetenv(env.GithubEventPath) - os.Setenv(env.GithubEventPath, tt.githubEventPath) - } else { - os.Unsetenv(env.GithubEventPath) - } - if err := tt.opts.Initialize(); (err != nil) != tt.wantErr { - t.Errorf("options.Initialize() error = %v, wantErr %v %v", err, tt.wantErr, t.Name()) - } - - envvars := make(map[string]string) - envvars[env.EnableSarif] = "1" - envvars[env.EnableLicense] = "1" - envvars[env.EnableDangerousWorkflow] = "1" - - for k, v := range envvars { - if os.Getenv(k) != v { - t.Errorf("%s env var not set correctly %s", k, v) - } - } - }) - } -} - -//nolint:paralleltest -// Not setting t.Parallel() here because we are mutating the env variables. -func TestUpdateEnvVariables(t *testing.T) { - tests := []struct { - opts *options.Options - name string - isPrivateRepo bool - wantErr bool - }{ - { - name: "Success - private repo", - opts: &options.Options{ - ScorecardOpts: &scopts.Options{ - Format: "json", - }, - }, - isPrivateRepo: true, - wantErr: false, - }, - { - name: "Success - private repo - sarif", - opts: &options.Options{ - ScorecardOpts: &scopts.Options{ - Format: "sarif", - }, - }, - isPrivateRepo: true, - wantErr: false, - }, - } - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - tt.opts.SetRepoVisibility(tt.isPrivateRepo) - tt.opts.SetPublishResults() - if !tt.wantErr && tt.isPrivateRepo { - if tt.opts.PublishResultsStr != "false" { - t.Errorf("scorecardPublishResults env var (%s) should be false", tt.opts.PublishResultsStr) - } - } - - if !tt.wantErr && tt.opts.ScorecardOpts.Format == "sarif" { - if _, ok := os.LookupEnv(tt.opts.ScorecardOpts.PolicyFile); ok { - t.Errorf("envEnableSarif env var should not be set") - } - } - }) - } -} - -//nolint:paralleltest -// Not setting t.Parallel() here because we are mutating the env variables. -func TestUpdateRepositoryInformation(t *testing.T) { - // Not setting t.Parallel() here because we are mutating the env variables - type args struct { - opts *options.Options - defaultBranch string - privateRepo bool - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "Success - private repo", - args: args{ - opts: &options.Options{}, - defaultBranch: "master", - privateRepo: true, - }, - wantErr: false, - }, - { - name: "Success - public repo", - args: args{ - opts: &options.Options{}, - defaultBranch: "master", - privateRepo: false, - }, - wantErr: false, - }, - { - name: "Success - public repo - no default branch", - args: args{ - opts: &options.Options{}, - defaultBranch: "", - privateRepo: false, - }, - wantErr: true, - }, - } - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - if err := tt.args.opts.SetDefaultBranch(tt.args.defaultBranch); (err != nil) != tt.wantErr { - t.Errorf("options.SetDefaultBranch() error = %v, wantErr %v", err, tt.wantErr) - } - - tt.args.opts.SetRepoVisibility(tt.args.privateRepo) - - if tt.args.privateRepo { - if tt.args.opts.PrivateRepoStr != strconv.FormatBool(tt.args.privateRepo) { - t.Errorf("scorecardPublishResults env var should be false") - } - } - if tt.args.defaultBranch != "" { - if tt.args.opts.DefaultBranch != fmt.Sprintf("refs/heads/%s", tt.args.defaultBranch) { - t.Errorf("scorecardDefaultBranch env var should be %s", tt.args.defaultBranch) - } - } - }) - } -} - -/* -func TestCheckRequired(t *testing.T) { - //nolint:paralleltest - // Not setting t.Parallel() here because we are mutating the env variables. - tests := []struct { - opts *options.Options - name string - wantErr bool - }{ - { - name: "Success - all required env vars set", - opts: options.New(), - wantErr: false, - }, - } - for _, tt := range tests { - tt := tt - envVariables := make(map[string]bool) - envVariables[env.GithubRepository] = true - envVariables[env.GithubAuthToken] = true - t.Run(tt.name, func(t *testing.T) { - if !tt.wantErr { - for k := range envVariables { - defer os.Unsetenv(k) - if err := os.Setenv(k, "true"); err != nil { - t.Errorf("failed to set env var %s", k) - } - } - } - - if err := tt.opts.CheckRequired(); (err != nil) != tt.wantErr { - t.Errorf("options.CheckRequired() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} -*/ - -//nolint:paralleltest -// Not setting t.Parallel() here because we are mutating the env variables. -func TestGithubEventPath(t *testing.T) { - tests := []struct { - name string - githubEventPath string - shouldEnvGithubEventPathBeSet bool - wantErr bool - isFork bool - }{ - { - name: "Success - githubEventPath set", - wantErr: false, - shouldEnvGithubEventPathBeSet: true, - githubEventPath: "./testdata/non-fork.json", - isFork: false, - }, - { - name: "Success - githubEventPath not set", - wantErr: true, - shouldEnvGithubEventPathBeSet: false, - githubEventPath: "", - }, - { - name: "Success - githubEventPath is empty", - wantErr: true, - shouldEnvGithubEventPathBeSet: true, - githubEventPath: "", - }, - { - name: "Failure non-existent file", - wantErr: true, - shouldEnvGithubEventPathBeSet: true, - githubEventPath: "./foo.bar.json", - }, - { - name: "Failure non-existent file", - wantErr: true, - shouldEnvGithubEventPathBeSet: true, - githubEventPath: "./testdata/incorrect.json", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if tt.shouldEnvGithubEventPathBeSet { - if err := os.Setenv(env.GithubEventPath, tt.githubEventPath); err != nil { - t.Errorf("failed to set env var %s", env.GithubEventPath) - } - defer os.Unsetenv(env.GithubEventPath) - } - - if err := options.GithubEventPath(); (err != nil) != tt.wantErr { - t.Errorf("options.GithubEventPath() error = %v, wantErr %v %v", err, tt.wantErr, tt.name) - } - - if tt.isFork { - forkEnv := os.Getenv(env.ScorecardFork) - if forkEnv != "true" { - t.Errorf("isFork = %v, want %v %v", tt.isFork, forkEnv, tt.name) - } - } - }) - } -} - -//nolint:paralleltest,gocognit -// Not setting t.Parallel() here because we are mutating the env variables. -func TestValidate(t *testing.T) { - tests := []struct { - opts *options.Options - name string - wantWriter string - authToken string - gitHubEventName string - ref string - scorecardDefaultBranch string - wantErr bool - scorecardFork bool - }{ - { - name: "scorecardFork set and failure", - opts: &options.Options{}, - wantErr: true, - authToken: "", - scorecardFork: true, - gitHubEventName: "", - ref: "", - scorecardDefaultBranch: "", - }, - { - name: "Success - scorecardFork set", - opts: &options.Options{}, - wantErr: false, - authToken: "token", - scorecardFork: false, - gitHubEventName: "", - ref: "", - scorecardDefaultBranch: "", - }, - { - name: "Success - scorecardFork set", - opts: &options.Options{}, - wantErr: true, - authToken: "token", - scorecardFork: true, - gitHubEventName: "pull_request", - ref: "main", - scorecardDefaultBranch: "main", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - writer := &bytes.Buffer{} - if err := os.Setenv(env.ScorecardFork, strconv.FormatBool(tt.scorecardFork)); err != nil { - t.Errorf("failed to set env var %s", env.ScorecardFork) - } - defer os.Unsetenv(env.ScorecardFork) - if tt.gitHubEventName != "" { - if err := os.Setenv(env.GithubEventName, tt.gitHubEventName); err != nil { - t.Errorf("failed to set env var %s", env.GithubEventName) - } - defer os.Unsetenv(env.GithubEventName) - } - if tt.ref != "" { - if err := os.Setenv(env.GithubRef, tt.ref); err != nil { - t.Errorf("failed to set env var %s", env.GithubRef) - } - defer os.Unsetenv(env.GithubRef) - } - if tt.scorecardDefaultBranch != "" { - tt.opts.DefaultBranch = tt.scorecardDefaultBranch - } - if tt.authToken != "" { - if err := os.Setenv(env.GithubAuthToken, tt.authToken); err != nil { - t.Errorf("failed to set env var %s", env.GithubAuthToken) - } - defer os.Unsetenv(env.GithubAuthToken) - } - if err := tt.opts.Validate(writer); (err != nil) != tt.wantErr { - t.Errorf("validate() error = %v, wantErr %v", err, tt.wantErr) - return - } - }) - } -} - -func TestGetScorecardCmd(t *testing.T) { - t.Parallel() - type args *options.Options - - //nolint - tests := []struct { - wantErr bool - name string - args args - want *exec.Cmd - }{ - { - name: "Success - envScorecardFork set", - args: &options.Options{ - ScorecardOpts: &scopts.Options{ - Repo: "foo/bar", - Format: "json", - PolicyFile: "./testdata/scorecard.yaml", - }, - GithubEventName: "pull_request", - ScorecardBin: "scorecard", - ResultsFile: "./testdata/scorecard.json", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--policy", - "./testdata/scorecard.yaml", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - envScorecardFork set", - args: &options.Options{ - ScorecardOpts: &scopts.Options{ - Repo: "foo/bar", - Format: "json", - PolicyFile: "./testdata/scorecard.yaml", - }, - GithubEventName: "pull_request", - ScorecardBin: "scorecard", - ResultsFile: "./testdata/scorecard.json", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--policy", - "./testdata/scorecard.yaml", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - envScorecardFork set", - args: &options.Options{ - ScorecardOpts: &scopts.Options{ - Repo: "foo/bar", - Format: "json", - PolicyFile: "./testdata/scorecard.yaml", - }, - GithubEventName: "pull_request", - ScorecardBin: "scorecard", - ResultsFile: "./testdata/scorecard.json", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--policy", - "./testdata/scorecard.yaml", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - envScorecardFork set", - args: &options.Options{ - ScorecardOpts: &scopts.Options{ - Repo: "foo/bar", - Format: "json", - }, - GithubEventName: "pull_request", - ScorecardBin: "scorecard", - ResultsFile: "./testdata/scorecard.json", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - envScorecardFork set", - args: &options.Options{ - ScorecardOpts: &scopts.Options{ - Repo: "foo/bar", - Format: "json", - }, - GithubEventName: "pull_request", - ScorecardBin: "scorecard", - ResultsFile: "./testdata/scorecard.json", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - envScorecardFork set", - args: &options.Options{ - ScorecardOpts: &scopts.Options{ - Repo: "foo/bar", - Format: "json", - }, - ScorecardBin: "scorecard", - ResultsFile: "./testdata/scorecard.json", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - Branch protection rule", - args: &options.Options{ - ScorecardOpts: &scopts.Options{ - Repo: "foo/bar", - Format: "json", - }, - GithubEventName: "branch_protection_rule", - ScorecardBin: "scorecard", - ResultsFile: "./testdata/scorecard.json", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Success - Branch protection rule", - args: &options.Options{ - ScorecardOpts: &scopts.Options{ - Repo: "foo/bar", - Format: "json", - PolicyFile: "./testdata/scorecard.yaml", - }, - GithubEventName: "branch_protection_rule", - ScorecardBin: "scorecard", - ResultsFile: "./testdata/scorecard.json", - }, - want: &exec.Cmd{ - Path: "scorecard", - Args: []string{ - "scorecard", - "--policy", - "./testdata/scorecard.yaml", - "--results-format", - "json", - "--results-file", - "./testdata/scorecard.json", - "--repo", - "foo/bar", - }, - }, - }, - { - name: "Want error - Branch protection rule", - args: &options.Options{ - ScorecardOpts: &scopts.Options{ - Repo: "", - Format: "", - }, - GithubEventName: "", - ScorecardBin: "", - ResultsFile: "", - }, - wantErr: true, - }, - } - - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - got, err := getScorecardCmd(tt.args) - if (err != nil) != tt.wantErr { - t.Errorf("getScorecardCmd() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !tt.wantErr && cmp.Equal(got.Args, tt.want.Args) { - t.Errorf("getScorecardCmd() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/env/env.go b/options/env.go similarity index 55% rename from env/env.go rename to options/env.go index f77cd4bd..3e2813bf 100644 --- a/env/env.go +++ b/options/env.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package env +package options import ( "errors" @@ -25,27 +25,27 @@ import ( // TODO(env): Remove once environment variables are not used for config. //nolint:revive,nolintlint const ( - EnableSarif = "ENABLE_SARIF" - EnableLicense = "ENABLE_LICENSE" - EnableDangerousWorkflow = "ENABLE_DANGEROUS_WORKFLOW" - GithubEventPath = "GITHUB_EVENT_PATH" - GithubEventName = "GITHUB_EVENT_NAME" - GithubRepository = "GITHUB_REPOSITORY" - GithubRef = "GITHUB_REF" - GithubWorkspace = "GITHUB_WORKSPACE" - GithubAuthToken = "GITHUB_AUTH_TOKEN" //nolint:gosec - InputResultsFile = "INPUT_RESULTS_FILE" - InputResultsFormat = "INPUT_RESULTS_FORMAT" - InputPublishResults = "INPUT_PUBLISH_RESULTS" - ScorecardFork = "SCORECARD_IS_FORK" - ScorecardPrivateRepo = "SCORECARD_PRIVATE_REPOSITORY" + EnvEnableSarif = "ENABLE_SARIF" + EnvEnableLicense = "ENABLE_LICENSE" + EnvEnableDangerousWorkflow = "ENABLE_DANGEROUS_WORKFLOW" + EnvGithubEventPath = "GITHUB_EVENT_PATH" + EnvGithubEventName = "GITHUB_EVENT_NAME" + EnvGithubRepository = "GITHUB_REPOSITORY" + EnvGithubRef = "GITHUB_REF" + EnvGithubWorkspace = "GITHUB_WORKSPACE" + EnvGithubAuthToken = "GITHUB_AUTH_TOKEN" //nolint:gosec + EnvInputResultsFile = "INPUT_RESULTS_FILE" + EnvInputResultsFormat = "INPUT_RESULTS_FORMAT" + EnvInputPublishResults = "INPUT_PUBLISH_RESULTS" + EnvScorecardFork = "SCORECARD_IS_FORK" + EnvScorecardPrivateRepo = "SCORECARD_PRIVATE_REPOSITORY" ) -// CheckRequired is a function to check if the required environment variables are set. -func CheckRequired() error { +// CheckRequiredEnv is a function to check if the required environment variables are set. +func CheckRequiredEnv() error { envVariables := make(map[string]bool) - envVariables[GithubRepository] = true - envVariables[GithubAuthToken] = true + envVariables[EnvGithubRepository] = true + envVariables[EnvGithubAuthToken] = true for key := range envVariables { // TODO(env): Refactor to use helpers @@ -57,13 +57,13 @@ func CheckRequired() error { return nil } -// Print is a function to print the ENV variables. -func Print(writer io.Writer) { - fmt.Fprintf(writer, "GITHUB_EVENT_PATH=%s\n", os.Getenv(GithubEventPath)) - fmt.Fprintf(writer, "GITHUB_EVENT_NAME=%s\n", os.Getenv(GithubEventName)) - fmt.Fprintf(writer, "GITHUB_REPOSITORY=%s\n", os.Getenv(GithubRepository)) - fmt.Fprintf(writer, "SCORECARD_IS_FORK=%s\n", os.Getenv(ScorecardFork)) - fmt.Fprintf(writer, "Ref=%s\n", os.Getenv(GithubRef)) +// EnvPrint is a function to print the ENV variables. +func EnvPrint(writer io.Writer) { + fmt.Fprintf(writer, "GITHUB_EVENT_PATH=%s\n", os.Getenv(EnvGithubEventPath)) + fmt.Fprintf(writer, "GITHUB_EVENT_NAME=%s\n", os.Getenv(EnvGithubEventName)) + fmt.Fprintf(writer, "GITHUB_REPOSITORY=%s\n", os.Getenv(EnvGithubRepository)) + fmt.Fprintf(writer, "SCORECARD_IS_FORK=%s\n", os.Getenv(EnvScorecardFork)) + fmt.Fprintf(writer, "Ref=%s\n", os.Getenv(EnvGithubRef)) } // Adapted from sigs.k8s.io/release-utils/env @@ -100,25 +100,16 @@ var ( // ErrGitHubEventPath TODO(lint): should have comment or be unexported (revive). ErrGitHubEventPath = errors.New("error getting GITHUB_EVENT_PATH") // ErrGitHubEventPathEmpty TODO(lint): should have comment or be unexported (revive). - ErrGitHubEventPathEmpty = errEnvVarIsEmptyWithKey(GithubEventPath) + ErrGitHubEventPathEmpty = errEnvVarIsEmptyWithKey(EnvGithubEventPath) // ErrGitHubEventPathNotSet TODO(lint): should have comment or be unexported (revive). - ErrGitHubEventPathNotSet = errEnvVarNotSetWithKey(InputPublishResults) + ErrGitHubEventPathNotSet = errEnvVarNotSetWithKey(EnvGithubEventPath) // ErrEmptyGitHubAuthToken TODO(lint): should have comment or be unexported (revive). - ErrEmptyGitHubAuthToken = errEnvVarIsEmptyWithKey(GithubAuthToken) + ErrEmptyGitHubAuthToken = errEnvVarIsEmptyWithKey(EnvGithubAuthToken) errEnvVarNotSet = errors.New("env var is not set") errEnvVarIsEmpty = errors.New("env var is empty") errRequiredEnvNotSet = errors.New("required environment variables are not set") - // TODO(env): Remove if not needed. - /* - errInputResultFileNotSet = errEnvVarNotSet(InputResultsFile) - errInputResultFileEmpty = errEnvVarIsEmpty(InputResultsFile) - errInputResultFormatNotSet = errEnvVarNotSet(InputResultsFormat) - errInputResultFormatEmpty = errEnvVarIsEmpty(InputResultsFormat) - errInputPublishResultsNotSet = errEnvVarNotSet(InputPublishResults) - errInputPublishResultsEmpty = errEnvVarIsEmpty(InputPublishResults) - */ ) func errEnvVarNotSetWithKey(envVar string) error { diff --git a/options/options.go b/options/options.go index 4bcb43a2..6b63eed3 100644 --- a/options/options.go +++ b/options/options.go @@ -26,7 +26,6 @@ import ( "github.com/caarlos0/env/v6" - scaenv "github.com/ossf/scorecard-action/env" scopts "github.com/ossf/scorecard/v4/options" ) @@ -73,14 +72,11 @@ type Options struct { // GitHub options. // TODO(github): Consider making this a separate options set so we can // encapsulate handling - // TODO(auth): We probably want to remove the token from options to prevent - // it from being easily read. - GithubAuthToken string `env:"GITHUB_AUTH_TOKEN"` - GithubEventName string `env:"GITHUB_EVENT_NAME"` - GithubEventPath string `env:"GITHUB_EVENT_PATH"` - GithubRef string `env:"GITHUB_REF"` - GithubRepository string `env:"GITHUB_REPOSITORY"` - GithubWorkspace string `env:"GITHUB_WORKSPACE"` + GithubEventName string `env:"GITHUB_EVENT_NAME"` + CheckGithubEventPath string `env:"GITHUB_EVENT_PATH"` + GithubRef string `env:"GITHUB_REF"` + GithubRepository string `env:"GITHUB_REPOSITORY"` + GithubWorkspace string `env:"GITHUB_WORKSPACE"` DefaultBranch string `env:"SCORECARD_DEFAULT_BRANCH"` // TODO(options): This may be better as a bool @@ -154,12 +150,12 @@ func (o *Options) Initialize() error { o.EnableLicense = "1" o.EnableDangerousWorkflow = "1" - return GithubEventPath() + return CheckGithubEventPath() } // Validate validates the scorecard configuration. func (o *Options) Validate(writer io.Writer) error { - if o.GithubAuthToken == "" { + if os.Getenv(EnvGithubAuthToken) == "" { fmt.Fprintf(writer, "The 'repo_token' variable is empty.\n") if o.IsForkStr == trueStr { fmt.Fprintf(writer, "We have detected you are running on a fork.\n") @@ -170,7 +166,7 @@ func (o *Options) Validate(writer io.Writer) error { "Please follow the instructions at https://github.com/ossf/scorecard-action#authentication to create the read-only PAT token.\n", //nolint:lll ) - return scaenv.ErrEmptyGitHubAuthToken + return ErrEmptyGitHubAuthToken } if strings.Contains(os.Getenv(o.GithubEventName), "pull_request") && @@ -186,7 +182,7 @@ func (o *Options) Validate(writer io.Writer) error { // CheckRequired TODO(lint): should have comment or be unexported (revive). func (o *Options) CheckRequired() error { - err := scaenv.CheckRequired() + err := CheckRequiredEnv() if err != nil { return fmt.Errorf("checking if required env vars are set: %w", err) } @@ -196,7 +192,7 @@ func (o *Options) CheckRequired() error { // Print is a function to print options. func (o *Options) Print(writer io.Writer) { - scaenv.Print(writer) + EnvPrint(writer) } // SetRepository TODO(lint): should have comment or be unexported (revive). @@ -209,6 +205,11 @@ func (o *Options) Repo() string { return o.ScorecardOpts.Repo } +// RepoIsSet TODO(lint): should have comment or be unexported (revive). +func (o *Options) RepoIsSet() bool { + return o.Repo() != "" +} + // SetRepoVisibility sets the repository's visibility. func (o *Options) SetRepoVisibility(privateRepo bool) { o.PrivateRepoStr = strconv.FormatBool(privateRepo) @@ -237,32 +238,32 @@ func (o *Options) SetPublishResults() { // GetGithubToken retrieves the GitHub auth token from the environment. func GetGithubToken() string { - return os.Getenv(scaenv.GithubAuthToken) + return os.Getenv(EnvGithubAuthToken) } // GetGithubWorkspace retrieves the GitHub auth token from the environment. func GetGithubWorkspace() string { - return os.Getenv(scaenv.GithubWorkspace) + return os.Getenv(EnvGithubWorkspace) } -// GithubEventPath gets the path to the GitHub event and sets the +// CheckGithubEventPath gets the path to the GitHub event and sets the // SCORECARD_IS_FORK environment variable. // TODO(options): Check if this actually needs to be exported. -func GithubEventPath() error { +func CheckGithubEventPath() error { var result string var exists bool - if result, exists = os.LookupEnv(scaenv.GithubEventPath); !exists { - return scaenv.ErrGitHubEventPathNotSet + if result, exists = os.LookupEnv(EnvGithubEventPath); !exists { + return ErrGitHubEventPathNotSet } if result == "" { - return scaenv.ErrGitHubEventPathEmpty + return ErrGitHubEventPathEmpty } data, err := ioutil.ReadFile(result) if err != nil { - return fmt.Errorf("error reading %s: %w", scaenv.GithubEventPath, err) + return fmt.Errorf("error reading %s: %w", EnvGithubEventPath, err) } isFork, err := RepoIsFork(string(data)) @@ -271,8 +272,8 @@ func GithubEventPath() error { } isForkStr := strconv.FormatBool(isFork) - if err := os.Setenv(scaenv.ScorecardFork, isForkStr); err != nil { - return fmt.Errorf("error setting %s: %w", scaenv.ScorecardFork, err) + if err := os.Setenv(EnvScorecardFork, isForkStr); err != nil { + return fmt.Errorf("error setting %s: %w", EnvScorecardFork, err) } return err @@ -281,7 +282,7 @@ func GithubEventPath() error { // RepoIsFork checks if the current repo is a fork. func RepoIsFork(ghEventPath string) (bool, error) { if ghEventPath == "" { - return false, scaenv.ErrGitHubEventPath + return false, ErrGitHubEventPath } /* https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#github_repository_is_fork diff --git a/options/options_test.go b/options/options_test.go index f1d610f1..e4110545 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -16,13 +16,19 @@ package options import ( "os" - "strconv" "testing" - "github.com/ossf/scorecard-action/env" + "github.com/google/go-cmp/cmp" + scopts "github.com/ossf/scorecard/v4/options" ) +var ( + githubEventPathNonFork = "testdata/non-fork.json" + githubEventPathFork = "testdata/fork.json" + githubEventPathIncorrect = "testdata/incorrect.json" +) + /* func TestNew(t *testing.T) { //nolint:paralleltest // Until/unless we consider providing a fake environment @@ -65,57 +71,45 @@ func TestOptionsInitialize(t *testing.T) { PublishResults string ResultsFile string } - tests := []struct { - name string - fields fields - wantErr bool - setEnvResultsFile bool - setEnvResultsFormat bool - setEnvPrivateRepo bool - setEnvPublishResults bool - isPrivateRepo bool + tests := []struct { //nolint:govet // TODO(lint): Fix + name string + fields fields + wantErr bool + githubEventPath string + setGithubEventPath bool }{ { - name: "Success", - fields: fields{ - ScorecardOpts: &scopts.Options{ - PolicyFile: defaultScorecardPolicyFile, - }, - ScorecardBin: defaultScorecardBin, - }, - wantErr: false, - setEnvResultsFile: true, - setEnvResultsFormat: true, - setEnvPrivateRepo: true, - setEnvPublishResults: true, - isPrivateRepo: true, + name: "Success - non-fork", + wantErr: false, + githubEventPath: githubEventPathNonFork, + setGithubEventPath: true, + }, + { + name: "Success - fork", + wantErr: false, + githubEventPath: githubEventPathFork, + setGithubEventPath: true, + }, + { + name: "Failure - incorrect GitHub events", + wantErr: true, + githubEventPath: githubEventPathIncorrect, + setGithubEventPath: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if tt.setEnvResultsFile { - os.Setenv(env.InputResultsFile, "results-file") - } - if tt.setEnvResultsFormat { - os.Setenv(env.InputResultsFormat, "sarif") - } - if tt.setEnvPrivateRepo { - os.Setenv(env.ScorecardPrivateRepo, strconv.FormatBool(tt.isPrivateRepo)) - } - if tt.setEnvPublishResults { - os.Setenv(env.InputPublishResults, strconv.FormatBool(!tt.isPrivateRepo)) + if tt.setGithubEventPath { + os.Setenv(EnvGithubEventPath, tt.githubEventPath) } - o := &Options{ - ScorecardOpts: tt.fields.ScorecardOpts, - GithubEventName: tt.fields.GithubEventName, - ScorecardBin: tt.fields.ScorecardBin, - DefaultBranch: tt.fields.DefaultBranch, - PrivateRepoStr: tt.fields.PrivateRepo, - PublishResultsStr: tt.fields.PublishResults, - ResultsFile: tt.fields.ResultsFile, - } + o, _ := New() //nolint:errcheck // TODO(lint): Fix + t.Logf("options before initialization: %+v", o) + optsBeforeInit := o + if err := o.Initialize(); (err != nil) != tt.wantErr { + t.Logf("options after initialization: %+v", o) + t.Logf("options comparison: %s", cmp.Diff(optsBeforeInit, o)) t.Errorf("Options.Initialize() error = %v, wantErr %v", err, tt.wantErr) } }) From d9cf2463e12de01f09e2d0bcd53b231b8ecf5a99 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Tue, 1 Mar 2022 23:43:25 -0500 Subject: [PATCH 05/17] go.mod: Update scorecard to v4.1.1-0.20220306220811-4b9f0389c6f6 Signed-off-by: Stephen Augustus --- go.mod | 38 ++++++++++++++++++++++----- go.sum | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 106 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index aee8fe2d..e55eec45 100644 --- a/go.mod +++ b/go.mod @@ -5,31 +5,57 @@ go 1.17 require ( github.com/caarlos0/env/v6 v6.9.1 github.com/google/go-cmp v0.5.7 - github.com/ossf/scorecard/v4 v4.1.1-0.20220227152949-d71866ca16b4 + github.com/ossf/scorecard/v4 v4.1.1-0.20220306220811-4b9f0389c6f6 ) require ( cloud.google.com/go v0.100.2 // indirect - cloud.google.com/go/compute v0.1.0 // indirect + cloud.google.com/go/compute v1.3.0 // indirect cloud.google.com/go/iam v0.1.1 // indirect cloud.google.com/go/storage v1.18.2 // indirect github.com/bombsimon/logrusr/v2 v2.0.1 // indirect + github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 // indirect + github.com/containerd/typeurl v1.0.2 // indirect + github.com/fatih/color v1.13.0 // indirect github.com/go-logr/logr v1.2.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-github/v38 v38.1.0 // indirect + github.com/google/go-github/v41 v41.0.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/google/wire v0.5.0 // indirect github.com/googleapis/gax-go/v2 v2.1.1 // indirect + github.com/h2non/filetype v1.1.3 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/moby/buildkit v0.8.3 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rhysd/actionlint v1.6.9 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/robfig/cron v1.2.0 // indirect + github.com/shurcooL/githubv4 v0.0.0-20201206200315-234843c633fa // indirect + github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a // indirect github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spf13/cobra v1.3.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect go.opencensus.io v0.23.0 // indirect gocloud.dev v0.24.0 // indirect - golang.org/x/net v0.0.0-20211216030914-fe4d6282115f // indirect + golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect + golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect - golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20220209214540-3681064d5158 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - google.golang.org/api v0.67.0 // indirect + google.golang.org/api v0.70.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00 // indirect + google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf // indirect google.golang.org/grpc v1.44.0 // indirect google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + mvdan.cc/sh/v3 v3.4.3 // indirect ) diff --git a/go.sum b/go.sum index 2698fa9d..f5c1d959 100644 --- a/go.sum +++ b/go.sum @@ -51,9 +51,10 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.28.0/go.mod h1:/Lo9aP2BX/WDiOvHiXX/UQWH9vLDFRABeyqFA+fjkqE= -cloud.google.com/go/compute v0.1.0 h1:rSUBvAyVwNJ5uQCKNJFMwPtTvJkfN38b6Pvb9zZoqJ8= +cloud.google.com/go/bigquery v1.29.0/go.mod h1:6zew/wq1L4nhPvzx2T5k9xkpgFCP2RTztr+qX2DKars= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0 h1:mPL/MzDDYHsh5tHRS9mhmhWlcgClCrCa6ApQCU6wnHI= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/datacatalog v1.1.0/go.mod h1:XiA5mWWnIFIcwFmsZGLOZRyX4AhXdh2SYpcQJMmkHiA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= @@ -120,6 +121,7 @@ github.com/Azure/go-amqp v0.13.0/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1 github.com/Azure/go-amqp v0.13.11/go.mod h1:D5ZrjQqB1dyp1A+G73xeL/kNn7D5qHJIIsNNps7YNmk= github.com/Azure/go-amqp v0.13.12/go.mod h1:D5ZrjQqB1dyp1A+G73xeL/kNn7D5qHJIIsNNps7YNmk= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -223,6 +225,7 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -295,6 +298,7 @@ github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6 github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 h1:tXKVfhE7FcSkhkv0UwkLvPDeZ4kz6OXd0PKPlFqf81M= github.com/bradleyfalzon/ghinstallation/v2 v2.0.4/go.mod h1:B40qPqJxWE0jDZgOR1JmaMy+4AY1eBP+IByOvqyAKp0= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= @@ -305,6 +309,7 @@ github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGr github.com/caarlos0/env/v6 v6.9.1 h1:zOkkjM0F6ltnQ5eBX6IPI41UP/KDGEK7rRPwGCNos8k= github.com/caarlos0/env/v6 v6.9.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Zu0ddvwc= github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= +github.com/carolynvs/magex v0.6.0/go.mod h1:hqaEkr9TAv+kFb/5wgDiTdszF13rpe0Q+bWHmTe6N74= github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -338,6 +343,7 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -412,6 +418,7 @@ github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Ev github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= @@ -500,6 +507,8 @@ github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvyukov/go-fuzz v0.0.0-20210914135545-4980593459a1/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= @@ -526,12 +535,14 @@ github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.13.1 h1:xVm/f9seEhZFL9+n5kv5XLrGwy6elc4V9v/XFY2vmd8= github.com/frankban/quicktest v1.13.1/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -622,7 +633,9 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -642,6 +655,7 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -663,6 +677,7 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= @@ -704,11 +719,15 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= github.com/google/go-containerregistry v0.8.0/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-github/v38 v38.1.0 h1:C6h1FkaITcBFK7gAmq4eFzt6gbhEhk7L5z6R3Uva+po= github.com/google/go-github/v38 v38.1.0/go.mod h1:cStvrz/7nFr0FoENgG6GLbp53WaelXucT+BBz/3VKx4= +github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= github.com/google/go-replayers/grpcreplay v1.1.0 h1:S5+I3zYyZ+GQz68OfbURDdt/+cSMqCK1wrvNx7WBzTE= @@ -803,6 +822,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= @@ -861,6 +881,7 @@ github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= @@ -906,12 +927,14 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -920,12 +943,14 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= @@ -935,6 +960,7 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -953,6 +979,7 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= @@ -965,9 +992,11 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= @@ -977,7 +1006,9 @@ github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpe github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= @@ -999,6 +1030,7 @@ github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/moby/buildkit v0.8.3 h1:vFlwUQ6BZE1loZ8zoZH3fYgmA1djFCS3DrOhCVU6ZZE= github.com/moby/buildkit v0.8.3/go.mod h1:jUezwyOvKdkbcvR66WuKzPYQUO3sQ8i/eChLZ7kEmg8= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= @@ -1011,6 +1043,7 @@ github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGq github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -1030,6 +1063,7 @@ github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5w github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -1045,8 +1079,10 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1058,7 +1094,9 @@ github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -1094,8 +1132,8 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/ossf/scorecard/v4 v4.1.1-0.20220227152949-d71866ca16b4 h1:LwuPOLzif3rEnB7Ta5PDmDPTxt5ld7dt5sS624jIztE= -github.com/ossf/scorecard/v4 v4.1.1-0.20220227152949-d71866ca16b4/go.mod h1:qs5PAO9RACLADHXR4jYFz18M6DlGre+Won6bmRWUnhE= +github.com/ossf/scorecard/v4 v4.1.1-0.20220306220811-4b9f0389c6f6 h1:6nDczrQC8+cSSOC2ibMrLVQszjF+Xv8tgFCtAZKadtI= +github.com/ossf/scorecard/v4 v4.1.1-0.20220306220811-4b9f0389c6f6/go.mod h1:qS/gkgUGZ5m8QWJ2MAwNA1QUDMVQYCcFTGkl+5tcKTE= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= @@ -1106,10 +1144,12 @@ github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= @@ -1161,8 +1201,11 @@ github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1: github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/rhysd/actionlint v1.6.9 h1:8rQQ76o88zctUCzukt0A5O/FO003wTGbkLQuwQkMf9c= github.com/rhysd/actionlint v1.6.9/go.mod h1:0AA4pvZ2nrZHT6D86eUhieH2NFmLqhxrNex0NEa2A2g= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -1170,6 +1213,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1-0.20210923151022-86f73c517451 h1:d1PiN4RxzIFXCJTvRkvSkKqwtRAl5ZV4lATKtQI0B7I= github.com/rogpeppe/go-internal v1.8.1-0.20210923151022-86f73c517451/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= @@ -1184,6 +1228,7 @@ github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43 github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= @@ -1194,9 +1239,11 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/githubv4 v0.0.0-20201206200315-234843c633fa h1:jozR3igKlnYCj9IVHOVump59bp07oIRoLQ/CcjMYIUA= github.com/shurcooL/githubv4 v0.0.0-20201206200315-234843c633fa/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a h1:KikTa6HtAK8cS1qjvUvvq4QO21QnwC+EfvB+OAuZ/ZU= github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1229,6 +1276,7 @@ github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKv github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1236,6 +1284,7 @@ github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzu github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= @@ -1397,6 +1446,7 @@ golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1490,12 +1540,14 @@ golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= @@ -1505,8 +1557,9 @@ golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1543,6 +1596,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1667,11 +1721,13 @@ golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210916214954-140adaaadfaf/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1838,8 +1894,9 @@ google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3h google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.67.0 h1:lYaaLa+x3VVUhtosaK9xihwQ9H9KRa557REHwwZ2orM= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0 h1:67zQnAE0T2rB0A3CwLSas0K+SbVzSxP+zTLkQLexeiw= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1938,8 +1995,10 @@ google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00 h1:zmf8Yq9j+IyTpps+paSkmHkSu5fJlRKy69LxRzc17Q0= google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf h1:SVYXkUz2yZS9FWb2Gm8ivSlbNQzL2Z/NpPKE3RG2jWk= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= @@ -1999,6 +2058,8 @@ gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -2026,10 +2087,12 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= @@ -2096,6 +2159,7 @@ k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuB k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= @@ -2104,6 +2168,7 @@ modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= mvdan.cc/editorconfig v0.2.0/go.mod h1:lvnnD3BNdBYkhq+B4uBuFFKatfp02eB6HixDvEz91C0= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/sh/v3 v3.4.3 h1:zbuKH7YH9cqU6PGajhFFXZY7dhPXcDr55iN/cUAqpuw= mvdan.cc/sh/v3 v3.4.3/go.mod h1:p/tqPPI4Epfk2rICAe2RoaNd8HBSJ8t9Y2DA9yQlbzY= mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= @@ -2115,6 +2180,7 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/release-utils v0.5.0/go.mod h1:t9pL38kZkTBVDcjL1y7ajrkNQFLiArVAjOVO0sxzFF0= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= From 85658fb1c018452645c2320aeae4a41c3603a767 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Wed, 2 Mar 2022 23:46:55 -0500 Subject: [PATCH 06/17] entrypoint: Wrap scorecard with additional flags and hide unused Signed-off-by: Stephen Augustus --- entrypoint/entrypoint.go | 52 +++++++++++++++++++++++++++++++++------- go.mod | 6 ++++- go.sum | 6 +++++ main.go | 11 ++++----- options/options.go | 38 ++++++++++++++++------------- 5 files changed, 80 insertions(+), 33 deletions(-) diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go index 9ef28061..4f41f3de 100644 --- a/entrypoint/entrypoint.go +++ b/entrypoint/entrypoint.go @@ -25,7 +25,11 @@ import ( "os/exec" "strings" + "github.com/spf13/cobra" + "github.com/ossf/scorecard-action/options" + "github.com/ossf/scorecard/v4/cmd" + scopts "github.com/ossf/scorecard/v4/options" ) // Errors. @@ -36,6 +40,34 @@ type repo struct { Private bool `json:"private"` } +// New creates a new scorecard command which can be used as an entrypoint for +// GitHub Actions. +func New() *cobra.Command { + opts := options.New() + opts.Initialize() + scOpts := opts.ScorecardOpts + + actionCmd := cmd.New(scOpts) + + actionCmd.Flags().StringVar( + &scOpts.ResultsFile, + "output-file", + scOpts.ResultsFile, + "path to output results to", + ) + + hiddenFlags := []string{ + scopts.FlagNPM, + scopts.FlagPyPI, + scopts.FlagRubyGems, + } + for _, f := range hiddenFlags { + actionCmd.Flags().MarkHidden(f) + } + + return actionCmd +} + // Run is the entrypoint for the action. func Run(o *options.Options) error { if err := o.Initialize(); err != nil { @@ -83,7 +115,7 @@ func Run(o *options.Options) error { return fmt.Errorf("running scorecard command: %w", err) } - results, err := ioutil.ReadFile(o.ResultsFile) + results, err := ioutil.ReadFile(o.ScorecardOpts.ResultsFile) if err != nil { return fmt.Errorf("reading results file: %w", err) } @@ -125,11 +157,13 @@ func getRepo(name, token string) (repo, error) { } func getScorecardCmd(o *options.Options) (*exec.Cmd, error) { - if o.ScorecardBin == "" { - return nil, errEmptyScorecardBin - } + /* + if o.ScorecardBin == "" { + return nil, errEmptyScorecardBin + } + */ var result exec.Cmd - result.Path = o.ScorecardBin + //result.Path = o.ScorecardBin // if pull_request if strings.Contains(o.GithubEventName, "pull_request") { @@ -142,7 +176,7 @@ func getScorecardCmd(o *options.Options) (*exec.Cmd, error) { o.ScorecardOpts.Format, "--show-details", ">", - o.ResultsFile, + o.ScorecardOpts.ResultsFile, } return &result, nil } @@ -156,7 +190,7 @@ func getScorecardCmd(o *options.Options) (*exec.Cmd, error) { o.ScorecardOpts.PolicyFile, "--show-details", ">", - o.ResultsFile, + o.ScorecardOpts.ResultsFile, } return &result, nil } @@ -175,7 +209,7 @@ func getScorecardCmd(o *options.Options) (*exec.Cmd, error) { enabledChecks, "--show-details", ">", - o.ResultsFile, + o.ScorecardOpts.ResultsFile, } return &result, nil } @@ -190,7 +224,7 @@ func getScorecardCmd(o *options.Options) (*exec.Cmd, error) { o.ScorecardOpts.PolicyFile, "--show-details", ">", - o.ResultsFile, + o.ScorecardOpts.ResultsFile, } return &result, nil diff --git a/go.mod b/go.mod index e55eec45..81f092a5 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/caarlos0/env/v6 v6.9.1 github.com/google/go-cmp v0.5.7 github.com/ossf/scorecard/v4 v4.1.1-0.20220306220811-4b9f0389c6f6 + github.com/spf13/cobra v1.3.0 ) require ( @@ -15,6 +16,7 @@ require ( cloud.google.com/go/storage v1.18.2 // indirect github.com/bombsimon/logrusr/v2 v2.0.1 // indirect github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 // indirect + github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/containerd/typeurl v1.0.2 // indirect github.com/fatih/color v1.13.0 // indirect github.com/go-logr/logr v1.2.2 // indirect @@ -33,6 +35,7 @@ require ( github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/moby/buildkit v0.8.3 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rhysd/actionlint v1.6.9 // indirect github.com/rivo/uniseg v0.2.0 // indirect @@ -40,7 +43,6 @@ require ( github.com/shurcooL/githubv4 v0.0.0-20201206200315-234843c633fa // indirect github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a // indirect github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spf13/cobra v1.3.0 // indirect github.com/spf13/pflag v1.0.5 // indirect go.opencensus.io v0.23.0 // indirect gocloud.dev v0.24.0 // indirect @@ -56,6 +58,8 @@ require ( google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf // indirect google.golang.org/grpc v1.44.0 // indirect google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect mvdan.cc/sh/v3 v3.4.3 // indirect + sigs.k8s.io/release-utils v0.5.0 // indirect ) diff --git a/go.sum b/go.sum index f5c1d959..17cf64c2 100644 --- a/go.sum +++ b/go.sum @@ -343,6 +343,7 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= @@ -1068,6 +1069,7 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1362,8 +1364,11 @@ github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f h1:mvXjJIHRZyhNuGassLTcXTwjiWq7NmjdavZsUnmFybQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -2180,6 +2185,7 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/release-utils v0.5.0 h1:TVJUoFLjfYYdJ11+mIw6eb44XIOC5BI3QQKiKYCtk/8= sigs.k8s.io/release-utils v0.5.0/go.mod h1:t9pL38kZkTBVDcjL1y7ajrkNQFLiArVAjOVO0sxzFF0= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= diff --git a/main.go b/main.go index ca10c89e..87f5b1f0 100644 --- a/main.go +++ b/main.go @@ -15,16 +15,13 @@ package main import ( + "log" + "github.com/ossf/scorecard-action/entrypoint" - "github.com/ossf/scorecard-action/options" ) -var opts = &options.Options{} - func main() { - err := entrypoint.Run(opts) - if err != nil { - // TODO: Don't panic! - panic(err) + if err := entrypoint.New().Execute(); err != nil { + log.Fatalf("error during command execution: %v", err) } } diff --git a/options/options.go b/options/options.go index 6b63eed3..d2e6f3c7 100644 --- a/options/options.go +++ b/options/options.go @@ -26,6 +26,7 @@ import ( "github.com/caarlos0/env/v6" + "github.com/ossf/scorecard/v4/options" scopts "github.com/ossf/scorecard/v4/options" ) @@ -43,11 +44,8 @@ type Options struct { ScorecardOpts *scopts.Options // Scorecard command-line options. - ScorecardBin string `env:"SCORECARD_BIN"` EnabledChecks string `env:"ENABLED_CHECKS"` PolicyFile string `env:"SCORECARD_POLICY_FILE"` - Format string `env:"SCORECARD_RESULTS_FORMAT"` - ResultsFile string `env:"SCORECARD_RESULTS_FILE"` // TODO(options): This may be better as a bool PublishResultsStr string `env:"SCORECARD_PUBLISH_RESULTS"` @@ -86,42 +84,46 @@ type Options struct { } const ( - defaultScorecardBin = "/scorecard" defaultScorecardPolicyFile = "./policy.yml" + defaultFormat = options.FormatSarif ) // New TODO(lint): should have comment or be unexported (revive). -func New() (*Options, error) { +func New() *Options { opts := &Options{} if err := env.Parse(opts); err != nil { - return opts, fmt.Errorf("parsing entrypoint env vars: %w", err) + // TODO(options): Consider making this an error. + fmt.Printf("parsing entrypoint env vars: %+v", err) } // TODO(options): Push options into scorecard.Options once/if it supports // validation. scOpts := scopts.New() + if err := opts.Initialize(); err != nil { + // TODO(options): Consider making this an error. + fmt.Printf("initializing scorecard-action options: %+v", err) + } + // TODO(options): Move this set-or-default logic to its own function. scOpts.PolicyFile = opts.PolicyFile if scOpts.PolicyFile == "" { scOpts.PolicyFile = defaultScorecardPolicyFile } - if opts.ScorecardBin == "" { - opts.ScorecardBin = defaultScorecardBin - } - opts.ScorecardOpts = scOpts - if opts.ResultsFile == "" { - opts.ResultsFile = opts.InputResultsFile + if opts.ScorecardOpts.ResultsFile == "" { + opts.ScorecardOpts.ResultsFile = opts.InputResultsFile // TODO(options): We should check if this is empty. } - if opts.Format == "" { - opts.Format = opts.InputResultsFormat + if opts.ScorecardOpts.Format == "" { + opts.ScorecardOpts.Format = opts.InputResultsFormat + } + if opts.ScorecardOpts.Format == "" { + opts.ScorecardOpts.Format = defaultFormat } - opts.ScorecardOpts.Format = opts.Format if opts.PublishResultsStr == "" { opts.PublishResultsStr = opts.InputPublishResults @@ -130,9 +132,13 @@ func New() (*Options, error) { } } + if err := opts.ScorecardOpts.Validate(); err != nil { + // TODO(options): Consider making this an error. + fmt.Printf("validating scorecard options: %+v", err) + } // TODO(options): Consider running Initialize() before returning. // TODO(options): Consider running Validate() before returning. - return opts, nil + return opts } // Initialize initializes the environment variables required for the action. From 325a9361d0d9a2acee8dedb9effbdcbd6d4f2570 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Thu, 3 Mar 2022 10:52:50 -0500 Subject: [PATCH 07/17] entrypoint: Add `print-config` command Signed-off-by: Stephen Augustus --- entrypoint/entrypoint.go | 16 +++++++++++++++- options/env.go | 4 ++-- options/options.go | 14 ++++++++++++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go index 4f41f3de..fcd87ca5 100644 --- a/entrypoint/entrypoint.go +++ b/entrypoint/entrypoint.go @@ -65,9 +65,23 @@ func New() *cobra.Command { actionCmd.Flags().MarkHidden(f) } + // Add sub-commands. + actionCmd.AddCommand(printConfigCmd(opts)) + return actionCmd } +func printConfigCmd(o *options.Options) *cobra.Command { + cmd := &cobra.Command{ + Use: "print-config", + Run: func(cmd *cobra.Command, args []string) { + o.Print() + }, + } + + return cmd +} + // Run is the entrypoint for the action. func Run(o *options.Options) error { if err := o.Initialize(); err != nil { @@ -98,7 +112,7 @@ func Run(o *options.Options) error { o.SetRepoVisibility(repo.Private) o.SetPublishResults() - o.Print(os.Stdout) + o.Print() if err := o.Validate(os.Stderr); err != nil { return fmt.Errorf("validating options: %w", err) diff --git a/options/env.go b/options/env.go index 3e2813bf..780a3cf5 100644 --- a/options/env.go +++ b/options/env.go @@ -57,8 +57,8 @@ func CheckRequiredEnv() error { return nil } -// EnvPrint is a function to print the ENV variables. -func EnvPrint(writer io.Writer) { +// envPrint is a function to print the ENV variables. +func envPrint(writer io.Writer) { fmt.Fprintf(writer, "GITHUB_EVENT_PATH=%s\n", os.Getenv(EnvGithubEventPath)) fmt.Fprintf(writer, "GITHUB_EVENT_NAME=%s\n", os.Getenv(EnvGithubEventName)) fmt.Fprintf(writer, "GITHUB_REPOSITORY=%s\n", os.Getenv(EnvGithubRepository)) diff --git a/options/options.go b/options/options.go index d2e6f3c7..dd0997d8 100644 --- a/options/options.go +++ b/options/options.go @@ -138,6 +138,7 @@ func New() *Options { } // TODO(options): Consider running Initialize() before returning. // TODO(options): Consider running Validate() before returning. + //opts.Print() return opts } @@ -197,8 +198,17 @@ func (o *Options) CheckRequired() error { } // Print is a function to print options. -func (o *Options) Print(writer io.Writer) { - EnvPrint(writer) +func (o *Options) Print() { + fmt.Printf("Event file: %s\n", o.CheckGithubEventPath) + fmt.Printf("Event name: %s\n", o.GithubEventName) + fmt.Printf("Ref: %s\n", o.ScorecardOpts.Commit) + fmt.Printf("Repository: %s\n", o.ScorecardOpts.Repo) + fmt.Printf("Fork repository: %s\n", o.IsForkStr) + fmt.Printf("Private repository: %s\n", o.PrivateRepoStr) + fmt.Printf("Publication enabled: %+v\n", o.ScorecardOpts.PublishResults) + fmt.Printf("Format: %s\n", o.ScorecardOpts.Format) + fmt.Printf("Policy file: %s\n", o.ScorecardOpts.PolicyFile) + fmt.Printf("Default branch: %s\n", o.DefaultBranch) } // SetRepository TODO(lint): should have comment or be unexported (revive). From da582e86e30ba0dd0d8d3716efc3bf0e2468d8e9 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Thu, 3 Mar 2022 12:07:27 -0500 Subject: [PATCH 08/17] options: Process GitHub info together Signed-off-by: Stephen Augustus --- entrypoint/entrypoint.go | 2 ++ options/options.go | 75 ++++++++++++++++------------------------ 2 files changed, 31 insertions(+), 46 deletions(-) diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go index fcd87ca5..62010348 100644 --- a/entrypoint/entrypoint.go +++ b/entrypoint/entrypoint.go @@ -35,6 +35,7 @@ import ( // Errors. var errEmptyScorecardBin = errors.New("scorecard_bin variable is empty") +// TODO(github): Move to separate package. type repo struct { DefaultBranch string `json:"default_branch"` Private bool `json:"private"` @@ -143,6 +144,7 @@ func Run(o *options.Options) error { // It is decided to not use the golang GitHub library because of the // dependency on the github.com/google/go-github/github library // which will in turn require other dependencies. +// TODO(github): Move to separate package. func getRepo(name, token string) (repo, error) { var r repo ctx := context.Background() diff --git a/options/options.go b/options/options.go index dd0997d8..f6ee07a6 100644 --- a/options/options.go +++ b/options/options.go @@ -70,11 +70,11 @@ type Options struct { // GitHub options. // TODO(github): Consider making this a separate options set so we can // encapsulate handling - GithubEventName string `env:"GITHUB_EVENT_NAME"` - CheckGithubEventPath string `env:"GITHUB_EVENT_PATH"` - GithubRef string `env:"GITHUB_REF"` - GithubRepository string `env:"GITHUB_REPOSITORY"` - GithubWorkspace string `env:"GITHUB_WORKSPACE"` + GithubEventName string `env:"GITHUB_EVENT_NAME"` + GithubEventPath string `env:"GITHUB_EVENT_PATH"` + GithubRef string `env:"GITHUB_REF"` + GithubRepository string `env:"GITHUB_REPOSITORY"` + GithubWorkspace string `env:"GITHUB_WORKSPACE"` DefaultBranch string `env:"SCORECARD_DEFAULT_BRANCH"` // TODO(options): This may be better as a bool @@ -84,7 +84,7 @@ type Options struct { } const ( - defaultScorecardPolicyFile = "./policy.yml" + defaultScorecardPolicyFile = "policy.yml" defaultFormat = options.FormatSarif ) @@ -102,7 +102,7 @@ func New() *Options { if err := opts.Initialize(); err != nil { // TODO(options): Consider making this an error. - fmt.Printf("initializing scorecard-action options: %+v", err) + fmt.Printf("initializing scorecard-action options: %+v\n", err) } // TODO(options): Move this set-or-default logic to its own function. @@ -112,6 +112,10 @@ func New() *Options { } opts.ScorecardOpts = scOpts + if err := opts.ScorecardOpts.Validate(); err != nil { + // TODO(options): Consider making this an error. + fmt.Printf("validating scorecard options: %+v\n", err) + } if opts.ScorecardOpts.ResultsFile == "" { opts.ScorecardOpts.ResultsFile = opts.InputResultsFile @@ -132,10 +136,6 @@ func New() *Options { } } - if err := opts.ScorecardOpts.Validate(); err != nil { - // TODO(options): Consider making this an error. - fmt.Printf("validating scorecard options: %+v", err) - } // TODO(options): Consider running Initialize() before returning. // TODO(options): Consider running Validate() before returning. //opts.Print() @@ -157,7 +157,7 @@ func (o *Options) Initialize() error { o.EnableLicense = "1" o.EnableDangerousWorkflow = "1" - return CheckGithubEventPath() + return o.SetRepoInfo() } // Validate validates the scorecard configuration. @@ -199,7 +199,7 @@ func (o *Options) CheckRequired() error { // Print is a function to print options. func (o *Options) Print() { - fmt.Printf("Event file: %s\n", o.CheckGithubEventPath) + fmt.Printf("Event file: %s\n", o.GithubEventPath) fmt.Printf("Event name: %s\n", o.GithubEventName) fmt.Printf("Ref: %s\n", o.ScorecardOpts.Commit) fmt.Printf("Repository: %s\n", o.ScorecardOpts.Repo) @@ -265,54 +265,37 @@ func GetGithubWorkspace() string { // CheckGithubEventPath gets the path to the GitHub event and sets the // SCORECARD_IS_FORK environment variable. // TODO(options): Check if this actually needs to be exported. -func CheckGithubEventPath() error { - var result string - var exists bool - - if result, exists = os.LookupEnv(EnvGithubEventPath); !exists { - return ErrGitHubEventPathNotSet - } - - if result == "" { +// TODO(options): Choose a more accurate name for what this does. +func (o *Options) SetRepoInfo() error { + eventPath := o.GithubEventPath + if eventPath == "" { return ErrGitHubEventPathEmpty } - data, err := ioutil.ReadFile(result) + repoInfo, err := ioutil.ReadFile(eventPath) if err != nil { - return fmt.Errorf("error reading %s: %w", EnvGithubEventPath, err) + return fmt.Errorf("reading GitHub event path: %w", err) } - isFork, err := RepoIsFork(string(data)) - if err != nil { - return fmt.Errorf("error checking if scorecard is a fork: %w", err) - } - - isForkStr := strconv.FormatBool(isFork) - if err := os.Setenv(EnvScorecardFork, isForkStr); err != nil { - return fmt.Errorf("error setting %s: %w", EnvScorecardFork, err) - } - - return err -} - -// RepoIsFork checks if the current repo is a fork. -func RepoIsFork(ghEventPath string) (bool, error) { - if ghEventPath == "" { - return false, ErrGitHubEventPath - } /* https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#github_repository_is_fork GITHUB_REPOSITORY_IS_FORK is true if the repository is a fork. */ type repo struct { Repository struct { - Fork bool `json:"fork"` + DefaultBranch string `json:"default_branch"` + Fork bool `json:"fork"` + Private bool `json:"private"` } `json:"repository"` } var r repo - if err := json.Unmarshal([]byte(ghEventPath), &r); err != nil { - return false, fmt.Errorf("error unmarshalling ghEventPath: %w", err) + if err := json.Unmarshal([]byte(repoInfo), &r); err != nil { + return fmt.Errorf("unmarshalling repo info: %w", err) } - return r.Repository.Fork, nil + o.PrivateRepoStr = strconv.FormatBool(r.Repository.Private) + o.IsForkStr = strconv.FormatBool(r.Repository.Fork) + o.DefaultBranch = r.Repository.DefaultBranch + + return nil } From 25dd5d4d5f9ceb9eed072c0e7061e3a9009e01e8 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Thu, 3 Mar 2022 15:04:34 -0500 Subject: [PATCH 09/17] options: Cleanups and defaulting for action-specific settings Signed-off-by: Stephen Augustus --- options/options.go | 83 ++++++++++++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/options/options.go b/options/options.go index f6ee07a6..d0cdf3f6 100644 --- a/options/options.go +++ b/options/options.go @@ -45,9 +45,6 @@ type Options struct { // Scorecard command-line options. EnabledChecks string `env:"ENABLED_CHECKS"` - PolicyFile string `env:"SCORECARD_POLICY_FILE"` - // TODO(options): This may be better as a bool - PublishResultsStr string `env:"SCORECARD_PUBLISH_RESULTS"` // Input options. // TODO(options): These input options shadow the some of the SCORECARD_ @@ -63,7 +60,6 @@ type Options struct { InputPublishResults string `env:"INPUT_PUBLISH_RESULTS"` // Scorecard checks. - EnableSarif string `env:"ENABLE_SARIF"` EnableLicense string `env:"ENABLE_LICENSE"` EnableDangerousWorkflow string `env:"ENABLE_DANGEROUS_WORKFLOW"` @@ -85,7 +81,7 @@ type Options struct { const ( defaultScorecardPolicyFile = "policy.yml" - defaultFormat = options.FormatSarif + formatSarif = options.FormatSarif ) // New TODO(lint): should have comment or be unexported (revive). @@ -106,39 +102,37 @@ func New() *Options { } // TODO(options): Move this set-or-default logic to its own function. - scOpts.PolicyFile = opts.PolicyFile - if scOpts.PolicyFile == "" { - scOpts.PolicyFile = defaultScorecardPolicyFile + if opts.InputResultsFormat != "" { + scOpts.Format = opts.InputResultsFormat + } else { + scOpts.EnableSarif = true + scOpts.Format = formatSarif + os.Setenv(options.EnvVarEnableSarif, trueStr) + if scOpts.Format == "" { + // Default the scorecard command to using SARIF format. + if scOpts.PolicyFile == "" { + // TODO(policy): Should we default or error here? + scOpts.PolicyFile = defaultScorecardPolicyFile + } + } } - opts.ScorecardOpts = scOpts - if err := opts.ScorecardOpts.Validate(); err != nil { + if err := scOpts.Validate(); err != nil { // TODO(options): Consider making this an error. fmt.Printf("validating scorecard options: %+v\n", err) } - if opts.ScorecardOpts.ResultsFile == "" { - opts.ScorecardOpts.ResultsFile = opts.InputResultsFile - // TODO(options): We should check if this is empty. - } - - if opts.ScorecardOpts.Format == "" { - opts.ScorecardOpts.Format = opts.InputResultsFormat - } - if opts.ScorecardOpts.Format == "" { - opts.ScorecardOpts.Format = defaultFormat - } + opts.ScorecardOpts = scOpts + opts.SetPublishResults() - if opts.PublishResultsStr == "" { - opts.PublishResultsStr = opts.InputPublishResults - if opts.PublishResultsStr == "" { - opts.PublishResultsStr = "false" + if opts.ScorecardOpts.PublishResults { + if scOpts.ResultsFile == "" { + scOpts.ResultsFile = opts.InputResultsFile + // TODO(options): We should check if this is empty. } } - // TODO(options): Consider running Initialize() before returning. // TODO(options): Consider running Validate() before returning. - //opts.Print() return opts } @@ -153,7 +147,6 @@ func (o *Options) Initialize() error { GITHUB_ACTIONS is true in GitHub env. */ - o.EnableSarif = "1" o.EnableLicense = "1" o.EnableDangerousWorkflow = "1" @@ -244,11 +237,37 @@ func (o *Options) SetDefaultBranch(defaultBranch string) error { // SetPublishResults sets whether results should be published based on a // repository's visibility. func (o *Options) SetPublishResults() { - isPrivateRepo := o.PrivateRepoStr - if isPrivateRepo == trueStr || isPrivateRepo == "" { - o.PublishResultsStr = "false" + // Check INPUT_PUBLISH_RESULTS + var inputBool bool + var inputErr error + input := os.Getenv(EnvInputPublishResults) + if input != "" { + inputBool, inputErr = strconv.ParseBool(o.InputPublishResults) + if inputErr != nil { + // TODO(options): Consider making this an error. + fmt.Printf( + "could not parse a valid bool from %s (%s): %+v\n", + input, + EnvInputPublishResults, + inputErr, + ) + } + } + + privateRepo, err := strconv.ParseBool(o.PrivateRepoStr) + if err != nil { + // TODO(options): Consider making this an error. + fmt.Printf( + "parsing bool from %s: %+v\n", + o.PrivateRepoStr, + err, + ) + } + + if privateRepo { + o.ScorecardOpts.PublishResults = false } else { - o.PublishResultsStr = trueStr + o.ScorecardOpts.PublishResults = o.ScorecardOpts.PublishResults || inputBool } } From 216f6fafd027efd6a479bea3d5dd4d391836a14c Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Thu, 3 Mar 2022 15:17:56 -0500 Subject: [PATCH 10/17] Remove/comment out extraneous code/tests Signed-off-by: Stephen Augustus --- entrypoint/entrypoint.go | 139 --------------------------------------- go.mod | 2 +- go.sum | 1 + options/options_test.go | 11 +--- 4 files changed, 4 insertions(+), 149 deletions(-) diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go index 62010348..3154c95d 100644 --- a/entrypoint/entrypoint.go +++ b/entrypoint/entrypoint.go @@ -17,13 +17,8 @@ package entrypoint import ( "context" "encoding/json" - "errors" "fmt" - "io/ioutil" "net/http" - "os" - "os/exec" - "strings" "github.com/spf13/cobra" @@ -32,9 +27,6 @@ import ( scopts "github.com/ossf/scorecard/v4/options" ) -// Errors. -var errEmptyScorecardBin = errors.New("scorecard_bin variable is empty") - // TODO(github): Move to separate package. type repo struct { DefaultBranch string `json:"default_branch"` @@ -83,63 +75,6 @@ func printConfigCmd(o *options.Options) *cobra.Command { return cmd } -// Run is the entrypoint for the action. -func Run(o *options.Options) error { - if err := o.Initialize(); err != nil { - return fmt.Errorf("initializing options: %w", err) - } - - if err := o.CheckRequired(); err != nil { - return fmt.Errorf("checking if required options are set: %w", err) - } - - // The repository should have already been initialized, so if for whatever - // reason it hasn't, we should exit here with an appropriate error - if o.RepoIsSet() { - return fmt.Errorf("repository cannot be empty") //nolint:goerr113 // TODO(lint): Fix - } - - token := options.GetGithubToken() - repo, err := getRepo(o.Repo(), token) - if err != nil { - return fmt.Errorf("getting repository information: %w", err) - } - - err = o.SetDefaultBranch(repo.DefaultBranch) - if err != nil { - return fmt.Errorf("setting default branch: %w", err) - } - - o.SetRepoVisibility(repo.Private) - o.SetPublishResults() - - o.Print() - - if err := o.Validate(os.Stderr); err != nil { - return fmt.Errorf("validating options: %w", err) - } - - // gets the cmd run settings - cmd, err := getScorecardCmd(o) - if err != nil { - return err - } - - cmd.Dir = options.GetGithubWorkspace() - if err := cmd.Run(); err != nil { - return fmt.Errorf("running scorecard command: %w", err) - } - - results, err := ioutil.ReadFile(o.ScorecardOpts.ResultsFile) - if err != nil { - return fmt.Errorf("reading results file: %w", err) - } - - fmt.Println(string(results)) - - return nil -} - // getRepo is a function to get the repository information. // It is decided to not use the golang GitHub library because of the // dependency on the github.com/google/go-github/github library @@ -171,77 +106,3 @@ func getRepo(name, token string) (repo, error) { return r, nil } - -func getScorecardCmd(o *options.Options) (*exec.Cmd, error) { - /* - if o.ScorecardBin == "" { - return nil, errEmptyScorecardBin - } - */ - var result exec.Cmd - //result.Path = o.ScorecardBin - - // if pull_request - if strings.Contains(o.GithubEventName, "pull_request") { - // empty policy file - if o.ScorecardOpts.PolicyFile == "" { - result.Args = []string{ - "--local", - ".", - "--format", - o.ScorecardOpts.Format, - "--show-details", - ">", - o.ScorecardOpts.ResultsFile, - } - return &result, nil - } - - result.Args = []string{ - "--local", - ".", - "--format", - o.ScorecardOpts.Format, - "--policy", - o.ScorecardOpts.PolicyFile, - "--show-details", - ">", - o.ScorecardOpts.ResultsFile, - } - return &result, nil - } - - var enabledChecks string - if o.GithubEventName == "branch_protection_rule" { - enabledChecks = "--checks Branch-Protection" - } - - if o.ScorecardOpts.PolicyFile == "" { - result.Args = []string{ - "--repo", - o.ScorecardOpts.Repo, - "--format", - o.ScorecardOpts.Format, - enabledChecks, - "--show-details", - ">", - o.ScorecardOpts.ResultsFile, - } - return &result, nil - } - - result.Args = []string{ - "--repo", - o.ScorecardOpts.Repo, - "--format", - o.ScorecardOpts.Format, - enabledChecks, - "--policy", - o.ScorecardOpts.PolicyFile, - "--show-details", - ">", - o.ScorecardOpts.ResultsFile, - } - - return &result, nil -} diff --git a/go.mod b/go.mod index 81f092a5..7c1c2d63 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.17 require ( github.com/caarlos0/env/v6 v6.9.1 - github.com/google/go-cmp v0.5.7 github.com/ossf/scorecard/v4 v4.1.1-0.20220306220811-4b9f0389c6f6 github.com/spf13/cobra v1.3.0 ) @@ -24,6 +23,7 @@ require ( github.com/golang-jwt/jwt/v4 v4.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-cmp v0.5.7 // indirect github.com/google/go-github/v38 v38.1.0 // indirect github.com/google/go-github/v41 v41.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect diff --git a/go.sum b/go.sum index 17cf64c2..42f47830 100644 --- a/go.sum +++ b/go.sum @@ -1080,6 +1080,7 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= diff --git a/options/options_test.go b/options/options_test.go index e4110545..7cefd954 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -14,15 +14,6 @@ package options -import ( - "os" - "testing" - - "github.com/google/go-cmp/cmp" - - scopts "github.com/ossf/scorecard/v4/options" -) - var ( githubEventPathNonFork = "testdata/non-fork.json" githubEventPathFork = "testdata/fork.json" @@ -58,6 +49,7 @@ func TestNew(t *testing.T) { } */ +/* //nolint:paralleltest // Until/unless we consider providing a fake environment // to tests, running these in parallel will have unpredictable results as // we're mutating environment variables. @@ -115,3 +107,4 @@ func TestOptionsInitialize(t *testing.T) { }) } } +*/ From c52ccc7d4869de307a84226753375681688f127f Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Thu, 3 Mar 2022 17:25:00 -0500 Subject: [PATCH 11/17] github: Move GitHub logic to a separate package Signed-off-by: Stephen Augustus --- entrypoint/entrypoint.go | 43 ----------- github/github.go | 152 +++++++++++++++++++++++++++++++++++++++ options/options.go | 25 ++----- 3 files changed, 157 insertions(+), 63 deletions(-) create mode 100644 github/github.go diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go index 3154c95d..0745157d 100644 --- a/entrypoint/entrypoint.go +++ b/entrypoint/entrypoint.go @@ -15,11 +15,6 @@ package entrypoint import ( - "context" - "encoding/json" - "fmt" - "net/http" - "github.com/spf13/cobra" "github.com/ossf/scorecard-action/options" @@ -27,12 +22,6 @@ import ( scopts "github.com/ossf/scorecard/v4/options" ) -// TODO(github): Move to separate package. -type repo struct { - DefaultBranch string `json:"default_branch"` - Private bool `json:"private"` -} - // New creates a new scorecard command which can be used as an entrypoint for // GitHub Actions. func New() *cobra.Command { @@ -74,35 +63,3 @@ func printConfigCmd(o *options.Options) *cobra.Command { return cmd } - -// getRepo is a function to get the repository information. -// It is decided to not use the golang GitHub library because of the -// dependency on the github.com/google/go-github/github library -// which will in turn require other dependencies. -// TODO(github): Move to separate package. -func getRepo(name, token string) (repo, error) { - var r repo - ctx := context.Background() - - req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("https://api.github.com/repos/%s", name), nil) - if err != nil { - return r, fmt.Errorf("error creating request: %w", err) - } - req.Header.Set("Authorization", token) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return r, fmt.Errorf("error creating request: %w", err) - } - defer resp.Body.Close() - if err != nil { - return r, fmt.Errorf("error reading response body: %w", err) - } - - err = json.NewDecoder(resp.Body).Decode(&r) - if err != nil { - return r, fmt.Errorf("error decoding response body: %w", err) - } - - return r, nil -} diff --git a/github/github.go b/github/github.go new file mode 100644 index 00000000..c4102e59 --- /dev/null +++ b/github/github.go @@ -0,0 +1,152 @@ +// Copyright OpenSSF 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 github + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "os" + + "github.com/ossf/scorecard/v4/clients/githubrepo/roundtripper" + "github.com/ossf/scorecard/v4/log" +) + +const ( + baseRepoURL = "https://api.github.com/repos/" +) + +// RepoInfo is a struct for repository information. +type RepoInfo struct { + Repo repo `json:"repository"` + respBytes []byte +} + +type repo struct { + /* + https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#github_repository_is_fork + + GITHUB_REPOSITORY_IS_FORK is true if the repository is a fork. + */ + DefaultBranch string `json:"default_branch"` + Fork bool `json:"fork"` + Private bool `json:"private"` +} + +type Client struct { + ctx context.Context + rt http.RoundTripper +} + +func NewClient(ctx context.Context) *Client { + c := &Client{} + + defaultCtx := context.Background() + if ctx == nil { + ctx = defaultCtx + } + + c.SetContext(ctx) + c.SetDefaultTransport() + return c +} + +func (c *Client) SetContext(ctx context.Context) { + c.ctx = ctx +} + +func (c *Client) SetTransport(rt http.RoundTripper) { + c.rt = rt +} + +func (c *Client) SetDefaultTransport() { + logger := log.NewLogger(log.DefaultLevel) + rt := roundtripper.NewTransport(c.ctx, logger) + c.rt = rt +} + +func WriteRepoInfo(ctx context.Context, repoName, path string) error { + c := NewClient(ctx) + repoInfo, err := c.RepoInfo(repoName) + if err != nil { + return fmt.Errorf("getting repo info: %w", err) + } + + repoFile, err := os.Create(path) + if err != nil { + return fmt.Errorf("creating repo info file: %w", err) + } + defer repoFile.Close() + + resp := repoInfo.respBytes + repoFile.Write(resp) + + return nil +} + +// getRepo is a function to get the repository information. +// It is decided to not use the golang GitHub library because of the +// dependency on the github.com/google/go-github/github library +// which will in turn require other dependencies. +func (c *Client) RepoInfo(repoName string) (RepoInfo, error) { + var r RepoInfo + + baseURL, err := url.Parse(baseRepoURL) + if err != nil { + return r, fmt.Errorf("parsing base repo URL: %w", err) + } + + repoURL, err := baseURL.Parse(repoName) + if err != nil { + return r, fmt.Errorf("parsing repo endpoint: %w", err) + } + + method := "GET" + req, err := http.NewRequestWithContext( + c.ctx, + method, + repoURL.String(), + nil, + ) + if err != nil { + return r, fmt.Errorf("error creating request: %w", err) + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return r, fmt.Errorf("error creating request: %w", err) + } + defer resp.Body.Close() + if err != nil { + return r, fmt.Errorf("error reading response body: %w", err) + } + + respBytes, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Printf("error reading response body: %w", err) + } + + r.respBytes = respBytes + + err = json.Unmarshal(respBytes, r) + if err != nil { + return r, fmt.Errorf("error decoding response body: %w", err) + } + + return r, nil +} diff --git a/options/options.go b/options/options.go index d0cdf3f6..80369a6c 100644 --- a/options/options.go +++ b/options/options.go @@ -26,6 +26,7 @@ import ( "github.com/caarlos0/env/v6" + "github.com/ossf/scorecard-action/github" "github.com/ossf/scorecard/v4/options" scopts "github.com/ossf/scorecard/v4/options" ) @@ -271,11 +272,6 @@ func (o *Options) SetPublishResults() { } } -// GetGithubToken retrieves the GitHub auth token from the environment. -func GetGithubToken() string { - return os.Getenv(EnvGithubAuthToken) -} - // GetGithubWorkspace retrieves the GitHub auth token from the environment. func GetGithubWorkspace() string { return os.Getenv(EnvGithubWorkspace) @@ -296,25 +292,14 @@ func (o *Options) SetRepoInfo() error { return fmt.Errorf("reading GitHub event path: %w", err) } - /* - https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#github_repository_is_fork - GITHUB_REPOSITORY_IS_FORK is true if the repository is a fork. - */ - type repo struct { - Repository struct { - DefaultBranch string `json:"default_branch"` - Fork bool `json:"fork"` - Private bool `json:"private"` - } `json:"repository"` - } - var r repo + var r github.RepoInfo if err := json.Unmarshal([]byte(repoInfo), &r); err != nil { return fmt.Errorf("unmarshalling repo info: %w", err) } - o.PrivateRepoStr = strconv.FormatBool(r.Repository.Private) - o.IsForkStr = strconv.FormatBool(r.Repository.Fork) - o.DefaultBranch = r.Repository.DefaultBranch + o.PrivateRepoStr = strconv.FormatBool(r.Repo.Private) + o.IsForkStr = strconv.FormatBool(r.Repo.Fork) + o.DefaultBranch = r.Repo.DefaultBranch return nil } From be9f91c1e8e2d43c01620e9f946101dbdd9aa2c6 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Thu, 3 Mar 2022 17:39:55 -0500 Subject: [PATCH 12/17] entrypoint: Support outputting to file Signed-off-by: Stephen Augustus --- entrypoint/entrypoint.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go index 0745157d..c201cfa5 100644 --- a/entrypoint/entrypoint.go +++ b/entrypoint/entrypoint.go @@ -15,6 +15,9 @@ package entrypoint import ( + "fmt" + "os" + "github.com/spf13/cobra" "github.com/ossf/scorecard-action/options" @@ -38,6 +41,40 @@ func New() *cobra.Command { "path to output results to", ) + // Adapt scorecard's PreRunE to support an output file + // TODO(scorecard): Move this into scorecard + var out, stdout *os.File + actionCmd.PreRunE = func(cmd *cobra.Command, args []string) error { + err := scOpts.Validate() + if err != nil { + return fmt.Errorf("validating options: %w", err) + } + + if scOpts.ResultsFile != "" { + var err error + out, err = os.Create(scOpts.ResultsFile) + if err != nil { + return fmt.Errorf( + "creating output file (%s): %w", + scOpts.ResultsFile, + err, + ) + } + stdout = os.Stdout + os.Stdout = out + cmd.SetOut(out) + } + + return nil + } + + actionCmd.PersistentPostRun = func(cmd *cobra.Command, args []string) { + if out != nil { + _ = out.Close() + } + os.Stdout = stdout + } + hiddenFlags := []string{ scopts.FlagNPM, scopts.FlagPyPI, From 203bcdf84e4169c2d3f809b44a3df45e0c969e15 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Thu, 3 Mar 2022 18:43:40 -0500 Subject: [PATCH 13/17] Remove more unnecessary code and fixup lint warnings Signed-off-by: Stephen Augustus --- entrypoint/entrypoint.go | 33 +++++++++++++++---- github/github.go | 17 +++++++--- main.go | 7 +++- options/env.go | 71 ++-------------------------------------- options/options.go | 59 ++++----------------------------- options/options_test.go | 1 + 6 files changed, 54 insertions(+), 134 deletions(-) diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go index c201cfa5..ae768a52 100644 --- a/entrypoint/entrypoint.go +++ b/entrypoint/entrypoint.go @@ -15,6 +15,7 @@ package entrypoint import ( + "errors" "fmt" "os" @@ -27,9 +28,12 @@ import ( // New creates a new scorecard command which can be used as an entrypoint for // GitHub Actions. -func New() *cobra.Command { +func New() (*cobra.Command, error) { opts := options.New() - opts.Initialize() + if err := opts.Initialize(); err != nil { + return nil, fmt.Errorf("initializing options: %w", err) + } + scOpts := opts.ScorecardOpts actionCmd := cmd.New(scOpts) @@ -62,7 +66,7 @@ func New() *cobra.Command { } stdout = os.Stdout os.Stdout = out - cmd.SetOut(out) + actionCmd.SetOut(out) } return nil @@ -75,28 +79,43 @@ func New() *cobra.Command { os.Stdout = stdout } + var hideErrs []error hiddenFlags := []string{ scopts.FlagNPM, scopts.FlagPyPI, scopts.FlagRubyGems, } + for _, f := range hiddenFlags { - actionCmd.Flags().MarkHidden(f) + err := actionCmd.Flags().MarkHidden(f) + if err != nil { + hideErrs = append(hideErrs, err) + } + } + + if len(hideErrs) > 0 { + return nil, fmt.Errorf( + "%w: %+v", + errHideFlags, + hideErrs, + ) } // Add sub-commands. actionCmd.AddCommand(printConfigCmd(opts)) - return actionCmd + return actionCmd, nil } func printConfigCmd(o *options.Options) *cobra.Command { - cmd := &cobra.Command{ + c := &cobra.Command{ Use: "print-config", Run: func(cmd *cobra.Command, args []string) { o.Print() }, } - return cmd + return c } + +var errHideFlags = errors.New("errors occurred while trying to hide scorecard flags") diff --git a/github/github.go b/github/github.go index c4102e59..8551d19f 100644 --- a/github/github.go +++ b/github/github.go @@ -48,11 +48,13 @@ type repo struct { Private bool `json:"private"` } +// Client holds a context and roundtripper for querying repo info from GitHub. type Client struct { ctx context.Context rt http.RoundTripper } +// NewClient returns a new Client for querying repo info from GitHub. func NewClient(ctx context.Context) *Client { c := &Client{} @@ -66,20 +68,24 @@ func NewClient(ctx context.Context) *Client { return c } +// SetContext sets a context for a GitHub client. func (c *Client) SetContext(ctx context.Context) { c.ctx = ctx } +// SetTransport sets a http.RoundTripper for a GitHub client. func (c *Client) SetTransport(rt http.RoundTripper) { c.rt = rt } +// SetDefaultTransport sets the scorecard roundtripper for a GitHub client. func (c *Client) SetDefaultTransport() { logger := log.NewLogger(log.DefaultLevel) rt := roundtripper.NewTransport(c.ctx, logger) c.rt = rt } +// WriteRepoInfo queries GitHub for repo info and writes it to a file. func WriteRepoInfo(ctx context.Context, repoName, path string) error { c := NewClient(ctx) repoInfo, err := c.RepoInfo(repoName) @@ -94,12 +100,15 @@ func WriteRepoInfo(ctx context.Context, repoName, path string) error { defer repoFile.Close() resp := repoInfo.respBytes - repoFile.Write(resp) + _, writeErr := repoFile.Write(resp) + if writeErr != nil { + return fmt.Errorf("writing repo info: %w", writeErr) + } return nil } -// getRepo is a function to get the repository information. +// RepoInfo is a function to get the repository information. // It is decided to not use the golang GitHub library because of the // dependency on the github.com/google/go-github/github library // which will in turn require other dependencies. @@ -138,12 +147,12 @@ func (c *Client) RepoInfo(repoName string) (RepoInfo, error) { respBytes, err := io.ReadAll(resp.Body) if err != nil { - fmt.Printf("error reading response body: %w", err) + return r, fmt.Errorf("error reading response body: %w", err) } r.respBytes = respBytes - err = json.Unmarshal(respBytes, r) + err = json.Unmarshal(respBytes, &r) if err != nil { return r, fmt.Errorf("error decoding response body: %w", err) } diff --git a/main.go b/main.go index 87f5b1f0..e57c01cf 100644 --- a/main.go +++ b/main.go @@ -21,7 +21,12 @@ import ( ) func main() { - if err := entrypoint.New().Execute(); err != nil { + action, err := entrypoint.New() + if err != nil { + log.Fatalf("creating scorecard entrypoint: %v", err) + } + + if err := action.Execute(); err != nil { log.Fatalf("error during command execution: %v", err) } } diff --git a/options/env.go b/options/env.go index 780a3cf5..d97e2362 100644 --- a/options/env.go +++ b/options/env.go @@ -17,8 +17,6 @@ package options import ( "errors" "fmt" - "io" - "os" ) // Environment variables. @@ -41,81 +39,16 @@ const ( EnvScorecardPrivateRepo = "SCORECARD_PRIVATE_REPOSITORY" ) -// CheckRequiredEnv is a function to check if the required environment variables are set. -func CheckRequiredEnv() error { - envVariables := make(map[string]bool) - envVariables[EnvGithubRepository] = true - envVariables[EnvGithubAuthToken] = true - - for key := range envVariables { - // TODO(env): Refactor to use helpers - if _, exists := os.LookupEnv(key); !exists { - return errRequiredEnvNotSet - } - } - - return nil -} - -// envPrint is a function to print the ENV variables. -func envPrint(writer io.Writer) { - fmt.Fprintf(writer, "GITHUB_EVENT_PATH=%s\n", os.Getenv(EnvGithubEventPath)) - fmt.Fprintf(writer, "GITHUB_EVENT_NAME=%s\n", os.Getenv(EnvGithubEventName)) - fmt.Fprintf(writer, "GITHUB_REPOSITORY=%s\n", os.Getenv(EnvGithubRepository)) - fmt.Fprintf(writer, "SCORECARD_IS_FORK=%s\n", os.Getenv(EnvScorecardFork)) - fmt.Fprintf(writer, "Ref=%s\n", os.Getenv(EnvGithubRef)) -} - -// Adapted from sigs.k8s.io/release-utils/env - -// TODO(env): Consider making these methods on an env var type. - -// Lookup returns either the provided environment variable for the given key -// or the default value def if not set. -func Lookup(envVar, def string, mustExist, mustNotBeEmpty bool) (string, error) { - value, ok := os.LookupEnv(envVar) - if !ok { - if mustExist { - return value, errEnvVarNotSetWithKey(envVar) - } - } - - if value == "" { - if mustNotBeEmpty { - return value, errEnvVarIsEmptyWithKey(envVar) - } - - return def, nil - } - - return value, nil -} - // Errors var ( // Errors. - // TODO(env): Determine if these errors actually need to be named. + errGitHubEventPathEmpty = errEnvVarIsEmptyWithKey(EnvGithubEventPath) + errEmptyGitHubAuthToken = errEnvVarIsEmptyWithKey(EnvGithubAuthToken) - // ErrGitHubEventPath TODO(lint): should have comment or be unexported (revive). - ErrGitHubEventPath = errors.New("error getting GITHUB_EVENT_PATH") - // ErrGitHubEventPathEmpty TODO(lint): should have comment or be unexported (revive). - ErrGitHubEventPathEmpty = errEnvVarIsEmptyWithKey(EnvGithubEventPath) - // ErrGitHubEventPathNotSet TODO(lint): should have comment or be unexported (revive). - ErrGitHubEventPathNotSet = errEnvVarNotSetWithKey(EnvGithubEventPath) - // ErrEmptyGitHubAuthToken TODO(lint): should have comment or be unexported (revive). - ErrEmptyGitHubAuthToken = errEnvVarIsEmptyWithKey(EnvGithubAuthToken) - - errEnvVarNotSet = errors.New("env var is not set") errEnvVarIsEmpty = errors.New("env var is empty") - - errRequiredEnvNotSet = errors.New("required environment variables are not set") ) -func errEnvVarNotSetWithKey(envVar string) error { - return fmt.Errorf("%w: %s", errEnvVarNotSet, envVar) -} - func errEnvVarIsEmptyWithKey(envVar string) error { return fmt.Errorf("%w: %s", errEnvVarIsEmpty, envVar) } diff --git a/options/options.go b/options/options.go index 80369a6c..06d44427 100644 --- a/options/options.go +++ b/options/options.go @@ -28,12 +28,10 @@ import ( "github.com/ossf/scorecard-action/github" "github.com/ossf/scorecard/v4/options" - scopts "github.com/ossf/scorecard/v4/options" ) var ( // Errors. - errDefaultBranchEmpty = errors.New("default branch is empty") errOnlyDefaultBranchSupported = errors.New("only default branch is supported") trueStr = "true" @@ -42,7 +40,7 @@ var ( // Options TODO(lint): should have comment or be unexported (revive). type Options struct { // Scorecard options. - ScorecardOpts *scopts.Options + ScorecardOpts *options.Options // Scorecard command-line options. EnabledChecks string `env:"ENABLED_CHECKS"` @@ -95,7 +93,7 @@ func New() *Options { // TODO(options): Push options into scorecard.Options once/if it supports // validation. - scOpts := scopts.New() + scOpts := options.New() if err := opts.Initialize(); err != nil { // TODO(options): Consider making this an error. @@ -167,7 +165,7 @@ func (o *Options) Validate(writer io.Writer) error { "Please follow the instructions at https://github.com/ossf/scorecard-action#authentication to create the read-only PAT token.\n", //nolint:lll ) - return ErrEmptyGitHubAuthToken + return errEmptyGitHubAuthToken } if strings.Contains(os.Getenv(o.GithubEventName), "pull_request") && @@ -181,16 +179,6 @@ func (o *Options) Validate(writer io.Writer) error { return nil } -// CheckRequired TODO(lint): should have comment or be unexported (revive). -func (o *Options) CheckRequired() error { - err := CheckRequiredEnv() - if err != nil { - return fmt.Errorf("checking if required env vars are set: %w", err) - } - - return nil -} - // Print is a function to print options. func (o *Options) Print() { fmt.Printf("Event file: %s\n", o.GithubEventPath) @@ -205,36 +193,6 @@ func (o *Options) Print() { fmt.Printf("Default branch: %s\n", o.DefaultBranch) } -// SetRepository TODO(lint): should have comment or be unexported (revive). -func (o *Options) SetRepository() { - o.ScorecardOpts.Repo = os.Getenv(o.GithubRepository) -} - -// Repo TODO(lint): should have comment or be unexported (revive). -func (o *Options) Repo() string { - return o.ScorecardOpts.Repo -} - -// RepoIsSet TODO(lint): should have comment or be unexported (revive). -func (o *Options) RepoIsSet() bool { - return o.Repo() != "" -} - -// SetRepoVisibility sets the repository's visibility. -func (o *Options) SetRepoVisibility(privateRepo bool) { - o.PrivateRepoStr = strconv.FormatBool(privateRepo) -} - -// SetDefaultBranch sets the default branch. -func (o *Options) SetDefaultBranch(defaultBranch string) error { - if defaultBranch == "" { - return errDefaultBranchEmpty - } - - o.DefaultBranch = fmt.Sprintf("refs/heads/%s", defaultBranch) - return nil -} - // SetPublishResults sets whether results should be published based on a // repository's visibility. func (o *Options) SetPublishResults() { @@ -272,19 +230,14 @@ func (o *Options) SetPublishResults() { } } -// GetGithubWorkspace retrieves the GitHub auth token from the environment. -func GetGithubWorkspace() string { - return os.Getenv(EnvGithubWorkspace) -} - -// CheckGithubEventPath gets the path to the GitHub event and sets the +// SetRepoInfo gets the path to the GitHub event and sets the // SCORECARD_IS_FORK environment variable. // TODO(options): Check if this actually needs to be exported. // TODO(options): Choose a more accurate name for what this does. func (o *Options) SetRepoInfo() error { eventPath := o.GithubEventPath if eventPath == "" { - return ErrGitHubEventPathEmpty + return errGitHubEventPathEmpty } repoInfo, err := ioutil.ReadFile(eventPath) @@ -293,7 +246,7 @@ func (o *Options) SetRepoInfo() error { } var r github.RepoInfo - if err := json.Unmarshal([]byte(repoInfo), &r); err != nil { + if err := json.Unmarshal(repoInfo, &r); err != nil { return fmt.Errorf("unmarshalling repo info: %w", err) } diff --git a/options/options_test.go b/options/options_test.go index 7cefd954..d9662985 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//nolint package options var ( From ca3a9ffa2771ca1c4bb810df51c73c2419d8f3ed Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Thu, 3 Mar 2022 23:49:52 -0500 Subject: [PATCH 14/17] Rewrite unit tests (1/n) Signed-off-by: Stephen Augustus --- options/env.go | 1 - options/options.go | 3 +- options/options_test.go | 130 ++++++++++++++++----------------- options/testdata/bad-data.json | 1 + 4 files changed, 66 insertions(+), 69 deletions(-) create mode 100644 options/testdata/bad-data.json diff --git a/options/env.go b/options/env.go index d97e2362..5ef9d549 100644 --- a/options/env.go +++ b/options/env.go @@ -43,7 +43,6 @@ const ( var ( // Errors. - errGitHubEventPathEmpty = errEnvVarIsEmptyWithKey(EnvGithubEventPath) errEmptyGitHubAuthToken = errEnvVarIsEmptyWithKey(EnvGithubAuthToken) errEnvVarIsEmpty = errors.New("env var is empty") diff --git a/options/options.go b/options/options.go index 06d44427..d821ae9b 100644 --- a/options/options.go +++ b/options/options.go @@ -32,6 +32,7 @@ import ( var ( // Errors. + errGithubEventPathEmpty = errors.New("GitHub event path is empty") errOnlyDefaultBranchSupported = errors.New("only default branch is supported") trueStr = "true" @@ -237,7 +238,7 @@ func (o *Options) SetPublishResults() { func (o *Options) SetRepoInfo() error { eventPath := o.GithubEventPath if eventPath == "" { - return errGitHubEventPathEmpty + return errGithubEventPathEmpty } repoInfo, err := ioutil.ReadFile(eventPath) diff --git a/options/options_test.go b/options/options_test.go index d9662985..a531a7e8 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -15,97 +15,93 @@ //nolint package options -var ( +import ( + "testing" + + "github.com/ossf/scorecard/v4/options" +) + +const ( + testRepo = "good/repo" + githubEventPathNonFork = "testdata/non-fork.json" githubEventPathFork = "testdata/fork.json" githubEventPathIncorrect = "testdata/incorrect.json" + githubEventPathBadPath = "testdata/bad-path.json" + githubEventPathBadData = "testdata/bad-data.json" ) -/* -func TestNew(t *testing.T) { - //nolint:paralleltest // Until/unless we consider providing a fake environment - // to tests, running these in parallel will have unpredictable results as - // we're mutating environment variables. +func TestInitialize(t *testing.T) { + type fields struct { + ScorecardOpts *options.Options + EnabledChecks string + InputResultsFile string + InputResultsFormat string + InputPublishResults string + EnableLicense string + EnableDangerousWorkflow string + GithubEventName string + GithubEventPath string + GithubRef string + GithubRepository string + GithubWorkspace string + DefaultBranch string + IsForkStr string + PrivateRepoStr string + } tests := []struct { - want *Options - name string + name string + fields fields + wantErr bool }{ { name: "Success", - want: &Options{ - ScorecardOpts: &scopts.Options{ - PolicyFile: defaultScorecardPolicyFile, - }, - ScorecardBin: defaultScorecardBin, + fields: fields{ + GithubEventPath: githubEventPathNonFork, }, + wantErr: false, }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := New(); !cmp.Equal(got, tt.want) { - t.Errorf("New() = %v, want %v: %v", got, tt.want, cmp.Diff(got, tt.want)) - } - }) - } -} -*/ - -/* -//nolint:paralleltest // Until/unless we consider providing a fake environment -// to tests, running these in parallel will have unpredictable results as -// we're mutating environment variables. -func TestOptionsInitialize(t *testing.T) { - type fields struct { - ScorecardOpts *scopts.Options - GithubEventName string - ScorecardBin string - DefaultBranch string - PrivateRepo string - PublishResults string - ResultsFile string - } - tests := []struct { //nolint:govet // TODO(lint): Fix - name string - fields fields - wantErr bool - githubEventPath string - setGithubEventPath bool - }{ { - name: "Success - non-fork", - wantErr: false, - githubEventPath: githubEventPathNonFork, - setGithubEventPath: true, + name: "FailureNoFieldsSet", + wantErr: true, }, { - name: "Success - fork", - wantErr: false, - githubEventPath: githubEventPathFork, - setGithubEventPath: true, + name: "FailureBadEventPath", + fields: fields{ + GithubEventPath: githubEventPathBadPath, + }, + wantErr: true, }, { - name: "Failure - incorrect GitHub events", - wantErr: true, - githubEventPath: githubEventPathIncorrect, - setGithubEventPath: true, + name: "FailureBadEventData", + fields: fields{ + GithubEventPath: githubEventPathBadData, + }, + wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if tt.setGithubEventPath { - os.Setenv(EnvGithubEventPath, tt.githubEventPath) + o := &Options{ + ScorecardOpts: tt.fields.ScorecardOpts, + EnabledChecks: tt.fields.EnabledChecks, + InputResultsFile: tt.fields.InputResultsFile, + InputResultsFormat: tt.fields.InputResultsFormat, + InputPublishResults: tt.fields.InputPublishResults, + EnableLicense: tt.fields.EnableLicense, + EnableDangerousWorkflow: tt.fields.EnableDangerousWorkflow, + GithubEventName: tt.fields.GithubEventName, + GithubEventPath: tt.fields.GithubEventPath, + GithubRef: tt.fields.GithubRef, + GithubRepository: tt.fields.GithubRepository, + GithubWorkspace: tt.fields.GithubWorkspace, + DefaultBranch: tt.fields.DefaultBranch, + IsForkStr: tt.fields.IsForkStr, + PrivateRepoStr: tt.fields.PrivateRepoStr, } - - o, _ := New() //nolint:errcheck // TODO(lint): Fix - t.Logf("options before initialization: %+v", o) - optsBeforeInit := o - if err := o.Initialize(); (err != nil) != tt.wantErr { - t.Logf("options after initialization: %+v", o) - t.Logf("options comparison: %s", cmp.Diff(optsBeforeInit, o)) t.Errorf("Options.Initialize() error = %v, wantErr %v", err, tt.wantErr) } }) } } -*/ diff --git a/options/testdata/bad-data.json b/options/testdata/bad-data.json new file mode 100644 index 00000000..0e5a75b0 --- /dev/null +++ b/options/testdata/bad-data.json @@ -0,0 +1 @@ +ewogICJhZnRlciI6ICJhYTA0OTZhYTZlZDUxMDI2NDJmMzUyYTVjNGFkM2NmMDkwMDE3Yzc2IiwKICAiYmFzZV9yZWYiOiBudWxsLAogICJiZWZvcmUiOiAiM2Q0NzFmZDM2ZDdmMTE0Nzg0M2M2OWQ2OGRlMzVkMzIxZDM2ZmU0MyIsCiAgImNvbW1pdHMiOiBbCiAgICB7CiAgICAgICJhdXRob3IiOiB7CiAgICAgICAgImVtYWlsIjogIjY0NTA1MDk5K2xhdXJlbnRzaW1vbkB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iLAogICAgICAgICJuYW1lIjogImxhdXJlbnRzaW1vbiIsCiAgICAgICAgInVzZXJuYW1lIjogImxhdXJlbnRzaW1vbiIKICAgICAgfSwKICAgICAgImNvbW1pdHRlciI6IHsKICAgICAgICAiZW1haWwiOiAibm9yZXBseUBnaXRodWIuY29tIiwKICAgICAgICAibmFtZSI6ICJHaXRIdWIiLAogICAgICAgICJ1c2VybmFtZSI6ICJ3ZWItZmxvdyIKICAgICAgfSwKICAgICAgImRpc3RpbmN0IjogdHJ1ZSwKICAgICAgImlkIjogImFhMDQ5NmFhNmVkNTEwMjY0MmYzNTJhNWM0YWQzY2YwOTAwMTdjNzYiLAogICAgICAibWVzc2FnZSI6ICJVcGRhdGUgZHVtbXkiLAogICAgICAidGltZXN0YW1wIjogIjIwMjItMDEtMTBUMTQ6MjQ6NDQtMDg6MDAiLAogICAgICAidHJlZV9pZCI6ICI5MTY3M2RlM2Y3OTg0ZDExMjc3ZGEzNDBkMjRiMDE4NzUyM2JkMjgzIiwKICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL2NvbW1pdC9hYTA0OTZhYTZlZDUxMDI2NDJmMzUyYTVjNGFkM2NmMDkwMDE3Yzc2IgogICAgfQogIF0sCiAgImNvbXBhcmUiOiAiaHR0cHM6Ly9naXRodWIuY29tL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9jb21wYXJlLzNkNDcxZmQzNmQ3Zi4uLmFhMDQ5NmFhNmVkNSIsCiAgImNyZWF0ZWQiOiBmYWxzZSwKICAiZGVsZXRlZCI6IGZhbHNlLAogICJmb3JjZWQiOiBmYWxzZSwKICAiaGVhZF9jb21taXQiOiB7CiAgICAiYXV0aG9yIjogewogICAgICAiZW1haWwiOiAiNjQ1MDUwOTkrbGF1cmVudHNpbW9uQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIsCiAgICAgICJuYW1lIjogImxhdXJlbnRzaW1vbiIsCiAgICAgICJ1c2VybmFtZSI6ICJsYXVyZW50c2ltb24iCiAgICB9LAogICAgImNvbW1pdHRlciI6IHsKICAgICAgImVtYWlsIjogIm5vcmVwbHlAZ2l0aHViLmNvbSIsCiAgICAgICJuYW1lIjogIkdpdEh1YiIsCiAgICAgICJ1c2VybmFtZSI6ICJ3ZWItZmxvdyIKICAgIH0sCiAgICAiZGlzdGluY3QiOiB0cnVlLAogICAgImlkIjogImFhMDQ5NmFhNmVkNTEwMjY0MmYzNTJhNWM0YWQzY2YwOTAwMTdjNzYiLAogICAgIm1lc3NhZ2UiOiAiVXBkYXRlIGR1bW15IiwKICAgICJ0aW1lc3RhbXAiOiAiMjAyMi0wMS0xMFQxNDoyNDo0NC0wODowMCIsCiAgICAidHJlZV9pZCI6ICI5MTY3M2RlM2Y3OTg0ZDExMjc3ZGEzNDBkMjRiMDE4NzUyM2JkMjgzIiwKICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9jb21taXQvYWEwNDk2YWE2ZWQ1MTAyNjQyZjM1MmE1YzRhZDNjZjA5MDAxN2M3NiIKICB9LAogICJwdXNoZXIiOiB7CiAgICAiZW1haWwiOiAiNjQ1MDUwOTkrbGF1cmVudHNpbW9uQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIsCiAgICAibmFtZSI6ICJsYXVyZW50c2ltb24iCiAgfSwKICAicmVmIjogInJlZnMvaGVhZHMvbWFpbiIsCiAgInJlcG9zaXRvcnkiOiB7CiAgICAiYWxsb3dfZm9ya2luZyI6IHRydWUsCiAgICAiYXJjaGl2ZV91cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsCiAgICAiYXJjaGl2ZWQiOiBmYWxzZSwKICAgICJhc3NpZ25lZXNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL2Fzc2lnbmVlc3svdXNlcn0iLAogICAgImJsb2JzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9naXQvYmxvYnN7L3NoYX0iLAogICAgImJyYW5jaGVzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9icmFuY2hlc3svYnJhbmNofSIsCiAgICAiY2xvbmVfdXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIuZ2l0IiwKICAgICJjb2xsYWJvcmF0b3JzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwKICAgICJjb21tZW50c191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvY29tbWVudHN7L251bWJlcn0iLAogICAgImNvbW1pdHNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL2NvbW1pdHN7L3NoYX0iLAogICAgImNvbXBhcmVfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwKICAgICJjb250ZW50c191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvY29udGVudHMveytwYXRofSIsCiAgICAiY29udHJpYnV0b3JzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9jb250cmlidXRvcnMiLAogICAgImNyZWF0ZWRfYXQiOiAxNjM2MTM3NDQ3LAogICAgImRlZmF1bHRfYnJhbmNoIjogIm1haW4iLAogICAgImRlcGxveW1lbnRzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9kZXBsb3ltZW50cyIsCiAgICAiZGVzY3JpcHRpb24iOiBudWxsLAogICAgImRpc2FibGVkIjogZmFsc2UsCiAgICAiZG93bmxvYWRzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9kb3dubG9hZHMiLAogICAgImV2ZW50c191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvZXZlbnRzIiwKICAgICJmb3JrcyI6IDAsCiAgICAiZm9ya3NfY291bnQiOiAwLAogICAgImZvcmtzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9mb3JrcyIsCiAgICAiZnVsbF9uYW1lIjogImxhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMiIsCiAgICAiZ2l0X2NvbW1pdHNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL2dpdC9jb21taXRzey9zaGF9IiwKICAgICJnaXRfcmVmc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvZ2l0L3JlZnN7L3NoYX0iLAogICAgImdpdF90YWdzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9naXQvdGFnc3svc2hhfSIsCiAgICAiZ2l0X3VybCI6ICJnaXQ6Ly9naXRodWIuY29tL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi5naXQiLAogICAgImhhc19kb3dubG9hZHMiOiB0cnVlLAogICAgImhhc19pc3N1ZXMiOiB0cnVlLAogICAgImhhc19wYWdlcyI6IGZhbHNlLAogICAgImhhc19wcm9qZWN0cyI6IHRydWUsCiAgICAiaGFzX3dpa2kiOiB0cnVlLAogICAgImhvbWVwYWdlIjogbnVsbCwKICAgICJob29rc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvaG9va3MiLAogICAgImh0bWxfdXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIiLAogICAgImlkIjogNDI1MDQ5OTY2LAogICAgImlzX3RlbXBsYXRlIjogZmFsc2UsCiAgICAiaXNzdWVfY29tbWVudF91cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwKICAgICJpc3N1ZV9ldmVudHNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLAogICAgImlzc3Vlc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvaXNzdWVzey9udW1iZXJ9IiwKICAgICJrZXlzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9rZXlzey9rZXlfaWR9IiwKICAgICJsYWJlbHNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL2xhYmVsc3svbmFtZX0iLAogICAgImxhbmd1YWdlIjogbnVsbCwKICAgICJsYW5ndWFnZXNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL2xhbmd1YWdlcyIsCiAgICAibGljZW5zZSI6IG51bGwsCiAgICAibWFzdGVyX2JyYW5jaCI6ICJtYWluIiwKICAgICJtZXJnZXNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL21lcmdlcyIsCiAgICAibWlsZXN0b25lc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvbWlsZXN0b25lc3svbnVtYmVyfSIsCiAgICAibWlycm9yX3VybCI6IG51bGwsCiAgICAibmFtZSI6ICJzY29yZWNhcmQtYWN0aW9uLXRlc3QtMiIsCiAgICAibm9kZV9pZCI6ICJSX2tnRE9HVldfYmciLAogICAgIm5vdGlmaWNhdGlvbnNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsCiAgICAib3Blbl9pc3N1ZXMiOiAwLAogICAgIm9wZW5faXNzdWVzX2NvdW50IjogMCwKICAgICJvd25lciI6IHsKICAgICAgImF2YXRhcl91cmwiOiAiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzY0NTA1MDk5P3Y9NCIsCiAgICAgICJlbWFpbCI6ICI2NDUwNTA5OStsYXVyZW50c2ltb25AdXNlcnMubm9yZXBseS5naXRodWIuY29tIiwKICAgICAgImV2ZW50c191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vZXZlbnRzey9wcml2YWN5fSIsCiAgICAgICJmb2xsb3dlcnNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL2ZvbGxvd2VycyIsCiAgICAgICJmb2xsb3dpbmdfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLAogICAgICAiZ2lzdHNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL2dpc3Rzey9naXN0X2lkfSIsCiAgICAgICJncmF2YXRhcl9pZCI6ICIiLAogICAgICAiaHRtbF91cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2xhdXJlbnRzaW1vbiIsCiAgICAgICJpZCI6IDY0NTA1MDk5LAogICAgICAibG9naW4iOiAibGF1cmVudHNpbW9uIiwKICAgICAgIm5hbWUiOiAibGF1cmVudHNpbW9uIiwKICAgICAgIm5vZGVfaWQiOiAiTURRNlZYTmxjalkwTlRBMU1EazUiLAogICAgICAib3JnYW5pemF0aW9uc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vb3JncyIsCiAgICAgICJyZWNlaXZlZF9ldmVudHNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL3JlY2VpdmVkX2V2ZW50cyIsCiAgICAgICJyZXBvc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vcmVwb3MiLAogICAgICAic2l0ZV9hZG1pbiI6IGZhbHNlLAogICAgICAic3RhcnJlZF91cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsCiAgICAgICJzdWJzY3JpcHRpb25zX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9zdWJzY3JpcHRpb25zIiwKICAgICAgInR5cGUiOiAiVXNlciIsCiAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24iCiAgICB9LAogICAgInByaXZhdGUiOiB0cnVlLAogICAgInB1bGxzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9wdWxsc3svbnVtYmVyfSIsCiAgICAicHVzaGVkX2F0IjogMTY0MTg1MzQ4NCwKICAgICJyZWxlYXNlc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvcmVsZWFzZXN7L2lkfSIsCiAgICAic2l6ZSI6IDMxNSwKICAgICJzc2hfdXJsIjogImdpdEBnaXRodWIuY29tOmxhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi5naXQiLAogICAgInN0YXJnYXplcnMiOiAwLAogICAgInN0YXJnYXplcnNfY291bnQiOiAwLAogICAgInN0YXJnYXplcnNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL3N0YXJnYXplcnMiLAogICAgInN0YXR1c2VzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9zdGF0dXNlcy97c2hhfSIsCiAgICAic3Vic2NyaWJlcnNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL3N1YnNjcmliZXJzIiwKICAgICJzdWJzY3JpcHRpb25fdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yL3N1YnNjcmlwdGlvbiIsCiAgICAic3ZuX3VybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yIiwKICAgICJ0YWdzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi90YWdzIiwKICAgICJ0ZWFtc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWFjdGlvbi10ZXN0LTIvdGVhbXMiLAogICAgInRvcGljcyI6IFtdLAogICAgInRyZWVzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtYWN0aW9uLXRlc3QtMi9naXQvdHJlZXN7L3NoYX0iLAogICAgInVwZGF0ZWRfYXQiOiAiMjAyMi0wMS0xMFQyMjoxNjowMVoiLAogICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1hY3Rpb24tdGVzdC0yIiwKICAgICJ2aXNpYmlsaXR5IjogInByaXZhdGUiLAogICAgIndhdGNoZXJzIjogMCwKICAgICJ3YXRjaGVyc19jb3VudCI6IDAKICB9LAogICJzZW5kZXIiOiB7CiAgICAiYXZhdGFyX3VybCI6ICJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNjQ1MDUwOTk/dj00IiwKICAgICJldmVudHNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL2V2ZW50c3svcHJpdmFjeX0iLAogICAgImZvbGxvd2Vyc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vZm9sbG93ZXJzIiwKICAgICJmb2xsb3dpbmdfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLAogICAgImdpc3RzX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9naXN0c3svZ2lzdF9pZH0iLAogICAgImdyYXZhdGFyX2lkIjogIiIsCiAgICAiaHRtbF91cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2xhdXJlbnRzaW1vbiIsCiAgICAiaWQiOiA2NDUwNTA5OSwKICAgICJsb2dpbiI6ICJsYXVyZW50c2ltb24iLAogICAgIm5vZGVfaWQiOiAiTURRNlZYTmxjalkwTlRBMU1EazUiLAogICAgIm9yZ2FuaXphdGlvbnNfdXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL29yZ3MiLAogICAgInJlY2VpdmVkX2V2ZW50c191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vcmVjZWl2ZWRfZXZlbnRzIiwKICAgICJyZXBvc191cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vcmVwb3MiLAogICAgInNpdGVfYWRtaW4iOiBmYWxzZSwKICAgICJzdGFycmVkX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9zdGFycmVkey9vd25lcn17L3JlcG99IiwKICAgICJzdWJzY3JpcHRpb25zX3VybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9zdWJzY3JpcHRpb25zIiwKICAgICJ0eXBlIjogIlVzZXIiLAogICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbiIKICB9Cn0K From 1f478f4c28b6320b7196b2d3e293ea1bb4ca7079 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Fri, 4 Mar 2022 02:43:22 -0500 Subject: [PATCH 15/17] Rewrite unit tests (2/n) Signed-off-by: Stephen Augustus --- entrypoint/entrypoint.go | 6 ++- go.mod | 2 +- options/options.go | 97 ++++++++++++---------------------------- options/options_test.go | 92 ++++++++++++++++++++++++++++++++++--- 4 files changed, 119 insertions(+), 78 deletions(-) diff --git a/entrypoint/entrypoint.go b/entrypoint/entrypoint.go index ae768a52..4f5ddba5 100644 --- a/entrypoint/entrypoint.go +++ b/entrypoint/entrypoint.go @@ -29,7 +29,11 @@ import ( // New creates a new scorecard command which can be used as an entrypoint for // GitHub Actions. func New() (*cobra.Command, error) { - opts := options.New() + opts, err := options.New() + if err != nil { + return nil, fmt.Errorf("creating new options: %w", err) + } + if err := opts.Initialize(); err != nil { return nil, fmt.Errorf("initializing options: %w", err) } diff --git a/go.mod b/go.mod index 7c1c2d63..81f092a5 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.17 require ( github.com/caarlos0/env/v6 v6.9.1 + github.com/google/go-cmp v0.5.7 github.com/ossf/scorecard/v4 v4.1.1-0.20220306220811-4b9f0389c6f6 github.com/spf13/cobra v1.3.0 ) @@ -23,7 +24,6 @@ require ( github.com/golang-jwt/jwt/v4 v4.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-cmp v0.5.7 // indirect github.com/google/go-github/v38 v38.1.0 // indirect github.com/google/go-github/v41 v41.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect diff --git a/options/options.go b/options/options.go index d821ae9b..85b5558a 100644 --- a/options/options.go +++ b/options/options.go @@ -33,12 +33,13 @@ import ( var ( // Errors. errGithubEventPathEmpty = errors.New("GitHub event path is empty") + errResultsPathEmpty = errors.New("results path is empty") errOnlyDefaultBranchSupported = errors.New("only default branch is supported") trueStr = "true" ) -// Options TODO(lint): should have comment or be unexported (revive). +// Options are options for running scorecard via GitHub Actions. type Options struct { // Scorecard options. ScorecardOpts *options.Options @@ -46,19 +47,6 @@ type Options struct { // Scorecard command-line options. EnabledChecks string `env:"ENABLED_CHECKS"` - // Input options. - // TODO(options): These input options shadow the some of the SCORECARD_ - // env vars: - // export SCORECARD_RESULTS_FILE="$INPUT_RESULTS_FILE" - // export SCORECARD_RESULTS_FORMAT="$INPUT_RESULTS_FORMAT" - // export SCORECARD_PUBLISH_RESULTS="$INPUT_PUBLISH_RESULTS" - // - // Let's target them for deletion, but only after confirming - // that there isn't anything that surprisingly needs them. - InputResultsFile string `env:"INPUT_RESULTS_FILE"` - InputResultsFormat string `env:"INPUT_RESULTS_FORMAT"` - InputPublishResults string `env:"INPUT_PUBLISH_RESULTS"` - // Scorecard checks. EnableLicense string `env:"ENABLE_LICENSE"` EnableDangerousWorkflow string `env:"ENABLE_DANGEROUS_WORKFLOW"` @@ -84,56 +72,45 @@ const ( formatSarif = options.FormatSarif ) -// New TODO(lint): should have comment or be unexported (revive). -func New() *Options { - opts := &Options{} +// New creates a new options set for running scorecard via GitHub Actions. +func New() (*Options, error) { + // Enable scorecard command to use SARIF format. + os.Setenv(options.EnvVarEnableSarif, trueStr) + + opts := &Options{ + ScorecardOpts: options.New(), + } if err := env.Parse(opts); err != nil { - // TODO(options): Consider making this an error. - fmt.Printf("parsing entrypoint env vars: %+v", err) + return opts, fmt.Errorf("parsing entrypoint env vars: %w", err) } - // TODO(options): Push options into scorecard.Options once/if it supports - // validation. - scOpts := options.New() - if err := opts.Initialize(); err != nil { - // TODO(options): Consider making this an error. - fmt.Printf("initializing scorecard-action options: %+v\n", err) + return opts, fmt.Errorf( + "initializing scorecard-action options: %w", + err, + ) } // TODO(options): Move this set-or-default logic to its own function. - if opts.InputResultsFormat != "" { - scOpts.Format = opts.InputResultsFormat - } else { - scOpts.EnableSarif = true - scOpts.Format = formatSarif - os.Setenv(options.EnvVarEnableSarif, trueStr) - if scOpts.Format == "" { - // Default the scorecard command to using SARIF format. - if scOpts.PolicyFile == "" { - // TODO(policy): Should we default or error here? - scOpts.PolicyFile = defaultScorecardPolicyFile - } + opts.ScorecardOpts.EnableSarif = true + if opts.ScorecardOpts.Format == formatSarif { + if opts.ScorecardOpts.PolicyFile == "" { + // TODO(policy): Should we default or error here? + opts.ScorecardOpts.PolicyFile = defaultScorecardPolicyFile } } - if err := scOpts.Validate(); err != nil { - // TODO(options): Consider making this an error. - fmt.Printf("validating scorecard options: %+v\n", err) + if err := opts.ScorecardOpts.Validate(); err != nil { + return opts, fmt.Errorf("validating scorecard options: %w", err) } - opts.ScorecardOpts = scOpts opts.SetPublishResults() - - if opts.ScorecardOpts.PublishResults { - if scOpts.ResultsFile == "" { - scOpts.ResultsFile = opts.InputResultsFile - // TODO(options): We should check if this is empty. - } + if opts.ScorecardOpts.ResultsFile == "" { + return opts, errResultsPathEmpty } // TODO(options): Consider running Validate() before returning. - return opts + return opts, nil } // Initialize initializes the environment variables required for the action. @@ -147,8 +124,9 @@ func (o *Options) Initialize() error { GITHUB_ACTIONS is true in GitHub env. */ - o.EnableLicense = "1" - o.EnableDangerousWorkflow = "1" + // TODO(checks): Do we actually expect to use these? + // o.EnableLicense = "1" + // o.EnableDangerousWorkflow = "1" return o.SetRepoInfo() } @@ -197,23 +175,6 @@ func (o *Options) Print() { // SetPublishResults sets whether results should be published based on a // repository's visibility. func (o *Options) SetPublishResults() { - // Check INPUT_PUBLISH_RESULTS - var inputBool bool - var inputErr error - input := os.Getenv(EnvInputPublishResults) - if input != "" { - inputBool, inputErr = strconv.ParseBool(o.InputPublishResults) - if inputErr != nil { - // TODO(options): Consider making this an error. - fmt.Printf( - "could not parse a valid bool from %s (%s): %+v\n", - input, - EnvInputPublishResults, - inputErr, - ) - } - } - privateRepo, err := strconv.ParseBool(o.PrivateRepoStr) if err != nil { // TODO(options): Consider making this an error. @@ -226,8 +187,6 @@ func (o *Options) SetPublishResults() { if privateRepo { o.ScorecardOpts.PublishResults = false - } else { - o.ScorecardOpts.PublishResults = o.ScorecardOpts.PublishResults || inputBool } } diff --git a/options/options_test.go b/options/options_test.go index a531a7e8..1dc4a608 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -16,13 +16,17 @@ package options import ( + "os" "testing" + "github.com/google/go-cmp/cmp" + "github.com/ossf/scorecard/v4/options" ) const ( - testRepo = "good/repo" + testRepo = "good/repo" + testResultsFile = "results.sarif" githubEventPathNonFork = "testdata/non-fork.json" githubEventPathFork = "testdata/fork.json" @@ -31,13 +35,90 @@ const ( githubEventPathBadData = "testdata/bad-data.json" ) +func TestNew(t *testing.T) { + tests := []struct { + name string + githubEventPath string + repo string + resultsFile string + resultsFormat string + publishResults string + want options.Options + wantErr bool + }{ + { + name: "SuccessFormatSARIF", + githubEventPath: githubEventPathNonFork, + repo: testRepo, + resultsFormat: "sarif", + resultsFile: testResultsFile, + want: options.Options{ + Repo: testRepo, + EnableSarif: true, + Format: formatSarif, + PolicyFile: defaultScorecardPolicyFile, + ResultsFile: testResultsFile, + Commit: options.DefaultCommit, + LogLevel: options.DefaultLogLevel, + }, + wantErr: false, + }, + { + name: "SuccessFormatJSON", + githubEventPath: githubEventPathNonFork, + repo: testRepo, + resultsFormat: "json", + resultsFile: testResultsFile, + want: options.Options{ + Repo: testRepo, + EnableSarif: true, + Format: options.FormatJSON, + ResultsFile: testResultsFile, + Commit: options.DefaultCommit, + LogLevel: options.DefaultLogLevel, + }, + wantErr: false, + }, + /* + { + name: "FailureNoEnvVars", + want: options.Options{}, + wantErr: true, + }, + */ + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.githubEventPath != "" { + os.Setenv(EnvGithubEventPath, tt.githubEventPath) + } + if tt.repo != "" { + os.Setenv(EnvGithubRepository, tt.repo) + } + if tt.resultsFile != "" { + os.Setenv("SCORECARD_RESULTS_FILE", tt.resultsFile) + } + if tt.resultsFormat != "" { + os.Setenv("SCORECARD_RESULTS_FORMAT", tt.resultsFormat) + } + + opts, err := New() + got := *opts.ScorecardOpts + if (err != nil) != tt.wantErr { + t.Errorf("New() error = %+v, wantErr %+v", err, tt.wantErr) + return + } + if !cmp.Equal(tt.want, got) { + t.Errorf("New(): -want, +got:\n%s", cmp.Diff(tt.want, got)) + } + }) + } +} + func TestInitialize(t *testing.T) { type fields struct { ScorecardOpts *options.Options EnabledChecks string - InputResultsFile string - InputResultsFormat string - InputPublishResults string EnableLicense string EnableDangerousWorkflow string GithubEventName string @@ -85,9 +166,6 @@ func TestInitialize(t *testing.T) { o := &Options{ ScorecardOpts: tt.fields.ScorecardOpts, EnabledChecks: tt.fields.EnabledChecks, - InputResultsFile: tt.fields.InputResultsFile, - InputResultsFormat: tt.fields.InputResultsFormat, - InputPublishResults: tt.fields.InputPublishResults, EnableLicense: tt.fields.EnableLicense, EnableDangerousWorkflow: tt.fields.EnableDangerousWorkflow, GithubEventName: tt.fields.GithubEventName, From 1c1e25749c6164a07b1104aec872d5f1d947556b Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Sun, 6 Mar 2022 22:24:14 -0500 Subject: [PATCH 16/17] Allow options tests to pass in GitHub Actions environments Signed-off-by: Stephen Augustus --- options/options.go | 3 +++ options/options_test.go | 54 ++++++++++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/options/options.go b/options/options.go index 85b5558a..609ee87d 100644 --- a/options/options.go +++ b/options/options.go @@ -100,6 +100,9 @@ func New() (*Options, error) { } } + // TODO(scorecard): Reset commit options. Fix this in scorecard. + opts.ScorecardOpts.Commit = options.DefaultCommit + if err := opts.ScorecardOpts.Validate(); err != nil { return opts, fmt.Errorf("validating scorecard options: %w", err) } diff --git a/options/options_test.go b/options/options_test.go index 1dc4a608..da20ab55 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -36,6 +36,14 @@ const ( ) func TestNew(t *testing.T) { + type fields struct { + EnableSarif bool + Format string + PolicyFile string + ResultsFile string + Commit string + LogLevel string + } tests := []struct { name string githubEventPath string @@ -43,7 +51,7 @@ func TestNew(t *testing.T) { resultsFile string resultsFormat string publishResults string - want options.Options + want fields wantErr bool }{ { @@ -52,8 +60,7 @@ func TestNew(t *testing.T) { repo: testRepo, resultsFormat: "sarif", resultsFile: testResultsFile, - want: options.Options{ - Repo: testRepo, + want: fields{ EnableSarif: true, Format: formatSarif, PolicyFile: defaultScorecardPolicyFile, @@ -69,8 +76,7 @@ func TestNew(t *testing.T) { repo: testRepo, resultsFormat: "json", resultsFile: testResultsFile, - want: options.Options{ - Repo: testRepo, + want: fields{ EnableSarif: true, Format: options.FormatJSON, ResultsFile: testResultsFile, @@ -79,22 +85,23 @@ func TestNew(t *testing.T) { }, wantErr: false, }, - /* - { - name: "FailureNoEnvVars", - want: options.Options{}, - wantErr: true, - }, - */ } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if tt.githubEventPath != "" { - os.Setenv(EnvGithubEventPath, tt.githubEventPath) + _, pathEnvExists := os.LookupEnv(EnvGithubEventPath) + if !pathEnvExists { + if tt.githubEventPath != "" { + os.Setenv(EnvGithubEventPath, tt.githubEventPath) + } } - if tt.repo != "" { - os.Setenv(EnvGithubRepository, tt.repo) + + _, repoEnvExists := os.LookupEnv(EnvGithubRepository) + if !repoEnvExists { + if tt.repo != "" { + os.Setenv(EnvGithubRepository, tt.repo) + } } + if tt.resultsFile != "" { os.Setenv("SCORECARD_RESULTS_FILE", tt.resultsFile) } @@ -103,11 +110,24 @@ func TestNew(t *testing.T) { } opts, err := New() - got := *opts.ScorecardOpts + scOpts := *opts.ScorecardOpts + got := fields{ + EnableSarif: scOpts.EnableSarif, + Format: scOpts.Format, + PolicyFile: scOpts.PolicyFile, + ResultsFile: scOpts.ResultsFile, + Commit: scOpts.Commit, + LogLevel: scOpts.LogLevel, + } + if (err != nil) != tt.wantErr { + for _, e := range os.Environ() { + t.Logf(e) + } t.Errorf("New() error = %+v, wantErr %+v", err, tt.wantErr) return } + if !cmp.Equal(tt.want, got) { t.Errorf("New(): -want, +got:\n%s", cmp.Diff(tt.want, got)) } From 29e94f28deaf9fba77df62d6f2ad8d24a607c402 Mon Sep 17 00:00:00 2001 From: Stephen Augustus Date: Sun, 6 Mar 2022 22:44:45 -0500 Subject: [PATCH 17/17] Rewrite unit tests (3/n) Signed-off-by: Stephen Augustus --- options/options.go | 19 ++++++----- options/options_test.go | 75 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/options/options.go b/options/options.go index 609ee87d..3fb3e20e 100644 --- a/options/options.go +++ b/options/options.go @@ -18,7 +18,6 @@ import ( "encoding/json" "errors" "fmt" - "io" "io/ioutil" "os" "strconv" @@ -112,7 +111,10 @@ func New() (*Options, error) { return opts, errResultsPathEmpty } - // TODO(options): Consider running Validate() before returning. + if err := opts.Validate(); err != nil { + return opts, fmt.Errorf("validating scorecard-action options: %w", err) + } + return opts, nil } @@ -135,15 +137,14 @@ func (o *Options) Initialize() error { } // Validate validates the scorecard configuration. -func (o *Options) Validate(writer io.Writer) error { +func (o *Options) Validate() error { if os.Getenv(EnvGithubAuthToken) == "" { - fmt.Fprintf(writer, "The 'repo_token' variable is empty.\n") + fmt.Printf("The 'repo_token' variable is empty.\n") if o.IsForkStr == trueStr { - fmt.Fprintf(writer, "We have detected you are running on a fork.\n") + fmt.Printf("We have detected you are running on a fork.\n") } - fmt.Fprintf( - writer, + fmt.Printf( "Please follow the instructions at https://github.com/ossf/scorecard-action#authentication to create the read-only PAT token.\n", //nolint:lll ) @@ -152,8 +153,8 @@ func (o *Options) Validate(writer io.Writer) error { if strings.Contains(os.Getenv(o.GithubEventName), "pull_request") && os.Getenv(o.GithubRef) == o.DefaultBranch { - fmt.Fprintf(writer, "%s not supported with %s event.\n", os.Getenv(o.GithubRef), os.Getenv(o.GithubEventName)) - fmt.Fprintf(writer, "Only the default branch %s is supported.\n", o.DefaultBranch) + fmt.Printf("%s not supported with %s event.\n", os.Getenv(o.GithubRef), os.Getenv(o.GithubEventName)) + fmt.Printf("Only the default branch %s is supported.\n", o.DefaultBranch) return errOnlyDefaultBranchSupported } diff --git a/options/options_test.go b/options/options_test.go index da20ab55..32850744 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -20,13 +20,13 @@ import ( "testing" "github.com/google/go-cmp/cmp" - "github.com/ossf/scorecard/v4/options" ) const ( testRepo = "good/repo" testResultsFile = "results.sarif" + testToken = "test-token" githubEventPathNonFork = "testdata/non-fork.json" githubEventPathFork = "testdata/fork.json" @@ -52,6 +52,7 @@ func TestNew(t *testing.T) { resultsFormat string publishResults string want fields + unsetToken bool wantErr bool }{ { @@ -85,9 +86,34 @@ func TestNew(t *testing.T) { }, wantErr: false, }, + { + name: "FailureTokenIsNotSet", + githubEventPath: githubEventPathNonFork, + repo: testRepo, + resultsFormat: "sarif", + resultsFile: testResultsFile, + want: fields{ + EnableSarif: true, + Format: formatSarif, + PolicyFile: defaultScorecardPolicyFile, + ResultsFile: testResultsFile, + Commit: options.DefaultCommit, + LogLevel: options.DefaultLogLevel, + }, + unsetToken: true, + wantErr: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + _, tokenEnvExists := os.LookupEnv(EnvGithubAuthToken) + if !tokenEnvExists { + os.Setenv(EnvGithubAuthToken, testToken) + } + if tt.unsetToken { + os.Unsetenv(EnvGithubAuthToken) + } + _, pathEnvExists := os.LookupEnv(EnvGithubEventPath) if !pathEnvExists { if tt.githubEventPath != "" { @@ -203,3 +229,50 @@ func TestInitialize(t *testing.T) { }) } } + +func TestPrint(t *testing.T) { + type fields struct { + ScorecardOpts *options.Options + EnabledChecks string + EnableLicense string + EnableDangerousWorkflow string + GithubEventName string + GithubEventPath string + GithubRef string + GithubRepository string + GithubWorkspace string + DefaultBranch string + IsForkStr string + PrivateRepoStr string + } + tests := []struct { + name string + fields fields + }{ + { + name: "Success", + fields: fields{ + ScorecardOpts: options.New(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + o := &Options{ + ScorecardOpts: tt.fields.ScorecardOpts, + EnabledChecks: tt.fields.EnabledChecks, + EnableLicense: tt.fields.EnableLicense, + EnableDangerousWorkflow: tt.fields.EnableDangerousWorkflow, + GithubEventName: tt.fields.GithubEventName, + GithubEventPath: tt.fields.GithubEventPath, + GithubRef: tt.fields.GithubRef, + GithubRepository: tt.fields.GithubRepository, + GithubWorkspace: tt.fields.GithubWorkspace, + DefaultBranch: tt.fields.DefaultBranch, + IsForkStr: tt.fields.IsForkStr, + PrivateRepoStr: tt.fields.PrivateRepoStr, + } + o.Print() + }) + } +}