From c90819886438728d7c1170ae688b217d42715f41 Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Tue, 10 May 2022 19:14:06 +0530 Subject: [PATCH 01/28] feat: add syntactic verification for analyzer.toml and issue descriptions (#131) --- .github/workflows/CI.yml | 7 +- analyzers/backend/docker/build.go | 117 ++ .../.deepsource/analyzer/analyzer.toml | 14 + .../.deepsource/analyzer/issues/PTC-W001.toml | 6 + .../.deepsource/analyzer/issues/PTC-W002.toml | 5 + .../.deepsource/analyzer/analyzer.toml | 14 + .../.deepsource/analyzer/issues/JS-001.toml | 4 + .../.deepsource/analyzer/issues/JS-002.toml | 0 .../.deepsource/analyzer/analyzer.toml | 14 + analyzers/validator/types.go | 56 + analyzers/validator/utils.go | 24 + analyzers/validator/validator.go | 161 ++ analyzers/validator/validator_test.go | 65 + command/analyzer/analyzer.go | 20 + command/analyzer/verify/utils.go | 14 + command/analyzer/verify/verify.go | 152 ++ command/auth/login/pat_login_flow.go | 2 +- command/auth/logout/logout.go | 2 +- command/auth/refresh/refresh.go | 2 +- command/auth/status/status.go | 2 +- command/config/validate/validate.go | 2 +- command/root.go | 2 + config/config.go | 4 +- deepsource/analyzers/queries/get_analyzers.go | 2 +- deepsource/auth/mutations/register_device.go | 2 +- .../transformers/queries/get_transformers.go | 2 +- go.mod | 29 +- go.sum | 1320 ++++++++++++++++- utils/config.go | 20 + utils/prompt.go | 13 + utils/spinner.go | 59 + 31 files changed, 2095 insertions(+), 41 deletions(-) create mode 100644 analyzers/backend/docker/build.go create mode 100644 analyzers/validator/testdata/analyzer1/.deepsource/analyzer/analyzer.toml create mode 100644 analyzers/validator/testdata/analyzer1/.deepsource/analyzer/issues/PTC-W001.toml create mode 100644 analyzers/validator/testdata/analyzer1/.deepsource/analyzer/issues/PTC-W002.toml create mode 100644 analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml create mode 100644 analyzers/validator/testdata/analyzer2/.deepsource/analyzer/issues/JS-001.toml create mode 100644 analyzers/validator/testdata/analyzer2/.deepsource/analyzer/issues/JS-002.toml create mode 100644 analyzers/validator/testdata/analyzer3/.deepsource/analyzer/analyzer.toml create mode 100644 analyzers/validator/types.go create mode 100644 analyzers/validator/utils.go create mode 100644 analyzers/validator/validator.go create mode 100644 analyzers/validator/validator_test.go create mode 100644 command/analyzer/analyzer.go create mode 100644 command/analyzer/verify/utils.go create mode 100644 command/analyzer/verify/verify.go create mode 100644 utils/config.go create mode 100644 utils/spinner.go diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 404f95957..c7cedf561 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -1,8 +1,11 @@ name: CI on: - pull_request_target: - branches: [master] + pull_request: + branches: + - "master" + - "dev" + - "analyzers" push: branches: - master diff --git a/analyzers/backend/docker/build.go b/analyzers/backend/docker/build.go new file mode 100644 index 000000000..98e20f90d --- /dev/null +++ b/analyzers/backend/docker/build.go @@ -0,0 +1,117 @@ +package docker + +import ( + "bufio" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "os" + "strings" + "time" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" + "github.com/docker/docker/pkg/archive" +) + +type ErrorLine struct { + Error string `json:"error"` + ErrorDetail ErrorDetail `json:"errorDetail"` +} + +type ErrorDetail struct { + Message string `json:"message"` +} + +type DockerBuildResponse struct { + Stream string `json:"stream"` +} + +type DockerClient struct { + Client *client.Client + ImageName string + ImageTag string + DockerfilePath string +} + +type DockerBuildError struct { + Message string +} + +func (d *DockerBuildError) Error() string { + return d.Message +} + +func (d *DockerClient) BuildAnalyzerDockerImage() *DockerBuildError { + var err error + d.Client, err = client.NewClientWithOpts(client.FromEnv) + if err != nil { + return &DockerBuildError{ + Message: err.Error(), + } + } + + if err = d.executeImageBuild(); err != nil { + return &DockerBuildError{ + Message: err.Error(), + } + } + return nil +} + +func (d *DockerClient) executeImageBuild() error { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*120) + defer cancel() + cwd, _ := os.Getwd() + + tarOptions := &archive.TarOptions{ + ExcludePatterns: []string{".git/**"}, + } + tar, err := archive.TarWithOptions(cwd, tarOptions) + if err != nil { + return err + } + + opts := types.ImageBuildOptions{ + Dockerfile: d.DockerfilePath, + Tags: []string{fmt.Sprintf("%s:%s", d.ImageName, d.ImageTag)}, + Remove: true, + Platform: "linux", + } + res, err := d.Client.ImageBuild(ctx, tar, opts) + if err != nil { + return err + } + defer res.Body.Close() + return checkResponse(res.Body) +} + +func checkResponse(rd io.Reader) error { + var lastLine []byte + count := 0 + var currentStream string + + scanner := bufio.NewScanner(rd) + for scanner.Scan() { + lastLine = scanner.Bytes() + d := &DockerBuildResponse{} + err := json.Unmarshal(lastLine, d) + if err != nil { + return err + } + if d.Stream == "" || d.Stream == "\n" || strings.TrimSuffix(d.Stream, "\n") == currentStream { + continue + } + currentStream = strings.TrimSuffix(d.Stream, "\n") + count++ + } + + errLine := &ErrorLine{} + json.Unmarshal([]byte(lastLine), errLine) + if errLine.Error != "" { + return errors.New(errLine.Error) + } + return scanner.Err() +} diff --git a/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/analyzer.toml b/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/analyzer.toml new file mode 100644 index 000000000..46fe5bc31 --- /dev/null +++ b/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/analyzer.toml @@ -0,0 +1,14 @@ +name = "todo comments checker" +shortcode = "@deepsource/demo-python" +description = "finds the todo comments in codebase." +category = "doc" +tags = ["documentation","todo"] +environment_variables = {code_path = "/code"} + +[urls] + source = "https://github.com/deepsourcelabs/2do-checker" + documentation = "https://deepsource.io/docs" + bug_tracker = "https://bugtracker.deepsource.io" + +[analysis] + command = "/app/todo-checker" diff --git a/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/issues/PTC-W001.toml b/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/issues/PTC-W001.toml new file mode 100644 index 000000000..01cdbe26b --- /dev/null +++ b/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/issues/PTC-W001.toml @@ -0,0 +1,6 @@ +# shortcode = "PTC-W001" +# title = "Potential hardcoded credential detected" +# category = "security" +description = """ +Potential hardcoded credential. Sensitive information like password shouldn't be hardcoded. Use an environment variable instead. +""" diff --git a/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/issues/PTC-W002.toml b/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/issues/PTC-W002.toml new file mode 100644 index 000000000..f38fb4f2a --- /dev/null +++ b/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/issues/PTC-W002.toml @@ -0,0 +1,5 @@ +# shortcode = "PTC-W001" +category = "security" +description = """ +Potential hardcoded credential. Sensitive information like password shouldn't be hardcoded. Use an environment variable instead. +""" diff --git a/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml b/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml new file mode 100644 index 000000000..59d895bba --- /dev/null +++ b/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml @@ -0,0 +1,14 @@ +name = "Todo comments checker" +# path = "@deepsource/demo-python" +description = "Finds the TODO comments in codebase." +# category = "doc" +tags = ["documentation","todo"] +environment_variables = {CODE_PATH = "/code"} + +[urls] + source = "https://github.com/deepsourcelabs/2do-checker" + documentation = "https://deepsource.io/docs" + bug_tracker = "https://bugtracker.deepsource.io" + +[analysis] + command = "/app/todo-checker" diff --git a/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/issues/JS-001.toml b/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/issues/JS-001.toml new file mode 100644 index 000000000..d7272ebda --- /dev/null +++ b/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/issues/JS-001.toml @@ -0,0 +1,4 @@ +category = "security" +description = """ +Potential hardcoded credential. Sensitive information like password shouldn't be hardcoded. Use an environment variable instead. +""" diff --git a/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/issues/JS-002.toml b/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/issues/JS-002.toml new file mode 100644 index 000000000..e69de29bb diff --git a/analyzers/validator/testdata/analyzer3/.deepsource/analyzer/analyzer.toml b/analyzers/validator/testdata/analyzer3/.deepsource/analyzer/analyzer.toml new file mode 100644 index 000000000..569c8ebdf --- /dev/null +++ b/analyzers/validator/testdata/analyzer3/.deepsource/analyzer/analyzer.toml @@ -0,0 +1,14 @@ +name = "Todo comments checker" +shortcode = "@deepsource/demo-python" +description = "Finds the TODO comments in codebase." +# category = "doc" +tags = ["documentation","todo"] +environment_variables = {CODE_PATH = "/code"} + +[urls] + source = "https://github.com/deepsourcelabs/2do-checker" + documentation = "https://deepsource.io/docs" + bug_tracker = "https://bugtracker.deepsource.io" + +[analysis] + command = "/app/todo-checker" diff --git a/analyzers/validator/types.go b/analyzers/validator/types.go new file mode 100644 index 000000000..cb7153724 --- /dev/null +++ b/analyzers/validator/types.go @@ -0,0 +1,56 @@ +package validator + +type Analysis struct { + Command string `toml:"command" json:"command" validate:"required"` +} + +// TODO: Remove the comment when we start support for Autofix. +// type Autofix struct { +// Command string `toml:"command" json:"command" analyzertoml:"required"` +// } + +type Build struct { + Builder string `toml:"builder" json:"builder" validate:"omitempty"` + Dockerfile string `toml:"dockerfile" json:"dockerfile,omitempty" validate:"omitempty"` + Script string `toml:"script" json:"script" validate:"omitempty"` +} + +type URL struct { + Source string `toml:"source" json:"source" validate:"omitempty,url"` + Documentation string `toml:"documentation" json:"documentation,omitempty" validate:"omitempty,url"` + BugTracker string `toml:"bug_tracker" json:"bug_tracker" validate:"omitempty,url"` +} + +type Test struct { + Command string `toml:"command" json:"command" validate:"omitempty"` +} + +// analyzer.toml type +type AnalyzerMetadata struct { + // Analyzer specific data + Name string `toml:"name" json:"name" validate:"required"` + Shortcode string `toml:"shortcode" json:"shortcode" validate:"required"` // New + Description string `toml:"description" json:"description" validate:"required"` + Category string `toml:"category" json:"category" validate:"required"` + Tags []string `toml:"tags" json:"tags,omitempty" validate:"omitempty"` + URL URL `toml:"urls" json:"urls,omitempty" validate:"omitempty"` + EnvironmentVariables map[string]string `toml:"environment_variables" json:"environment_variables,omitempty" validate:"omitempty"` + + // Analyzer, Autofix and Transformer config + Analysis Analysis `toml:"analysis" json:"analysis" validate:"required"` + // Autofix Autofix `toml:"autofix" json:"autofix" validate:"omitempty"` + + // Build steps needed to build the analyzer + Build Build `toml:"build" json:"build" validate:"omitempty"` + + // Test command for running the testing workflow + Test Test `toml:"test" json:"test" validate:"omitempty"` +} + +// Analyzer issue description +type AnalyzerIssue struct { + Shortcode string `validate:"omitempty"` + Title string `toml:"title" json:"title" validate:"required"` + Description string `toml:"description" json:"description" validate:"required"` + Category string `toml:"category" json:"category" validate:"required"` +} diff --git a/analyzers/validator/utils.go b/analyzers/validator/utils.go new file mode 100644 index 000000000..873db0bed --- /dev/null +++ b/analyzers/validator/utils.go @@ -0,0 +1,24 @@ +package validator + +import ( + "reflect" + + validate "github.com/go-playground/validator/v10" +) + +// Returns the list of required fields from the error message returned by the `go-playground/validator` library +func getMissingRequiredFields(err error, config interface{}) []string { + missingRequiredFields := []string{} + errs := err.(validate.ValidationErrors) + for _, err := range errs { + if err.Tag() == "required" { + c := reflect.ValueOf(config) + for i := 0; i < c.Type().NumField(); i++ { + if err.Field() == c.Type().Field(i).Name { + missingRequiredFields = append(missingRequiredFields, c.Type().Field(i).Tag.Get("toml")) + } + } + } + } + return missingRequiredFields +} diff --git a/analyzers/validator/validator.go b/analyzers/validator/validator.go new file mode 100644 index 000000000..e7b6e8c17 --- /dev/null +++ b/analyzers/validator/validator.go @@ -0,0 +1,161 @@ +package validator + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + validate "github.com/go-playground/validator/v10" + "github.com/pelletier/go-toml/v2" +) + +type Error struct { + Type string + Field string + Message string +} + +type ValidationError struct { + File string + Errors []Error +} + +// Checks if the analyzer.toml file and the issue directory is present +func CheckForAnalyzerConfig(analyzerTOMLPath, issuesDirectoryPath string) (err error) { + // Check if `analyzer.toml` is present in `.deepsource/analyzer` folder + if _, err := os.Stat(analyzerTOMLPath); err != nil { + if errors.Is(err, os.ErrNotExist) { + return errors.New("the analyzer.toml file doesn't exist\n") + } + } + + // Check if `issues/` directory is present in `.deepsource/analyzer` folder and is not empty. + if _, err := os.Stat(issuesDirectoryPath); err != nil { + if errors.Is(err, os.ErrNotExist) { + return errors.New("the issue descriptions directory doesn't exist\n") + } + } + + // Check if there are any toml files in the `issues/` directory + files, err := ioutil.ReadDir(issuesDirectoryPath) + if err != nil { + return fmt.Errorf("failed to read the files present in the issues directory at %s\n", issuesDirectoryPath) + } + + // Check if its an empty directory + if len(files) < 1 { + return fmt.Errorf("found 0 issues configured in the issues directory at %s\n", issuesDirectoryPath) + } + + tomlPresent := false + // Check if there are TOML files configured in the issues/ directory + for _, file := range files { + if strings.HasSuffix(file.Name(), ".toml") { + tomlPresent = true + break + } + } + if !tomlPresent { + return fmt.Errorf("found no toml files in the issues directory at %s\n", issuesDirectoryPath) + } + + return +} + +// Validates analyzer.toml file +func ValidateAnalyzerTOML(analyzerTOMLPath string) (*AnalyzerMetadata, *ValidationError, error) { + config := AnalyzerMetadata{} + analyzerTOMLValidationErrors := ValidationError{} + + // Read the contents of analyzer.toml file + analyzerTOMLContent, err := ioutil.ReadFile(analyzerTOMLPath) + if err != nil { + return &config, nil, errors.New("failed to read analyzer.toml file") + } + + // Unmarshal TOML into config + if err = toml.Unmarshal(analyzerTOMLContent, &config); err != nil { + return &config, nil, err + } + + // Validate analyzer.toml fields based on type and sanity checks + v := validate.New() + if err := v.Struct(&config); err != nil { + missingRequiredFields := getMissingRequiredFields(err, config) + analyzerTOMLValidationErrors = ValidationError{ + File: analyzerTOMLPath, + } + + // TODO: Tweak this to accomodate other error types. + for _, missingField := range missingRequiredFields { + analyzerTOMLValidationErrors.Errors = append(analyzerTOMLValidationErrors.Errors, Error{ + Type: "ERROR", + Field: missingField, + Message: "Missing required field", + }, + ) + } + return &config, &analyzerTOMLValidationErrors, nil + } + return &config, nil, nil +} + +// Validates issue description TOML files +func ValidateIssueDescriptions(issuesDirectoryPath string) (*[]ValidationError, error) { + validationFailed := false + issueValidationErrors := []ValidationError{} + + // TODO: List only TOML files here + issuesList, err := ioutil.ReadDir(issuesDirectoryPath) + if err != nil { + return nil, err + } + + for _, issuePath := range issuesList { + config := AnalyzerIssue{} + + // Set the issue shortcode as the filename + config.Shortcode = strings.TrimSuffix(issuePath.Name(), ".toml") + + // Read the contents of issue toml file + issueTOMLContent, err := ioutil.ReadFile(filepath.Join(issuesDirectoryPath, issuePath.Name())) + if err != nil { + return nil, fmt.Errorf("failed to read file: %s", filepath.Join(issuesDirectoryPath, issuePath.Name())) + } + + // Unmarshal TOML into config + if err = toml.Unmarshal(issueTOMLContent, &config); err != nil { + return nil, err + } + + // Validate the data + v := validate.New() + + if err := v.Struct(&config); err != nil { + validationFailed = true + missingRequiredFields := getMissingRequiredFields(err, config) + issueValidationError := ValidationError{ + File: issuePath.Name(), + } + + // TODO: Tweak this to accomodate other error types. + for _, missingField := range missingRequiredFields { + issueValidationError.Errors = append(issueValidationError.Errors, Error{ + Type: "ERROR", + Field: missingField, + Message: "Missing required field", + }, + ) + } + issueValidationErrors = append(issueValidationErrors, issueValidationError) + } + } + + if validationFailed { + return &issueValidationErrors, nil + } + return nil, nil +} diff --git a/analyzers/validator/validator_test.go b/analyzers/validator/validator_test.go new file mode 100644 index 000000000..26104e5b5 --- /dev/null +++ b/analyzers/validator/validator_test.go @@ -0,0 +1,65 @@ +package validator + +import ( + "testing" +) + +func TestValidateAnalyzerToml(t *testing.T) { + type test struct { + tomlPath string + validTOML bool + } + + tests := []test{ + { + tomlPath: "./testdata/analyzer1/.deepsource/analyzer/analyzer.toml", + validTOML: true, + }, + { + tomlPath: "./testdata/analyzer2/.deepsource/analyzer/analyzer.toml", + validTOML: false, + }, + { + tomlPath: "./testdata/analyzer3/.deepsource/analyzer/analyzer.toml", + validTOML: false, + }, + } + + for _, tc := range tests { + _, validationErr, _ := ValidateAnalyzerTOML(tc.tomlPath) + if validationErr != nil && tc.validTOML { + t.Errorf("Expected valid TOML for %s. Got: %v", tc.tomlPath, validationErr) + } + if validationErr == nil && !tc.validTOML { + t.Errorf("Expected invalid TOML for %s. Got: %v", tc.tomlPath, validationErr) + } + } +} + +func TestValidateIssueDescriptions(t *testing.T) { + type test struct { + issuesDirPath string + validIssues bool + } + + tests := []test{ + { + issuesDirPath: "./testdata/analyzer1/.deepsource/analyzer/issues/", + validIssues: false, + }, + { + issuesDirPath: "./testdata/analyzer2/.deepsource/analyzer/issues/", + validIssues: false, + }, + } + + for _, tc := range tests { + validationErrors, err := ValidateIssueDescriptions(tc.issuesDirPath) + if validationErrors != nil && tc.validIssues { + t.Errorf("Expected valid TOML for %s. Got: %v", tc.issuesDirPath, err) + } + if validationErrors == nil && !tc.validIssues { + t.Errorf("Expected invalid TOML for %s. Got: %v", tc.issuesDirPath, err) + } + } +} diff --git a/command/analyzer/analyzer.go b/command/analyzer/analyzer.go new file mode 100644 index 000000000..7c5c8fdb2 --- /dev/null +++ b/command/analyzer/analyzer.go @@ -0,0 +1,20 @@ +package analyzer + +import ( + "github.com/spf13/cobra" + + verify "github.com/deepsourcelabs/cli/command/analyzer/verify" +) + +// Options holds the metadata. +type Options struct{} + +// NewCmdVersion returns the current version of cli being used +func NewCmdAnalyzer() *cobra.Command { + cmd := &cobra.Command{ + Use: "analyzer", + Short: "Operations related to DeepSource Analyzers", + } + cmd.AddCommand(verify.NewCmdAnalyzerVerify()) + return cmd +} diff --git a/command/analyzer/verify/utils.go b/command/analyzer/verify/utils.go new file mode 100644 index 000000000..56e476bd0 --- /dev/null +++ b/command/analyzer/verify/utils.go @@ -0,0 +1,14 @@ +package verify + +import ( + "crypto/rand" + "fmt" +) + +func generateImageVersion(length int) string { + b := make([]byte, length) + if _, err := rand.Read(b); err != nil { + panic(err) + } + return fmt.Sprintf("%x", b) +} diff --git a/command/analyzer/verify/verify.go b/command/analyzer/verify/verify.go new file mode 100644 index 000000000..87e5b1e9c --- /dev/null +++ b/command/analyzer/verify/verify.go @@ -0,0 +1,152 @@ +package verify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "strings" + + build "github.com/deepsourcelabs/cli/analyzers/backend/docker" + "github.com/deepsourcelabs/cli/analyzers/validator" + "github.com/deepsourcelabs/cli/utils" + "github.com/spf13/cobra" +) + +var ( + configFolder string = ".deepsource/analyzer" + analyzerTOMLPath string + issuesDirPath string +) + +type AnalyzerVerifyOpts struct{} + +func NewCmdAnalyzerVerify() *cobra.Command { + cwd, _ := os.Getwd() + + // Extracting the path of the project root + projectRoot, err := utils.ExtractProjectRootPath() + if err != nil { + projectRoot = cwd + } + + // Configuring the paths of analyzer.toml and issues directory + analyzerTOMLPath = filepath.Join(projectRoot, configFolder, "analyzer.toml") + issuesDirPath = filepath.Join(projectRoot, configFolder, "issues/") + + opts := AnalyzerVerifyOpts{} + cmd := &cobra.Command{ + Use: "verify", + Short: "Verify DeepSource Analyzers configuration", + Args: utils.NoArgs, + RunE: func(_ *cobra.Command, _ []string) error { + if err := opts.Run(); err != nil { + return errors.New("Analyzer verification failed. Exiting...") + } + return nil + }, + } + return cmd +} + +// Runs the command +func (*AnalyzerVerifyOpts) Run() (err error) { + var validationErrors *[]validator.ValidationError + spin := utils.SpinnerUtils{} + configurationValid := true + + ///////////////////////////////// + // Configuration verification/// + /////////////////////////////// + + // Check for path of `analyzer.toml` file and `issues` directory containing issue descriptions + spin.StartSpinnerWithLabel("Checking for presence of analyzer.toml and issue descriptions...", "Yay!!Found analyzer.toml and issue descriptions.") + if err = validator.CheckForAnalyzerConfig(analyzerTOMLPath, issuesDirPath); err != nil { + configurationValid = false + spin.StopSpinnerWithError("Failed to locate analyzer configurations", err) + return + } + spin.StopSpinner() + + // Read and verify analyzer toml + spin.StartSpinnerWithLabel("Validating analyzer.toml...", "Verified analyzer.toml") + analyzerTOMLData, analyzerTOMLValidationErrors, err := validator.ValidateAnalyzerTOML(analyzerTOMLPath) + if analyzerTOMLValidationErrors != nil { + configurationValid = false + spin.StopSpinnerWithError("Failed to verify analyzer.toml\n", err) + for _, err := range analyzerTOMLValidationErrors.Errors { + msg := fmt.Sprintf("%s : %s", err.Message, err.Field) + failureMsg := utils.GetFailureMessage(msg, "") + fmt.Printf(" * %s\n", failureMsg) + } + } + spin.StopSpinner() + + // Read and verify all issues + spin.StartSpinnerWithLabel("Validating issue descriptions...", "Verified issue descriptions") + if validationErrors, err = validator.ValidateIssueDescriptions(issuesDirPath); err != nil { + configurationValid = false + spin.StopSpinnerWithError("Failed to validate the following issue desriptions", err) + } + + // Check if there are any validation errors in issue descriptions + if validationErrors != nil { + configurationValid = false + spin.StopSpinnerWithError("Failed to validate the following issue descriptions\n", err) + for _, validationError := range *validationErrors { + fmt.Printf(" * %s\n", validationError.File) + for _, err := range validationError.Errors { + msg := fmt.Sprintf("%s : %s", err.Message, err.Field) + failureMsg := utils.GetFailureMessage(msg, "") + fmt.Printf(" * %s\n", failureMsg) + } + } + } + spin.StopSpinner() + + // Do not move to building the image if the configuration verification fails + if !configurationValid { + return + } + + ///////////////////////// + // Build verification/// + /////////////////////// + + // Specifying the name of the image to be built + // Set the default Dockerfile path as "Dockerfile" + var dockerFilePath, dockerFileName string + dockerFilePath = "Dockerfile" + + // Read config for the value if specified + if analyzerTOMLData.Build.Dockerfile != "" { + dockerFilePath = analyzerTOMLData.Build.Dockerfile + } + if analyzerTOMLData.Shortcode != "" { + dockerFileName = strings.TrimPrefix(analyzerTOMLData.Shortcode, "@") + } + + spin.StartSpinnerWithLabel(fmt.Sprintf("Building Analyzer image with the name \"%s\"", dockerFileName), "Successfully built the Analyzer image") + // Specifying the source to build + // Check for the presence of `build.Dockerfile` or if not a `Dockerfile` in the current working directory + if _, err := os.Stat(dockerFilePath); err != nil { + if errors.Is(err, os.ErrNotExist) { + spin.StopSpinnerWithError("Failed to build the image", fmt.Errorf("%s not found\n", dockerFilePath)) + return err + } + } + + analyzerBuilder := build.DockerClient{ + ImageName: dockerFileName, + DockerfilePath: dockerFilePath, + ImageTag: generateImageVersion(7), + } + + buildErr := analyzerBuilder.BuildAnalyzerDockerImage() + if buildErr != nil { + spin.StopSpinnerWithError("Failed to build the image", fmt.Errorf(buildErr.Error())) + } + spin.StopSpinner() + + return nil +} diff --git a/command/auth/login/pat_login_flow.go b/command/auth/login/pat_login_flow.go index edefaf8d5..69132a1d4 100644 --- a/command/auth/login/pat_login_flow.go +++ b/command/auth/login/pat_login_flow.go @@ -7,7 +7,7 @@ import ( ) // Starts the login flow for the CLI (using PAT) -func (opts *LoginOptions) startPATLoginFlow(cfg *config.CLIConfig, token string) error { +func (*LoginOptions) startPATLoginFlow(cfg *config.CLIConfig, token string) error { // set personal access token (PAT) cfg.Token = token diff --git a/command/auth/logout/logout.go b/command/auth/logout/logout.go index 6d9e3e82f..1fc12c668 100644 --- a/command/auth/logout/logout.go +++ b/command/auth/logout/logout.go @@ -26,7 +26,7 @@ func NewCmdLogout() *cobra.Command { return cmd } -func (opts *LogoutOptions) Run() error { +func (*LogoutOptions) Run() error { // Fetch config cfg, err := config.GetConfig() if err != nil { diff --git a/command/auth/refresh/refresh.go b/command/auth/refresh/refresh.go index b71592d32..c54bccbb3 100644 --- a/command/auth/refresh/refresh.go +++ b/command/auth/refresh/refresh.go @@ -39,7 +39,7 @@ func NewCmdRefresh() *cobra.Command { return cmd } -func (opts *RefreshOptions) Run() error { +func (*RefreshOptions) Run() error { // Fetch config cfg, err := config.GetConfig() if err != nil { diff --git a/command/auth/status/status.go b/command/auth/status/status.go index 40af9ce46..72d2aa5f3 100644 --- a/command/auth/status/status.go +++ b/command/auth/status/status.go @@ -34,7 +34,7 @@ func NewCmdStatus() *cobra.Command { return cmd } -func (opts *AuthStatusOptions) Run() error { +func (*AuthStatusOptions) Run() error { // Fetch config cfg, err := config.GetConfig() if err != nil { diff --git a/command/config/validate/validate.go b/command/config/validate/validate.go index 500cb50ae..0fdadf222 100644 --- a/command/config/validate/validate.go +++ b/command/config/validate/validate.go @@ -38,7 +38,7 @@ func NewCmdValidate() *cobra.Command { } // Run executes the command. -func (o *Options) Run() error { +func (*Options) Run() error { // Fetch config cfg, err := config.GetConfig() if err != nil { diff --git a/command/root.go b/command/root.go index 73e323b3c..123eb8911 100644 --- a/command/root.go +++ b/command/root.go @@ -1,6 +1,7 @@ package command import ( + "github.com/deepsourcelabs/cli/command/analyzer" "github.com/deepsourcelabs/cli/command/auth" "github.com/deepsourcelabs/cli/command/config" "github.com/deepsourcelabs/cli/command/issues" @@ -29,6 +30,7 @@ Login into DeepSource using the command : deepsource auth login`, cmd.AddCommand(repo.NewCmdRepo()) cmd.AddCommand(issues.NewCmdIssues()) cmd.AddCommand(report.NewCmdReport()) + cmd.AddCommand(analyzer.NewCmdAnalyzer()) return cmd } diff --git a/config/config.go b/config/config.go index d6746cb6c..8f8d816f0 100644 --- a/config/config.go +++ b/config/config.go @@ -37,7 +37,7 @@ func (cfg *CLIConfig) SetTokenExpiry(str string) { } // Checks if the token has expired or not -func (cfg CLIConfig) IsExpired() bool { +func (cfg *CLIConfig) IsExpired() bool { if cfg.TokenExpiresIn.IsZero() { return true } @@ -54,7 +54,7 @@ func (CLIConfig) configDir() (string, error) { } // configPath returns the file path to the config file. -func (cfg CLIConfig) configPath() (string, error) { +func (cfg *CLIConfig) configPath() (string, error) { home, err := cfg.configDir() if err != nil { return "", err diff --git a/deepsource/analyzers/queries/get_analyzers.go b/deepsource/analyzers/queries/get_analyzers.go index 04e496d20..b2be4a894 100644 --- a/deepsource/analyzers/queries/get_analyzers.go +++ b/deepsource/analyzers/queries/get_analyzers.go @@ -42,7 +42,7 @@ type IGQLClient interface { GetToken() string } -func (a AnalyzersRequest) Do(ctx context.Context, client IGQLClient) ([]analyzers.Analyzer, error) { +func (AnalyzersRequest) Do(ctx context.Context, client IGQLClient) ([]analyzers.Analyzer, error) { req := graphql.NewRequest(listAnalyzersQuery) // set header fields diff --git a/deepsource/auth/mutations/register_device.go b/deepsource/auth/mutations/register_device.go index 572925211..04f502c73 100644 --- a/deepsource/auth/mutations/register_device.go +++ b/deepsource/auth/mutations/register_device.go @@ -29,7 +29,7 @@ type IGQLClient interface { GQL() *graphql.Client } -func (r RegisterDeviceRequest) Do(ctx context.Context, client IGQLClient) (*auth.Device, error) { +func (RegisterDeviceRequest) Do(ctx context.Context, client IGQLClient) (*auth.Device, error) { req := graphql.NewRequest(registerDeviceMutation) req.Header.Set("Cache-Control", "no-cache") diff --git a/deepsource/transformers/queries/get_transformers.go b/deepsource/transformers/queries/get_transformers.go index b173e0ce5..5f68896fd 100644 --- a/deepsource/transformers/queries/get_transformers.go +++ b/deepsource/transformers/queries/get_transformers.go @@ -40,7 +40,7 @@ type IGQLClient interface { GetToken() string } -func (t TransformersRequest) Do(ctx context.Context, client IGQLClient) ([]transformers.Transformer, error) { +func (TransformersRequest) Do(ctx context.Context, client IGQLClient) ([]transformers.Transformer, error) { req := graphql.NewRequest(listTransformersQuery) // set header fields diff --git a/go.mod b/go.mod index dd8082467..b0bc0e0a9 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,16 @@ require ( github.com/AlecAivazis/survey/v2 v2.2.12 github.com/Jeffail/gabs/v2 v2.6.1 github.com/MakeNowJust/heredoc v1.0.0 + github.com/briandowns/spinner v1.18.1 github.com/cli/browser v1.1.0 + github.com/containerd/containerd v1.6.3 // indirect + github.com/containerd/continuity v0.3.0 // indirect github.com/deepsourcelabs/graphql v0.2.2 - github.com/fatih/color v1.12.0 + github.com/docker/distribution v2.8.1+incompatible // indirect + github.com/docker/docker v20.10.14+incompatible + github.com/fatih/color v1.13.0 github.com/getsentry/sentry-go v0.6.0 +<<<<<<< HEAD github.com/owenrumney/go-sarif/v2 v2.1.0 github.com/pelletier/go-toml v1.9.2 github.com/pterm/pterm v0.12.23 @@ -57,4 +63,25 @@ require ( gopkg.in/ini.v1 v1.51.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect +======= + github.com/go-playground/validator/v10 v10.10.1 + github.com/gorilla/mux v1.8.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/matryer/is v1.4.0 // indirect + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d + github.com/moby/sys/mount v0.3.2 // indirect + github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/owenrumney/go-sarif/v2 v2.1.0 + github.com/pelletier/go-toml v1.9.4 + github.com/pelletier/go-toml/v2 v2.0.0 + github.com/pterm/pterm v0.12.23 + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cobra v1.4.0 + github.com/spf13/viper v1.10.1 + github.com/stretchr/testify v1.7.1 + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonschema v1.2.0 + gopkg.in/ini.v1 v1.66.4 // indirect + gotest.tools/v3 v3.2.0 // indirect +>>>>>>> 6477a26 (feat: add syntactic verification for analyzer.toml and issue descriptions (#131)) ) diff --git a/go.sum b/go.sum index d7f2af69d..2c10fd80b 100644 --- a/go.sum +++ b/go.sum @@ -1,87 +1,418 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 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.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.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.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +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.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= 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/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.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= 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/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.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/AlecAivazis/survey/v2 v2.2.12 h1:5a07y93zA6SZ09gOa9wLVLznF5zTJMQ+pJ3cZK4IuO8= github.com/AlecAivazis/survey/v2 v2.2.12/go.mod h1:6d4saEvBsfSHXeN1a5OA5m2+HJ2LuVokllnC77pAIKI= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +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 v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +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.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +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/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.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/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Jeffail/gabs/v2 v2.6.1 h1:wwbE6nTQTwIMsMxzi6XFQQYRZ6wDc1mSdxoAN+9U4Gk= github.com/Jeffail/gabs/v2 v2.6.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +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.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/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +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.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.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY= +github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +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/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +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/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= 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/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= 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/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/atomicgo/cursor v0.0.1 h1:xdogsqa6YYlLfM+GyClC/Lchf7aiMerFiZQn7soTOoU= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +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/blang/semver v3.1.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/briandowns/spinner v1.18.1 h1:yhQmQtM1zsqFsouh09Bk/jCjd50pC3EOGsh28gLVvwY= +github.com/briandowns/spinner v1.18.1/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= +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/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +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/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +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/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= 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/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +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/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +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/cli/browser v1.1.0 h1:xOZBfkfY9L9vMBgqb1YwRirGu6QFaQ5dP/vXt5ENSOY= github.com/cli/browser v1.1.0/go.mod h1:HKMQAt9t12kov91Mn7RfZxyJQQgWgyS/3SZswlZ5iTI= 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/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +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/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +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.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +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.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.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= +github.com/containerd/containerd v1.6.3 h1:JfgUEIAH07xDWk6kqz0P3ArZt+KJ9YeihSC9uyFtSKg= +github.com/containerd/containerd v1.6.3/go.mod h1:gCVGrYRYFm2E8GmuUIbj/NGD7DLZQLzSJQazjVKDOig= +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/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +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-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.4/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +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/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= +github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= +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/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +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/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= +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/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= +github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= +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/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= 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-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +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-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-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/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +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/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/deepsourcelabs/graphql v0.2.2 h1:6CtKGvVSIY6Jnf72VyfXB77AaaoHATBzXsrh64irtVQ= github.com/deepsourcelabs/graphql v0.2.2/go.mod h1:2hqi4vS0LxP9wMjbkbMOdR/fap2zwDlzqGGO8WEgyBA= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +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-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/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.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/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.14+incompatible h1:+T9/PRYWNDo5SZl5qS1r9Mo/0Q8AwxKKPtu9S1yxM0w= +github.com/docker/docker v20.10.14+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +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.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +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/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +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/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/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +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/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= 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 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +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/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/getsentry/sentry-go v0.6.0 h1:kPd+nr+dlXmaarUBg7xlC/qn+7wyMJL6PMsSn5fA+RM= github.com/getsentry/sentry-go v0.6.0/go.mod h1:0yZBuzSvbZwBnvaF9VwZIMen3kXscY8/uasKtAX1qG8= +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.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= @@ -89,58 +420,197 @@ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclK github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 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-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +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 v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +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/jsonpointer v0.19.5/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/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +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-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig= +github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= 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/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/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +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.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 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 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/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 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.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= 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/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= 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.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +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 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +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/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+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/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-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-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +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/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/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.4.2 h1:tXy44JFSFkKnELV6WaMo/lLfu/meqITX3iAV52do7lk= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +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 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +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.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +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.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/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/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= 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/errwrap v1.1.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.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-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= 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= @@ -149,31 +619,58 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 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.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 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.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +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.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= 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.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/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= +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/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 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.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/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= @@ -182,51 +679,91 @@ github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiD github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +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/cpuid v1.2.1/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 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.4 h1:5Myjjh3JY/NaAi4IsUbHADytDyl1VE1Y9PXDlL+P/VQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 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/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +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 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= 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/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/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/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +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.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= 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.7/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.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +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.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.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= 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/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= 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/miekg/pkcs11 v1.1.1/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-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -234,111 +771,300 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 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.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +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/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.3.2 h1:uq/CiGDZPvr+c85RYHtKIUORFbmavBUyWH3E1NEyjqI= +github.com/moby/sys/mount v0.3.2/go.mod h1:iN27Ec0LtJ0Mx/++rE6t6mTdbbEEZd+oKfAHP1y6vHs= +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/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/mountinfo v0.6.1 h1:+H/KnGEAGRpTrEAqNVQ2AM3SiwMgJUt/TXj+Z8cmCIc= +github.com/moby/sys/mountinfo v0.6.1/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +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-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 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +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/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= +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/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.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.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +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.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= +<<<<<<< HEAD +======= +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.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +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 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +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/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/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-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-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.1 h1:PJ9DSs2sVwE0iVr++pAHE6QkS9tzcVWozlPifdwMgrU= +github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +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.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/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/owenrumney/go-sarif v1.1.1 h1:QNObu6YX1igyFKhdzd7vgzmw7XsWN3/6NMGuDzBgXmE= +>>>>>>> 6477a26 (feat: add syntactic verification for analyzer.toml and issue descriptions (#131)) github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U= github.com/owenrumney/go-sarif/v2 v2.1.0 h1:Xp4RUbbQc5O2/t5YYZ+1QzJ8FZVdJwXeiWssiF5vQrA= github.com/owenrumney/go-sarif/v2 v2.1.0/go.mod h1:MSqMMx9WqlBSY7pXoOZWgEsVB4FDNfhcaXDA1j6Sr+w= 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/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.2 h1:7NiByeVF4jKSG1lDF3X8LTIkq2/bu+1uYbIm1eS5tzk= -github.com/pelletier/go-toml v1.9.2/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.0 h1:P7Bq0SaI8nsexyay5UAyDo+ICWy5MQPgEZ5+l8JQTKo= +github.com/pelletier/go-toml/v2 v2.0.0/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= 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/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 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_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +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-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-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 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/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/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-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/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/pterm/pterm v0.12.23 h1:+PL0YqmmT0QiDLOpevE3e2HPb5UIDBxh6OlLm8jDhxg= github.com/pterm/pterm v0.12.23/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +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.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= 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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +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/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= 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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +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/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +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/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +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/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +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.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +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 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= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= +github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +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-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/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/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= 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/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +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/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= 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/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/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +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/netlink v1.1.1-0.20210330154013-f5de75959ad5/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/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +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/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/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/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -349,28 +1075,103 @@ github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmv github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +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/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= github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= 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/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= 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.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= +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/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= 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/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +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-20181203042331-505ab145d0a9/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/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-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8= -golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20210220033148-5ea612d1eb83/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-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-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-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -380,13 +1181,27 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl 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/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-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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -398,18 +1213,85 @@ golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn 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-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= +<<<<<<< HEAD +======= +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-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-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-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/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= +>>>>>>> 6477a26 (feat: add syntactic verification for analyzer.toml and issue descriptions (#131)) golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-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-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-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/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 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-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= @@ -422,34 +1304,148 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h 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-20190530182044-ad28b68e88f1/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-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-20190813064441-fde4db37ae7a/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-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-20200519105757-fe76b779f299/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-20200625212154-ddb9806d33ae/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-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-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/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-20210225134936-a50acf3fe073/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-20210319071255-635bc2c9138d/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= +<<<<<<< HEAD golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d h1:FjkYO/PPp4Wi0EAUOVLxePm7qVW4r4ctbWpURyuOD0E= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= +======= +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-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/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-20210603081109-ebe580a85c40/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-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-20210809222454-d867a43fc93e/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-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/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-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-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/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-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-20220405210540-1e041c57c461 h1:kHVeDEnfKn3T238CvrUcz6KeEsFHVaKh4kMTt6Wsysg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/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= +>>>>>>> 6477a26 (feat: add syntactic verification for analyzer.toml and issue descriptions (#131)) golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +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.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 h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/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-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-20181221001348-537d06c36207/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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -460,64 +1456,332 @@ golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/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-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-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-20190911174233-4f2ddba30aff/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-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-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-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-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/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-20200616133436-c1934b75d054/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-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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/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= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 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.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.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.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.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.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 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/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-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-20190522204451-c2c4e71fbf69/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-20200423170343-7949de9c1215/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-20201019141844-1ed22bb0c154/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/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-20210513213006-bf773b8c8384/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-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-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-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-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-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= 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 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= +google.golang.org/grpc v1.43.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 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= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +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.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +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/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.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-20200615113413-eeeca48fe776/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= +gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= 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= +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/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +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/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +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/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= +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/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +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/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +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/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +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/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +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/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= 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/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +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/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/utils/config.go b/utils/config.go new file mode 100644 index 000000000..082c8b737 --- /dev/null +++ b/utils/config.go @@ -0,0 +1,20 @@ +package utils + +import ( + "os/exec" + "strings" +) + +// Extracts the path of the config sent as a parameter in the user repo +// Checks in the current working directory as well as the root directory +// of the project +func ExtractProjectRootPath() (string, error) { + // Fetch the top-level directory + output, err := exec.Command("git", "rev-parse", "--show-toplevel").Output() + if err != nil { + return "", err + } + + // Removing trailing null characters + return strings.TrimRight(string(output), "\000\n"), nil +} diff --git a/utils/prompt.go b/utils/prompt.go index 976cc0597..6a9601493 100644 --- a/utils/prompt.go +++ b/utils/prompt.go @@ -5,6 +5,7 @@ import ( "github.com/AlecAivazis/survey/v2" "github.com/AlecAivazis/survey/v2/terminal" + "github.com/mgutz/ansi" ) // ========== @@ -99,3 +100,15 @@ func checkInterrupt(err error) error { } return err } + +func GetSuccessMessage(msg string) string { + greenTickMark := ansi.Color("✔", "green") + return greenTickMark + " " + msg + "\n" +} + +func GetFailureMessage(msg, errorMsg string) string { + if errorMsg != "" { + return ansi.Color("✗"+" "+msg+". "+"Error: "+errorMsg, "red") + } + return ansi.Color("✗"+" "+msg, "red") +} diff --git a/utils/spinner.go b/utils/spinner.go new file mode 100644 index 000000000..b200fad63 --- /dev/null +++ b/utils/spinner.go @@ -0,0 +1,59 @@ +package utils + +import ( + "os" + "sync" + "time" + + "github.com/briandowns/spinner" +) + +type SpinnerUtils struct { + mu sync.Mutex + Spinner *spinner.Spinner +} + +// Starts the spinner with the passed label. Final message is also set which is shown once the Spinner +// is stopped without an error. +func (s *SpinnerUtils) StartSpinnerWithLabel(label, finalMessage string) { + s.mu.Lock() + defer s.mu.Unlock() + + sp := spinner.New(spinner.CharSets[11], 120*time.Millisecond, spinner.WithWriter(os.Stderr), spinner.WithFinalMSG(GetSuccessMessage(finalMessage))) // Build our new spinner + if label != "" { + sp.Suffix = " " + label + " " + } + + sp.Start() // Start the spinner + s.Spinner = sp +} + +// Stops the spinner +func (s *SpinnerUtils) StopSpinner() { + s.mu.Lock() + defer s.mu.Unlock() + + if s.Spinner == nil { + return + } + s.Spinner.Stop() + s.Spinner = nil +} + +// Stops the spinner and displays an error message with a cross emoji +func (s *SpinnerUtils) StopSpinnerWithError(msg string, errorMessage error) { + s.mu.Lock() + defer s.mu.Unlock() + + if errorMessage != nil { + s.Spinner.FinalMSG = GetFailureMessage(msg, errorMessage.Error()) + } else { + s.Spinner.FinalMSG = GetFailureMessage(msg, "") + } + + if s.Spinner == nil { + return + } + s.Spinner.Stop() + s.Spinner = nil +} From 9a0997afa177f0201d8d54754023f936a4c4f38f Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Fri, 13 May 2022 18:47:07 +0530 Subject: [PATCH 02/28] feat: `deepsource analyzer init` command (#134) * chore: init deepsource analyzer init command Signed-off-by: Siddhant N Trivedi * chore: delete redundant types data Signed-off-by: Siddhant N Trivedi * chore: don't create the directory if it already exists Signed-off-by: Siddhant N Trivedi * chore: set default value of analyzer from shortcode Signed-off-by: Siddhant N Trivedi * chore: minor tweak Signed-off-by: Siddhant N Trivedi * chore: fix path formatting Signed-off-by: Siddhant N Trivedi * tests: add tests for initAnalyzer method Signed-off-by: Siddhant N Trivedi * chore: add more test case and exit init if the analyzer already exists Signed-off-by: Siddhant N Trivedi * Update init.go * Update init.go * chore: remove analyzer.toml directory Signed-off-by: Siddhant N Trivedi * chore: use bytes.Equal for matching []bytes Signed-off-by: Siddhant N Trivedi * chore: address review comments Signed-off-by: Siddhant N Trivedi * chore: debug Signed-off-by: Siddhant N Trivedi * chore: fix DeepSource issues and add skipcq to some Signed-off-by: Siddhant N Trivedi * Format code with gofmt Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> --- analyzers/config/config.go | 25 +++ command/analyzer/analyzer.go | 2 + command/analyzer/initialize/init.go | 157 +++++++++++++++++++ command/analyzer/initialize/init_test.go | 128 +++++++++++++++ command/analyzer/verify/verify.go | 13 +- command/auth/login/login.go | 2 +- command/config/generate/analyzers_input.go | 2 +- command/issues/list/utils.go | 2 +- command/report/tests/init_test.go | 2 +- command/report/tests/report_workflow_test.go | 2 +- utils/prompt.go | 5 +- 11 files changed, 323 insertions(+), 17 deletions(-) create mode 100644 analyzers/config/config.go create mode 100644 command/analyzer/initialize/init.go create mode 100644 command/analyzer/initialize/init_test.go diff --git a/analyzers/config/config.go b/analyzers/config/config.go new file mode 100644 index 000000000..4f88b7a04 --- /dev/null +++ b/analyzers/config/config.go @@ -0,0 +1,25 @@ +package config + +import ( + "os" + "path/filepath" + + "github.com/deepsourcelabs/cli/utils" +) + +var configFolder string = ".deepsource/analyzer" + +func InitAnalyzerConfigurationPaths() (string, string, string) { + cwd, _ := os.Getwd() + + // Extracting the path of the project root + projectRoot, err := utils.ExtractProjectRootPath() + if err != nil { + projectRoot = cwd + } + + // Configuring the paths of analyzer.toml and issues directory + analyzerTOMLPath := filepath.Join(projectRoot, configFolder, "analyzer.toml") + issuesDirPath := filepath.Join(projectRoot, configFolder, "issues/") + return projectRoot, analyzerTOMLPath, issuesDirPath +} diff --git a/command/analyzer/analyzer.go b/command/analyzer/analyzer.go index 7c5c8fdb2..5af58f5b0 100644 --- a/command/analyzer/analyzer.go +++ b/command/analyzer/analyzer.go @@ -3,6 +3,7 @@ package analyzer import ( "github.com/spf13/cobra" + initialize "github.com/deepsourcelabs/cli/command/analyzer/initialize" verify "github.com/deepsourcelabs/cli/command/analyzer/verify" ) @@ -16,5 +17,6 @@ func NewCmdAnalyzer() *cobra.Command { Short: "Operations related to DeepSource Analyzers", } cmd.AddCommand(verify.NewCmdAnalyzerVerify()) + cmd.AddCommand(initialize.NewCmdAnalyzerInit()) return cmd } diff --git a/command/analyzer/initialize/init.go b/command/analyzer/initialize/init.go new file mode 100644 index 000000000..784b821b0 --- /dev/null +++ b/command/analyzer/initialize/init.go @@ -0,0 +1,157 @@ +package initialize + +import ( + "bytes" + "errors" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/deepsourcelabs/cli/analyzers/config" + validator "github.com/deepsourcelabs/cli/analyzers/validator" + "github.com/deepsourcelabs/cli/utils" + "github.com/pelletier/go-toml" + "github.com/pterm/pterm" + "github.com/spf13/cobra" +) + +type SDKResponse struct { + SDKRequired bool + SDKLanguage string +} + +type AnalyzerInitOpts struct { + SDKInput SDKResponse + ProjectRootPath string + AnalyzerTOMLPath string + AnalyzerTOMLData validator.AnalyzerMetadata + IssuesDirectoryPath string + AnalyzerShortcodeArg string + SingleLineInputPrompt func(string, string, string) (string, error) + DescriptionPrompt func(string, string, string) (string, error) + ConfirmationPrompt func(string, string) (bool, error) + SingleOptionPrompt func(string, string, []string) (string, error) +} + +func NewCmdAnalyzerInit() *cobra.Command { + cwd, _ := os.Getwd() + opts := AnalyzerInitOpts{ + SingleLineInputPrompt: utils.GetSingleLineInput, + DescriptionPrompt: utils.GetSingleLineInput, + ConfirmationPrompt: utils.ConfirmFromUser, + SingleOptionPrompt: utils.SelectFromOptions, + } + + // Fetch the project root path and analyzer.toml path + opts.ProjectRootPath, opts.AnalyzerTOMLPath, opts.IssuesDirectoryPath = config.InitAnalyzerConfigurationPaths() + + cmd := &cobra.Command{ + Use: "init", + Short: "Initialize DeepSource Analyzer", + Args: utils.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + // Check if the analyzer.toml already exists. If yes, display that the analyzer already initialized at `.deepsource/analyzer/analyzer.toml` + if _, err := os.Stat(opts.AnalyzerTOMLPath); err == nil { + pterm.Info.Printf("Analyzer already initialized at %s. Exiting...\n", strings.TrimPrefix(opts.AnalyzerTOMLPath, cwd+"/")) + return nil + } + + if len(args) > 0 { + opts.AnalyzerShortcodeArg = args[0] + } + analysisConfigBytes, err := opts.initAnalyzer() + if err != nil { + return fmt.Errorf("Analyzer initialization failed. Error: %s", err) + } + if err = opts.writeAnalyzerTOMLConfig(analysisConfigBytes); err != nil { + return fmt.Errorf("Analyzer initialization failed. Error: %s", err) + } + pterm.Success.Printf("Analyzer %s set up successfully!\n", opts.AnalyzerTOMLData.Shortcode) + return nil + }, + } + return cmd +} + +// Initialize the Analyzer +func (a *AnalyzerInitOpts) initAnalyzer() (*bytes.Buffer, error) { + var err error + var msg, helpText string + supportedSDKS := getSupportedSDKs() + + pterm.Info.Printf("Initializing analyzer %s...\n", a.AnalyzerShortcodeArg) + a.AnalyzerTOMLData.Shortcode = strings.ToLower(a.AnalyzerShortcodeArg) + + // Fetch the default analyzer name from the shortcode + // Eg: @deepsource/armory -> Armory + defaultAnalyzerName := strings.Title(strings.SplitAfter(a.AnalyzerTOMLData.Shortcode, "/")[1]) // skipcq: SCC-SA1019 + + // Collect name of the Analyzer + msg = "Please enter the name of the Analyzer?" + helpText = "The name of the Analyzer." + if a.AnalyzerTOMLData.Name, err = a.SingleLineInputPrompt(msg, helpText, defaultAnalyzerName); err != nil { + return nil, err + } + + // Collect description of the Analyzer + msg = "Description of the Analyzer?" + helpText = "What does the Analyzer do?" + if a.AnalyzerTOMLData.Description, err = a.DescriptionPrompt(msg, helpText, ""); err != nil { + return nil, err + } + + if len(supportedSDKS) > 0 { + + // Check if DeepSource SDK is needed or not? + msg = "Would you like to use DeepSource Analyzer SDK to build your Analyzer?" + helpText = "DeepSource SDKs help you to easily create an Analyzer" + if a.SDKInput.SDKRequired, err = a.ConfirmationPrompt(msg, helpText); err != nil { + return nil, err + } + + if a.SDKInput.SDKRequired { + msg = "Which language do you want the SDK for:" + helpText = "Choose the language for which the SDK will be generated" + if a.SDKInput.SDKLanguage, err = a.SingleOptionPrompt(msg, helpText, supportedSDKS); err != nil { + return nil, err + } + } + } + + // Encoding the struct to TOML + // and storing in GeneratedConfig of Options struct + var buf bytes.Buffer + if err = toml.NewEncoder(&buf).Order(toml.OrderPreserve).Encode(a.AnalyzerTOMLData); err != nil { + return nil, err + } + + return &buf, nil +} + +// Writes the Analyzer TOML data to the file +func (a *AnalyzerInitOpts) writeAnalyzerTOMLConfig(buf *bytes.Buffer) (err error) { + // Create the .deepsource/analyzer directory and issues/ directory + directoriesToCreate := []string{".deepsource", ".deepsource/analyzer", ".deepsource/analyzer/issues/"} + + // Create the required directories mentioned above + for _, dir := range directoriesToCreate { + if _, err := os.Stat(filepath.Join(a.ProjectRootPath, dir)); errors.Is(err, os.ErrNotExist) { + if err = os.Mkdir(filepath.Join(a.ProjectRootPath, dir), 0o750); err != nil { + return err + } + } + } + + // Write the input data to analyzer.toml + if err = os.WriteFile(a.AnalyzerTOMLPath, buf.Bytes(), 0o644); err != nil { + return err + } + return +} + +// Returns the list of supported SDKs +// TODO: Send the list of supported SDKs from here once we start supporting any +func getSupportedSDKs() []string { + return []string{""} +} diff --git a/command/analyzer/initialize/init_test.go b/command/analyzer/initialize/init_test.go new file mode 100644 index 000000000..ac63097eb --- /dev/null +++ b/command/analyzer/initialize/init_test.go @@ -0,0 +1,128 @@ +package initialize + +import ( + "reflect" + "testing" +) + +var ( + singleLineInputResponse, descriptionInputResponse, singleOptionPromptResponse string + confirmationResponse bool +) + +func mockGetSingleLineInput(string, string, string) (string, error) { + return singleLineInputResponse, nil +} + +func mockDescriptionPrompt(string, string, string) (string, error) { + return descriptionInputResponse, nil +} + +func mockConfirmFromUser(string, string) (bool, error) { + return confirmationResponse, nil +} + +func mockSingleOptionPrompt(string, string, []string) (string, error) { + return singleOptionPromptResponse, nil +} + +type Test struct { + AnalyzerShortcode string + AnalyzerName string + AnalyzerDescription string + SDKRequired bool + SDKLanguage string + ExpectedConfig string +} + +func TestInitAnalyzer(t *testing.T) { + // Creating an instance of AnalyzerInitOpts + + opts := AnalyzerInitOpts{ + SingleLineInputPrompt: mockGetSingleLineInput, + DescriptionPrompt: mockDescriptionPrompt, + ConfirmationPrompt: mockConfirmFromUser, + SingleOptionPrompt: mockSingleOptionPrompt, + } + + testCases := []Test{ + { + AnalyzerShortcode: "@deepsource/demo-python", + AnalyzerName: "Python Analyzer", + AnalyzerDescription: "This is a python analyzer", + SDKRequired: false, + SDKLanguage: "", + ExpectedConfig: `name = "Python Analyzer" +shortcode = "@deepsource/demo-python" +description = "This is a python analyzer" +category = "" +tags = [] + +[urls] + source = "" + documentation = "" + bug_tracker = "" + +[environment_variables] + +[analysis] + command = "" + +[build] + builder = "" + dockerfile = "" + script = "" + +[test] + command = "" +`, + }, + { + AnalyzerShortcode: "@deepsource/demo-go", + AnalyzerName: "Go Analyzer", + AnalyzerDescription: "This is a golang analyzer", + SDKRequired: true, + SDKLanguage: "Go", + ExpectedConfig: `name = "Go Analyzer" +shortcode = "@deepsource/demo-go" +description = "This is a golang analyzer" +category = "" +tags = [] + +[urls] + source = "" + documentation = "" + bug_tracker = "" + +[environment_variables] + +[analysis] + command = "" + +[build] + builder = "" + dockerfile = "" + script = "" + +[test] + command = "" +`, + }, + } + + for _, tc := range testCases { + opts.AnalyzerShortcodeArg = tc.AnalyzerShortcode + singleLineInputResponse = tc.AnalyzerName + descriptionInputResponse = tc.AnalyzerDescription + confirmationResponse = tc.SDKRequired + singleOptionPromptResponse = tc.SDKLanguage + + buf, err := opts.initAnalyzer() + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(tc.ExpectedConfig, buf.String()) { + t.Errorf("Expected %s\n====\nGot %s", tc.ExpectedConfig, buf.String()) + } + } +} diff --git a/command/analyzer/verify/verify.go b/command/analyzer/verify/verify.go index 87e5b1e9c..c8da97c43 100644 --- a/command/analyzer/verify/verify.go +++ b/command/analyzer/verify/verify.go @@ -8,29 +8,24 @@ import ( "strings" build "github.com/deepsourcelabs/cli/analyzers/backend/docker" + "github.com/deepsourcelabs/cli/analyzers/config" "github.com/deepsourcelabs/cli/analyzers/validator" "github.com/deepsourcelabs/cli/utils" "github.com/spf13/cobra" ) var ( - configFolder string = ".deepsource/analyzer" analyzerTOMLPath string issuesDirPath string + projectRoot string + configFolder string = ".deepsource/analyzer" ) type AnalyzerVerifyOpts struct{} func NewCmdAnalyzerVerify() *cobra.Command { - cwd, _ := os.Getwd() - - // Extracting the path of the project root - projectRoot, err := utils.ExtractProjectRootPath() - if err != nil { - projectRoot = cwd - } - // Configuring the paths of analyzer.toml and issues directory + projectRoot, analyzerTOMLPath, issuesDirPath = config.InitAnalyzerConfigurationPaths() analyzerTOMLPath = filepath.Join(projectRoot, configFolder, "analyzer.toml") issuesDirPath = filepath.Join(projectRoot, configFolder, "issues/") diff --git a/command/auth/login/login.go b/command/auth/login/login.go index fb8d1b1b2..249867bdc 100644 --- a/command/auth/login/login.go +++ b/command/auth/login/login.go @@ -127,7 +127,7 @@ func (opts *LoginOptions) handleInteractiveLogin() error { } // Prompt the user for hostname only in the case of on-premise if loginType == "DeepSource Enterprise" { - opts.HostName, err = utils.GetSingleLineInput(hostPromptMessage, hostPromptHelpText) + opts.HostName, err = utils.GetSingleLineInput(hostPromptMessage, hostPromptHelpText, "") if err != nil { return err } diff --git a/command/config/generate/analyzers_input.go b/command/config/generate/analyzers_input.go index 5a2cbbe1e..3d0ec13dd 100644 --- a/command/config/generate/analyzers_input.go +++ b/command/config/generate/analyzers_input.go @@ -73,7 +73,7 @@ func (o *Options) inputAnalyzerMeta(requiredFieldsData map[string][]AnalyzerMeta return err } default: - metaFields[i].UserInput, err = utils.GetSingleLineInput(metaFields[i].Title, metaFields[i].Description) + metaFields[i].UserInput, err = utils.GetSingleLineInput(metaFields[i].Title, metaFields[i].Description, "") if err != nil { return err } diff --git a/command/issues/list/utils.go b/command/issues/list/utils.go index cbdd86f32..3e2d48675 100644 --- a/command/issues/list/utils.go +++ b/command/issues/list/utils.go @@ -166,7 +166,7 @@ func convertSARIF(issueData []issues.Issue) *sarif.Report { // Adding the tools data to the SARIF report corresponding to the number of analyzers activated for _, issue := range issueData { if !shortcodes[issue.Analyzer.Shortcode].exists { - driverName := "DeepSource " + strings.Title(issue.Analyzer.Shortcode) + " Analyzer" + driverName := "DeepSource " + strings.Title(issue.Analyzer.Shortcode) + " Analyzer" // skipcq: SCC-SA1019 informationURI := "https://deepsource.io/directory/analyzers/" + string(issue.Analyzer.Shortcode) tool := sarif.Tool{ diff --git a/command/report/tests/init_test.go b/command/report/tests/init_test.go index 8f203e10c..6d9dd4017 100644 --- a/command/report/tests/init_test.go +++ b/command/report/tests/init_test.go @@ -30,7 +30,7 @@ func startMockAPIServer() { go func() { err := srv.ListenAndServe() if err != nil { - log.Fatalln("Error starting HTTP mock server") + log.Fatalln("Error starting HTTP mock server") // skipcq: RVV-A0003 } }() } diff --git a/command/report/tests/report_workflow_test.go b/command/report/tests/report_workflow_test.go index fea343032..cd23f754e 100644 --- a/command/report/tests/report_workflow_test.go +++ b/command/report/tests/report_workflow_test.go @@ -51,7 +51,7 @@ func graphQLAPIMock(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") - if string(requestBodyData) == string(req) { + if bytes.Equal(requestBodyData, req) { w.Write([]byte(successResponseBodyData)) } else { w.Write([]byte(errorResponseBodyData)) diff --git a/utils/prompt.go b/utils/prompt.go index 6a9601493..7f7a985cb 100644 --- a/utils/prompt.go +++ b/utils/prompt.go @@ -21,7 +21,6 @@ func ConfirmFromUser(msg, helpText string) (bool, error) { Default: true, Help: helpText, } - err := survey.AskOne(confirmPrompt, &response) if err != nil { return true, checkInterrupt(err) @@ -52,12 +51,12 @@ func SelectFromOptions(msg, helpText string, opts []string) (string, error) { // Used for Single Line Text Input // Being used for getting "Import root" of user for configuring meta of Go analyzer -func GetSingleLineInput(msg, helpText string) (string, error) { +func GetSingleLineInput(msg, helpText, defaultValue string) (string, error) { response := "" prompt := &survey.Input{ Renderer: survey.Renderer{}, Message: msg, - Default: "", + Default: defaultValue, Help: helpText, } From 9d7c2b6f76dd7bf269764ea4d2138272254e44dc Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Thu, 26 May 2022 21:52:57 +0530 Subject: [PATCH 03/28] feat(analyzer): `analyzer run` command (#138) --- .github/workflows/CI.yml | 6 +- .gitignore | 1 - Makefile | 2 +- analysis/config/config.go | 104 ++++ analysis/config/format.go | 67 +++ analysis/config/types.go | 103 ++++ analysis/config/utils.go | 78 +++ analysis/lsp/types.go | 63 +++ analyzers/backend/docker/build.go | 35 +- analyzers/backend/docker/container.go | 147 ++++++ analyzers/config/config.go | 114 ++++- analyzers/config/types.go | 56 +++ analyzers/validator/validator.go | 8 +- command/analyzer/analyzer.go | 2 + command/analyzer/initialize/init.go | 23 +- .../run/.deepsource/analyzer/analyzer.toml | 0 command/analyzer/run/client.go | 44 ++ command/analyzer/run/config.go | 44 ++ command/analyzer/run/result.go | 39 ++ command/analyzer/run/run.go | 118 +++++ command/analyzer/run/source.go | 46 ++ command/analyzer/run/source_test.go | 138 ++++++ .../run/test/expected_analysis_results.json | 1 + command/analyzer/run/test/run_test.go | 73 +++ .../.deepsource/analyzer/analyzer.toml | 24 + .../.deepsource/analyzer/issues/I001.toml | 5 + .../analyzer/run/test/todo-checker/Dockerfile | 27 ++ .../analyzer/run/test/todo-checker/config.go | 22 + command/analyzer/run/test/todo-checker/go.mod | 5 + command/analyzer/run/test/todo-checker/go.sum | 2 + .../analyzer/run/test/todo-checker/main.go | 58 +++ .../analyzer/run/test/todo-checker/types.go | 94 ++++ .../analyzer/run/test/todo-checker/utils.go | 80 ++++ .../run/testdata/project1/.deepsource.toml | 30 ++ .../analyzer/run/testdata/project1/.gitignore | 1 + .../analyzer/run/testdata/project1/README.md | 31 ++ .../analyzer/run/testdata/project1/bind.go | 20 + command/analyzer/run/testdata/project1/cmd.go | 108 +++++ .../analyzer/run/testdata/project1/code.go | 161 +++++++ command/analyzer/run/testdata/project1/go.mod | 5 + command/analyzer/run/testdata/project1/go.sum | 10 + .../run/testdata/project1/hex_example.go | 9 + .../analyzer/run/testdata/project1/html.go | 18 + .../analyzer/run/testdata/project1/main.go | 36 ++ .../run/testdata/project1/sync_example.go | 24 + .../run/testdata/project1/unsafe_example.go | 22 + .../run/testdata/project1/unsafe_header.go | 18 + .../run/testdata/project1/weak_crypto.go | 24 + .../run/testdata/project2/.deepsource.toml | 9 + .../run/testdata/project2/.rubocop.yml | 2 + .../analyzer/run/testdata/project2/README.md | 31 ++ .../analyzer/run/testdata/project2/code.rb | 75 +++ .../run/testdata/project3/.deepsource.toml | 9 + .../analyzer/run/testdata/project3/.gitignore | 1 + .../analyzer/run/testdata/project3/Cargo.lock | 7 + .../analyzer/run/testdata/project3/Cargo.toml | 8 + .../analyzer/run/testdata/project3/README.md | 29 ++ .../run/testdata/project3/src/main.rs | 101 ++++ .../run/testdata/project4/.deepsource.toml | 21 + .../project4/.github/workflows/CI.yml | 36 ++ .../analyzer/run/testdata/project4/.gitignore | 125 +++++ .../analyzer/run/testdata/project4/Pipfile | 11 + .../analyzer/run/testdata/project4/README.md | 31 ++ .../run/testdata/project4/assignment.py | 3 + .../run/testdata/project4/demo_code.py | 141 ++++++ .../run/testdata/project4/django_issues.py | 10 + .../project4/duplicate_bases_class.py | 19 + .../run/testdata/project4/miscellaneous.py | 23 + .../project4/return_not_implemented.py | 25 + .../run/testdata/project4/security.py | 32 ++ .../run/testdata/project4/tests/__init__.py | 0 .../run/testdata/project4/tests/test_code.py | 11 + .../run/testdata/project4/type_checks.py | 7 + .../toolbox/project1/analysis_config.json | 1 + .../toolbox/project2/analysis_config.json | 1 + .../toolbox/project3/analysis_config.json | 1 + .../toolbox/project4/analysis_config.json | 1 + command/analyzer/run/types.go | 10 + command/analyzer/run/utils.go | 85 ++++ command/analyzer/verify/utils.go | 14 - command/analyzer/verify/verify.go | 23 +- go.mod | 104 ++-- go.sum | 451 +++--------------- 83 files changed, 3115 insertions(+), 489 deletions(-) create mode 100644 analysis/config/config.go create mode 100644 analysis/config/format.go create mode 100644 analysis/config/types.go create mode 100644 analysis/config/utils.go create mode 100644 analysis/lsp/types.go create mode 100644 analyzers/backend/docker/container.go create mode 100644 analyzers/config/types.go create mode 100644 command/analyzer/run/.deepsource/analyzer/analyzer.toml create mode 100644 command/analyzer/run/client.go create mode 100644 command/analyzer/run/config.go create mode 100644 command/analyzer/run/result.go create mode 100644 command/analyzer/run/run.go create mode 100644 command/analyzer/run/source.go create mode 100644 command/analyzer/run/source_test.go create mode 100644 command/analyzer/run/test/expected_analysis_results.json create mode 100644 command/analyzer/run/test/run_test.go create mode 100644 command/analyzer/run/test/todo-checker/.deepsource/analyzer/analyzer.toml create mode 100644 command/analyzer/run/test/todo-checker/.deepsource/analyzer/issues/I001.toml create mode 100644 command/analyzer/run/test/todo-checker/Dockerfile create mode 100644 command/analyzer/run/test/todo-checker/config.go create mode 100644 command/analyzer/run/test/todo-checker/go.mod create mode 100644 command/analyzer/run/test/todo-checker/go.sum create mode 100644 command/analyzer/run/test/todo-checker/main.go create mode 100644 command/analyzer/run/test/todo-checker/types.go create mode 100644 command/analyzer/run/test/todo-checker/utils.go create mode 100644 command/analyzer/run/testdata/project1/.deepsource.toml create mode 100644 command/analyzer/run/testdata/project1/.gitignore create mode 100644 command/analyzer/run/testdata/project1/README.md create mode 100644 command/analyzer/run/testdata/project1/bind.go create mode 100644 command/analyzer/run/testdata/project1/cmd.go create mode 100644 command/analyzer/run/testdata/project1/code.go create mode 100644 command/analyzer/run/testdata/project1/go.mod create mode 100644 command/analyzer/run/testdata/project1/go.sum create mode 100644 command/analyzer/run/testdata/project1/hex_example.go create mode 100644 command/analyzer/run/testdata/project1/html.go create mode 100644 command/analyzer/run/testdata/project1/main.go create mode 100644 command/analyzer/run/testdata/project1/sync_example.go create mode 100644 command/analyzer/run/testdata/project1/unsafe_example.go create mode 100644 command/analyzer/run/testdata/project1/unsafe_header.go create mode 100644 command/analyzer/run/testdata/project1/weak_crypto.go create mode 100644 command/analyzer/run/testdata/project2/.deepsource.toml create mode 100644 command/analyzer/run/testdata/project2/.rubocop.yml create mode 100644 command/analyzer/run/testdata/project2/README.md create mode 100644 command/analyzer/run/testdata/project2/code.rb create mode 100644 command/analyzer/run/testdata/project3/.deepsource.toml create mode 100644 command/analyzer/run/testdata/project3/.gitignore create mode 100644 command/analyzer/run/testdata/project3/Cargo.lock create mode 100644 command/analyzer/run/testdata/project3/Cargo.toml create mode 100644 command/analyzer/run/testdata/project3/README.md create mode 100644 command/analyzer/run/testdata/project3/src/main.rs create mode 100644 command/analyzer/run/testdata/project4/.deepsource.toml create mode 100644 command/analyzer/run/testdata/project4/.github/workflows/CI.yml create mode 100644 command/analyzer/run/testdata/project4/.gitignore create mode 100644 command/analyzer/run/testdata/project4/Pipfile create mode 100644 command/analyzer/run/testdata/project4/README.md create mode 100644 command/analyzer/run/testdata/project4/assignment.py create mode 100644 command/analyzer/run/testdata/project4/demo_code.py create mode 100644 command/analyzer/run/testdata/project4/django_issues.py create mode 100644 command/analyzer/run/testdata/project4/duplicate_bases_class.py create mode 100644 command/analyzer/run/testdata/project4/miscellaneous.py create mode 100644 command/analyzer/run/testdata/project4/return_not_implemented.py create mode 100644 command/analyzer/run/testdata/project4/security.py create mode 100644 command/analyzer/run/testdata/project4/tests/__init__.py create mode 100644 command/analyzer/run/testdata/project4/tests/test_code.py create mode 100644 command/analyzer/run/testdata/project4/type_checks.py create mode 100644 command/analyzer/run/testdata/toolbox/project1/analysis_config.json create mode 100644 command/analyzer/run/testdata/toolbox/project2/analysis_config.json create mode 100644 command/analyzer/run/testdata/toolbox/project3/analysis_config.json create mode 100644 command/analyzer/run/testdata/toolbox/project4/analysis_config.json create mode 100644 command/analyzer/run/types.go create mode 100644 command/analyzer/run/utils.go delete mode 100644 command/analyzer/verify/utils.go diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index c7cedf561..b98efa813 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -27,17 +27,21 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Build the binary - run: make build + run: | + pwd + make build - name: Setup tests run: make test_setup env: CODE_PATH: /home/runner/code + APP_PATH: /home/runner/app - name: Run tests run: make test env: CODE_PATH: /home/runner/code + APP_PATH: /home/runner/app - name: Report test coverage to DeepSource uses: deepsourcelabs/test-coverage-action@master diff --git a/.gitignore b/.gitignore index d9e0a2eda..cfa172c02 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,3 @@ dist # Test coverage reports coverage.out cover.out - diff --git a/Makefile b/Makefile index 35929b8dd..63ebb5b57 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ test: go test -v -coverprofile=coverage.out -count=1 ./... test_setup: - mkdir -p ${CODE_PATH} + mkdir -p ${CODE_PATH} ${APP_PATH} cd ${CODE_PATH} && ls -A1 | xargs rm -rf git clone https://github.com/deepsourcelabs/cli ${CODE_PATH} chmod +x /tmp/deepsource diff --git a/analysis/config/config.go b/analysis/config/config.go new file mode 100644 index 000000000..560b0fa6d --- /dev/null +++ b/analysis/config/config.go @@ -0,0 +1,104 @@ +package config + +import ( + "errors" + "fmt" + "os" + "path" + + "github.com/pelletier/go-toml/v2" +) + +type AnalysisRun struct { + AnalyzerName string + LocalCodePath string + ContainerCodePath string + DSConfig DSConfig + AnalysisFiles []string + ExcludedFiles []string + TestFiles []string +} + +/* Checks for excluded and test files based on the `exclude_patterns` and `test_patterns` + * configured by the user */ +func (r *AnalysisRun) checkExcludedAndTestFiles() (err error) { + // Get a list of the files that match the `exclude_patterns` configured in `.deepsource.toml` + r.ExcludedFiles, err = r.getMatchingFiles(r.DSConfig.ExcludePatterns) + if err != nil { + return err + } + + // Get a list of the files that match the `test_patterns` configured in `.deepsource.toml` + r.TestFiles, err = r.getMatchingFiles(r.DSConfig.TestPatterns) + if err != nil { + return err + } + return nil +} + +/* Parses the DeepSource config (.deepsource.toml) located at the root of the project at CODE_PATH as does + * .git directory and resolves the config data into AnalysisRun */ +func (r *AnalysisRun) parseDeepSourceConfig() (err error) { + r.DSConfig = DSConfig{} + + // Having resolved the project root path, check for the presence of .deepsource.toml in that path + // Read it if it exists and throw error if it doesn't + if _, err := os.Stat(path.Join(r.LocalCodePath, ".deepsource.toml")); err != nil { + if errors.Is(err, os.ErrNotExist) { + fmt.Println("Could not find .deepsource.toml config at project root path:", r.LocalCodePath) + // If DeepSource config is not present, keep empty r.DSConfig + return nil + } + } + + // If present, read the DeepSource config and decode it into r.DSConfig + config, err := os.ReadFile(path.Join(r.LocalCodePath, ".deepsource.toml")) + if err != nil { + fmt.Printf("Failed to read the .deepsource.toml config. Error: %s", err) + return nil + } + + // Unmarshal the []byte config data into struct + err = toml.Unmarshal(config, &r.DSConfig) + if err != nil { + fmt.Printf("Failed to retrieve the .deepsource.toml config data. Error: %s", err) + return nil + } + return err +} + +/* Configures the analysis_config.json file which is used by analyzer to run analysis since it contains + * metadata about the files to be analyzed, the test files in the project, the excluded files and analyzer meta */ +func (r *AnalysisRun) ConfigureAnalysis() (*AnalysisConfig, error) { + var err error + analyzerConfig := &AnalysisConfig{} + + // Parse DeepSource config (.deepsource.toml) in order to get the + // configured `exclude_patterns` and `test_patterns` + if err = r.parseDeepSourceConfig(); err != nil { + return analyzerConfig, err + } + + // Get the list of all the files present in the CODE_PATH and are to be analyzed + if r.AnalysisFiles, err = readAllFiles(r.LocalCodePath); err != nil { + return analyzerConfig, err + } + + // Gets the list of files to be excluded from analysis and the test files present + // Doesn't return error, just logs it even if the error comes up since it doens't affect the analysis run + if err = r.checkExcludedAndTestFiles(); err != nil { + return analyzerConfig, nil + } + + // Filter out the files to be analyzed by removing the r.ExcludedFiles from them and assign them to r.AnalysisFiles + r.filterAnalysisFiles() + + // Format the analysis config data into LSP format of analysis_config.json + return r.formatAnalysisConfigToLSP(), nil +} + +/* Formats the LSP based result to the default DeepSource format + * Not used as of now but keeping it here for future */ +func (r *AnalysisRun) FormatLSPResultToDefault(analysisResult *AnalysisResult) *DefaultAnalysisResult { + return r.formatLSPResultsToDefault(analysisResult) +} diff --git a/analysis/config/format.go b/analysis/config/format.go new file mode 100644 index 000000000..44f094f5c --- /dev/null +++ b/analysis/config/format.go @@ -0,0 +1,67 @@ +package config + +import ( + "github.com/deepsourcelabs/cli/analysis/lsp" +) + +/* Formats the analysis config data in the form of the LSP format as defined in + * the `analysis/types.go` */ +func (r *AnalysisRun) formatAnalysisConfigToLSP() *AnalysisConfig { + anaConfig := AnalysisConfig{ + ExcludePatterns: r.DSConfig.ExcludePatterns, + TestPatterns: r.DSConfig.TestPatterns, + } + + // Store the files, test files and excluded files in the LSP based analysis config + for _, file := range r.AnalysisFiles { + anaConfig.Files = append(anaConfig.Files, lsp.TextDocumentItem{URI: lsp.DocumentURI(file)}) + } + + for _, testFile := range r.TestFiles { + anaConfig.TestFiles = append(anaConfig.TestFiles, lsp.TextDocumentItem{URI: lsp.DocumentURI(testFile)}) + } + + for _, excludedFile := range r.ExcludedFiles { + anaConfig.ExcludedFiles = append(anaConfig.ExcludedFiles, lsp.TextDocumentItem{URI: lsp.DocumentURI(excludedFile)}) + } + + // Read analyzer_meta from DeepSource config (.deepsource.toml) and + // store the one corresponding to the Analyzer whose check is scheduled in analysis_config.json + for _, analyzer := range r.DSConfig.Analyzers { + if analyzer.Name == r.AnalyzerName { + anaConfig.AnalyzerMeta = analyzer.Meta + } + } + return &anaConfig +} + +/* Converts the LSP based analysis_results.json into the default format supported by DeepSource */ +func (*AnalysisRun) formatLSPResultsToDefault(analysisResult *AnalysisResult) *DefaultAnalysisResult { + defaultAnalysisResult := DefaultAnalysisResult{ + Metrics: analysisResult.Metrics, + IsPassed: analysisResult.IsPassed, + Errors: analysisResult.Errors, + ExtraData: analysisResult.ExtraData, + } + for _, issue := range analysisResult.Issues { + analysisIssue := Issue{ + Code: issue.Code, + Title: issue.Message, + Location: Location{ + Path: issue.RelatedInformation[0].Location.URI, + Position: Position{ + Begin: Coordinate{ + Line: issue.Range.Start.Line, + Column: issue.Range.Start.Character, + }, + End: Coordinate{ + Line: issue.Range.End.Line, + Column: issue.Range.End.Character, + }, + }, + }, + } + defaultAnalysisResult.Issues = append(defaultAnalysisResult.Issues, analysisIssue) + } + return &defaultAnalysisResult +} diff --git a/analysis/config/types.go b/analysis/config/types.go new file mode 100644 index 000000000..1e8414fb1 --- /dev/null +++ b/analysis/config/types.go @@ -0,0 +1,103 @@ +package config + +import "github.com/deepsourcelabs/cli/analysis/lsp" + +/////////////////////////////////////////////////////// +// DSConfig is the struct for .deepsource.toml file // +///////////////////////////////////////////////////// + +type DSConfig struct { + Version int `mapstructure:"version,omitempty" json:"version" toml:"version"` + ExcludePatterns []string `mapstructure:"exclude_patterns,omitempty" json:"exclude_patterns,omitempty" toml:"exclude_patterns"` + TestPatterns []string `mapstructure:"test_patterns,omitempty" json:"test_patterns,omitempty" toml:"test_patterns"` + Analyzers []Analyzer `mapstructure:"analyzers,omitempty" json:"analyzers,omitempty" toml:"analyzers"` + Transformers []Transformer `mapstructure:"transformers,omitempty" json:"transformers,omitempty" toml:"transformers"` +} + +type Analyzer struct { + Name string `mapstructure:"name,omitempty" json:"name,omitempty" toml:"name"` + RuntimeVersion string `mapstructure:"runtime_version,omitempty" json:"runtime_version,omitempty" toml:"runtime_version,omitempty"` + Enabled bool `mapstructure:"enabled,omitempty" json:"enabled" toml:"enabled"` + DependencyFilePaths []string `mapstructure:"dependency_file_paths,omitempty" json:"dependency_file_paths,omitempty"` + Meta interface{} `mapstructure:"meta,omitempty" json:"meta,omitempty" toml:"meta"` + Thresholds interface{} `mapstructure:"thresholds,omitempty" json:"thresholds,omitempty"` +} + +type Transformer struct { + Name string `mapstructure:"name,omitempty" json:"name,omitempty" toml:"name"` + Enabled bool `mapstructure:"enabled,omitempty" json:"enabled,omitempty" toml:"enabled"` +} + +/////////////////////////////////////// +// LSP based Analysis Config Types // +///////////////////////////////////// + +type AnalysisConfig struct { + Files []lsp.TextDocumentItem `json:"files"` + TestFiles []lsp.TextDocumentItem `json:"test_files"` + ExcludedFiles []lsp.TextDocumentItem `json:"excluded_files"` + ExcludePatterns []string `json:"exclude_patterns"` + TestPatterns []string `json:"test_patterns"` + AnalyzerMeta interface{} `json:"analyzer_meta"` +} + +////////////////////////////////////// +// LSP based Analysis Result Types // +///////////////////////////////////// + +type Namespace struct { + Key string `json:"key"` + Value float64 `json:"value"` +} + +type Metric struct { + MetricCode string `json:"metric_code"` + Namespaces []Namespace `json:"namespaces"` +} + +type AnalysisResult struct { + Issues []lsp.Diagnostic `json:"issues"` + Metrics []Metric `json:"metrics,omitempty"` + IsPassed bool `json:"is_passed"` + Errors []Error `json:"errors"` + // Errors []lsp.Diagnostic `json:"errors"` + ExtraData interface{} `json:"extra_data"` +} + +//////////////////////////////////// +// Default Analysis Result Types // +/////////////////////////////////// + +type Error struct { + HMessage string `json:"hmessage"` + Level int `json:"level"` +} + +type Coordinate struct { + Line int `json:"line"` + Column int `json:"column"` +} + +type Position struct { + Begin Coordinate `json:"begin"` + End Coordinate `json:"end"` +} + +type Location struct { + Path string `json:"path"` + Position Position `json:"position"` +} + +type Issue struct { + Code string `json:"issue_code"` + Title string `json:"issue_text"` + Location Location `json:"location"` +} + +type DefaultAnalysisResult struct { + Issues []Issue `json:"issues"` + Metrics []Metric `json:"metrics,omitempty"` + IsPassed bool `json:"is_passed"` + Errors []Error `json:"errors"` + ExtraData interface{} `json:"extra_data"` +} diff --git a/analysis/config/utils.go b/analysis/config/utils.go new file mode 100644 index 000000000..4fb360c7c --- /dev/null +++ b/analysis/config/utils.go @@ -0,0 +1,78 @@ +package config + +import ( + "os" + "path" + "path/filepath" + "strings" + + "github.com/gobwas/glob" +) + +/* Walks the `CODE_PATH` directory and returns all the files other than the ones present + * in the .git folder for analysis in the form of a string array */ +func readAllFiles(codePath string) ([]string, error) { + fileCount := 0 + + allFiles := make([]string, 0) + + err := filepath.Walk(codePath, + func(path string, fileInfo os.FileInfo, err error) error { + if err != nil { + return err + } + fileCount++ + + /* Check the following before appending to the list of files: + * Should not be a directory + * The walked file should not be present in .git folder */ + if !fileInfo.IsDir() && !strings.HasPrefix(path, filepath.Join(codePath, ".git")) { + allFiles = append(allFiles, path) + } + return nil + }) + if err != nil { + return allFiles, err + } + return allFiles, nil +} + +// Returns the slice of files matching certain glob patterns +func (r *AnalysisRun) getMatchingFiles(patterns []string) ([]string, error) { + matchedFiles := make([]string, 0) + + // Return all the files if no exclude_patterns are configured + if len(patterns) == 0 { + return matchedFiles, nil + } + + for _, file := range r.AnalysisFiles { + for i := range patterns { + g := glob.MustCompile(path.Join(r.LocalCodePath, patterns[i])) + if g.Match(file) { + matchedFiles = append(matchedFiles, file) + } + } + } + return matchedFiles, nil +} + +// Filters the analysis files and removes the files matching the exclude_patterns from them +// TODO: Improve the logic here +func (r *AnalysisRun) filterAnalysisFiles() { + excluded := false + filteredFiles := []string{} + for _, file := range r.AnalysisFiles { + excluded = false + for _, excludedFile := range r.ExcludedFiles { + if file == excludedFile { + excluded = true + break + } + } + if !excluded { + filteredFiles = append(filteredFiles, file) + } + } + r.AnalysisFiles = filteredFiles +} diff --git a/analysis/lsp/types.go b/analysis/lsp/types.go new file mode 100644 index 000000000..b42ead688 --- /dev/null +++ b/analysis/lsp/types.go @@ -0,0 +1,63 @@ +package lsp + +////////////////////////////// +// Document identity types // +///////////////////////////// + +type DocumentURI string + +type TextDocumentItem struct { + URI DocumentURI `json:"uri"` + LanguageID string `json:"languageID,omitempty"` + Version int `json:"version,omitempty"` + Text string `json:"text,omitempty"` +} + +/////////////////////////////// +// Diagnostic related types // +///////////////////////////// + +type DiagnosticSeverity int + +const ( + Error DiagnosticSeverity = 1 + Warning DiagnosticSeverity = 2 + Information DiagnosticSeverity = 3 + Hint DiagnosticSeverity = 4 +) + +type Position struct { + Line int `json:"line"` + Character int `json:"character"` +} +type Range struct { + Start Position `json:"start"` + End Position `json:"end"` +} + +type Location struct { + URI string `json:"uri"` + Range Range `json:"range"` +} + +type DiagnosticRelatedInformation struct { + Location Location `json:"location"` + Message string `json:"message"` +} + +type Diagnostic struct { + Range Range `json:"range"` + Severity DiagnosticSeverity `json:"severity,omitempty"` + Code string `json:"code,omitempty"` + Source string `json:"source,omitempty"` + Message string `json:"message"` + + /** + * An array of related diagnostic information, e.g. when symbol-names within + * a scope collide all definitions can be marked via this property. + * var a,b + * a := 2 + * Issues in line 1 and 2 are related. + */ + RelatedInformation []DiagnosticRelatedInformation `json:"relatedInformation"` +} diff --git a/analyzers/backend/docker/build.go b/analyzers/backend/docker/build.go index 98e20f90d..0df23ecf9 100644 --- a/analyzers/backend/docker/build.go +++ b/analyzers/backend/docker/build.go @@ -3,6 +3,7 @@ package docker import ( "bufio" "context" + "crypto/rand" "encoding/json" "errors" "fmt" @@ -11,11 +12,15 @@ import ( "strings" "time" + "github.com/deepsourcelabs/cli/analyzers/config" "github.com/docker/docker/api/types" "github.com/docker/docker/client" "github.com/docker/docker/pkg/archive" ) +// Timeout for build and container operations (10 minutes) +const buildTimeout = 10 * time.Minute + type ErrorLine struct { Error string `json:"error"` ErrorDetail ErrorDetail `json:"errorDetail"` @@ -31,9 +36,12 @@ type DockerBuildResponse struct { type DockerClient struct { Client *client.Client + ContainerName string + ContainerID string ImageName string ImageTag string DockerfilePath string + AnalysisOpts AnalysisParams } type DockerBuildError struct { @@ -62,7 +70,7 @@ func (d *DockerClient) BuildAnalyzerDockerImage() *DockerBuildError { } func (d *DockerClient) executeImageBuild() error { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*120) + ctx, cancel := context.WithTimeout(context.Background(), buildTimeout) defer cancel() cwd, _ := os.Getwd() @@ -115,3 +123,28 @@ func checkResponse(rd io.Reader) error { } return scanner.Err() } + +// Returns the docker image details to build +func GetDockerImageDetails(analyzerTOMLData *config.AnalyzerMetadata) (string, string) { + var dockerFilePath, dockerFileName string + dockerFilePath = "Dockerfile" + + // Read config for the value if specified + if analyzerTOMLData.Build.Dockerfile != "" { + dockerFilePath = analyzerTOMLData.Build.Dockerfile + } + + // Removing the @ from the shortcode since docker build doesn't accept it as a valid image name + if analyzerTOMLData.Shortcode != "" { + dockerFileName = strings.TrimPrefix(analyzerTOMLData.Shortcode, "@") + } + return dockerFilePath, dockerFileName +} + +func GenerateImageVersion(length int) string { + b := make([]byte, length) + if _, err := rand.Read(b); err != nil { + panic(err) + } + return fmt.Sprintf("%x", b) +} diff --git a/analyzers/backend/docker/container.go b/analyzers/backend/docker/container.go new file mode 100644 index 000000000..250f17898 --- /dev/null +++ b/analyzers/backend/docker/container.go @@ -0,0 +1,147 @@ +package docker + +import ( + "archive/tar" + "context" + "fmt" + "io" + "io/ioutil" + "os" + "path" + "strings" + "time" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/network" + "github.com/docker/docker/pkg/archive" + v1 "github.com/opencontainers/image-spec/specs-go/v1" +) + +type AnalysisParams struct { + AnalyzerName string + HostCodePath string + HostToolBoxPath string + AnalysisCommand string + ContainerCodePath string + ContainerToolBoxPath string + AnalysisResultsPath string + AnalysisResultsFilename string + AnalysisConfigPath string +} + +const containerRunTimeout = 10 * time.Minute + +/* Creates a Docker container with the volume mount in which the source code to be analyzed and the CMD instruction being the + * analysis command configured by the user. + * Having started the container, streams the logs to STDOUT. On completion of the streaming, + * copies the `analysis_results.json` result file generated in the container to the host directory + */ +func (d *DockerClient) StartDockerContainer() error { + /* ========================================================== + * Prepare the container config with the following data: + * - ImageName + * - CMD instruction + * - Environment variables + * ========================================================== */ + + config := container.Config{ + Image: fmt.Sprintf("%s:%s", d.ImageName, d.ImageTag), + Cmd: strings.Split(d.AnalysisOpts.AnalysisCommand, " "), + Env: []string{ + "TOOLBOX_PATH=" + d.AnalysisOpts.ContainerToolBoxPath, + "CODE_PATH=" + d.AnalysisOpts.ContainerCodePath, + }, + } + + /* Host config containing the mounted volumes + * The host machine's temporary code path and toolbox path is mounted in the container */ + hostConfig := container.HostConfig{ + Binds: []string{ + fmt.Sprintf("%s:%s", d.AnalysisOpts.HostCodePath, d.AnalysisOpts.ContainerCodePath), + }, + } + + // Prepare the network config + networkConfig := network.NetworkingConfig{} + platform := v1.Platform{ + Architecture: "amd64", + OS: "linux", + } + + /* =============================================================================== + * Create container with the above configs and copy the analysis_config.json to it + * =============================================================================== */ + ctx, cancel := context.WithTimeout(context.Background(), containerRunTimeout) + defer cancel() + containerCreateResp, err := d.Client.ContainerCreate(ctx, &config, &hostConfig, &networkConfig, &platform, d.ContainerName) + if err != nil { + return err + } + d.ContainerID = containerCreateResp.ID + + tr, err := archive.Tar(d.AnalysisOpts.AnalysisConfigPath, archive.Uncompressed) + if err != nil { + return err + } + + opts := types.CopyToContainerOptions{} + if err = d.Client.CopyToContainer(ctx, d.ContainerID, path.Join(d.AnalysisOpts.ContainerToolBoxPath), tr, opts); err != nil { + return err + } + + /* ========================================= + * Start the container + * ========================================= */ + containerOpts := types.ContainerStartOptions{} + err = d.Client.ContainerStart(ctx, containerCreateResp.ID, containerOpts) + if err != nil { + return err + } + + /* =================================================================== + * Stream container logs to STDOUT + * TODO: Check if the logs are needed only in --verbose/--debug mode? + * =================================================================== */ + reader, err := d.Client.ContainerLogs(ctx, containerCreateResp.ID, types.ContainerLogsOptions{ShowStdout: true, ShowStderr: true, Follow: true, Timestamps: false}) + if err != nil { + return err + } + defer reader.Close() + + _, err = io.Copy(os.Stdout, reader) + if err != nil && err != io.EOF { + return err + } + return nil +} + +/* Fetch analysis results generated after analysis from the container */ +func (d *DockerClient) FetchAnalysisResults() ([]byte, string, error) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*120) + defer cancel() + + // If no error is found from the above step, copy the analysis results file to the host + contentReader, _, err := d.Client.CopyFromContainer(ctx, d.ContainerID, path.Join(d.AnalysisOpts.ContainerToolBoxPath, d.AnalysisOpts.AnalysisResultsFilename)) + if err != nil { + return nil, "", err + } + defer contentReader.Close() + + tr := tar.NewReader(contentReader) + + // Read the TAR archive returned by docker + result, err := tr.Next() + if err != nil { + if err != io.EOF { + return nil, "", err + } + } + + // Read the contents of the TAR archive into a byte buffer + buf, err := ioutil.ReadAll(tr) + if err != nil { + return nil, "", err + } + return buf, result.Name, nil +} diff --git a/analyzers/config/config.go b/analyzers/config/config.go index 4f88b7a04..dee56a59a 100644 --- a/analyzers/config/config.go +++ b/analyzers/config/config.go @@ -1,15 +1,31 @@ package config import ( + "errors" + "fmt" + "io/ioutil" "os" "path/filepath" + "strings" "github.com/deepsourcelabs/cli/utils" + "github.com/pelletier/go-toml/v2" ) -var configFolder string = ".deepsource/analyzer" +var ( + projectRoot string + analyzerTOMLPath string + issuesDirectoryPath string + configFolder string = ".deepsource/analyzer" +) func InitAnalyzerConfigurationPaths() (string, string, string) { + resolveAnalyzerConfigurationPaths() + return projectRoot, analyzerTOMLPath, issuesDirectoryPath +} + +// Read the types and read the config +func resolveAnalyzerConfigurationPaths() { cwd, _ := os.Getwd() // Extracting the path of the project root @@ -19,7 +35,97 @@ func InitAnalyzerConfigurationPaths() (string, string, string) { } // Configuring the paths of analyzer.toml and issues directory - analyzerTOMLPath := filepath.Join(projectRoot, configFolder, "analyzer.toml") - issuesDirPath := filepath.Join(projectRoot, configFolder, "issues/") - return projectRoot, analyzerTOMLPath, issuesDirPath + analyzerTOMLPath = filepath.Join(projectRoot, configFolder, "analyzer.toml") + issuesDirectoryPath = filepath.Join(projectRoot, configFolder, "issues/") +} + +// Verify the paths of analyzer configurations like analyzer.toml and +// issue descriptions +func VerifyAnalyzerConfigs() error { + resolveAnalyzerConfigurationPaths() + + // Check if `analyzer.toml` is present in `.deepsource/analyzer` folder + if _, err := os.Stat(analyzerTOMLPath); err != nil { + if errors.Is(err, os.ErrNotExist) { + return errors.New("the analyzer.toml file doesn't exist\n") + } + } + + // Check if `issues/` directory is present in `.deepsource/analyzer` folder and is not empty. + if _, err := os.Stat(issuesDirectoryPath); err != nil { + if errors.Is(err, os.ErrNotExist) { + return errors.New("the issue descriptions directory doesn't exist\n") + } + } + + // Check if there are any toml files in the `issues/` directory + files, err := ioutil.ReadDir(issuesDirectoryPath) + if err != nil { + return fmt.Errorf("failed to read the files present in the issues directory at %s\n", issuesDirectoryPath) + } + + // Check if its an empty directory + if len(files) < 1 { + return fmt.Errorf("found 0 issues configured in the issues directory at %s\n", issuesDirectoryPath) + } + + tomlPresent := false + // Check if there are TOML files configured in the issues/ directory + for _, file := range files { + if strings.HasSuffix(file.Name(), ".toml") { + tomlPresent = true + break + } + } + if !tomlPresent { + return fmt.Errorf("found no toml files in the issues directory at %s\n", issuesDirectoryPath) + } + return nil +} + +// Get the analyzer.toml data +func GetAnalyzerTOML() (*AnalyzerMetadata, error) { + resolveAnalyzerConfigurationPaths() + config := AnalyzerMetadata{} + + // Read the contents of analyzer.toml file + analyzerTOMLContent, err := ioutil.ReadFile(analyzerTOMLPath) + if err != nil { + return &config, errors.New("failed to read analyzer.toml file") + } + + // Unmarshal TOML into config + if err = toml.Unmarshal(analyzerTOMLContent, &config); err != nil { + return &config, err + } + return &config, nil +} + +// Get the list of issue descriptions +func GetIssueDescriptions() (*[]AnalyzerIssue, error) { + resolveAnalyzerConfigurationPaths() + issueDescriptions := []AnalyzerIssue{} + + issuesList, err := ioutil.ReadDir(issuesDirectoryPath) + if err != nil { + return nil, err + } + for _, issuePath := range issuesList { + issue := AnalyzerIssue{} + // Set the issue shortcode as the filename + issue.Shortcode = strings.TrimSuffix(issuePath.Name(), ".toml") + + // Read the contents of issue toml file + issueTOMLContent, err := ioutil.ReadFile(filepath.Join(issuesDirectoryPath, issuePath.Name())) + if err != nil { + return nil, fmt.Errorf("failed to read file: %s", filepath.Join(issuesDirectoryPath, issuePath.Name())) + } + + // Unmarshal TOML into config + if err = toml.Unmarshal(issueTOMLContent, &issue); err != nil { + return nil, err + } + issueDescriptions = append(issueDescriptions, issue) + } + return &issueDescriptions, nil } diff --git a/analyzers/config/types.go b/analyzers/config/types.go new file mode 100644 index 000000000..e7d993e08 --- /dev/null +++ b/analyzers/config/types.go @@ -0,0 +1,56 @@ +package config + +type Analysis struct { + Command string `toml:"command" json:"command" validate:"required"` +} + +// TODO: Remove the comment when we start support for Autofix. +// type Autofix struct { +// Command string `toml:"command" json:"command" analyzertoml:"required"` +// } + +type Build struct { + Builder string `toml:"builder" json:"builder" validate:"omitempty"` + Dockerfile string `toml:"dockerfile" json:"dockerfile,omitempty" validate:"omitempty"` + Script string `toml:"script" json:"script" validate:"omitempty"` +} + +type URL struct { + Source string `toml:"source" json:"source" validate:"omitempty,url"` + Documentation string `toml:"documentation" json:"documentation,omitempty" validate:"omitempty,url"` + BugTracker string `toml:"bug_tracker" json:"bug_tracker" validate:"omitempty,url"` +} + +type Test struct { + Command string `toml:"command" json:"command" validate:"omitempty"` +} + +// analyzer.toml type +type AnalyzerMetadata struct { + // Analyzer specific data + Name string `toml:"name" json:"name" validate:"required"` + Shortcode string `toml:"shortcode" json:"shortcode" validate:"required"` // New + Description string `toml:"description" json:"description" validate:"required"` + Category string `toml:"category" json:"category" validate:"required"` + Tags []string `toml:"tags" json:"tags,omitempty" validate:"omitempty"` + URL URL `toml:"urls" json:"urls,omitempty" validate:"omitempty"` + EnvironmentVariables map[string]string `toml:"environment_variables" json:"environment_variables,omitempty" validate:"omitempty"` + + // Analyzer, Autofix and Transformer config + Analysis Analysis `toml:"analysis" json:"analysis" validate:"required"` + // Autofix Autofix `toml:"autofix" json:"autofix" validate:"omitempty"` + + // Build steps needed to build the analyzer + Build Build `toml:"build" json:"build" validate:"omitempty"` + + // Test command for running the testing workflow + Test Test `toml:"test" json:"test" validate:"omitempty"` +} + +// Analyzer issue description +type AnalyzerIssue struct { + Shortcode string `validate:"omitempty"` + Title string `toml:"title" json:"title" validate:"required"` + Description string `toml:"description" json:"description" validate:"required"` + Category string `toml:"category" json:"category" validate:"required"` +} diff --git a/analyzers/validator/validator.go b/analyzers/validator/validator.go index e7b6e8c17..71a6e507c 100644 --- a/analyzers/validator/validator.go +++ b/analyzers/validator/validator.go @@ -8,6 +8,7 @@ import ( "path/filepath" "strings" + "github.com/deepsourcelabs/cli/analyzers/config" validate "github.com/go-playground/validator/v10" "github.com/pelletier/go-toml/v2" ) @@ -23,7 +24,8 @@ type ValidationError struct { Errors []Error } -// Checks if the analyzer.toml file and the issue directory is present +// Receives the path of the `analyzer.toml` and issue descriptions and +// checks if they are actually present func CheckForAnalyzerConfig(analyzerTOMLPath, issuesDirectoryPath string) (err error) { // Check if `analyzer.toml` is present in `.deepsource/analyzer` folder if _, err := os.Stat(analyzerTOMLPath); err != nil { @@ -66,8 +68,8 @@ func CheckForAnalyzerConfig(analyzerTOMLPath, issuesDirectoryPath string) (err e } // Validates analyzer.toml file -func ValidateAnalyzerTOML(analyzerTOMLPath string) (*AnalyzerMetadata, *ValidationError, error) { - config := AnalyzerMetadata{} +func ValidateAnalyzerTOML(analyzerTOMLPath string) (*config.AnalyzerMetadata, *ValidationError, error) { + config := config.AnalyzerMetadata{} analyzerTOMLValidationErrors := ValidationError{} // Read the contents of analyzer.toml file diff --git a/command/analyzer/analyzer.go b/command/analyzer/analyzer.go index 5af58f5b0..7d7d04b9b 100644 --- a/command/analyzer/analyzer.go +++ b/command/analyzer/analyzer.go @@ -4,6 +4,7 @@ import ( "github.com/spf13/cobra" initialize "github.com/deepsourcelabs/cli/command/analyzer/initialize" + "github.com/deepsourcelabs/cli/command/analyzer/run" verify "github.com/deepsourcelabs/cli/command/analyzer/verify" ) @@ -16,6 +17,7 @@ func NewCmdAnalyzer() *cobra.Command { Use: "analyzer", Short: "Operations related to DeepSource Analyzers", } + cmd.AddCommand(run.NewCmdAnalyzerRun()) cmd.AddCommand(verify.NewCmdAnalyzerVerify()) cmd.AddCommand(initialize.NewCmdAnalyzerInit()) return cmd diff --git a/command/analyzer/initialize/init.go b/command/analyzer/initialize/init.go index 784b821b0..0b66c7b32 100644 --- a/command/analyzer/initialize/init.go +++ b/command/analyzer/initialize/init.go @@ -8,12 +8,13 @@ import ( "path/filepath" "strings" - "github.com/deepsourcelabs/cli/analyzers/config" - validator "github.com/deepsourcelabs/cli/analyzers/validator" - "github.com/deepsourcelabs/cli/utils" "github.com/pelletier/go-toml" "github.com/pterm/pterm" "github.com/spf13/cobra" + + "github.com/deepsourcelabs/cli/analyzers/config" + validator "github.com/deepsourcelabs/cli/analyzers/validator" + "github.com/deepsourcelabs/cli/utils" ) type SDKResponse struct { @@ -22,15 +23,16 @@ type SDKResponse struct { } type AnalyzerInitOpts struct { - SDKInput SDKResponse - ProjectRootPath string - AnalyzerTOMLPath string - AnalyzerTOMLData validator.AnalyzerMetadata - IssuesDirectoryPath string - AnalyzerShortcodeArg string + SDKInput SDKResponse + ProjectRootPath string + AnalyzerTOMLPath string + AnalyzerTOMLData validator.AnalyzerMetadata + IssuesDirectoryPath string + AnalyzerShortcodeArg string + + ConfirmationPrompt func(string, string) (bool, error) SingleLineInputPrompt func(string, string, string) (string, error) DescriptionPrompt func(string, string, string) (string, error) - ConfirmationPrompt func(string, string) (bool, error) SingleOptionPrompt func(string, string, []string) (string, error) } @@ -102,7 +104,6 @@ func (a *AnalyzerInitOpts) initAnalyzer() (*bytes.Buffer, error) { } if len(supportedSDKS) > 0 { - // Check if DeepSource SDK is needed or not? msg = "Would you like to use DeepSource Analyzer SDK to build your Analyzer?" helpText = "DeepSource SDKs help you to easily create an Analyzer" diff --git a/command/analyzer/run/.deepsource/analyzer/analyzer.toml b/command/analyzer/run/.deepsource/analyzer/analyzer.toml new file mode 100644 index 000000000..e69de29bb diff --git a/command/analyzer/run/client.go b/command/analyzer/run/client.go new file mode 100644 index 000000000..8c3f77cf3 --- /dev/null +++ b/command/analyzer/run/client.go @@ -0,0 +1,44 @@ +package run + +import ( + "strings" + + "github.com/deepsourcelabs/cli/analyzers/backend/docker" + "github.com/deepsourcelabs/cli/analyzers/config" +) + +// Reads the analyzer.toml data and environment variables and creates a docker client +// to be used in the docker related ops by the run command +func (a *AnalyzerDryRun) createDockerClient() error { + // Get the Analyzer.toml contents + analyzerTOMLData, err := config.GetAnalyzerTOML() + if err != nil { + return err + } + + // Fetch environment variables set by the user + fetchEnvironmentVariables() + + // Extracting the docker file and path details + dockerFilePath, dockerFileName := docker.GetDockerImageDetails(analyzerTOMLData) + analyzerName := strings.Split(dockerFileName, "/")[1] + + /* ====================================== */ + // Create a Docker Client + /* ====================================== */ + + a.Client = &docker.DockerClient{ + ImageName: dockerFileName, + ImageTag: docker.GenerateImageVersion(7), + ContainerName: analyzerName + "-" + docker.GenerateImageVersion(7), + DockerfilePath: dockerFilePath, + AnalysisOpts: docker.AnalysisParams{ + AnalyzerName: analyzerTOMLData.Name, + AnalysisCommand: analyzerTOMLData.Analysis.Command, + ContainerCodePath: containerCodePath, + ContainerToolBoxPath: containerToolBoxPath, + AnalysisResultsFilename: analysisResultsName + analysisResultsExt, + }, + } + return nil +} diff --git a/command/analyzer/run/config.go b/command/analyzer/run/config.go new file mode 100644 index 000000000..bf9bc8c8e --- /dev/null +++ b/command/analyzer/run/config.go @@ -0,0 +1,44 @@ +package run + +import ( + "encoding/json" + "fmt" + "os" + "path" + + analysis_config "github.com/deepsourcelabs/cli/analysis/config" +) + +// Prepares the analysis config and writes it to TOOLBOX_PATH +func (a *AnalyzerDryRun) prepareAnalysisConfig() (err error) { + /* Prepare the analysis_config.json here and mount into the container at `TOOLBOX_PATH/analysis_config.json` + * The analysis_config.json will have path prepended with the CODE_PATH of the container and not local CODE_PATH */ + analysisRun := analysis_config.AnalysisRun{ + AnalyzerName: a.Client.AnalysisOpts.AnalyzerName, + LocalCodePath: a.Client.AnalysisOpts.HostCodePath, + ContainerCodePath: containerCodePath, + } + + if a.AnalysisConfig, err = analysisRun.ConfigureAnalysis(); err != nil { + return err + } + return nil +} + +// Writes the analysis_config.json into a temporary directory which shall be mounted as TOOLBOX directory in the container +func (a *AnalyzerDryRun) writeAnalysisConfig() (err error) { + // Modify the paths of analysis_config.json file to use the container based CODE_PATH instead + // of the local CODE_PATH + modifyAnalysisConfigFilepaths(a.AnalysisConfig, a.Client.AnalysisOpts.HostCodePath, a.Client.AnalysisOpts.ContainerCodePath) + + // Marshal the analysis_config data into JSON + analysisConfigJSON, err := json.Marshal(a.AnalysisConfig) + if err != nil { + return err + } + a.Client.AnalysisOpts.AnalysisConfigPath = path.Join(a.TempToolBoxDirectory, analysisConfigName+analysisConfigExt) + + // Create a temporary directory + fmt.Printf("Writing analysis_config to %s\n", a.TempToolBoxDirectory) + return os.WriteFile(path.Join(a.TempToolBoxDirectory, analysisConfigName+analysisConfigExt), analysisConfigJSON, 0o644) +} diff --git a/command/analyzer/run/result.go b/command/analyzer/run/result.go new file mode 100644 index 000000000..015cc1199 --- /dev/null +++ b/command/analyzer/run/result.go @@ -0,0 +1,39 @@ +package run + +import ( + "errors" + "fmt" + "os" + "path" + "strings" +) + +// Writes the analysis results into a file with the name specified in the `fileName` parameter +func (a *AnalyzerDryRun) writeAnalysisResults(buf []byte, fileName string) (err error) { + analysisResultsPath := path.Join(a.Client.AnalysisOpts.AnalysisResultsPath, fileName) + + // Ref: https://deepsource.io/directory/analyzers/go/issues/GSC-G305 + if !strings.Contains(string(buf), "..") { + fmt.Println("Writing analysis result to", path.Join(a.Client.AnalysisOpts.AnalysisResultsPath, fileName)) + + // Check if the results file already exists + if _, err := os.Stat(analysisResultsPath); err != nil { + if errors.Is(err, os.ErrNotExist) { + fmt.Println("File doesn't exist already. Creating it.") + // Create the file and allocate permissions to it + _, err := os.Create(analysisResultsPath) + if err != nil { + return err + } + if err = os.Chmod(analysisResultsPath, 0o600); err != nil { + return err + } + } + } + + if err = os.WriteFile(path.Join(a.Client.AnalysisOpts.AnalysisResultsPath, fileName), buf, 0o600); err != nil { + return err + } + } + return nil +} diff --git a/command/analyzer/run/run.go b/command/analyzer/run/run.go new file mode 100644 index 000000000..899ae46b8 --- /dev/null +++ b/command/analyzer/run/run.go @@ -0,0 +1,118 @@ +package run + +import ( + "fmt" + "os" + + "github.com/deepsourcelabs/cli/utils" + "github.com/spf13/cobra" + + analysis_config "github.com/deepsourcelabs/cli/analysis/config" + "github.com/deepsourcelabs/cli/analyzers/backend/docker" +) + +// Variables to hold the value of CODE_PATH and TOOLBOX_PATH to be injected +// into the analysis container +var ( + containerCodePath string + containerToolBoxPath string + analysisConfigName string = "analysis_config" + analysisResultsName string = "analysis_results" + analysisConfigExt string = ".json" + analysisResultsExt string = ".json" +) + +// The params required while running the Analysis locally +type AnalyzerDryRun struct { + Client *docker.DockerClient // The client to be used for all docker related ops + RemoteSource bool // True if the source to be analyzed is a remote VCS repository + SourcePath string // The path of the directory of source code to be analyzed + AnalysisFiles []string // The list of analysis files + TempCloneDirectory string // The temporary directory where the source of the remote VCS will be cloned to + TempToolBoxDirectory string // The temporary directory where the analysis_config is present + + AnalysisConfig *analysis_config.AnalysisConfig // The analysis_config.json file containing the meta for analysis +} + +func NewCmdAnalyzerRun() *cobra.Command { + // Setting the current working directory as the default path of the source to be analyzed + cwd, _ := os.Getwd() + + // Initializing the run params and setting defaults + opts := AnalyzerDryRun{ + SourcePath: cwd, + RemoteSource: false, + } + + cmd := &cobra.Command{ + Use: "dry-run", + Short: "Dry run the DeepSource Analyzer locally", + Args: utils.MaxNArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + if len(args) > 0 { + opts.SourcePath = args[0] + } + if err := opts.AnalyzerRun(); err != nil { + return fmt.Errorf("Failed to run the Analyzer. Error: %s", err) + } + return nil + }, + } + + // --output-file/ -o flag + cmd.Flags().StringVarP(&opts.TempToolBoxDirectory, "output-file", "o", "", "The path of analysis results") + return cmd +} + +// Run the Analyzer locally on a certain directory or repository +func (a *AnalyzerDryRun) AnalyzerRun() (err error) { + // runtime.Breakpoint() + err = a.createDockerClient() + if err != nil { + return err + } + + // Building the Analyzer image + fmt.Println("Building Analyzer image...") + if buildError := a.Client.BuildAnalyzerDockerImage(); buildError != nil { + return buildError + } + + /* Create temporary toolbox directory to store analysis config and later analyis results + * If already passed through --output-file flag, use that one */ + if err = a.createTemporaryToolBoxDir(); err != nil { + return err + } + + // Resolve the path of source code to be analyzed based on the user input + a.Client.AnalysisOpts.HostCodePath, err = a.resolveAnalysisCodePath() + if err != nil { + return err + } + + /* Generate the analysis_config.json file + * Also, write the analysis_config data into a temp /toolbox directory to be mounted into the container */ + if err = a.prepareAnalysisConfig(); err != nil { + return err + } + + // Write the analysis_config.json to local toolbox directory + if err = a.writeAnalysisConfig(); err != nil { + return err + } + + /* Starts the Docker container which analyzes the code and stores the analysis results + * in a variable */ + if err = a.Client.StartDockerContainer(); err != nil { + return err + } + + // Fetch the analysis results + analysisResultBuf, analysisResultFileName, err := a.Client.FetchAnalysisResults() + if err != nil { + return err + } + + // Write the analysis results to the file + return a.writeAnalysisResults(analysisResultBuf, analysisResultFileName) +} diff --git a/command/analyzer/run/source.go b/command/analyzer/run/source.go new file mode 100644 index 000000000..d498f6cd5 --- /dev/null +++ b/command/analyzer/run/source.go @@ -0,0 +1,46 @@ +package run + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/go-git/go-git/v5" +) + +/* Resolves the code to be analyzed by the Analyzer. + * The user passes it as an argument to the command `deepsource analyzer run ` + * Parse the argument and check if its a URL, if not then resolve the local directory path */ +func (a *AnalyzerDryRun) resolveAnalysisCodePath() (string, error) { + // Check if the source path is a valid VCS URL + if isValidUrl(a.SourcePath) { + tempCloneDir, err := a.cloneRemoteSource() + if err != nil { + return "", err + } + a.SourcePath = tempCloneDir + } else { + a.SourcePath, _ = filepath.Abs(a.SourcePath) + } + return a.SourcePath, nil +} + +// Clones the remote repository which is to be analyzed +func (a *AnalyzerDryRun) cloneRemoteSource() (string, error) { + var err error + a.RemoteSource = true + if a.TempCloneDirectory, err = createTemporaryDirectory("code"); err != nil { + return "", err + } + + // Clone the repository to a temporary directory + fmt.Printf("Cloning %s to %s\n", a.SourcePath, a.TempCloneDirectory) + if _, err := git.PlainClone(a.TempCloneDirectory, false, &git.CloneOptions{ + URL: a.SourcePath, + Depth: 1, + Progress: os.Stdout, + }); err != nil { + return "", err + } + return a.TempCloneDirectory, nil +} diff --git a/command/analyzer/run/source_test.go b/command/analyzer/run/source_test.go new file mode 100644 index 000000000..520cbe74c --- /dev/null +++ b/command/analyzer/run/source_test.go @@ -0,0 +1,138 @@ +package run + +import ( + "bytes" + "encoding/json" + "os" + "strings" + "testing" + + "github.com/deepsourcelabs/cli/analyzers/backend/docker" +) + +func TestPrepareAnalysisConfig(t *testing.T) { + type TestCase struct { + CodePath string + ToolBoxPath string + AnalyzerName string + } + + testCases := []TestCase{ + { + CodePath: "testdata/project1/", + ToolBoxPath: "testdata/toolbox/project1/", + AnalyzerName: "acme", + }, + { + CodePath: "testdata/project2/", + ToolBoxPath: "testdata/toolbox/project2/", + AnalyzerName: "vim", + }, + { + CodePath: "testdata/project3/", + ToolBoxPath: "testdata/toolbox/project3/", + AnalyzerName: "emacs", + }, + { + CodePath: "testdata/project4/", + ToolBoxPath: "testdata/toolbox/project4/", + AnalyzerName: "nano", + }, + } + containerCodePath := "/code" + + for _, tc := range testCases { + dc := docker.DockerClient{ + AnalysisOpts: docker.AnalysisParams{ + AnalyzerName: tc.AnalyzerName, + HostCodePath: tc.CodePath, + ContainerCodePath: containerCodePath, + }, + } + + opts := AnalyzerDryRun{ + Client: &dc, + TempToolBoxDirectory: tc.ToolBoxPath, + } + + err := opts.prepareAnalysisConfig() + if err != nil { + t.Errorf("Failed to verify analysis config generation. Error:%s", err) + } + modifyAnalysisConfigFilepaths(opts.AnalysisConfig, opts.Client.AnalysisOpts.HostCodePath, opts.Client.AnalysisOpts.ContainerCodePath) + + receivedAnalysisConfig, err := json.Marshal(opts.AnalysisConfig) + if err != nil { + t.Errorf("Failed to marshal the received config to JSON. Error:%s", err) + } + + expectedAnalysisConfig, err := os.ReadFile(tc.ToolBoxPath + "analysis_config.json") + if err != nil { + t.Errorf("Failed to read the expected analysis config. Error:%s", err) + } + + if !bytes.Equal(receivedAnalysisConfig, expectedAnalysisConfig) { + t.Errorf("Received invalid analysis config. Expected %s\nGot %s\n", string(expectedAnalysisConfig), string(receivedAnalysisConfig)) + } + + } +} + +func TestResolveAnalysisCodePath(t *testing.T) { + type TestCase struct { + Path string + Response string + RemoteSource bool + } + + testCases := []TestCase{ + { + Path: "/Users/phoenix/codes/", + Response: "/Users/phoenix/codes", + RemoteSource: false, + }, + { + Path: "/tmp/helloworld/", + Response: "/tmp/helloworld", + RemoteSource: false, + }, + { + Path: "https://github.com/deepsourcelabs/shifty", + Response: "TEMPDIR", + RemoteSource: true, + }, + { + Path: "https://gitlab.com/deepsourcelabs/demo-go", + Response: "TEMPDIR", + RemoteSource: true, + }, + { + Path: "github.com/deepsourcelabs/cli", + Response: "TEMPDIR", + RemoteSource: false, + }, + } + + for _, tc := range testCases { + opts := AnalyzerDryRun{ + SourcePath: tc.Path, + } + resolvedPath, err := opts.resolveAnalysisCodePath() + if err != nil && err.Error() != "authentication required" { + t.Errorf("Failed to resolve the analysis source path. Error:%s", err) + } + + if opts.RemoteSource != tc.RemoteSource { + t.Errorf("Expected RemoteSource for %s to be %v. Got %v", tc.Path, tc.RemoteSource, opts.RemoteSource) + } + if resolvedPath != tc.Response { + if tc.Response != "TEMPDIR" { + t.Errorf("Failed to resolve the local analysis source path. Wanted %s. Got %s", tc.Response, resolvedPath) + } + + if !strings.HasPrefix(resolvedPath, os.Getenv("TEMPDIR")) { + t.Errorf("Failed to resolve the remote analysis source path. Wanted a temp directory. Got %s", resolvedPath) + } + } + } +} diff --git a/command/analyzer/run/test/expected_analysis_results.json b/command/analyzer/run/test/expected_analysis_results.json new file mode 100644 index 000000000..99743779f --- /dev/null +++ b/command/analyzer/run/test/expected_analysis_results.json @@ -0,0 +1 @@ +{"issues":[{"range":{"start":{"line":4,"character":0},"end":{"line":4,"character":0}},"code":"I001","message":"Found a TODO comment","relatedInformation":[{"location":{"uri":"analyzer.toml","range":{"start":{"line":4,"character":0},"end":{"line":4,"character":0}}},"message":"Found a TODO comment"}]},{"range":{"start":{"line":1,"character":0},"end":{"line":1,"character":0}},"code":"I001","message":"Found a TODO comment","relatedInformation":[{"location":{"uri":"I001.toml","range":{"start":{"line":1,"character":0},"end":{"line":1,"character":0}}},"message":"Found a TODO comment"}]},{"range":{"start":{"line":4,"character":0},"end":{"line":4,"character":0}},"code":"I001","message":"Found a TODO comment","relatedInformation":[{"location":{"uri":"I001.toml","range":{"start":{"line":4,"character":0},"end":{"line":4,"character":0}}},"message":"Found a TODO comment"}]},{"range":{"start":{"line":48,"character":0},"end":{"line":48,"character":0}},"code":"I001","message":"Found a TODO comment","relatedInformation":[{"location":{"uri":"main.go","range":{"start":{"line":48,"character":0},"end":{"line":48,"character":0}}},"message":"Found a TODO comment"}]},{"range":{"start":{"line":15,"character":0},"end":{"line":15,"character":0}},"code":"I001","message":"Found a TODO comment","relatedInformation":[{"location":{"uri":"utils.go","range":{"start":{"line":15,"character":0},"end":{"line":15,"character":0}}},"message":"Found a TODO comment"}]},{"range":{"start":{"line":32,"character":0},"end":{"line":32,"character":0}},"code":"I001","message":"Found a TODO comment","relatedInformation":[{"location":{"uri":"utils.go","range":{"start":{"line":32,"character":0},"end":{"line":32,"character":0}}},"message":"Found a TODO comment"}]},{"range":{"start":{"line":54,"character":0},"end":{"line":54,"character":0}},"code":"I001","message":"Found a TODO comment","relatedInformation":[{"location":{"uri":"utils.go","range":{"start":{"line":54,"character":0},"end":{"line":54,"character":0}}},"message":"Found a TODO comment"}]}],"is_passed":true,"errors":null,"extra_data":null} \ No newline at end of file diff --git a/command/analyzer/run/test/run_test.go b/command/analyzer/run/test/run_test.go new file mode 100644 index 000000000..17babdd2a --- /dev/null +++ b/command/analyzer/run/test/run_test.go @@ -0,0 +1,73 @@ +package run + +import ( + "bytes" + "os" + "os/exec" + "path" + "testing" + + "github.com/google/go-cmp/cmp" +) + +// Execute the command from there +func TestAnalyzerRun(t *testing.T) { + /* ============================================================================= + // Copying the todo-checker directory to $APP_PATH for the integration tests + /* ============================================================================= */ + cwd, _ := os.Getwd() + + analyzerPath := path.Join(cwd, "todo-checker") + appPath := os.Getenv("APP_PATH") + if appPath == "" { + appPath = "/app/" + } + + // Copy all the files to APP_PATH + cmd := exec.Command("cp", "-a", analyzerPath+"/.", ".") + cmd.Dir = appPath + + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + // Run the command + err := cmd.Run() + outStr, outErr := stdout.String(), stderr.String() + if err != nil { + t.Errorf("Failed to copy the analyzer code to %s. Error:%s\n%s", appPath, err, outErr) + } + t.Log(outStr) + + /* ============================================================================= + * Run the analyzer dry-run command on the testdata/todo-checker directory + * ============================================================================= */ + + analysisCmd := exec.Command("/tmp/deepsource", "analyzer", "dry-run", analyzerPath, "--output-file", appPath) + analysisCmd.Dir = appPath + + var stdout1, stderr1 bytes.Buffer + analysisErr := analysisCmd.Run() + outStr1, outErr1 := stdout1.String(), stderr1.String() + if err != nil { + t.Errorf("Failed to run the analyzer. Error:%s\n%s", analysisErr, outErr1) + } + t.Log(outStr1) + + /* ============================================================================= + // Compare the results + /* ============================================================================= */ + + receivedAnalysisResults, err := os.ReadFile(path.Join(appPath, "analysis_results.json")) + if err != nil { + t.Errorf("Failed to read the received analysis result. Error:%s", err) + } + expectedAnalysisResults, err := os.ReadFile(path.Join(cwd, "expected_analysis_results.json")) + if err != nil { + t.Errorf("Failed to read the expected analysis result. Error:%s", err) + } + if !bytes.Equal(receivedAnalysisResults, expectedAnalysisResults) { + diff := cmp.Diff(receivedAnalysisResults, expectedAnalysisResults) + t.Errorf("Failed to verify analysis results. Expected: %s\n==========\nGot: %s\n=========\nDiff:%s", expectedAnalysisResults, receivedAnalysisResults, diff) + } +} diff --git a/command/analyzer/run/test/todo-checker/.deepsource/analyzer/analyzer.toml b/command/analyzer/run/test/todo-checker/.deepsource/analyzer/analyzer.toml new file mode 100644 index 000000000..056b137ef --- /dev/null +++ b/command/analyzer/run/test/todo-checker/.deepsource/analyzer/analyzer.toml @@ -0,0 +1,24 @@ +version = "1" +name = "Todo comments checker" +shortcode = "@siddhant-deepsource/todo-comments-checker" +description = "Finds the TODO comments in codebase." +category = "language" +tags = [] + +[urls] + source = "" + documentation = "" + bug_tracker = "" + +[environment_variables] + +[analysis] + command = "/app/todo-checker" + +[build] + builder = "" + dockerfile = "" + script = "" + +[test] + command = "" diff --git a/command/analyzer/run/test/todo-checker/.deepsource/analyzer/issues/I001.toml b/command/analyzer/run/test/todo-checker/.deepsource/analyzer/issues/I001.toml new file mode 100644 index 000000000..99057c2cb --- /dev/null +++ b/command/analyzer/run/test/todo-checker/.deepsource/analyzer/issues/I001.toml @@ -0,0 +1,5 @@ +title = "Found a TODO comment" +category = "doc" +description = """ +Here's a TODO comment you might wanna check. +""" diff --git a/command/analyzer/run/test/todo-checker/Dockerfile b/command/analyzer/run/test/todo-checker/Dockerfile new file mode 100644 index 000000000..1b84531d1 --- /dev/null +++ b/command/analyzer/run/test/todo-checker/Dockerfile @@ -0,0 +1,27 @@ +FROM golang:1.17.6-alpine3.15 + +USER root + +RUN mkdir -p /toolbox /app /code /artifacts /macrocode + +ENV CODE_PATH=/code +ENV TOOLBOX_PATH=/toolbox +RUN apk add --no-cache openssh shadow git grep + +COPY . /app + +WORKDIR /app +RUN git config --global url.git@github.com:.insteadOf https://github.com/ +RUN go env -w GOPRIVATE=github.com/siddhant-deepsource/* + +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /app/todo-checker . + +# delete any user with uid 1000, then create the runner user with uid 1000 +RUN adduser -D -u 1000 runner runner && \ + mkdir -p /.cache /code /home/runner/go && \ + chmod -R ugo+rwx /toolbox /.cache /code /home/runner && \ + chown -R runner:runner /toolbox /.cache /code /home/runner + +WORKDIR /app + +USER runner diff --git a/command/analyzer/run/test/todo-checker/config.go b/command/analyzer/run/test/todo-checker/config.go new file mode 100644 index 000000000..065ad554c --- /dev/null +++ b/command/analyzer/run/test/todo-checker/config.go @@ -0,0 +1,22 @@ +package main + +import ( + "encoding/json" + "os" + "path" +) + +func readAnalysisConfig() (*AnalysisConfig, error) { + analysisConfig := AnalysisConfig{} + + data, err := os.ReadFile(path.Join(toolboxPath, "analysis_config.json")) + if err != nil { + return nil, err + } + + err = json.Unmarshal(data, &analysisConfig) + if err != nil { + return nil, err + } + return &analysisConfig, nil +} diff --git a/command/analyzer/run/test/todo-checker/go.mod b/command/analyzer/run/test/todo-checker/go.mod new file mode 100644 index 000000000..6783f05ea --- /dev/null +++ b/command/analyzer/run/test/todo-checker/go.mod @@ -0,0 +1,5 @@ +module github.com/siddhant-deepsource/2do-checker + +go 1.17 + +require github.com/karrick/godirwalk v1.16.1 diff --git a/command/analyzer/run/test/todo-checker/go.sum b/command/analyzer/run/test/todo-checker/go.sum new file mode 100644 index 000000000..c2c11623e --- /dev/null +++ b/command/analyzer/run/test/todo-checker/go.sum @@ -0,0 +1,2 @@ +github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= +github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= diff --git a/command/analyzer/run/test/todo-checker/main.go b/command/analyzer/run/test/todo-checker/main.go new file mode 100644 index 000000000..93d486a9d --- /dev/null +++ b/command/analyzer/run/test/todo-checker/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "bytes" + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "strings" +) + +var ( + issues []Diagnostic + analysisConf *AnalysisConfig + toolboxPath string = os.Getenv("TOOLBOX_PATH") +) + +func main() { + var err error + + cmd := exec.Command("ls", "-ltr") + cmd.Dir = toolboxPath + + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + err = cmd.Run() + outStr, _ := stdout.String(), stderr.String() + if err != nil { + fmt.Println(err) + } + fmt.Println(outStr) + + log.Println("Parsing analysis_config.json...") + if analysisConf, err = readAnalysisConfig(); err != nil { + log.Fatalln(err) + } + + for _, path := range analysisConf.Files { + content, err := ioutil.ReadFile(string(path.URI)) + if err != nil { + log.Fatal(err) + } + lines := strings.Split(string(content), "\n") + for lineNumber, line := range lines { + if strings.Contains(line, "TODO") { + createIssue(string(path.URI), lineNumber, 0) + } + } + } + macroAnalysisResult := prepareResult() + + if writeError := writeMacroResult(¯oAnalysisResult); writeError != nil { + log.Fatalln("Error occured while writing results:", writeError) + } +} diff --git a/command/analyzer/run/test/todo-checker/types.go b/command/analyzer/run/test/todo-checker/types.go new file mode 100644 index 000000000..5c91dd0f7 --- /dev/null +++ b/command/analyzer/run/test/todo-checker/types.go @@ -0,0 +1,94 @@ +package main + +/////////////////////////////// +// Diagnostic related types // +///////////////////////////// + +type DiagnosticSeverity int + +const ( + Error DiagnosticSeverity = 1 + Warning DiagnosticSeverity = 2 + Information DiagnosticSeverity = 3 + Hint DiagnosticSeverity = 4 +) + +type Position struct { + Line int `json:"line"` + Character int `json:"character"` +} +type Range struct { + Start Position `json:"start"` + End Position `json:"end"` +} + +type Location struct { + URI string `json:"uri"` + Range Range `json:"range"` +} + +type DiagnosticRelatedInformation struct { + Location Location `json:"location"` + Message string `json:"message"` +} + +type Diagnostic struct { + Range Range `json:"range"` + Severity DiagnosticSeverity `json:"severity,omitempty"` + Code string `json:"code,omitempty"` + Source string `json:"source,omitempty"` + Message string `json:"message"` + + /** + * An array of related diagnostic information, e.g. when symbol-names within + * a scope collide all definitions can be marked via this property. + * var a,b + * a := 2 + * Issues in line 1 and 2 are related. + */ + RelatedInformation []DiagnosticRelatedInformation `json:"relatedInformation"` +} + +type Namespace struct { + Key string `json:"key"` + Value float64 `json:"value"` +} + +type Metric struct { + MetricCode string `json:"metric_code"` + Namespaces []Namespace `json:"namespaces"` +} + +type AnalysisResult struct { + Issues []Diagnostic `json:"issues"` + Metrics []Metric `json:"metrics,omitempty"` + IsPassed bool `json:"is_passed"` + Errors []Diagnostic `json:"errors"` + ExtraData interface{} `json:"extra_data"` +} + +//////////////////////////// +// Analysis Config Types // +//////////////////////////// + +type AnalysisConfig struct { + Files []TextDocumentItem `json:"files"` + TestFiles []TextDocumentItem `json:"test_files"` + ExcludedFiles []TextDocumentItem `json:"excluded_files"` + ExcludePatterns []string `json:"exclude_patterns"` + TestPatterns []string `json:"test_patterns"` + AnalyzerMeta interface{} `json:"analyzer_meta"` +} + +////////////////////////////// +// Document identity types // +///////////////////////////// + +type DocumentURI string + +type TextDocumentItem struct { + URI DocumentURI `json:"uri"` + LanguageID string `json:"languageID,omitempty"` + Version int `json:"version,omitempty"` + Text string `json:"text,omitempty"` +} diff --git a/command/analyzer/run/test/todo-checker/utils.go b/command/analyzer/run/test/todo-checker/utils.go new file mode 100644 index 000000000..c888fb64a --- /dev/null +++ b/command/analyzer/run/test/todo-checker/utils.go @@ -0,0 +1,80 @@ +package main + +import ( + "encoding/json" + "os" + "path" +) + +func createIssue(filePath string, lineNumber, _ int) { + vcsPath := path.Base(filePath) + actualLineNumber := lineNumber + 1 + + // issue := Diagnostic{ + // Code: "I001", + // Title: "Possible TODO comment found", + // Location: Location{ + // Path: vcsPath, + // Position: Position{ + // Begin: Coordinate{ + // Line: actualLineNumber, + // Column: column, + // }, + // End: Coordinate{ + // Line: actualLineNumber, + // }, + // }, + // }, + // } + + issue := Diagnostic{ + Code: "I001", + Message: "Found a TODO comment", + Range: Range{ + Start: Position{ + Line: actualLineNumber, + }, + End: Position{ + Line: actualLineNumber, + }, + }, + RelatedInformation: []DiagnosticRelatedInformation{ + { + Location: Location{ + URI: vcsPath, + Range: Range{ + Start: Position{ + Line: actualLineNumber, + }, + End: Position{ + Line: actualLineNumber, + }, + }, + }, + Message: "Found a TODO comment", + }, + }, + } + issues = append(issues, issue) +} + +func prepareResult() AnalysisResult { + result := AnalysisResult{} + result.Issues = issues + result.IsPassed = false + + if len(issues) > 0 { + result.IsPassed = true + } + + return result +} + +func writeMacroResult(result *AnalysisResult) error { + resultJSON, err := json.Marshal(result) + if err != nil { + return err + } + + return os.WriteFile(path.Join(toolboxPath, "analysis_results.json"), resultJSON, 0o777) +} diff --git a/command/analyzer/run/testdata/project1/.deepsource.toml b/command/analyzer/run/testdata/project1/.deepsource.toml new file mode 100644 index 000000000..e6ec67e52 --- /dev/null +++ b/command/analyzer/run/testdata/project1/.deepsource.toml @@ -0,0 +1,30 @@ +version = 1 + +exclude_patterns = ["bind.*", "unsafe_*.*"] + +test_patterns = ["*_test.go"] + +[[analyzers]] +name = "go" +enabled = true + + [analyzers.meta] + import_paths = ["github.com/deepsourcelabs/demo-go"] + +[[analyzers]] +name = "docker" +enabled = true + + [analyzers.meta] + dockerfile_paths = [ + "./env/Dockerfile_dev", + "./env/Dockerfile_prod" + ] + +[[transformers]] +name = "gofmt" +enabled = true + +[[analyzers]] +name = "secrets" +enabled = true diff --git a/command/analyzer/run/testdata/project1/.gitignore b/command/analyzer/run/testdata/project1/.gitignore new file mode 100644 index 000000000..f80df8ddc --- /dev/null +++ b/command/analyzer/run/testdata/project1/.gitignore @@ -0,0 +1 @@ +demo-go diff --git a/command/analyzer/run/testdata/project1/README.md b/command/analyzer/run/testdata/project1/README.md new file mode 100644 index 000000000..80eb7283d --- /dev/null +++ b/command/analyzer/run/testdata/project1/README.md @@ -0,0 +1,31 @@ +

+ +

+ +

+ Documentation | + Get Started | + Discuss +

+ +

+ DeepSource helps you ship good quality code. +

+ +

+ +--- + +# Demo repository - Go + +This repository demonstrates sample issues in Go code raised by DeepSource. + +[![DeepSource](https://deepsource.io/gh/deepsourcelabs/demo-go.svg/?label=active+issues&show_trend=true)](https://deepsource.io/gh/deepsourcelabs/demo-go/?ref=repository-badge) + +### Report + +[https://deepsource.io/gh/deepsourcelabs/demo-go/issues/](https://deepsource.io/gh/deepsourcelabs/demo-go/issues/) + +### Documentation + +[https://deepsource.io/docs/analyzer/go.html](https://deepsource.io/docs/analyzer/go.html) diff --git a/command/analyzer/run/testdata/project1/bind.go b/command/analyzer/run/testdata/project1/bind.go new file mode 100644 index 000000000..611cca390 --- /dev/null +++ b/command/analyzer/run/testdata/project1/bind.go @@ -0,0 +1,20 @@ +package main + +import ( + "log" + "net" + + "golang.org/x/crypto/ssh" +) + +func connect() { + l, err := net.Listen("tcp", "0.0.0.0:2000") + if err != nil { + log.Fatal(err) + } + defer l.Close() +} + +func sshConfigure() { + _ = ssh.InsecureIgnoreHostKey() +} diff --git a/command/analyzer/run/testdata/project1/cmd.go b/command/analyzer/run/testdata/project1/cmd.go new file mode 100644 index 000000000..495140b6a --- /dev/null +++ b/command/analyzer/run/testdata/project1/cmd.go @@ -0,0 +1,108 @@ +package main + +import ( + "bytes" + "io" + "io/ioutil" + "log" + "os" + "os/exec" + "strings" + "sync" + "time" +) + +func runCmd(command string, args []string, env []string, cmdDir string) (string, string, error) { + cmd := exec.Command(command, args...) + cmd.Dir = cmdDir + cmd.Env = os.Environ() + cmd.Env = append(cmd.Env, env...) + + var stdoutBuf, stderrBuf bytes.Buffer + stdoutIn, _ := cmd.StdoutPipe() + stderrIn, _ := cmd.StderrPipe() + + stdout := io.MultiWriter(os.Stdout, &stdoutBuf) + stderr := io.MultiWriter(os.Stderr, &stderrBuf) + + startTime := time.Now() + + err := cmd.Start() + if err != nil { + return string(stdoutBuf.Bytes()), string(stderrBuf.Bytes()), err + } + + log.Println("==> EXEC COMMAND " + command) + log.Println("-> ARGS: " + strings.Join(args[:], " ")) + log.Println("-> DIR: " + cmdDir) + log.Println("-> STDOUT/STDERR: ..") + + var wg sync.WaitGroup + wg.Add(1) + + go func() { + _, _ = io.Copy(stdout, stdoutIn) + wg.Done() + }() + + _, _ = io.Copy(stderr, stderrIn) + wg.Wait() + + err = cmd.Wait() + + if err != nil { + log.Println("-> ERROR: ", err.Error()) + if exitError, ok := err.(*exec.ExitError); ok { + log.Println("-> EXIT CODE: ", exitError.ExitCode()) + + log.Println("-> TIME TAKEN: ", time.Now().Sub(startTime)/time.Millisecond) + log.Println("==> END EXEC COMMAND " + command + "\n") + + return string(stdoutBuf.Bytes()), string(stderrBuf.Bytes()), err + } + } + + log.Println("-> TIME TAKEN: ", time.Now().Sub(startTime)/time.Millisecond) + log.Println("=> END EXEC COMMAND " + command + "\n") + + if bytes.Compare(stdoutBuf.Bytes(), stderrBuf.Bytes()) == 0 { + log.Println("Both stdout and stderr have same value") + } + + return string(stdoutBuf.Bytes()), string(stderrBuf.Bytes()), nil +} + +func ExampleOpenFile() { + f, err := os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE, 0755) + if err != nil { + log.Fatal(err) + } + + if err := f.Close(); err != nil { + log.Fatal(err) + } +} + +func createTempFile() { + tmpFile, _ := os.Create("emptyFile.txt") + log.Println(tmpFile) +} + +func ExampleTempFile() { + err := ioutil.WriteFile("/tmp/demo-go", []byte("deepsource-for-go"), 0644) + if err != nil { + panic(err) + } +} + +func ExampleCreate() { + f, _ := os.Create("exampe.txt") + f.Close() +} + +func EmptyPath(path string) bool { + if len(path) == 0 { + return true + } + return false +} diff --git a/command/analyzer/run/testdata/project1/code.go b/command/analyzer/run/testdata/project1/code.go new file mode 100644 index 000000000..ab19040f1 --- /dev/null +++ b/command/analyzer/run/testdata/project1/code.go @@ -0,0 +1,161 @@ +package main + +import ( + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "strings" +) + +type GenericInterface interface { + DeliversTo(string) bool +} + +type Address struct { + City string `json:"city"` + PostalCode string `json:"postal_code"` + FirstLine string `json:"first_line"` + SecondLine string `json:"second_line"` +} + +type Seller struct { + Name string `json:"name"` + Address Address `json:"address"` + IsVerified bool `json:"is_verified"` +} + +type Dealer struct { + Name string `json:"dealer_name"` + Address Address `json:"dealer_address"` + IsVerified bool `json:"dealer_is_verified"` +} + +func PromoteSellerToDealer(seller Seller) Dealer { + dealer := Dealer{ + Name: seller.Name, + Address: seller.Address, + IsVerified: seller.IsVerified, + } + return dealer +} + +func (seller Seller) DeliversTo(city string) bool { + return city == seller.Address.City +} + +func HasAnySellersFromCity(sellers []Seller, city string) { + city = city + + for i := range sellers { + if sellers[i].Address.City == city { + fmt.Printf("Found seller %s in %s city", sellers[i].Name, city) + } + if sellers[i].IsVerified == true { + fmt.Printf("This seller is verified\n") + } + deliveryPostalRange := "5600" + if strings.Index(sellers[i].Address.PostalCode, deliveryPostalRange) != -1 { + fmt.Printf("This seller does not deliver to the given postal code range") + } + break + } + + allSellers := make([]Seller, len(sellers)) + + if allSellers != nil && len(allSellers) == 0 { + fmt.Println("allSellers is empty") + } + + for i, x := range sellers { + allSellers[i] = x + } + + combinedSellers := []Seller{} + + for _, x := range allSellers { + combinedSellers = append(sellers, x) + } + for _, x := range combinedSellers { + fmt.Println(x) + } +} + +type Product struct { + Name string `json:"name"` + Price int `json:"price"` + Description string `json:"description"` + Seller Seller `json:"seller"` +} + +func (product Product) DeliversTo(city string) bool { + delivers := product.Seller.DeliversTo(city) + if delivers { + return true + } else { + return false + } +} + +func NewProduct(name string, price int, description string, seller Seller) Product { + return Product{ + Name: name, + Price: price, + Description: description, + Seller: seller, + } +} + +func (product Product) Update(updatedProduct Product) { + product.Name = updatedProduct.Name + product.Price = updatedProduct.Price + product.Description = updatedProduct.Description + product.Seller = updatedProduct.Seller +} + +func LoadProducts(jsonPath string) ([]Product, error) { + productBytes, err := ioutil.ReadFile(jsonPath) + products := []Product{} + err = json.Unmarshal(productBytes, &products) + + if nil != err { + fmt.Println(err) + return products, err + } + + return products, nil +} + +func WriteProducts(productsSold []Product, productsLeft []Product, jsonPath string) error { + allProducts := []Product{} + + for _, product := range productsSold { + allProducts = append(allProducts, product) + } + + for i := range productsLeft { + productsLeft = append(allProducts, productsLeft[i]) + } + + fmt.Println(allProducts[:]) + + if len(allProducts) == 0 { + return errors.New(fmt.Sprintf("%d products found. This is an error.", len(allProducts))) + } + + return nil +} + +func traverseProducts() { + var Products [2048]byte + for _, product := range Products { + fmt.Println(product) + } + + for index := 0; index < len(Products); index++ { + productMap := make([][1024]byte, index) + for product, productIndex := range productMap { + fmt.Println(product, "indexed as", productIndex) + } + } +} diff --git a/command/analyzer/run/testdata/project1/go.mod b/command/analyzer/run/testdata/project1/go.mod new file mode 100644 index 000000000..ce0e09eaf --- /dev/null +++ b/command/analyzer/run/testdata/project1/go.mod @@ -0,0 +1,5 @@ +module github.com/deepsourcelabs/demo-go + +go 1.13 + +require golang.org/x/crypto v0.0.0-20201116153603-4be66e5b6582 diff --git a/command/analyzer/run/testdata/project1/go.sum b/command/analyzer/run/testdata/project1/go.sum new file mode 100644 index 000000000..caf21c9dd --- /dev/null +++ b/command/analyzer/run/testdata/project1/go.sum @@ -0,0 +1,10 @@ +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20201116153603-4be66e5b6582 h1:0WDrJ1E7UolDk1KhTXxxw3Fc8qtk5x7dHP431KHEJls= +golang.org/x/crypto v0.0.0-20201116153603-4be66e5b6582/go.mod h1:tCqSYrHVcf3i63Co2FzBkTCo2gdF6Zak62921dSfraU= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201113234701-d7a72108b828 h1:htWEtQEuEVJ4tU/Ngx7Cd/4Q7e3A5Up1owgyBtVsTwk= +golang.org/x/term v0.0.0-20201113234701-d7a72108b828/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/command/analyzer/run/testdata/project1/hex_example.go b/command/analyzer/run/testdata/project1/hex_example.go new file mode 100644 index 000000000..a637bcdf0 --- /dev/null +++ b/command/analyzer/run/testdata/project1/hex_example.go @@ -0,0 +1,9 @@ +package main + +func HexLiteral() bool { + x := 0xFff + y := 0xFFF + z := 0xfff + + return (x == y) && (y == z) +} diff --git a/command/analyzer/run/testdata/project1/html.go b/command/analyzer/run/testdata/project1/html.go new file mode 100644 index 000000000..1ee059d54 --- /dev/null +++ b/command/analyzer/run/testdata/project1/html.go @@ -0,0 +1,18 @@ +package main + +import ( + "html/template" + "os" +) + +const tmpl = "" + +func badHTMLTemplate() { + a := "something from another place" + t := template.Must(template.New("ex").Parse(tmpl)) + v := map[string]interface{}{ + "Title": "Test World", + "Body": template.HTML(a), + } + t.Execute(os.Stdout, v) +} diff --git a/command/analyzer/run/testdata/project1/main.go b/command/analyzer/run/testdata/project1/main.go new file mode 100644 index 000000000..da032eacc --- /dev/null +++ b/command/analyzer/run/testdata/project1/main.go @@ -0,0 +1,36 @@ +package main + +import "fmt" + +const ( + productPath string = "/tmp/products.json" + sellerPath string = "/tmp/sellers.json" +) + +func main() { + s := Seller{ + Name: "SomeSeller", + Address: Address{ + City: "Gotham", + }, + } + var i GenericInterface + i = &s + + givenCity := "Gotham" + + switch i.(type) { + case interface{}: + fmt.Println("What to do") + case Product: + fmt.Println(i.(Product).DeliversTo(givenCity)) + case Seller: + fmt.Println(i.(Seller).DeliversTo(givenCity)) + } +} + +func appendData() { + var s []string + s = append(s, productPath) + s = append(s, sellerPath) +} diff --git a/command/analyzer/run/testdata/project1/sync_example.go b/command/analyzer/run/testdata/project1/sync_example.go new file mode 100644 index 000000000..e19d3e168 --- /dev/null +++ b/command/analyzer/run/testdata/project1/sync_example.go @@ -0,0 +1,24 @@ +package main + +import ( + "sync" + "testing" +) + +var dataLarge []byte + +const size = 64 * 1024 // 65536 + +func benchmarkLargeSizePool(b *testing.B) { + bytePool := sync.Pool{ + New: func() interface{} { + b := make([]byte, size) + return b + }, + } + for i := 0; i < b.N; i++ { + dataLarge = bytePool.Get().([]byte) + _ = dataLarge + bytePool.Put(dataLarge) + } +} diff --git a/command/analyzer/run/testdata/project1/unsafe_example.go b/command/analyzer/run/testdata/project1/unsafe_example.go new file mode 100644 index 000000000..71b02463e --- /dev/null +++ b/command/analyzer/run/testdata/project1/unsafe_example.go @@ -0,0 +1,22 @@ +package main + +import ( + "fmt" + "unsafe" +) + +type Fake struct{} + +func (Fake) Good() {} + +func unsafeCode() { + unsafeM := Fake{} + unsafeM.Good() + intArray := [...]int{1, 2} + fmt.Printf("\nintArray: %v\n", intArray) + intPtr := &intArray[0] + fmt.Printf("\nintPtr=%p, *intPtr=%d.\n", intPtr, *intPtr) + addressHolder := uintptr(unsafe.Pointer(intPtr)) + unsafe.Sizeof(intArray[0]) + intPtr = (*int)(unsafe.Pointer(addressHolder)) + fmt.Printf("\nintPtr=%p, *intPtr=%d.\n\n", intPtr, *intPtr) +} diff --git a/command/analyzer/run/testdata/project1/unsafe_header.go b/command/analyzer/run/testdata/project1/unsafe_header.go new file mode 100644 index 000000000..7ebf79799 --- /dev/null +++ b/command/analyzer/run/testdata/project1/unsafe_header.go @@ -0,0 +1,18 @@ +package main + +import "net/http" + +func exposeHeader(url string) error { + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return err + } + req.Header.Set("Server", "Apache/2.4.1 (Unix)") + + _, err = http.DefaultClient.Do(req) + if err != nil { + return err + } + + return nil +} diff --git a/command/analyzer/run/testdata/project1/weak_crypto.go b/command/analyzer/run/testdata/project1/weak_crypto.go new file mode 100644 index 000000000..327394272 --- /dev/null +++ b/command/analyzer/run/testdata/project1/weak_crypto.go @@ -0,0 +1,24 @@ +package main + +import ( + "crypto/md5" + "crypto/rand" + "crypto/rsa" + "fmt" + "os" +) + +func makeMD5Hash() { + for _, arg := range os.Args { + fmt.Printf("%x - %s\n", md5.Sum([]byte(arg)), arg) + } +} + +func generateRSAKey() { + // Generate Private Key + pvk, err := rsa.GenerateKey(rand.Reader, 1024) + if err != nil { + fmt.Println(err) + } + fmt.Println(pvk) +} diff --git a/command/analyzer/run/testdata/project2/.deepsource.toml b/command/analyzer/run/testdata/project2/.deepsource.toml new file mode 100644 index 000000000..218067597 --- /dev/null +++ b/command/analyzer/run/testdata/project2/.deepsource.toml @@ -0,0 +1,9 @@ +version = 1 + +[[analyzers]] +name = "ruby" +enabled = true + +[[analyzers]] +name = "secrets" +enabled = true diff --git a/command/analyzer/run/testdata/project2/.rubocop.yml b/command/analyzer/run/testdata/project2/.rubocop.yml new file mode 100644 index 000000000..48a6a58a8 --- /dev/null +++ b/command/analyzer/run/testdata/project2/.rubocop.yml @@ -0,0 +1,2 @@ +require: + - rubocop-performance diff --git a/command/analyzer/run/testdata/project2/README.md b/command/analyzer/run/testdata/project2/README.md new file mode 100644 index 000000000..bc14dbea3 --- /dev/null +++ b/command/analyzer/run/testdata/project2/README.md @@ -0,0 +1,31 @@ +

+ +

+ +

+ Documentation | + Get Started | + Discuss +

+ +

+ DeepSource helps you ship good quality code. +

+ +

+ +--- + +# Demo repository - Ruby + +This repository demonstrates sample issues in Ruby code raised by DeepSource. + +[![DeepSource](https://deepsource.io/gh/deepsourcelabs/demo-ruby.svg/?label=active+issues&show_trend=true&token=GUiSpAVeA3v_yYb35jVt0I1V)](https://deepsource.io/gh/deepsourcelabs/demo-ruby/?ref=repository-badge) + +### Report + +[https://deepsource.io/gh/deepsourcelabs/demo-ruby/issues/](https://deepsource.io/gh/deepsourcelabs/demo-ruby/issues/) + +### Documentation + +[https://deepsource.io/docs/analyzer/ruby.html](https://deepsource.io/docs/analyzer/ruby.html) diff --git a/command/analyzer/run/testdata/project2/code.rb b/command/analyzer/run/testdata/project2/code.rb new file mode 100644 index 000000000..462b54762 --- /dev/null +++ b/command/analyzer/run/testdata/project2/code.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +# Raises "bad ordering of magic comments" +# frozen_string_literal: true +# encoding: ascii + +# Raises "use of deprecated BigDecimal.new" +a = { 'hello' => 'world', 'testing' => BigDecimal.new(123.456, 3) } + +# Raises "`while`/`until` detected in `begin` block" +begin + do_something +end while a == b + +# Raises "multiple comparison detected" +x < y < z +10 <= x <= 20 + +# Raises "empty rescue block detected" +begin + bar +rescue +end + +# Raises "redundant `else`-clause detected" +if bar +else +end + +# Raises "unused method arguments detected" +def some_method(bar) + puts 'Hello' +end + +# Raises "unreachable code detected" +def some_method + return + do_something +end + +# Raises "top level return with argument detected" +return 1 + +# Raises "duplicate elsif block detected" +if x == 1 + do_something +elsif x == 1 + do_something_else +end + +# Raises "Deprecated way of initializing OpenSSL::Cipher and OpenSSL::Digest" +OpenSSL::Cipher::AES.new(128, :GCM) + +# Raises "put empty method definitions on a single line" +# Also raises "multiple methods with same name in the same scope" as we have a +# method with same name above +def some_method +end + +# Raises "Invalid annotation keyword format detected" +def foo + # TODO Replace this with bar + do_something +end + +# Raises "Use `Range#cover?` instead of `Range#include?`" +(1..9).include?(5) + +my_hash = {} +# Raises "Hash merging can be replaced by hash key assignment" +my_hash.merge!('key': value) + + +# Raises "Use `size` instead of `count`" +[1, 2, 3].count diff --git a/command/analyzer/run/testdata/project3/.deepsource.toml b/command/analyzer/run/testdata/project3/.deepsource.toml new file mode 100644 index 000000000..066c4f06a --- /dev/null +++ b/command/analyzer/run/testdata/project3/.deepsource.toml @@ -0,0 +1,9 @@ +version = 1 + +[[analyzers]] +name = "secrets" +enabled = true + +[[analyzers]] +name = "rust" +enabled = true diff --git a/command/analyzer/run/testdata/project3/.gitignore b/command/analyzer/run/testdata/project3/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/command/analyzer/run/testdata/project3/.gitignore @@ -0,0 +1 @@ +/target diff --git a/command/analyzer/run/testdata/project3/Cargo.lock b/command/analyzer/run/testdata/project3/Cargo.lock new file mode 100644 index 000000000..0d6ba6390 --- /dev/null +++ b/command/analyzer/run/testdata/project3/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "demo-rust" +version = "0.1.0" diff --git a/command/analyzer/run/testdata/project3/Cargo.toml b/command/analyzer/run/testdata/project3/Cargo.toml new file mode 100644 index 000000000..a2eccfc63 --- /dev/null +++ b/command/analyzer/run/testdata/project3/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "demo-rust" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/command/analyzer/run/testdata/project3/README.md b/command/analyzer/run/testdata/project3/README.md new file mode 100644 index 000000000..6f4d6b7f5 --- /dev/null +++ b/command/analyzer/run/testdata/project3/README.md @@ -0,0 +1,29 @@ +

+ +

+ +

+ Documentation | + Get Started | + Discuss +

+ +

+ DeepSource helps you ship good quality code. +

+ +--- + +# Demo repository - Rust + +This repository demonstrates sample issues in Rust code raised by DeepSource. + +[![DeepSource](https://deepsource.io/gh/deepsourcelabs/demo-rust.svg/?label=active+issues&show_trend=true&token=altPfxyH5fAdAyqUZ7zDX7dx)](https://deepsource.io/gh/deepsourcelabs/demo-rust/?ref=repository-badge) + +### Report + +[https://deepsource.io/gh/deepsourcelabs/demo-rust/issues/](https://deepsource.io/gh/deepsourcelabs/demo-rust/issues/) + +### Documentation + +[https://deepsource.io/docs/analyzer/rust.html](https://deepsource.io/docs/analyzer/rust.html) diff --git a/command/analyzer/run/testdata/project3/src/main.rs b/command/analyzer/run/testdata/project3/src/main.rs new file mode 100644 index 000000000..8fd502149 --- /dev/null +++ b/command/analyzer/run/testdata/project3/src/main.rs @@ -0,0 +1,101 @@ +//! A two player tic-tac-toe game to showcase some of +//! the issues caught by DeepSource's Rust analyzer + +use std::{convert::identity as id, {fmt}}; + +#[derive(Debug, PartialEq, Copy, Clone)] +enum Player { + PlayerX, + PlayerO, + EmptyPlayer, +} + +impl fmt::Display for Player { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::PlayerX => write!(f, "X"), + Self::PlayerO => write!(f, "O"), + Self::EmptyPlayer => write!(f, "E"), + } + } +} + +#[derive(Debug, PartialEq)] +struct Board { + cells: [[Player; 3]; 3], +} + +impl fmt::Display for Board { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + for row in &self.cells { + for col in row { + write!(f, " {} ", col)?; + } + write!(f, "\n")?; + } + Ok(()) + } +} + +impl Board { + pub fn new() -> Self { + let cells = [[Player::EmptyPlayer; 03]; 03]; + Self { cells } + } + + #[must_use] + pub fn update_state(&mut self, player: Player, position: usize) { + let position = position - 1; + let (x, y) = (position / 3, position % 3); + self.cells[x][y] = player; + } + + pub fn get_state(&self, position: usize) -> Player { + let position = position - 1; + let (x, y) = (position / 3, position % 3); + self.cells[x][y] + } + + pub fn is_winner(&self, target: Player) -> bool { + let rows = [[1, 2, 3], [4, 5, 6], [7, 8, 9]].iter(); + let columns = [[1, 4, 7], [2, 5, 8], [3, 6, 9]].iter(); + let diags = [[1, 5, 9], [3, 5, 7]].iter(); + + rows.chain(columns) + .chain(diags) + .map(|triple| { + triple + .iter() + .map(|&i| self.get_state(i)) + .fold(true, |acc, x| acc && x == target) + }) + .any(id) + } +} + +fn main() { + let mut board = Board::new(); + + // a sample tic-tac-toe game run + // O|O|O + // X|O|E + // X|E|X + board.update_state(Player::PlayerO, 5); + board.update_state(Player::PlayerX, 4); + board.update_state(Player::PlayerO, 3); + board.update_state(Player::PlayerX, 7); + board.update_state(Player::PlayerO, 1); + board.update_state(Player::PlayerX, 9); + board.update_state(Player::PlayerO, 2); + + println!("{}", board); + + let winner = if board.is_winner(Player::PlayerO) { + "O" + } else if !board.is_winner(Player::PlayerX) { + "Draw" + } else { + "X" + }; + println!("Winner: {}", winner); +} diff --git a/command/analyzer/run/testdata/project4/.deepsource.toml b/command/analyzer/run/testdata/project4/.deepsource.toml new file mode 100644 index 000000000..a0c44f91e --- /dev/null +++ b/command/analyzer/run/testdata/project4/.deepsource.toml @@ -0,0 +1,21 @@ +version = 1 + +[[analyzers]] +name = "python" +enabled = true + + [analyzers.meta] + runtime_version = "3.x.x" + type_checker = "mypy" + +[[transformers]] +name = "black" +enabled = true + +[[analyzers]] +name = "test-coverage" +enabled = true + +[[analyzers]] +name = "secrets" +enabled = true diff --git a/command/analyzer/run/testdata/project4/.github/workflows/CI.yml b/command/analyzer/run/testdata/project4/.github/workflows/CI.yml new file mode 100644 index 000000000..f6151ad26 --- /dev/null +++ b/command/analyzer/run/testdata/project4/.github/workflows/CI.yml @@ -0,0 +1,36 @@ +name: CI + +on: + pull_request: + push: + branches: + - master + +jobs: + run-tests: + runs-on: [ubuntu-latest] + + env: + DEEPSOURCE_DSN: ${{ secrets.DEEPSOURCE_DSN }} + + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + fetch-depth: 1 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Set up python3.9 + uses: actions/setup-python@v2 + with: + python-version: '3.9' + + - name: Run tests + run: | + pip install pytest-cov django + pytest --cov=./ --cov-report=xml + + - name: Report test coverage to DeepSource + run: | + curl https://deepsource.io/cli | sh + ./bin/deepsource report --analyzer test-coverage --key python --value-file ./coverage.xml diff --git a/command/analyzer/run/testdata/project4/.gitignore b/command/analyzer/run/testdata/project4/.gitignore new file mode 100644 index 000000000..f71748641 --- /dev/null +++ b/command/analyzer/run/testdata/project4/.gitignore @@ -0,0 +1,125 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/command/analyzer/run/testdata/project4/Pipfile b/command/analyzer/run/testdata/project4/Pipfile new file mode 100644 index 000000000..b5846df18 --- /dev/null +++ b/command/analyzer/run/testdata/project4/Pipfile @@ -0,0 +1,11 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] + +[requires] +python_version = "3.8" diff --git a/command/analyzer/run/testdata/project4/README.md b/command/analyzer/run/testdata/project4/README.md new file mode 100644 index 000000000..51bf367cc --- /dev/null +++ b/command/analyzer/run/testdata/project4/README.md @@ -0,0 +1,31 @@ +

+ +

+ +

+ Documentation | + Get Started | + Discuss +

+ +

+ DeepSource helps you ship good quality code. +

+ +

+ +--- + +# Demo repository - Python + +This repository demonstrates sample issues in Python code raised by DeepSource. + +[![DeepSource](https://deepsource.io/gh/deepsourcelabs/demo-python.svg/?label=active+issues&show_trend=true)](https://deepsource.io/gh/deepsourcelabs/demo-python/?ref=repository-badge) + +### Report + +[https://deepsource.io/gh/deepsourcelabs/demo-python/issues/](https://deepsource.io/gh/deepsourcelabs/demo-python/issues/) + +### Documentation + +[https://deepsource.io/docs/analyzer/python.html](https://deepsource.io/docs/analyzer/python.html) diff --git a/command/analyzer/run/testdata/project4/assignment.py b/command/analyzer/run/testdata/project4/assignment.py new file mode 100644 index 000000000..f401a7daf --- /dev/null +++ b/command/analyzer/run/testdata/project4/assignment.py @@ -0,0 +1,3 @@ +*FIRST = [1, 2, 3] +(*FIRST,) = [1, 2, 3] +*FIRST, a, b = [1, 2, 3] diff --git a/command/analyzer/run/testdata/project4/demo_code.py b/command/analyzer/run/testdata/project4/demo_code.py new file mode 100644 index 000000000..68313e68b --- /dev/null +++ b/command/analyzer/run/testdata/project4/demo_code.py @@ -0,0 +1,141 @@ +import random +import pdb +import sys as sys +import os +import subprocess +import ssl + + +# from django.db.models.expressions import RawSQL + +AWS_SECRET_KEY = "d6s$f9g!j8mg7hw?n&2" + +class BaseNumberGenerator: + """Declare a method -- `get_number`.""" + + def __init__(self): + self.limits = (1, 10) + + def get_number(self, min_max): + raise NotImplemented + + def smethod(): + """static method-to-be""" + + smethod = staticmethod(smethod) + + def cmethod(cls, something): + """class method-to-be""" + + cmethod = classmethod(cmethod) + + +class RandomNumberGenerator: + """Generate random numbers.""" + + def limits(self): + return self.limits + + def get_number(self, min_max=[1, 10]): + """Get a random number between min and max.""" + assert all([isinstance(i, int) for i in min_max]) + return random.randint(*min_max) + + +class ImaginaryNumber: + """Class to represent an imaginary number.""" + def __init__(self): + self.real = 0 + self.imaginary = 1 + + def __getattr__(self, key): + return key + + +def main(options: dict = {}) -> str: + pdb.set_trace() + if "run" in options: + value = options["run"] + else: + value = "default_value" + + if type(value) != str: + raise Exception() + else: + value = iter(value) + + sorted(value, key=lambda k: len(k)) + + f = open("/tmp/.deepsource.toml", "r") + f.write("config file.") + f.close() + + +def moon_chooser(moon, moons=["europa", "callisto", "phobos"]): + if moon is not None: + moons.append(moon) + + return random.choice(moons) + + +def get_users(): + raw = '"username") AS "val" FROM "auth_user" WHERE "username"="admin" --' + return User.objects.annotate(val=RawSQL(raw, [])) + + +def tar_something(): + context = ssl._create_stdlib_context() + os.tempnam("dir1") + subprocess.Popen("/bin/chown *", shell=True) + o.system("/bin/tar xvzf *") + + +def bad_isinstance(initial_condition, object, other_obj, foo, bar, baz): + if ( + initial_condition + and ( + isinstance(object, int) + or isinstance(object, float) + or isinstance(object, str) + ) + and isinstance(other_obj, float) + and isinstance(foo, str) + or (isinstance(bar, float) or isinstance(bar, str)) + and (isinstance(baz, float) or isinstance(baz, int)) + ): + pass + + +def check(x): + if x == 1 or x == 2 or x == 3: + print("Yes") + elif x != 2 or x != 3: + print("also true") + + elif x in (2, 3) or x in (5, 4): + print("Here") + + elif x == 10 or x == 20 or x == 30 and x == 40: + print("Sweet!") + + elif x == 10 or x == 20 or x == 30: + print("Why even?") + + +def chained_comparison(): + a = 1 + b = 2 + c = 3 + return a < b and b < c + +def wrong_callable(): + number = ImaginaryNumber() + if hasattr(number, '__call__'): + return number() + +if __name__ == "__main__": + args = ["--disable", "all"] + for i in range(len(args)): + has_truthy = True if args[i] else False + if has_truthy: + break diff --git a/command/analyzer/run/testdata/project4/django_issues.py b/command/analyzer/run/testdata/project4/django_issues.py new file mode 100644 index 000000000..a0d19177b --- /dev/null +++ b/command/analyzer/run/testdata/project4/django_issues.py @@ -0,0 +1,10 @@ +import datetime + +from django.http import HttpResponse +from django.views.decorators.http import require_http_methods + +@require_http_methods(["GET", "POST"]) # Sensitive +def current_datetime(request): + now = datetime.datetime.now() + html = "It is %s." % now + return HttpResponse(html) diff --git a/command/analyzer/run/testdata/project4/duplicate_bases_class.py b/command/analyzer/run/testdata/project4/duplicate_bases_class.py new file mode 100644 index 000000000..ad1dfe8bc --- /dev/null +++ b/command/analyzer/run/testdata/project4/duplicate_bases_class.py @@ -0,0 +1,19 @@ +import abc + + +class Base: + def __init__(self): + self.base = 1 + + +class BaseOne: + def __init__(self): + self.base_one = 2 + + +class Child(Base, BaseOne, Base, BaseOne): + """Some Child class""" + + +class ChildOne(Base, BaseOne, Base, BaseOne, abc.ABC, abc.ABCMeta, abc.ABCMeta): + """Class with duplicate bases""" diff --git a/command/analyzer/run/testdata/project4/miscellaneous.py b/command/analyzer/run/testdata/project4/miscellaneous.py new file mode 100644 index 000000000..a3b4fa7e6 --- /dev/null +++ b/command/analyzer/run/testdata/project4/miscellaneous.py @@ -0,0 +1,23 @@ +from utils import get_next, render_to_frontend, render_bg + +class Orange: + """Represents the fruit orange.""" + orange = "#FFA500" + + # Other class implementations + + def get_orange(self): + return self.orange + +def render(): + fruit = Orange() + render_to_frontend(fruit.orange) # Rendering a color, but one can get confused with the fruit + render_bg(fruit.get_orange) + +def play_with_magic_numbers(): + magic_numbers = {0, 1, 1, 2, 3, 5} + + for elem in magic_numbers: + magic_numbers.add(get_next(elem)) + return magic_numbers + diff --git a/command/analyzer/run/testdata/project4/return_not_implemented.py b/command/analyzer/run/testdata/project4/return_not_implemented.py new file mode 100644 index 000000000..c9d7e580b --- /dev/null +++ b/command/analyzer/run/testdata/project4/return_not_implemented.py @@ -0,0 +1,25 @@ +class RealNumber: + """Represents a real number.""" + def __init__(self, val): + self.val = val + + def __add__(self, other): + raise NotImplementedError + +class ComplexNumber: + """Represents an imaginary number.""" + def __init__(self, x, y): + self.x = x + self.y = y + + def __add__(self, other): + return self.val + other.val + + def __radd__(self, other): + res = (self.x + other.val, self.y) + return res + +if __name__ == "__main__": + complex_num = ComplexNumber(2, 5) + real_num = RealNumber(32) + return real_num + complex_num diff --git a/command/analyzer/run/testdata/project4/security.py b/command/analyzer/run/testdata/project4/security.py new file mode 100644 index 000000000..1916df298 --- /dev/null +++ b/command/analyzer/run/testdata/project4/security.py @@ -0,0 +1,32 @@ +import sqlite3 +import requests + +class ResidentsDb: + def __init__(self, table_name, mapping_function, duration): + """Set location on disk data cache will reside. + Also sets the table name and refresh duration + """ + self.table_name = table_name + self.mapping_function = mapping_function + self.disk_location = DISK_LOCATION_DEFAULT + self.duration = duration + self.conn = None + self.cursor = None + + def open(self): + """ Opens connection to sqlite database.""" + self.conn = sqlite3.connect(self.dbname) + self.cursor = self.conn.cursor() + + def get_id_from_name(self, name): + """Get id of resident from name.""" + data = self.cursor.execute("SELECT id FROM userdata WHERE Name ={};".format(name)) + self.conn.commit() + return data + +def fetch_version(request): + """Fetch verison of bgmi.""" + version = requests.get( + "https://pypi.python.org/pypi/bgmi/json", verify=False + ).json()["info"]["version"] + return version diff --git a/command/analyzer/run/testdata/project4/tests/__init__.py b/command/analyzer/run/testdata/project4/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/command/analyzer/run/testdata/project4/tests/test_code.py b/command/analyzer/run/testdata/project4/tests/test_code.py new file mode 100644 index 000000000..159c78dfb --- /dev/null +++ b/command/analyzer/run/testdata/project4/tests/test_code.py @@ -0,0 +1,11 @@ +import unittest +from demo_code import RandomNumberGenerator + + +def test_random_number_generator(): + """Test random number generator.""" + assert RandomNumberGenerator().get_number() + +class Tests(unittest.TestCase): + def my_test(self, arg1, arg2): + self.assertEquals(arg1, arg2) diff --git a/command/analyzer/run/testdata/project4/type_checks.py b/command/analyzer/run/testdata/project4/type_checks.py new file mode 100644 index 000000000..811da988f --- /dev/null +++ b/command/analyzer/run/testdata/project4/type_checks.py @@ -0,0 +1,7 @@ +def greet_all(names: list[str]) -> None: + for name in names: + print('Hello ' + name) + +if __name__ == "__main__": + heights = [5.5, 6, 5.9] + greet_all(heights) diff --git a/command/analyzer/run/testdata/toolbox/project1/analysis_config.json b/command/analyzer/run/testdata/toolbox/project1/analysis_config.json new file mode 100644 index 000000000..c40f9464f --- /dev/null +++ b/command/analyzer/run/testdata/toolbox/project1/analysis_config.json @@ -0,0 +1 @@ +{"files":[{"uri":"/code/.deepsource.toml"},{"uri":"/code/README.md"},{"uri":"/code/cmd.go"},{"uri":"/code/code.go"},{"uri":"/code/go.mod"},{"uri":"/code/go.sum"},{"uri":"/code/hex_example.go"},{"uri":"/code/html.go"},{"uri":"/code/main.go"},{"uri":"/code/sync_example.go"},{"uri":"/code/weak_crypto.go"}],"test_files":null,"excluded_files":[{"uri":"/code/bind.go"},{"uri":"/code/unsafe_example.go"},{"uri":"/code/unsafe_header.go"}],"exclude_patterns":["bind.*","unsafe_*.*"],"test_patterns":["*_test.go"],"analyzer_meta":null} \ No newline at end of file diff --git a/command/analyzer/run/testdata/toolbox/project2/analysis_config.json b/command/analyzer/run/testdata/toolbox/project2/analysis_config.json new file mode 100644 index 000000000..b0b854359 --- /dev/null +++ b/command/analyzer/run/testdata/toolbox/project2/analysis_config.json @@ -0,0 +1 @@ +{"files":[{"uri":"/code/.deepsource.toml"},{"uri":"/code/.rubocop.yml"},{"uri":"/code/README.md"},{"uri":"/code/code.rb"}],"test_files":null,"excluded_files":null,"exclude_patterns":null,"test_patterns":null,"analyzer_meta":null} \ No newline at end of file diff --git a/command/analyzer/run/testdata/toolbox/project3/analysis_config.json b/command/analyzer/run/testdata/toolbox/project3/analysis_config.json new file mode 100644 index 000000000..5fe311ffe --- /dev/null +++ b/command/analyzer/run/testdata/toolbox/project3/analysis_config.json @@ -0,0 +1 @@ +{"files":[{"uri":"/code/.deepsource.toml"},{"uri":"/code/Cargo.lock"},{"uri":"/code/Cargo.toml"},{"uri":"/code/README.md"},{"uri":"/code/src/main.rs"}],"test_files":null,"excluded_files":null,"exclude_patterns":null,"test_patterns":null,"analyzer_meta":null} \ No newline at end of file diff --git a/command/analyzer/run/testdata/toolbox/project4/analysis_config.json b/command/analyzer/run/testdata/toolbox/project4/analysis_config.json new file mode 100644 index 000000000..8d917402d --- /dev/null +++ b/command/analyzer/run/testdata/toolbox/project4/analysis_config.json @@ -0,0 +1 @@ +{"files":[{"uri":"/code/.deepsource.toml"},{"uri":"/code/Pipfile"},{"uri":"/code/README.md"},{"uri":"/code/assignment.py"},{"uri":"/code/demo_code.py"},{"uri":"/code/django_issues.py"},{"uri":"/code/duplicate_bases_class.py"},{"uri":"/code/miscellaneous.py"},{"uri":"/code/return_not_implemented.py"},{"uri":"/code/security.py"},{"uri":"/code/tests/__init__.py"},{"uri":"/code/tests/test_code.py"},{"uri":"/code/type_checks.py"}],"test_files":null,"excluded_files":null,"exclude_patterns":null,"test_patterns":null,"analyzer_meta":null} \ No newline at end of file diff --git a/command/analyzer/run/types.go b/command/analyzer/run/types.go new file mode 100644 index 000000000..8523d4cc3 --- /dev/null +++ b/command/analyzer/run/types.go @@ -0,0 +1,10 @@ +package run + +type AnalysisConfig struct { + Files []string `json:"files"` + ExcludePatterns []string `json:"exclude_patterns"` + ExcludeFiles []string `json:"exclude_files"` + TestFiles []string `json:"test_files"` + TestPatterns []string `json:"test_patterns"` + AnalyzerMeta interface{} `json:"analyzer_meta"` +} diff --git a/command/analyzer/run/utils.go b/command/analyzer/run/utils.go new file mode 100644 index 000000000..e6211c4fb --- /dev/null +++ b/command/analyzer/run/utils.go @@ -0,0 +1,85 @@ +package run + +import ( + "net/url" + "os" + "path" + "strings" + + analysis "github.com/deepsourcelabs/cli/analysis/config" + "github.com/deepsourcelabs/cli/analysis/lsp" +) + +// isValidUrl tests a string to determine if it is a well-structured url or not. +func isValidUrl(toTest string) bool { + _, err := url.ParseRequestURI(toTest) + if err != nil { + return false + } + + u, err := url.Parse(toTest) + if err != nil || u.Scheme == "" || u.Host == "" { + return false + } + + return true +} + +// Modify the filepaths to use the container CODE_PATH and not the local CODE_PATH +// since the file will be mounted on the container and there, the container's path would +// only be resolvable +func modifyAnalysisConfigFilepaths(analysisConfig *analysis.AnalysisConfig, localCodePath, containerCodePath string) { + for idx, file := range analysisConfig.Files { + filePath := strings.TrimPrefix(string(file.URI), localCodePath) + analysisConfig.Files[idx].URI = lsp.DocumentURI(path.Join(containerCodePath, filePath)) + } + + for idx, file := range analysisConfig.TestFiles { + filePath := strings.TrimPrefix(string(file.URI), localCodePath) + analysisConfig.TestFiles[idx].URI = lsp.DocumentURI(path.Join(containerCodePath, filePath)) + } + + for idx, file := range analysisConfig.ExcludedFiles { + filePath := strings.TrimPrefix(string(file.URI), localCodePath) + analysisConfig.ExcludedFiles[idx].URI = lsp.DocumentURI(path.Join(containerCodePath, filePath)) + } +} + +// Creates a temporary directory with the name supplied as the parameter +func createTemporaryDirectory(directoryName string) (string, error) { + return os.MkdirTemp("", directoryName) +} + +/* Fetches environment variables like CODE_PATH and TOOLBOX_PATH set by the user + * Check if the user supplied CODE_PATH and TOOLBOX_PATH, if not + * use the default values of CODE_PATH and TOOLBOX_PATH */ +func fetchEnvironmentVariables() { + // Set the value of container's code path + if _, envVarPresent := os.LookupEnv("CODE_PATH"); envVarPresent { + containerCodePath = os.Getenv("CODE_PATH") + } else { + containerCodePath = "/code" + } + + // Set the value of container's toolbox path + if _, envVarPresent := os.LookupEnv("TOOLBOX_PATH"); envVarPresent { + containerToolBoxPath = os.Getenv("TOOLBOX_PATH") + } else { + containerToolBoxPath = "/toolbox" + } +} + +func (a *AnalyzerDryRun) createTemporaryToolBoxDir() (err error) { + if a.TempToolBoxDirectory == "" { + // Create a temporary directory + if a.TempToolBoxDirectory, err = createTemporaryDirectory("toolbox"); err != nil { + return err + } + } + + /* Assign the path of temporary local toolbox directory to the HostToolBoxPath(which shall be mounted into the container) + * and also use it to write the analysis_results.json file locally to the temporary */ + a.Client.AnalysisOpts.HostToolBoxPath = a.TempToolBoxDirectory + a.Client.AnalysisOpts.AnalysisResultsPath = a.TempToolBoxDirectory + return nil +} diff --git a/command/analyzer/verify/utils.go b/command/analyzer/verify/utils.go deleted file mode 100644 index 56e476bd0..000000000 --- a/command/analyzer/verify/utils.go +++ /dev/null @@ -1,14 +0,0 @@ -package verify - -import ( - "crypto/rand" - "fmt" -) - -func generateImageVersion(length int) string { - b := make([]byte, length) - if _, err := rand.Read(b); err != nil { - panic(err) - } - return fmt.Sprintf("%x", b) -} diff --git a/command/analyzer/verify/verify.go b/command/analyzer/verify/verify.go index c8da97c43..626ee2a81 100644 --- a/command/analyzer/verify/verify.go +++ b/command/analyzer/verify/verify.go @@ -5,10 +5,8 @@ import ( "fmt" "os" "path/filepath" - "strings" build "github.com/deepsourcelabs/cli/analyzers/backend/docker" - "github.com/deepsourcelabs/cli/analyzers/config" "github.com/deepsourcelabs/cli/analyzers/validator" "github.com/deepsourcelabs/cli/utils" "github.com/spf13/cobra" @@ -17,7 +15,6 @@ import ( var ( analyzerTOMLPath string issuesDirPath string - projectRoot string configFolder string = ".deepsource/analyzer" ) @@ -25,7 +22,11 @@ type AnalyzerVerifyOpts struct{} func NewCmdAnalyzerVerify() *cobra.Command { // Configuring the paths of analyzer.toml and issues directory - projectRoot, analyzerTOMLPath, issuesDirPath = config.InitAnalyzerConfigurationPaths() + projectRoot, err := utils.ExtractProjectRootPath() + if err != nil { + fmt.Printf("Couldn't find the root directory of the project. Error:%s", err) + } + analyzerTOMLPath = filepath.Join(projectRoot, configFolder, "analyzer.toml") issuesDirPath = filepath.Join(projectRoot, configFolder, "issues/") @@ -110,16 +111,7 @@ func (*AnalyzerVerifyOpts) Run() (err error) { // Specifying the name of the image to be built // Set the default Dockerfile path as "Dockerfile" - var dockerFilePath, dockerFileName string - dockerFilePath = "Dockerfile" - - // Read config for the value if specified - if analyzerTOMLData.Build.Dockerfile != "" { - dockerFilePath = analyzerTOMLData.Build.Dockerfile - } - if analyzerTOMLData.Shortcode != "" { - dockerFileName = strings.TrimPrefix(analyzerTOMLData.Shortcode, "@") - } + dockerFilePath, dockerFileName := build.GetDockerImageDetails(analyzerTOMLData) spin.StartSpinnerWithLabel(fmt.Sprintf("Building Analyzer image with the name \"%s\"", dockerFileName), "Successfully built the Analyzer image") // Specifying the source to build @@ -130,11 +122,10 @@ func (*AnalyzerVerifyOpts) Run() (err error) { return err } } - analyzerBuilder := build.DockerClient{ ImageName: dockerFileName, DockerfilePath: dockerFilePath, - ImageTag: generateImageVersion(7), + ImageTag: build.GenerateImageVersion(7), } buildErr := analyzerBuilder.BuildAnalyzerDockerImage() diff --git a/go.mod b/go.mod index b0bc0e0a9..b9bda8296 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/AlecAivazis/survey/v2 v2.2.12 github.com/Jeffail/gabs/v2 v2.6.1 github.com/MakeNowJust/heredoc v1.0.0 + github.com/ProtonMail/go-crypto v0.0.0-20220407094043-a94812496cf5 // indirect github.com/briandowns/spinner v1.18.1 github.com/cli/browser v1.1.0 github.com/containerd/containerd v1.6.3 // indirect @@ -13,75 +14,92 @@ require ( github.com/deepsourcelabs/graphql v0.2.2 github.com/docker/distribution v2.8.1+incompatible // indirect github.com/docker/docker v20.10.14+incompatible + github.com/emirpasic/gods v1.18.1 // indirect github.com/fatih/color v1.13.0 github.com/getsentry/sentry-go v0.6.0 -<<<<<<< HEAD github.com/owenrumney/go-sarif/v2 v2.1.0 - github.com/pelletier/go-toml v1.9.2 + github.com/pelletier/go-toml v1.9.4 github.com/pterm/pterm v0.12.23 - github.com/spf13/cobra v1.1.3 - github.com/spf13/viper v1.7.1 - github.com/stretchr/testify v1.7.0 + github.com/spf13/cobra v1.4.0 + github.com/spf13/viper v1.10.1 + github.com/stretchr/testify v1.7.1 github.com/xeipuuv/gojsonschema v1.2.0 ) require ( github.com/atomicgo/cursor v0.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.4.7 // indirect - github.com/google/go-cmp v0.5.5 // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/go-git/go-git/v5 v5.4.2 + github.com/go-playground/validator/v10 v10.10.1 + github.com/gobwas/glob v0.2.3 + github.com/google/go-cmp v0.5.6 github.com/gookit/color v1.4.2 // indirect + github.com/gorilla/mux v1.8.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/kr/pretty v0.3.0 // indirect - github.com/magiconair/properties v1.8.1 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect github.com/matryer/is v1.4.0 // indirect - github.com/mattn/go-colorable v0.1.8 // 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/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/moby/sys/mount v0.3.2 // indirect + github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 + github.com/pelletier/go-toml/v2 v2.0.0 github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect - github.com/rogpeppe/go-internal v1.8.0 // indirect - github.com/spf13/afero v1.1.2 // indirect - github.com/spf13/cast v1.3.0 // indirect - github.com/spf13/jwalterweatherman v1.0.0 // indirect + github.com/sergi/go-diff v1.2.0 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.4.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.2.0 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/xanzy/ssh-agent v0.3.1 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - golang.org/x/crypto v0.0.0-20211202192323-5770296d904e // indirect - golang.org/x/sys v0.0.0-20211205182925-97ca703d548d // indirect - golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect + golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88 // indirect + golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect + golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/ini.v1 v1.51.0 // indirect + gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect -======= - github.com/go-playground/validator/v10 v10.10.1 - github.com/gorilla/mux v1.8.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/matryer/is v1.4.0 // indirect - github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d - github.com/moby/sys/mount v0.3.2 // indirect - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect - github.com/owenrumney/go-sarif/v2 v2.1.0 - github.com/pelletier/go-toml v1.9.4 - github.com/pelletier/go-toml/v2 v2.0.0 - github.com/pterm/pterm v0.12.23 - github.com/spf13/afero v1.8.2 // indirect - github.com/spf13/cobra v1.4.0 - github.com/spf13/viper v1.10.1 - github.com/stretchr/testify v1.7.1 - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonschema v1.2.0 - gopkg.in/ini.v1 v1.66.4 // indirect gotest.tools/v3 v3.2.0 // indirect ->>>>>>> 6477a26 (feat: add syntactic verification for analyzer.toml and issue descriptions (#131)) +) + +require ( + github.com/Microsoft/go-winio v0.5.2 // indirect + github.com/Microsoft/hcsshim v0.9.2 // indirect + github.com/acomagu/bufpipe v1.0.3 // indirect + github.com/containerd/cgroups v1.0.3 // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/go-playground/locales v0.14.0 // indirect + github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/leodido/go-urn v1.2.1 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/moby/sys/mountinfo v0.6.1 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/runc v1.1.1 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + go.opencensus.io v0.23.0 // indirect + google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa // indirect + google.golang.org/grpc v1.43.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect ) diff --git a/go.sum b/go.sum index 2c10fd80b..442ab0fdf 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,4 @@ bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -19,17 +18,6 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb 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.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.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -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.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= 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= @@ -38,8 +26,6 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 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.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= 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= @@ -51,33 +37,27 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/AlecAivazis/survey/v2 v2.2.12 h1:5a07y93zA6SZ09gOa9wLVLznF5zTJMQ+pJ3cZK4IuO8= github.com/AlecAivazis/survey/v2 v2.2.12/go.mod h1:6d4saEvBsfSHXeN1a5OA5m2+HJ2LuVokllnC77pAIKI= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= 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 v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= 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.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= 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/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.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/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Jeffail/gabs/v2 v2.6.1 h1:wwbE6nTQTwIMsMxzi6XFQQYRZ6wDc1mSdxoAN+9U4Gk= github.com/Jeffail/gabs/v2 v2.6.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= @@ -92,7 +72,7 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX 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/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= @@ -102,46 +82,44 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3 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.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY= github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= 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/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20220407094043-a94812496cf5 h1:cSHEbLj0GZeHM1mWG84qEnGFojNEQ83W7cwaPRjcwXU= +github.com/ProtonMail/go-crypto v0.0.0-20220407094043-a94812496cf5/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/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= 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/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +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/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= -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 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +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/atomicgo/cursor v0.0.1 h1:xdogsqa6YYlLfM+GyClC/Lchf7aiMerFiZQn7soTOoU= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= 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= @@ -149,7 +127,6 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r 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/blang/semver v3.1.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= @@ -157,19 +134,13 @@ github.com/briandowns/spinner v1.18.1 h1:yhQmQtM1zsqFsouh09Bk/jCjd50pC3EOGsh28gL github.com/briandowns/spinner v1.18.1/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= 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/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= 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/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= 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/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= 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/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= @@ -182,8 +153,6 @@ github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -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/cli/browser v1.1.0 h1:xOZBfkfY9L9vMBgqb1YwRirGu6QFaQ5dP/vXt5ENSOY= github.com/cli/browser v1.1.0/go.mod h1:HKMQAt9t12kov91Mn7RfZxyJQQgWgyS/3SZswlZ5iTI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -194,13 +163,8 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP 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/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= 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= @@ -232,15 +196,12 @@ github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/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.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= -github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= github.com/containerd/containerd v1.6.3 h1:JfgUEIAH07xDWk6kqz0P3ArZt+KJ9YeihSC9uyFtSKg= github.com/containerd/containerd v1.6.3/go.mod h1:gCVGrYRYFm2E8GmuUIbj/NGD7DLZQLzSJQazjVKDOig= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -250,7 +211,6 @@ github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cE 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/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= @@ -261,9 +221,6 @@ github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1S 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-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.4/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= 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= @@ -273,8 +230,6 @@ github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak 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/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= -github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= 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= @@ -297,23 +252,16 @@ github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNR 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/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= 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/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= -github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= 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/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= 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-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= 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= @@ -377,30 +325,27 @@ github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZi 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/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= 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/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= 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/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= +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/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= 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= @@ -409,49 +354,48 @@ github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5 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/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/getsentry/sentry-go v0.6.0 h1:kPd+nr+dlXmaarUBg7xlC/qn+7wyMJL6PMsSn5fA+RM= github.com/getsentry/sentry-go v0.6.0/go.mod h1:0yZBuzSvbZwBnvaF9VwZIMen3kXscY8/uasKtAX1qG8= 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.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +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 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +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 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= +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 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +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-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 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 v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= 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/jsonpointer v0.19.5/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/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= 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-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= @@ -461,7 +405,8 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig= github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= 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/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +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= @@ -495,7 +440,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt 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 v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -512,14 +456,11 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD 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.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= 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/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= 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= @@ -537,11 +478,9 @@ github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYV github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= 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/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+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/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= @@ -552,11 +491,6 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf 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-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-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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= @@ -564,11 +498,7 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.4.2 h1:tXy44JFSFkKnELV6WaMo/lLfu/meqITX3iAV52do7lk= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= @@ -584,85 +514,48 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad 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.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/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/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -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/errwrap v1.1.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.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-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -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.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 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.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -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.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= 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.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 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= 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/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 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.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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -670,7 +563,6 @@ github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0b github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= @@ -678,6 +570,9 @@ github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6i github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/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= @@ -709,34 +604,26 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -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/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/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/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 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.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -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.7/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.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -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= @@ -745,7 +632,6 @@ github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4 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.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= 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= @@ -756,26 +642,15 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -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/miekg/pkcs11 v1.1.1/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 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -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/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.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= 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/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mount v0.3.2 h1:uq/CiGDZPvr+c85RYHtKIUORFbmavBUyWH3E1NEyjqI= github.com/moby/sys/mount v0.3.2/go.mod h1:iN27Ec0LtJ0Mx/++rE6t6mTdbbEEZd+oKfAHP1y6vHs= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= @@ -783,18 +658,14 @@ github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/mountinfo v0.6.1 h1:+H/KnGEAGRpTrEAqNVQ2AM3SiwMgJUt/TXj+Z8cmCIc= github.com/moby/sys/mountinfo v0.6.1/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= 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-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 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= @@ -802,16 +673,13 @@ github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2 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/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= 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/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -823,20 +691,13 @@ 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.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= 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.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= -<<<<<<< HEAD -======= 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.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= 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= @@ -845,8 +706,6 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 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/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -855,7 +714,6 @@ github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= 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/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= github.com/opencontainers/runc v1.1.1 h1:PJ9DSs2sVwE0iVr++pAHE6QkS9tzcVWozlPifdwMgrU= github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -869,17 +727,11 @@ github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqi github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/owenrumney/go-sarif v1.1.1 h1:QNObu6YX1igyFKhdzd7vgzmw7XsWN3/6NMGuDzBgXmE= ->>>>>>> 6477a26 (feat: add syntactic verification for analyzer.toml and issue descriptions (#131)) github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U= github.com/owenrumney/go-sarif/v2 v2.1.0 h1:Xp4RUbbQc5O2/t5YYZ+1QzJ8FZVdJwXeiWssiF5vQrA= github.com/owenrumney/go-sarif/v2 v2.1.0/go.mod h1:MSqMMx9WqlBSY7pXoOZWgEsVB4FDNfhcaXDA1j6Sr+w= -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/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.0 h1:P7Bq0SaI8nsexyay5UAyDo+ICWy5MQPgEZ5+l8JQTKo= @@ -893,22 +745,16 @@ github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV 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/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 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_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 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-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -919,10 +765,7 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q 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/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/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-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -934,7 +777,6 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx 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/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/pterm/pterm v0.12.23 h1:+PL0YqmmT0QiDLOpevE3e2HPb5UIDBxh6OlLm8jDhxg= github.com/pterm/pterm v0.12.23/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= @@ -949,18 +791,16 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po 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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= 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/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= 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/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= 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= @@ -975,12 +815,9 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 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/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= 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/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -990,7 +827,6 @@ 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.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= @@ -1004,11 +840,9 @@ 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= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= 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= @@ -1031,9 +865,6 @@ github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= 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/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= 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= @@ -1050,15 +881,16 @@ github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV 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/netlink v1.1.1-0.20210330154013-f5de75959ad5/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/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= 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/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xanzy/ssh-agent v0.3.1 h1:AmzO1SSWxw73zxFZPRwaMN1MohDw8UyHnmuxyceTEGo= +github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1089,16 +921,6 @@ 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/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -1108,60 +930,34 @@ 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.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= 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/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= 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/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= 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-20181203042331-505ab145d0a9/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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-20210220033148-5ea612d1eb83/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-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88 h1:Tgea0cVUD0ivh5ADBX4WwuI12DUd2to3nCYe2eayMIw= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1185,7 +981,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu 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= @@ -1197,14 +992,11 @@ 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/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-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-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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1222,7 +1014,6 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL 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-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= @@ -1230,13 +1021,10 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL 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= -<<<<<<< HEAD -======= 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= @@ -1245,25 +1033,15 @@ 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-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-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/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= ->>>>>>> 6477a26 (feat: add syntactic verification for analyzer.toml and issue descriptions (#131)) +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1273,14 +1051,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ 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-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-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/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 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= @@ -1292,11 +1062,9 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ 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-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-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-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1323,11 +1091,8 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w 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-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1351,15 +1116,12 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200519105757-fe76b779f299/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-20200625212154-ddb9806d33ae/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-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= @@ -1372,58 +1134,33 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w 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-20210225134936-a50acf3fe073/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-20210319071255-635bc2c9138d/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= -<<<<<<< HEAD -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d h1:FjkYO/PPp4Wi0EAUOVLxePm7qVW4r4ctbWpURyuOD0E= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= -======= -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-20210423185535-09eb48e85fd7/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-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-20210603081109-ebe580a85c40/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-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-20210809222454-d867a43fc93e/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-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/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-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-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/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-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-20220405210540-1e041c57c461 h1:kHVeDEnfKn3T238CvrUcz6KeEsFHVaKh4kMTt6Wsysg= -golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= ->>>>>>> 6477a26 (feat: add syntactic verification for analyzer.toml and issue descriptions (#131)) golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 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= @@ -1431,6 +1168,7 @@ 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= @@ -1439,9 +1177,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb 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 h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1464,11 +1200,8 @@ golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgw 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-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-20190911174233-4f2ddba30aff/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-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1502,15 +1235,11 @@ golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4X 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/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= @@ -1537,19 +1266,6 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 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.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.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.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.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 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= @@ -1581,7 +1297,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG 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-20200423170343-7949de9c1215/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= @@ -1593,39 +1308,13 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D 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-20201019141844-1ed22bb0c154/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/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-20210513213006-bf773b8c8384/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-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-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-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-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-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -1650,18 +1339,9 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv 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 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= google.golang.org/grpc v1.43.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= @@ -1692,8 +1372,6 @@ gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKW gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= 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.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= @@ -1703,6 +1381,8 @@ gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76 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.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +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= @@ -1714,10 +1394,8 @@ 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-20200615113413-eeeca48fe776/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= @@ -1733,55 +1411,40 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 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/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= 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/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= 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/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= 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/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= 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/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= 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/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= 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/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= 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/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= 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/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= 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/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 7a96beb0e9478257e8d5a8b0b3136bcefbbaca8e Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi Date: Fri, 27 May 2022 11:49:23 +0530 Subject: [PATCH 04/28] chore: fix CI Signed-off-by: Siddhant N Trivedi --- .github/workflows/CI.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b98efa813..1e9c9241c 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -27,9 +27,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Build the binary - run: | - pwd - make build + run: make build - name: Setup tests run: make test_setup From c07857c571b1f139717a227f48aa734ae0fb0e8f Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Sat, 28 May 2022 19:13:47 +0530 Subject: [PATCH 05/28] feat(verify): add `--verbose` flag and fix flicker in survey prompt (#136) --- analyzers/backend/docker/build.go | 71 +++-------- analyzers/backend/docker/utils.go | 56 +++++++++ .../.deepsource/analyzer/analyzer.toml | 2 +- analyzers/validator/validator.go | 2 +- command/analyzer/run/run.go | 15 ++- command/analyzer/verify/build.go | 84 +++++++++++++ command/analyzer/verify/verify.go | 118 +++++++++--------- go.mod | 16 +-- go.sum | 24 ++-- utils/spinner.go | 3 +- 10 files changed, 252 insertions(+), 139 deletions(-) create mode 100644 analyzers/backend/docker/utils.go create mode 100644 command/analyzer/verify/build.go diff --git a/analyzers/backend/docker/build.go b/analyzers/backend/docker/build.go index 0df23ecf9..a6eeec254 100644 --- a/analyzers/backend/docker/build.go +++ b/analyzers/backend/docker/build.go @@ -1,11 +1,8 @@ package docker import ( - "bufio" "context" "crypto/rand" - "encoding/json" - "errors" "fmt" "io" "os" @@ -21,19 +18,6 @@ import ( // Timeout for build and container operations (10 minutes) const buildTimeout = 10 * time.Minute -type ErrorLine struct { - Error string `json:"error"` - ErrorDetail ErrorDetail `json:"errorDetail"` -} - -type ErrorDetail struct { - Message string `json:"message"` -} - -type DockerBuildResponse struct { - Stream string `json:"stream"` -} - type DockerClient struct { Client *client.Client ContainerName string @@ -42,6 +26,7 @@ type DockerClient struct { ImageTag string DockerfilePath string AnalysisOpts AnalysisParams + ShowLogs bool } type DockerBuildError struct { @@ -52,26 +37,28 @@ func (d *DockerBuildError) Error() string { return d.Message } -func (d *DockerClient) BuildAnalyzerDockerImage() *DockerBuildError { +// Docker build API function +func (d *DockerClient) BuildAnalyzerDockerImage() (context.CancelFunc, io.ReadCloser, *DockerBuildError) { var err error d.Client, err = client.NewClientWithOpts(client.FromEnv) if err != nil { - return &DockerBuildError{ + return nil, nil, &DockerBuildError{ Message: err.Error(), } } - if err = d.executeImageBuild(); err != nil { - return &DockerBuildError{ + cancelFunc, responseReader, err := d.executeImageBuild() + if err != nil { + return cancelFunc, nil, &DockerBuildError{ Message: err.Error(), } } - return nil + return cancelFunc, responseReader, nil } -func (d *DockerClient) executeImageBuild() error { - ctx, cancel := context.WithTimeout(context.Background(), buildTimeout) - defer cancel() +// Executes the docker image build +func (d *DockerClient) executeImageBuild() (context.CancelFunc, io.ReadCloser, error) { + ctx, ctxCancelFunc := context.WithTimeout(context.Background(), buildTimeout) cwd, _ := os.Getwd() tarOptions := &archive.TarOptions{ @@ -79,7 +66,7 @@ func (d *DockerClient) executeImageBuild() error { } tar, err := archive.TarWithOptions(cwd, tarOptions) if err != nil { - return err + return ctxCancelFunc, nil, err } opts := types.ImageBuildOptions{ @@ -90,38 +77,10 @@ func (d *DockerClient) executeImageBuild() error { } res, err := d.Client.ImageBuild(ctx, tar, opts) if err != nil { - return err - } - defer res.Body.Close() - return checkResponse(res.Body) -} - -func checkResponse(rd io.Reader) error { - var lastLine []byte - count := 0 - var currentStream string - - scanner := bufio.NewScanner(rd) - for scanner.Scan() { - lastLine = scanner.Bytes() - d := &DockerBuildResponse{} - err := json.Unmarshal(lastLine, d) - if err != nil { - return err - } - if d.Stream == "" || d.Stream == "\n" || strings.TrimSuffix(d.Stream, "\n") == currentStream { - continue - } - currentStream = strings.TrimSuffix(d.Stream, "\n") - count++ - } - - errLine := &ErrorLine{} - json.Unmarshal([]byte(lastLine), errLine) - if errLine.Error != "" { - return errors.New(errLine.Error) + ctxCancelFunc() + return ctxCancelFunc, nil, err } - return scanner.Err() + return ctxCancelFunc, res.Body, nil } // Returns the docker image details to build diff --git a/analyzers/backend/docker/utils.go b/analyzers/backend/docker/utils.go new file mode 100644 index 000000000..712607331 --- /dev/null +++ b/analyzers/backend/docker/utils.go @@ -0,0 +1,56 @@ +package docker + +import ( + "bufio" + "encoding/json" + "errors" + "fmt" + "io" + "strings" +) + +type ErrorLine struct { + Error string `json:"error"` + ErrorDetail ErrorDetail `json:"errorDetail"` +} + +type ErrorDetail struct { + Message string `json:"message"` +} + +type DockerBuildResponse struct { + Stream string `json:"stream"` +} + +/* Checks the docker build response and prints all the logs if `showAllLogs` is true + * Used in `deepsource analyzer run` and `deepsource analyzer verify` commands */ +func CheckBuildResponse(rd io.Reader, showAllLogs bool) error { // skipcq: RVV-A0005 + var lastLine []byte + count := 0 + var currentStream string + + scanner := bufio.NewScanner(rd) + for scanner.Scan() { + lastLine = scanner.Bytes() + d := &DockerBuildResponse{} + err := json.Unmarshal(lastLine, d) + if err != nil { + return err + } + if d.Stream == "" || d.Stream == "\n" || strings.Contains(d.Stream, "--->") || strings.TrimSuffix(d.Stream, "\n") == currentStream { + continue + } + currentStream = strings.TrimSuffix(d.Stream, "\n") + if showAllLogs { + fmt.Println(currentStream) + } + count++ + } + + errLine := &ErrorLine{} + json.Unmarshal([]byte(lastLine), errLine) + if errLine.Error != "" { + return errors.New(errLine.Error) + } + return scanner.Err() +} diff --git a/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml b/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml index 59d895bba..6da43b523 100644 --- a/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml +++ b/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml @@ -1,5 +1,5 @@ name = "Todo comments checker" -# path = "@deepsource/demo-python" +# shortcode = "@deepsource/demo-python" # test invalid config description = "Finds the TODO comments in codebase." # category = "doc" tags = ["documentation","todo"] diff --git a/analyzers/validator/validator.go b/analyzers/validator/validator.go index 71a6e507c..1f294c194 100644 --- a/analyzers/validator/validator.go +++ b/analyzers/validator/validator.go @@ -102,6 +102,7 @@ func ValidateAnalyzerTOML(analyzerTOMLPath string) (*config.AnalyzerMetadata, *V } return &config, &analyzerTOMLValidationErrors, nil } + return &config, nil, nil } @@ -135,7 +136,6 @@ func ValidateIssueDescriptions(issuesDirectoryPath string) (*[]ValidationError, // Validate the data v := validate.New() - if err := v.Struct(&config); err != nil { validationFailed = true missingRequiredFields := getMissingRequiredFields(err, config) diff --git a/command/analyzer/run/run.go b/command/analyzer/run/run.go index 899ae46b8..9eb04c5f2 100644 --- a/command/analyzer/run/run.go +++ b/command/analyzer/run/run.go @@ -74,10 +74,23 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { // Building the Analyzer image fmt.Println("Building Analyzer image...") - if buildError := a.Client.BuildAnalyzerDockerImage(); buildError != nil { + ctxCancelFunc, buildRespReader, buildError := a.Client.BuildAnalyzerDockerImage() + + // Cancel the build context and close the reader before exiting this function + if buildRespReader != nil { + defer buildRespReader.Close() + } + defer ctxCancelFunc() + if buildError != nil { return buildError } + // Check the docker build response + // TODO: Tweak the behaviour here when the spinners are added to the run command + if err = docker.CheckBuildResponse(buildRespReader, false); err != nil { + return err + } + /* Create temporary toolbox directory to store analysis config and later analyis results * If already passed through --output-file flag, use that one */ if err = a.createTemporaryToolBoxDir(); err != nil { diff --git a/command/analyzer/verify/build.go b/command/analyzer/verify/build.go new file mode 100644 index 000000000..6f69192c1 --- /dev/null +++ b/command/analyzer/verify/build.go @@ -0,0 +1,84 @@ +package verify + +import ( + "errors" + "fmt" + "os" + + build "github.com/deepsourcelabs/cli/analyzers/backend/docker" + "github.com/deepsourcelabs/cli/utils" + "github.com/mgutz/ansi" +) + +// Verify the docker image build of the Analyzer +func (a *AnalyzerVerifyOpts) verifyAnalyzerDockerBuild() (err error) { + // Fetch the details of the dockerfile to build and also the name of the docker image + a.Build.DockerFilePath, a.Build.DockerImageName = build.GetDockerImageDetails(a.AnalyzerTOMLData) + + /* In case of verbose mode (when the user supplies a `--verbose` flag), do not use spinner since it doesn't allow showing multiline + * output at the same time as rendering a spinner. Can be done but would require some string concatenation magic. Can be picked up later. */ + switch a.Build.VerboseMode { + case true: + arrowIcon := ansi.Color("> [verbose]", "yellow") + fmt.Printf("%s Building Analyzer image with the name \"%s\"\n", arrowIcon, a.Build.DockerImageName) + case false: + a.Spinner.StartSpinnerWithLabel(fmt.Sprintf("Building Analyzer image with the name \"%s\"", a.Build.DockerImageName), "Successfully built the Analyzer image") + } + + /* Specifying the source to build + * Check for the presence of `build.Dockerfile` or if not a `Dockerfile` in the current working directory */ + if _, err := os.Stat(a.Build.DockerFilePath); err != nil { + if errors.Is(err, os.ErrNotExist) { + a.Spinner.StopSpinnerWithError("Failed to build the image", fmt.Errorf("%s not found\n", a.Build.DockerFilePath)) + return err + } + } + + /* /////////////////////////////////// + * Analyzer docker build verification + * /////////////////////////////////// */ + + /* Initialize the builder with the above fetched details + * Use the `GenerateImageVersion` utility to generate a random string of length 7 to tag the image */ + analyzerBuilder := build.DockerClient{ + ImageName: a.Build.DockerImageName, + DockerfilePath: a.Build.DockerFilePath, + ImageTag: build.GenerateImageVersion(7), + ShowLogs: a.Build.VerboseMode, + } + + // Build the docker image :rocket: + ctxCancelFunc, buildRespReader, buildErr := analyzerBuilder.BuildAnalyzerDockerImage() + + // Cancel the build context and close the reader before exiting this function + defer buildRespReader.Close() + defer ctxCancelFunc() + + if buildErr != nil { + a.handleBuildError(buildErr) + return buildErr + } + + // Read the docker build response + if err = build.CheckBuildResponse(buildRespReader, a.Build.VerboseMode); err != nil { + a.handleBuildError(err) + return err + } + + // In case of verbose mode, no need to stop the spinner + if a.Build.VerboseMode { + fmt.Print(utils.GetSuccessMessage("Successfully built the Analyzer image")) + return nil + } + a.Spinner.StopSpinner() + return nil +} + +// Utility to handle the output in case of build errors for different modes +func (a *AnalyzerVerifyOpts) handleBuildError(buildError error) { + if a.Build.VerboseMode { + fmt.Println(utils.GetFailureMessage("Failed to build the image", buildError.Error())) + return + } + a.Spinner.StopSpinnerWithError("Failed to build the image", fmt.Errorf(buildError.Error())) +} diff --git a/command/analyzer/verify/verify.go b/command/analyzer/verify/verify.go index 626ee2a81..c89e22a7f 100644 --- a/command/analyzer/verify/verify.go +++ b/command/analyzer/verify/verify.go @@ -3,10 +3,9 @@ package verify import ( "errors" "fmt" - "os" "path/filepath" - build "github.com/deepsourcelabs/cli/analyzers/backend/docker" + "github.com/deepsourcelabs/cli/analyzers/config" "github.com/deepsourcelabs/cli/analyzers/validator" "github.com/deepsourcelabs/cli/utils" "github.com/spf13/cobra" @@ -18,7 +17,21 @@ var ( configFolder string = ".deepsource/analyzer" ) -type AnalyzerVerifyOpts struct{} +type AnalyzerBuild struct { + DockerFilePath string + DockerImageName string + VerboseMode bool +} + +type AnalyzerVerifyOpts struct { + AnalyzerTOMLData *config.AnalyzerMetadata + Build AnalyzerBuild + Spinner *utils.SpinnerUtils +} + +/* //////////////////////////////////// + * $ deepsource analyzer verify + * /////////////////////////////////// */ func NewCmdAnalyzerVerify() *cobra.Command { // Configuring the paths of analyzer.toml and issues directory @@ -26,69 +39,85 @@ func NewCmdAnalyzerVerify() *cobra.Command { if err != nil { fmt.Printf("Couldn't find the root directory of the project. Error:%s", err) } - analyzerTOMLPath = filepath.Join(projectRoot, configFolder, "analyzer.toml") issuesDirPath = filepath.Join(projectRoot, configFolder, "issues/") - opts := AnalyzerVerifyOpts{} + opts := AnalyzerVerifyOpts{ + Spinner: &utils.SpinnerUtils{}, + Build: AnalyzerBuild{ + VerboseMode: false, + }, + } cmd := &cobra.Command{ Use: "verify", Short: "Verify DeepSource Analyzers configuration", Args: utils.NoArgs, RunE: func(_ *cobra.Command, _ []string) error { - if err := opts.Run(); err != nil { + if err := opts.verifyAnalyzer(); err != nil { return errors.New("Analyzer verification failed. Exiting...") } return nil }, } + + // --verbose flag. On being set, the build logs as well as the verification diagnostics are visible to the user + cmd.Flags().BoolVar(&opts.Build.VerboseMode, "verbose", false, "Output build logs and diagnostics related to verification failures") return cmd } -// Runs the command -func (*AnalyzerVerifyOpts) Run() (err error) { +/* //////////////////////////////////// + * Analyzer configuration verification + * /////////////////////////////////// */ + +func (a *AnalyzerVerifyOpts) verifyAnalyzer() (err error) { var validationErrors *[]validator.ValidationError - spin := utils.SpinnerUtils{} + var analyzerTOMLValidationErrors *validator.ValidationError configurationValid := true - ///////////////////////////////// - // Configuration verification/// - /////////////////////////////// + /* ////////////////////////////////////////////////////////////////////////////////// + * Checks for the presence of .deepsource/analyzer directory, + * the analyzer.toml file and issues present in .deepsource/analyzer/issues directory + * /////////////////////////////////////////////////////////////////////////////////// */ - // Check for path of `analyzer.toml` file and `issues` directory containing issue descriptions - spin.StartSpinnerWithLabel("Checking for presence of analyzer.toml and issue descriptions...", "Yay!!Found analyzer.toml and issue descriptions.") + a.Spinner.StartSpinnerWithLabel("Checking for presence of analyzer.toml and issue descriptions...", "Yay!!Found analyzer.toml and issue descriptions.") if err = validator.CheckForAnalyzerConfig(analyzerTOMLPath, issuesDirPath); err != nil { configurationValid = false - spin.StopSpinnerWithError("Failed to locate analyzer configurations", err) + a.Spinner.StopSpinnerWithError("Failed to locate analyzer configurations", err) return } - spin.StopSpinner() + a.Spinner.StopSpinner() + + /* /////////////////////////////// + * Read and verify analyzer.toml + * ////////////////////////////// */ - // Read and verify analyzer toml - spin.StartSpinnerWithLabel("Validating analyzer.toml...", "Verified analyzer.toml") - analyzerTOMLData, analyzerTOMLValidationErrors, err := validator.ValidateAnalyzerTOML(analyzerTOMLPath) - if analyzerTOMLValidationErrors != nil { + a.Spinner.StartSpinnerWithLabel("Validating analyzer.toml...", "Verified analyzer.toml") + a.AnalyzerTOMLData, analyzerTOMLValidationErrors, err = validator.ValidateAnalyzerTOML(analyzerTOMLPath) + if len(analyzerTOMLValidationErrors.Errors) > 0 { configurationValid = false - spin.StopSpinnerWithError("Failed to verify analyzer.toml\n", err) + a.Spinner.StopSpinnerWithError("Failed to verify analyzer.toml\n", err) for _, err := range analyzerTOMLValidationErrors.Errors { msg := fmt.Sprintf("%s : %s", err.Message, err.Field) failureMsg := utils.GetFailureMessage(msg, "") fmt.Printf(" * %s\n", failureMsg) } } - spin.StopSpinner() + a.Spinner.StopSpinner() - // Read and verify all issues - spin.StartSpinnerWithLabel("Validating issue descriptions...", "Verified issue descriptions") + /* ////////////////////////////////////// + * Reads and verifies issue descriptions + * ///////////////////////////////////// */ + + a.Spinner.StartSpinnerWithLabel("Validating issue descriptions...", "Verified issue descriptions") if validationErrors, err = validator.ValidateIssueDescriptions(issuesDirPath); err != nil { configurationValid = false - spin.StopSpinnerWithError("Failed to validate the following issue desriptions", err) + a.Spinner.StopSpinnerWithError("Failed to validate the following issue desriptions", err) } // Check if there are any validation errors in issue descriptions if validationErrors != nil { configurationValid = false - spin.StopSpinnerWithError("Failed to validate the following issue descriptions\n", err) + a.Spinner.StopSpinnerWithError("Failed to validate the following issue descriptions\n", err) for _, validationError := range *validationErrors { fmt.Printf(" * %s\n", validationError.File) for _, err := range validationError.Errors { @@ -98,41 +127,16 @@ func (*AnalyzerVerifyOpts) Run() (err error) { } } } - spin.StopSpinner() + a.Spinner.StopSpinner() - // Do not move to building the image if the configuration verification fails + // Do not proceed to building the image if the configuration verification fails if !configurationValid { return } - ///////////////////////// - // Build verification/// - /////////////////////// - - // Specifying the name of the image to be built - // Set the default Dockerfile path as "Dockerfile" - dockerFilePath, dockerFileName := build.GetDockerImageDetails(analyzerTOMLData) - - spin.StartSpinnerWithLabel(fmt.Sprintf("Building Analyzer image with the name \"%s\"", dockerFileName), "Successfully built the Analyzer image") - // Specifying the source to build - // Check for the presence of `build.Dockerfile` or if not a `Dockerfile` in the current working directory - if _, err := os.Stat(dockerFilePath); err != nil { - if errors.Is(err, os.ErrNotExist) { - spin.StopSpinnerWithError("Failed to build the image", fmt.Errorf("%s not found\n", dockerFilePath)) - return err - } - } - analyzerBuilder := build.DockerClient{ - ImageName: dockerFileName, - DockerfilePath: dockerFilePath, - ImageTag: build.GenerateImageVersion(7), - } - - buildErr := analyzerBuilder.BuildAnalyzerDockerImage() - if buildErr != nil { - spin.StopSpinnerWithError("Failed to build the image", fmt.Errorf(buildErr.Error())) - } - spin.StopSpinner() + /* //////////////////////////////////////////////////// + * Verify the local docker image build of the Analyzer + * /////////////////////////////////////////////////// */ - return nil + return a.verifyAnalyzerDockerBuild() } diff --git a/go.mod b/go.mod index b9bda8296..59da01294 100644 --- a/go.mod +++ b/go.mod @@ -3,16 +3,13 @@ module github.com/deepsourcelabs/cli go 1.18 require ( - github.com/AlecAivazis/survey/v2 v2.2.12 + github.com/AlecAivazis/survey/v2 v2.3.4 github.com/Jeffail/gabs/v2 v2.6.1 github.com/MakeNowJust/heredoc v1.0.0 github.com/ProtonMail/go-crypto v0.0.0-20220407094043-a94812496cf5 // indirect github.com/briandowns/spinner v1.18.1 github.com/cli/browser v1.1.0 - github.com/containerd/containerd v1.6.3 // indirect - github.com/containerd/continuity v0.3.0 // indirect github.com/deepsourcelabs/graphql v0.2.2 - github.com/docker/distribution v2.8.1+incompatible // indirect github.com/docker/docker v20.10.14+incompatible github.com/emirpasic/gods v1.18.1 // indirect github.com/fatih/color v1.13.0 @@ -50,7 +47,7 @@ require ( github.com/moby/sys/mount v0.3.2 // indirect github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 - github.com/pelletier/go-toml/v2 v2.0.0 + github.com/pelletier/go-toml/v2 v2.0.1 github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect @@ -70,9 +67,6 @@ require ( golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - gotest.tools/v3 v3.2.0 // indirect ) require ( @@ -80,6 +74,9 @@ require ( github.com/Microsoft/hcsshim v0.9.2 // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/containerd/cgroups v1.0.3 // indirect + github.com/containerd/containerd v1.6.3 // indirect + github.com/containerd/continuity v0.3.0 // indirect + github.com/docker/distribution v2.8.1+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect github.com/go-git/gcfg v1.5.0 // indirect @@ -102,4 +99,7 @@ require ( google.golang.org/grpc v1.43.0 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + gotest.tools/v3 v3.2.0 // indirect ) diff --git a/go.sum b/go.sum index 442ab0fdf..e8cb80d16 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.2.12 h1:5a07y93zA6SZ09gOa9wLVLznF5zTJMQ+pJ3cZK4IuO8= -github.com/AlecAivazis/survey/v2 v2.2.12/go.mod h1:6d4saEvBsfSHXeN1a5OA5m2+HJ2LuVokllnC77pAIKI= +github.com/AlecAivazis/survey/v2 v2.3.4 h1:pchTU9rsLUSvWEl2Aq9Pv3k0IE2fkqtGxazskAMd9Ng= +github.com/AlecAivazis/survey/v2 v2.3.4/go.mod h1:hrV6Y/kQCLhIZXGcriDCUBtB3wnN7156gMXJ3+b23xM= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= @@ -88,8 +88,8 @@ github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfy 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/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= github.com/ProtonMail/go-crypto v0.0.0-20220407094043-a94812496cf5 h1:cSHEbLj0GZeHM1mWG84qEnGFojNEQ83W7cwaPRjcwXU= @@ -280,6 +280,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t 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.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= +github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= @@ -527,8 +529,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= +github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= +github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 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= @@ -593,8 +595,6 @@ github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn 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.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 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= @@ -734,8 +734,8 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.0 h1:P7Bq0SaI8nsexyay5UAyDo+ICWy5MQPgEZ5+l8JQTKo= -github.com/pelletier/go-toml/v2 v2.0.0/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= @@ -848,7 +848,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ 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-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.1/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= @@ -943,7 +942,6 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf 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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/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= @@ -1077,7 +1075,6 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190530182044-ad28b68e88f1/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= @@ -1159,6 +1156,7 @@ golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAgl golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/utils/spinner.go b/utils/spinner.go index b200fad63..d8462f6e9 100644 --- a/utils/spinner.go +++ b/utils/spinner.go @@ -19,11 +19,10 @@ func (s *SpinnerUtils) StartSpinnerWithLabel(label, finalMessage string) { s.mu.Lock() defer s.mu.Unlock() - sp := spinner.New(spinner.CharSets[11], 120*time.Millisecond, spinner.WithWriter(os.Stderr), spinner.WithFinalMSG(GetSuccessMessage(finalMessage))) // Build our new spinner + sp := spinner.New(spinner.CharSets[11], 120*time.Millisecond, spinner.WithWriter(os.Stdout), spinner.WithWriter(os.Stderr), spinner.WithFinalMSG(GetSuccessMessage(finalMessage))) // Build our new spinner if label != "" { sp.Suffix = " " + label + " " } - sp.Start() // Start the spinner s.Spinner = sp } From 217b61e4da060eae3adaaebf527f97a30a0ae247 Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi Date: Sun, 29 May 2022 20:03:43 +0530 Subject: [PATCH 06/28] Revert "chore: truncate hostname if greater than 256" This reverts commit 98e92f7ca9b3059bae6ffd9d13f87bc388298047. --- command/auth/login/login_flow.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/command/auth/login/login_flow.go b/command/auth/login/login_flow.go index cd8b7a0c1..87f7ff75b 100644 --- a/command/auth/login/login_flow.go +++ b/command/auth/login/login_flow.go @@ -101,10 +101,7 @@ func fetchPAT(ctx context.Context, deviceRegistrationData *auth.Device) (*auth.P if err != nil { hostName = defaultHostName } - if len(hostName) > 256 { - hostName = hostName[:256] - } - userDescription := fmt.Sprintf("CLI : %s@%s", userName, hostName) + userDescription := fmt.Sprintf("CLI PAT for %s@%s", userName, hostName) // Fetching DeepSource client in order to interact with SDK deepsource, err := deepsource.New(deepsource.ClientOpts{ From a3ab1fa2786d1803cd521545b3ede594f41ea47f Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Wed, 8 Jun 2022 19:04:55 +0530 Subject: [PATCH 07/28] chore(verify): improve type checks in analyzer.toml and issues verification (#144) --- .github/workflows/CI.yml | 4 +- analyzers/backend/docker/build.go | 6 +- analyzers/config/config.go | 11 +- analyzers/validator/analyzer_toml.go | 86 +++++++ analyzers/validator/issues.go | 72 ++++++ .../.deepsource/analyzer/analyzer.toml | 12 +- .../.deepsource/analyzer/analyzer.toml | 4 +- .../.deepsource/analyzer/analyzer.toml | 14 +- analyzers/validator/types.go | 56 ---- analyzers/validator/utils.go | 79 ++++++ analyzers/validator/validator.go | 140 +++++----- cmd/Dockerfile_new | 2 + command/analyzer/initialize/init.go | 243 +++++++++++++----- command/analyzer/initialize/init_test.go | 113 ++++---- command/analyzer/initialize/utils.go | 104 ++++++++ command/analyzer/verify/build.go | 23 +- command/analyzer/verify/verify.go | 76 +++--- command/auth/login/login.go | 8 +- command/auth/logout/logout.go | 14 +- command/config/generate/analyzers_input.go | 8 +- command/config/generate/generate.go | 5 +- command/config/generate/generic_input.go | 7 +- command/config/generate/transformers_input.go | 2 +- .../config/types.go => types/analyzer.go | 44 ++-- utils/prompt.go | 21 +- utils/remote_resolver.go | 3 +- utils/spinner.go | 11 +- 27 files changed, 806 insertions(+), 362 deletions(-) create mode 100644 analyzers/validator/analyzer_toml.go create mode 100644 analyzers/validator/issues.go delete mode 100644 analyzers/validator/types.go create mode 100644 cmd/Dockerfile_new create mode 100644 command/analyzer/initialize/utils.go rename analyzers/config/types.go => types/analyzer.go (51%) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 1e9c9241c..e0dc92a5f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -3,9 +3,7 @@ name: CI on: pull_request: branches: - - "master" - - "dev" - - "analyzers" + - '**' push: branches: - master diff --git a/analyzers/backend/docker/build.go b/analyzers/backend/docker/build.go index a6eeec254..db046d858 100644 --- a/analyzers/backend/docker/build.go +++ b/analyzers/backend/docker/build.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "github.com/deepsourcelabs/cli/analyzers/config" + cliTypes "github.com/deepsourcelabs/cli/types" "github.com/docker/docker/api/types" "github.com/docker/docker/client" "github.com/docker/docker/pkg/archive" @@ -37,7 +37,7 @@ func (d *DockerBuildError) Error() string { return d.Message } -// Docker build API function +// BuildAnalyzerDockerImage is the docker image build API used by various CLI commands func (d *DockerClient) BuildAnalyzerDockerImage() (context.CancelFunc, io.ReadCloser, *DockerBuildError) { var err error d.Client, err = client.NewClientWithOpts(client.FromEnv) @@ -84,7 +84,7 @@ func (d *DockerClient) executeImageBuild() (context.CancelFunc, io.ReadCloser, e } // Returns the docker image details to build -func GetDockerImageDetails(analyzerTOMLData *config.AnalyzerMetadata) (string, string) { +func GetDockerImageDetails(analyzerTOMLData *cliTypes.AnalyzerTOML) (string, string) { var dockerFilePath, dockerFileName string dockerFilePath = "Dockerfile" diff --git a/analyzers/config/config.go b/analyzers/config/config.go index dee56a59a..8d486e165 100644 --- a/analyzers/config/config.go +++ b/analyzers/config/config.go @@ -8,6 +8,7 @@ import ( "path/filepath" "strings" + "github.com/deepsourcelabs/cli/types" "github.com/deepsourcelabs/cli/utils" "github.com/pelletier/go-toml/v2" ) @@ -84,9 +85,9 @@ func VerifyAnalyzerConfigs() error { } // Get the analyzer.toml data -func GetAnalyzerTOML() (*AnalyzerMetadata, error) { +func GetAnalyzerTOML() (*types.AnalyzerTOML, error) { resolveAnalyzerConfigurationPaths() - config := AnalyzerMetadata{} + config := types.AnalyzerTOML{} // Read the contents of analyzer.toml file analyzerTOMLContent, err := ioutil.ReadFile(analyzerTOMLPath) @@ -102,16 +103,16 @@ func GetAnalyzerTOML() (*AnalyzerMetadata, error) { } // Get the list of issue descriptions -func GetIssueDescriptions() (*[]AnalyzerIssue, error) { +func GetIssueDescriptions() (*[]types.AnalyzerIssue, error) { resolveAnalyzerConfigurationPaths() - issueDescriptions := []AnalyzerIssue{} + issueDescriptions := []types.AnalyzerIssue{} issuesList, err := ioutil.ReadDir(issuesDirectoryPath) if err != nil { return nil, err } for _, issuePath := range issuesList { - issue := AnalyzerIssue{} + issue := types.AnalyzerIssue{} // Set the issue shortcode as the filename issue.Shortcode = strings.TrimSuffix(issuePath.Name(), ".toml") diff --git a/analyzers/validator/analyzer_toml.go b/analyzers/validator/analyzer_toml.go new file mode 100644 index 000000000..e639218ca --- /dev/null +++ b/analyzers/validator/analyzer_toml.go @@ -0,0 +1,86 @@ +package validator + +import ( + "fmt" + "strings" + + "github.com/deepsourcelabs/cli/types" + validate "github.com/go-playground/validator/v10" +) + +var supportedEngines []string = []string{"docker"} + +func validateAnalyzerTOMLFields(config *types.AnalyzerTOML, filePath string) (*ValidationFailure, error) { + var supportedEnginesString string + analyzerTOMLValidationErrors := ValidationFailure{} + + // Validate analyzer.toml fields based on type and sanity checks + v := validate.New() + // Custom validators for shortcode and engine + v.RegisterValidation("shortcode", ValidateShortcode) + v.RegisterValidation("engine", ValidateEngine) + + // Start the validation + if err := v.Struct(config); err != nil { + // List the missing required fields + missingRequiredFields := getMissingRequiredFields(err, *config) + analyzerTOMLValidationErrors = ValidationFailure{ + File: filePath, + } + + // Find any missing "required" fields from analyzer.toml + for _, missingField := range missingRequiredFields { + analyzerTOMLValidationErrors.Errors = append(analyzerTOMLValidationErrors.Errors, ErrorMeta{ + Level: Error, + Field: missingField, + Message: fmt.Sprintf("Missing required field : %s", missingField), + }, + ) + } + + // Check if the shortcode begins with @ and the right build engine is configured + errs := err.(validate.ValidationErrors) + for _, err := range errs { + if err.Tag() == "shortcode" { + analyzerTOMLValidationErrors.Errors = append(analyzerTOMLValidationErrors.Errors, ErrorMeta{ + Level: Error, + Field: "shortcode", + Message: "Analyzer shortcode should begin with '@'", + }) + } + + if err.Tag() == "engine" { + if len(supportedEngines) > 1 { + supportedEnginesString = strings.Join(supportedEngines, ", ") + } else { + supportedEnginesString = supportedEngines[0] + } + + analyzerTOMLValidationErrors.Errors = append(analyzerTOMLValidationErrors.Errors, ErrorMeta{ + Level: Error, + Field: "engine", + Message: fmt.Sprintf("Invalid build engine \"%s\". The following build engines are supported: [%s]", config.Build.Engine, supportedEnginesString), + }) + } + } + } + if len(analyzerTOMLValidationErrors.Errors) > 0 { + return &analyzerTOMLValidationErrors, nil + } + return nil, nil +} + +// Validates if the shortcode begins with `@` +func ValidateShortcode(fl validate.FieldLevel) bool { + return strings.HasPrefix(fl.Field().String(), "@") +} + +// Validates the supported engines. As of now, only docker is supported. +func ValidateEngine(fl validate.FieldLevel) bool { + for _, supportedEngine := range supportedEngines { + if fl.Field().String() == supportedEngine { + return true + } + } + return false +} diff --git a/analyzers/validator/issues.go b/analyzers/validator/issues.go new file mode 100644 index 000000000..38372d785 --- /dev/null +++ b/analyzers/validator/issues.go @@ -0,0 +1,72 @@ +package validator + +import ( + "fmt" + "strings" + + "github.com/deepsourcelabs/cli/types" + validate "github.com/go-playground/validator/v10" +) + +var supportedIssueCategories = []string{ + "bug-risk", + "antipattern", + "security", + "style", + "performance", + "doc", + "typecheck", + "coverage", +} + +func validateIssueTOML(config *types.AnalyzerIssue, issuePath string) *ValidationFailure { + issueValidationError := ValidationFailure{} + // Validate the issue data + v := validate.New() + v.RegisterValidation("category", ValidateCategory) + if err := v.Struct(config); err != nil { + // validationFailed = true + missingRequiredFields := getMissingRequiredFields(err, *config) + issueValidationError = ValidationFailure{ + File: issuePath, + } + + // TODO: Tweak this to accomodate other error types. + for _, missingField := range missingRequiredFields { + issueValidationError.Errors = append(issueValidationError.Errors, ErrorMeta{ + Level: Error, + Field: missingField, + Message: fmt.Sprintf("Missing required field: %s", missingField), + }, + ) + } + + // Check if the category is supported + errs := err.(validate.ValidationErrors) + for _, err := range errs { + if err.Tag() == "category" { + supportedCategories := strings.Join(supportedIssueCategories, ", ") + issueValidationError.Errors = append(issueValidationError.Errors, ErrorMeta{ + Level: Error, + Field: "category", + Message: fmt.Sprintf("Invalid issue category \"%s\". The following issue categories are supported: [%s]", config.Category, supportedCategories), + }) + } + } + } + + // Return nil if no validation errors found + if len(issueValidationError.Errors) > 0 { + return &issueValidationError + } + return nil +} + +func ValidateCategory(fl validate.FieldLevel) bool { + for _, supportedCategory := range supportedIssueCategories { + if fl.Field().String() == supportedCategory { + return true + } + } + return false +} diff --git a/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/analyzer.toml b/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/analyzer.toml index 46fe5bc31..858d23e6b 100644 --- a/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/analyzer.toml +++ b/analyzers/validator/testdata/analyzer1/.deepsource/analyzer/analyzer.toml @@ -1,14 +1,14 @@ name = "todo comments checker" shortcode = "@deepsource/demo-python" description = "finds the todo comments in codebase." -category = "doc" tags = ["documentation","todo"] -environment_variables = {code_path = "/code"} -[urls] - source = "https://github.com/deepsourcelabs/2do-checker" - documentation = "https://deepsource.io/docs" - bug_tracker = "https://bugtracker.deepsource.io" +[environment_variables] + CODE_PATH = "/code" + +repository = "https://github.com/deepsourcelabs/2do-checker" +documentation = "https://deepsource.io/docs" +bug_tracker = "https://bugtracker.deepsource.io" [analysis] command = "/app/todo-checker" diff --git a/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml b/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml index 6da43b523..0c6d13c63 100644 --- a/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml +++ b/analyzers/validator/testdata/analyzer2/.deepsource/analyzer/analyzer.toml @@ -3,7 +3,9 @@ name = "Todo comments checker" description = "Finds the TODO comments in codebase." # category = "doc" tags = ["documentation","todo"] -environment_variables = {CODE_PATH = "/code"} + +[environment_variables] + CODE_PATH = "/code" [urls] source = "https://github.com/deepsourcelabs/2do-checker" diff --git a/analyzers/validator/testdata/analyzer3/.deepsource/analyzer/analyzer.toml b/analyzers/validator/testdata/analyzer3/.deepsource/analyzer/analyzer.toml index 569c8ebdf..3e95d2d98 100644 --- a/analyzers/validator/testdata/analyzer3/.deepsource/analyzer/analyzer.toml +++ b/analyzers/validator/testdata/analyzer3/.deepsource/analyzer/analyzer.toml @@ -1,14 +1,14 @@ name = "Todo comments checker" -shortcode = "@deepsource/demo-python" +shortcode = "deepsource/demo-python" description = "Finds the TODO comments in codebase." -# category = "doc" tags = ["documentation","todo"] -environment_variables = {CODE_PATH = "/code"} -[urls] - source = "https://github.com/deepsourcelabs/2do-checker" - documentation = "https://deepsource.io/docs" - bug_tracker = "https://bugtracker.deepsource.io" +[environment_variables] + CODE_PATH = "/code" + +repository = "https://github.com/deepsourcelabs/2do-checker" +documentation = "https://deepsource.io/docs" +bug_tracker = "https://bugtracker.deepsource.io" [analysis] command = "/app/todo-checker" diff --git a/analyzers/validator/types.go b/analyzers/validator/types.go deleted file mode 100644 index cb7153724..000000000 --- a/analyzers/validator/types.go +++ /dev/null @@ -1,56 +0,0 @@ -package validator - -type Analysis struct { - Command string `toml:"command" json:"command" validate:"required"` -} - -// TODO: Remove the comment when we start support for Autofix. -// type Autofix struct { -// Command string `toml:"command" json:"command" analyzertoml:"required"` -// } - -type Build struct { - Builder string `toml:"builder" json:"builder" validate:"omitempty"` - Dockerfile string `toml:"dockerfile" json:"dockerfile,omitempty" validate:"omitempty"` - Script string `toml:"script" json:"script" validate:"omitempty"` -} - -type URL struct { - Source string `toml:"source" json:"source" validate:"omitempty,url"` - Documentation string `toml:"documentation" json:"documentation,omitempty" validate:"omitempty,url"` - BugTracker string `toml:"bug_tracker" json:"bug_tracker" validate:"omitempty,url"` -} - -type Test struct { - Command string `toml:"command" json:"command" validate:"omitempty"` -} - -// analyzer.toml type -type AnalyzerMetadata struct { - // Analyzer specific data - Name string `toml:"name" json:"name" validate:"required"` - Shortcode string `toml:"shortcode" json:"shortcode" validate:"required"` // New - Description string `toml:"description" json:"description" validate:"required"` - Category string `toml:"category" json:"category" validate:"required"` - Tags []string `toml:"tags" json:"tags,omitempty" validate:"omitempty"` - URL URL `toml:"urls" json:"urls,omitempty" validate:"omitempty"` - EnvironmentVariables map[string]string `toml:"environment_variables" json:"environment_variables,omitempty" validate:"omitempty"` - - // Analyzer, Autofix and Transformer config - Analysis Analysis `toml:"analysis" json:"analysis" validate:"required"` - // Autofix Autofix `toml:"autofix" json:"autofix" validate:"omitempty"` - - // Build steps needed to build the analyzer - Build Build `toml:"build" json:"build" validate:"omitempty"` - - // Test command for running the testing workflow - Test Test `toml:"test" json:"test" validate:"omitempty"` -} - -// Analyzer issue description -type AnalyzerIssue struct { - Shortcode string `validate:"omitempty"` - Title string `toml:"title" json:"title" validate:"required"` - Description string `toml:"description" json:"description" validate:"required"` - Category string `toml:"category" json:"category" validate:"required"` -} diff --git a/analyzers/validator/utils.go b/analyzers/validator/utils.go index 873db0bed..01e91629b 100644 --- a/analyzers/validator/utils.go +++ b/analyzers/validator/utils.go @@ -1,9 +1,14 @@ package validator import ( + "errors" + "fmt" + "path" "reflect" + "strings" validate "github.com/go-playground/validator/v10" + "github.com/pelletier/go-toml/v2" ) // Returns the list of required fields from the error message returned by the `go-playground/validator` library @@ -22,3 +27,77 @@ func getMissingRequiredFields(err error, config interface{}) []string { } return missingRequiredFields } + +// Handle decoding errors reported by go-toml +func handleTOMLDecodeErrors(err error, filePath string) *ValidationFailure { + var usefulResponse, expectedType, receivedType, fieldName, decodeErrorMessage string + + // Get the DecodeError exported by go-toml + // Ref: https://pkg.go.dev/github.com/pelletier/go-toml/v2#DecodeError + var decodeErr *toml.DecodeError + if !errors.As(err, &decodeErr) { + decodeErrorMessage = err.Error() + + // Handle strict mode error when some alien fields are added in the user configured TOML + if strings.HasPrefix(err.Error(), "strict mode") { + decodeErrorMessage = fmt.Sprintf("failed to parse %s. Invalid fields detected.", path.Base(filePath)) + } + validationError := ValidationFailure{ + File: filePath, + Errors: []ErrorMeta{ + { + Level: DecodeErr, + Field: "", + Message: decodeErrorMessage, + }, + }, + } + return &validationError + } + + /* ================================================= + * Extract the data about the decoding failure and return + * a validation failure response + * ================================================= */ + + errorMessage := decodeErr.Error() + // Error case 1: `toml: cannot decode TOML integer into struct field types.AnalyzerTOML.Name of type string"` + if strings.HasPrefix(errorMessage, "toml: cannot decode TOML") { + + usefulResponse = strings.TrimPrefix(errorMessage, "toml: cannot decode TOML ") + responseArray := strings.Split(usefulResponse, " ") + + expectedType = responseArray[len(responseArray)-1] + receivedType = responseArray[0] + fieldData := responseArray[len(responseArray)-4] + index := strings.LastIndex(fieldData, ".") + fieldName = strings.ToLower(fieldData[index:]) + // Framing the decoding failure error message + decodeErrorMessage = fmt.Sprintf("expected the field \"%s\" of type %s. Got %s.", fieldName, expectedType, receivedType) + + } else if strings.HasPrefix(errorMessage, "toml: cannot store TOML") { + + // Error case 2: `toml: cannot store TOML string into a Go slice` + usefulResponse = strings.TrimPrefix(errorMessage, "toml: cannot store TOML ") + responseArray := strings.Split(usefulResponse, " ") + + expectedType = responseArray[len(responseArray)-1] + receivedType = responseArray[0] + decodeErrorMessage = fmt.Sprintf("expected type for one of the fields : %s. Received: %s.", expectedType, receivedType) + } else { + decodeErrorMessage = errorMessage + fieldName = "" + } + + validationError := ValidationFailure{ + File: filePath, + Errors: []ErrorMeta{ + { + Level: DecodeErr, + Field: fieldName, + Message: decodeErrorMessage, + }, + }, + } + return &validationError +} diff --git a/analyzers/validator/validator.go b/analyzers/validator/validator.go index 1f294c194..d88d6611f 100644 --- a/analyzers/validator/validator.go +++ b/analyzers/validator/validator.go @@ -1,6 +1,7 @@ package validator import ( + "bytes" "errors" "fmt" "io/ioutil" @@ -8,48 +9,59 @@ import ( "path/filepath" "strings" - "github.com/deepsourcelabs/cli/analyzers/config" - validate "github.com/go-playground/validator/v10" + "github.com/deepsourcelabs/cli/types" "github.com/pelletier/go-toml/v2" ) -type Error struct { - Type string +/* ================================================== + * Types used to report validation failure error data + * ================================================== */ +type ErrLevel int + +const ( + DecodeErr ErrLevel = iota + Error + Warning + Information +) + +type ErrorMeta struct { + Level ErrLevel Field string Message string } -type ValidationError struct { +type ValidationFailure struct { File string - Errors []Error + Errors []ErrorMeta } -// Receives the path of the `analyzer.toml` and issue descriptions and +// CheckForAnalyzerConfig receives the path of the `analyzer.toml` and issue descriptions and // checks if they are actually present func CheckForAnalyzerConfig(analyzerTOMLPath, issuesDirectoryPath string) (err error) { // Check if `analyzer.toml` is present in `.deepsource/analyzer` folder if _, err := os.Stat(analyzerTOMLPath); err != nil { if errors.Is(err, os.ErrNotExist) { - return errors.New("the analyzer.toml file doesn't exist\n") + return errors.New("the analyzer.toml file doesn't exist") } } // Check if `issues/` directory is present in `.deepsource/analyzer` folder and is not empty. if _, err := os.Stat(issuesDirectoryPath); err != nil { if errors.Is(err, os.ErrNotExist) { - return errors.New("the issue descriptions directory doesn't exist\n") + return errors.New("the issue descriptions directory doesn't exist") } } // Check if there are any toml files in the `issues/` directory files, err := ioutil.ReadDir(issuesDirectoryPath) if err != nil { - return fmt.Errorf("failed to read the files present in the issues directory at %s\n", issuesDirectoryPath) + return fmt.Errorf("failed to read the files present in the issues directory at %s", issuesDirectoryPath) } // Check if its an empty directory if len(files) < 1 { - return fmt.Errorf("found 0 issues configured in the issues directory at %s\n", issuesDirectoryPath) + return fmt.Errorf("found 0 issues configured in the issues directory at %s", issuesDirectoryPath) } tomlPresent := false @@ -61,55 +73,48 @@ func CheckForAnalyzerConfig(analyzerTOMLPath, issuesDirectoryPath string) (err e } } if !tomlPresent { - return fmt.Errorf("found no toml files in the issues directory at %s\n", issuesDirectoryPath) + return fmt.Errorf("found no toml files in the issues directory at %s", issuesDirectoryPath) } return } -// Validates analyzer.toml file -func ValidateAnalyzerTOML(analyzerTOMLPath string) (*config.AnalyzerMetadata, *ValidationError, error) { - config := config.AnalyzerMetadata{} - analyzerTOMLValidationErrors := ValidationError{} +// ValidateAnalyzerTOML receives the path of analyzer.toml and reads as well as validates it for +// the type checks, required fields etc. Returns the analyzer.toml content and the validation failures +// if any in the form of ValidationFailure struct. +func ValidateAnalyzerTOML(analyzerTOMLPath string) (*types.AnalyzerTOML, *ValidationFailure, error) { + config := types.AnalyzerTOML{} // Read the contents of analyzer.toml file analyzerTOMLContent, err := ioutil.ReadFile(analyzerTOMLPath) if err != nil { - return &config, nil, errors.New("failed to read analyzer.toml file") - } - - // Unmarshal TOML into config - if err = toml.Unmarshal(analyzerTOMLContent, &config); err != nil { - return &config, nil, err + return nil, nil, errors.New("failed to read analyzer.toml file") } - // Validate analyzer.toml fields based on type and sanity checks - v := validate.New() - if err := v.Struct(&config); err != nil { - missingRequiredFields := getMissingRequiredFields(err, config) - analyzerTOMLValidationErrors = ValidationError{ - File: analyzerTOMLPath, - } - - // TODO: Tweak this to accomodate other error types. - for _, missingField := range missingRequiredFields { - analyzerTOMLValidationErrors.Errors = append(analyzerTOMLValidationErrors.Errors, Error{ - Type: "ERROR", - Field: missingField, - Message: "Missing required field", - }, - ) + // Decode the TOML into the struct + d := toml.NewDecoder(bytes.NewBuffer(analyzerTOMLContent)) + d.DisallowUnknownFields() + if err := d.Decode(&config); err != nil { + decodeErrorResp := handleTOMLDecodeErrors(err, analyzerTOMLPath) + if decodeErrorResp != nil { + return nil, decodeErrorResp, nil } - return &config, &analyzerTOMLValidationErrors, nil + return nil, nil, err } - return &config, nil, nil + // Validate the analyzer.toml fields for default/custom type checks, required fields + analyzerTOMLValidationErrors, err := validateAnalyzerTOMLFields(&config, analyzerTOMLPath) + if err != nil { + return nil, nil, err + } + return &config, analyzerTOMLValidationErrors, nil } -// Validates issue description TOML files -func ValidateIssueDescriptions(issuesDirectoryPath string) (*[]ValidationError, error) { - validationFailed := false - issueValidationErrors := []ValidationError{} +// ValidateIssueDescriptions receives the path of issues directory for reading and validating them +// for type checks and required fields. Returns an array of ValidationFailure struct containing +// validation errors for each issue TOML file. +func ValidateIssueDescriptions(issuesDirectoryPath string) (*[]ValidationFailure, error) { + issueValidationErrors := []ValidationFailure{} // TODO: List only TOML files here issuesList, err := ioutil.ReadDir(issuesDirectoryPath) @@ -117,10 +122,11 @@ func ValidateIssueDescriptions(issuesDirectoryPath string) (*[]ValidationError, return nil, err } + // Iterate over the issues one by one, read and decode them, validate the fields and return the + // validation result. for _, issuePath := range issuesList { - config := AnalyzerIssue{} - // Set the issue shortcode as the filename + config := types.AnalyzerIssue{} config.Shortcode = strings.TrimSuffix(issuePath.Name(), ".toml") // Read the contents of issue toml file @@ -129,35 +135,23 @@ func ValidateIssueDescriptions(issuesDirectoryPath string) (*[]ValidationError, return nil, fmt.Errorf("failed to read file: %s", filepath.Join(issuesDirectoryPath, issuePath.Name())) } - // Unmarshal TOML into config - if err = toml.Unmarshal(issueTOMLContent, &config); err != nil { - return nil, err - } - - // Validate the data - v := validate.New() - if err := v.Struct(&config); err != nil { - validationFailed = true - missingRequiredFields := getMissingRequiredFields(err, config) - issueValidationError := ValidationError{ - File: issuePath.Name(), + // Decode the TOML content into the AnalyzerIssue struct object + d := toml.NewDecoder(bytes.NewBuffer(issueTOMLContent)) + d.DisallowUnknownFields() + if err = d.Decode(&config); err != nil { + decodeErrorResp := handleTOMLDecodeErrors(err, issuePath.Name()) + if decodeErrorResp != nil { + // Append the error to the array created for reporting issue validation errors and return it + issueValidationErrors = append(issueValidationErrors, *decodeErrorResp) + continue } - - // TODO: Tweak this to accomodate other error types. - for _, missingField := range missingRequiredFields { - issueValidationError.Errors = append(issueValidationError.Errors, Error{ - Type: "ERROR", - Field: missingField, - Message: "Missing required field", - }, - ) - } - issueValidationErrors = append(issueValidationErrors, issueValidationError) } - } - if validationFailed { - return &issueValidationErrors, nil + // Validate the analyzer.toml fields for default/custom type checks, required fields + issueValidationError := validateIssueTOML(&config, issuePath.Name()) + if issueValidationError != nil { + issueValidationErrors = append(issueValidationErrors, *issueValidationError) + } } - return nil, nil + return &issueValidationErrors, nil } diff --git a/cmd/Dockerfile_new b/cmd/Dockerfile_new new file mode 100644 index 000000000..611fc0609 --- /dev/null +++ b/cmd/Dockerfile_new @@ -0,0 +1,2 @@ + +FROM alpine diff --git a/command/analyzer/initialize/init.go b/command/analyzer/initialize/init.go index 0b66c7b32..5395f0b01 100644 --- a/command/analyzer/initialize/init.go +++ b/command/analyzer/initialize/init.go @@ -2,10 +2,8 @@ package initialize import ( "bytes" - "errors" "fmt" "os" - "path/filepath" "strings" "github.com/pelletier/go-toml" @@ -13,7 +11,7 @@ import ( "github.com/spf13/cobra" "github.com/deepsourcelabs/cli/analyzers/config" - validator "github.com/deepsourcelabs/cli/analyzers/validator" + "github.com/deepsourcelabs/cli/types" "github.com/deepsourcelabs/cli/utils" ) @@ -22,27 +20,35 @@ type SDKResponse struct { SDKLanguage string } +type InputPrompt interface { + ConfirmFromUser(string, string) (bool, error) + GetSingleLineInput(string, string, string) (string, error) + SelectFromOptions(string, string, []string) (string, error) +} + type AnalyzerInitOpts struct { + Namespace string + AnalyzerName string SDKInput SDKResponse ProjectRootPath string AnalyzerTOMLPath string - AnalyzerTOMLData validator.AnalyzerMetadata IssuesDirectoryPath string AnalyzerShortcodeArg string - - ConfirmationPrompt func(string, string) (bool, error) - SingleLineInputPrompt func(string, string, string) (string, error) - DescriptionPrompt func(string, string, string) (string, error) - SingleOptionPrompt func(string, string, []string) (string, error) + AnalyzerTOMLData types.AnalyzerTOML + PromptUtils InputPrompt } +/* ============================================================= + * $ deepsource analyzer init + * + * Helps in initializing the config for a new DeepSource Analyzer + * ============================================================== */ func NewCmdAnalyzerInit() *cobra.Command { cwd, _ := os.Getwd() + opts := AnalyzerInitOpts{ - SingleLineInputPrompt: utils.GetSingleLineInput, - DescriptionPrompt: utils.GetSingleLineInput, - ConfirmationPrompt: utils.ConfirmFromUser, - SingleOptionPrompt: utils.SelectFromOptions, + PromptUtils: utils.UserInputPrompt{}, + AnalyzerShortcodeArg: "", } // Fetch the project root path and analyzer.toml path @@ -51,17 +57,23 @@ func NewCmdAnalyzerInit() *cobra.Command { cmd := &cobra.Command{ Use: "init", Short: "Initialize DeepSource Analyzer", - Args: utils.ExactArgs(1), + Args: utils.MaxNArgs(1), RunE: func(_ *cobra.Command, args []string) error { - // Check if the analyzer.toml already exists. If yes, display that the analyzer already initialized at `.deepsource/analyzer/analyzer.toml` + // Check if the analyzer.toml already exists. + // If yes, display that the analyzer already initialized at `.deepsource/analyzer/analyzer.toml` if _, err := os.Stat(opts.AnalyzerTOMLPath); err == nil { pterm.Info.Printf("Analyzer already initialized at %s. Exiting...\n", strings.TrimPrefix(opts.AnalyzerTOMLPath, cwd+"/")) return nil } + // Check for the shortcode argument (if any) if len(args) > 0 { opts.AnalyzerShortcodeArg = args[0] + if !strings.HasPrefix(opts.AnalyzerShortcodeArg, "@") { + opts.AnalyzerShortcodeArg = strings.ToLower("@" + opts.AnalyzerShortcodeArg) + } } + analysisConfigBytes, err := opts.initAnalyzer() if err != nil { return fmt.Errorf("Analyzer initialization failed. Error: %s", err) @@ -69,90 +81,191 @@ func NewCmdAnalyzerInit() *cobra.Command { if err = opts.writeAnalyzerTOMLConfig(analysisConfigBytes); err != nil { return fmt.Errorf("Analyzer initialization failed. Error: %s", err) } - pterm.Success.Printf("Analyzer %s set up successfully!\n", opts.AnalyzerTOMLData.Shortcode) + pterm.Success.Printf("Analyzer %s initialized successfully!\n", opts.AnalyzerTOMLData.Shortcode) return nil }, } return cmd } -// Initialize the Analyzer +// initAnalyzer helps the Analyzer authors initialize a new Analyzer +// in an interactive way with the help of suitable prompts func (a *AnalyzerInitOpts) initAnalyzer() (*bytes.Buffer, error) { - var err error - var msg, helpText string - supportedSDKS := getSupportedSDKs() + // If the user didn't add an Analyzer shortcode argument to the command and + // just ran `deepsource analyzer init`, input the Namespace and Analyzer name from the user + // and create the Analyzer shortcode in the format : @/ + if a.AnalyzerShortcodeArg == "" { + if err := a.fetchNamespaceAndAnalyzerName(); err != nil { + return nil, err + } + } - pterm.Info.Printf("Initializing analyzer %s...\n", a.AnalyzerShortcodeArg) a.AnalyzerTOMLData.Shortcode = strings.ToLower(a.AnalyzerShortcodeArg) + pterm.Info.Printf("Initializing analyzer %s...\n", a.AnalyzerTOMLData.Shortcode) - // Fetch the default analyzer name from the shortcode - // Eg: @deepsource/armory -> Armory - defaultAnalyzerName := strings.Title(strings.SplitAfter(a.AnalyzerTOMLData.Shortcode, "/")[1]) // skipcq: SCC-SA1019 + // Collect Analyzer name and description + if err := a.fetchAnalyzerDisplayNameAndDescription(); err != nil { + return nil, err + } - // Collect name of the Analyzer - msg = "Please enter the name of the Analyzer?" - helpText = "The name of the Analyzer." - if a.AnalyzerTOMLData.Name, err = a.SingleLineInputPrompt(msg, helpText, defaultAnalyzerName); err != nil { + // Collect Analyzer tags + if err := a.fetchTags(); err != nil { return nil, err } - // Collect description of the Analyzer - msg = "Description of the Analyzer?" - helpText = "What does the Analyzer do?" - if a.AnalyzerTOMLData.Description, err = a.DescriptionPrompt(msg, helpText, ""); err != nil { + // Collect the required URLs (git repository URL for example) + if err := a.fetchURLs(); err != nil { return nil, err } - if len(supportedSDKS) > 0 { - // Check if DeepSource SDK is needed or not? - msg = "Would you like to use DeepSource Analyzer SDK to build your Analyzer?" - helpText = "DeepSource SDKs help you to easily create an Analyzer" - if a.SDKInput.SDKRequired, err = a.ConfirmationPrompt(msg, helpText); err != nil { - return nil, err - } + // Collect the required analysis and test commands + if err := a.fetchCommands(); err != nil { + return nil, err + } - if a.SDKInput.SDKRequired { - msg = "Which language do you want the SDK for:" - helpText = "Choose the language for which the SDK will be generated" - if a.SDKInput.SDKLanguage, err = a.SingleOptionPrompt(msg, helpText, supportedSDKS); err != nil { - return nil, err - } - } + // Collect the SDKs to use + if err := a.fetchSDKInput(); err != nil { + return nil, err } + // Setting build.engine as "docker" + // TODO(SNT): Remove this once more than one build engines are supported. + a.AnalyzerTOMLData.Build.Engine = "docker" + // Encoding the struct to TOML // and storing in GeneratedConfig of Options struct var buf bytes.Buffer - if err = toml.NewEncoder(&buf).Order(toml.OrderPreserve).Encode(a.AnalyzerTOMLData); err != nil { + if err := toml.NewEncoder(&buf).Order(toml.OrderPreserve).Encode(a.AnalyzerTOMLData); err != nil { return nil, err } - return &buf, nil } -// Writes the Analyzer TOML data to the file -func (a *AnalyzerInitOpts) writeAnalyzerTOMLConfig(buf *bytes.Buffer) (err error) { - // Create the .deepsource/analyzer directory and issues/ directory - directoriesToCreate := []string{".deepsource", ".deepsource/analyzer", ".deepsource/analyzer/issues/"} +/* Input the namespace and Analyzer name from the user in case the user didn't mention it as an + * argument to the `deepsource analyzer init` command */ +func (a *AnalyzerInitOpts) fetchNamespaceAndAnalyzerName() (err error) { + // TODO(SNT): Change this to use a public API to show a list of namespaces the user has access to. + msg := "Namespace" + helpText := "The namespace to which the Analyzer will be associated." + if a.Namespace, err = a.PromptUtils.GetSingleLineInput(msg, helpText, ""); err != nil { + return err + } - // Create the required directories mentioned above - for _, dir := range directoriesToCreate { - if _, err := os.Stat(filepath.Join(a.ProjectRootPath, dir)); errors.Is(err, os.ErrNotExist) { - if err = os.Mkdir(filepath.Join(a.ProjectRootPath, dir), 0o750); err != nil { - return err - } - } + // Check for empty namespace and return error + if a.Namespace == "" { + return fmt.Errorf("namespace cannot be empty") + } + + // Sanitize the namespace + a.Namespace = sanitizeInput(a.Namespace) + + // Input shortcode of the Analyzer. + msg = "Name of the Analyzer" + helpText = "Name of the Analyzer. This is to be used to access the Analyzer as: @/." + if a.AnalyzerName, err = a.PromptUtils.GetSingleLineInput(msg, helpText, ""); err != nil { + return err + } + + // Check for empty shortcode and return error. + if a.AnalyzerName == "" { + return fmt.Errorf("Analyzer name cannot be empty") + } + + // Sanitize the Analyzer name + a.AnalyzerName = sanitizeInput(a.AnalyzerName) + + a.AnalyzerShortcodeArg = strings.ToLower("@" + a.Namespace + "/" + a.AnalyzerName) + return +} + +// fetchAnalyzerDisplayNameAndDescription collects input for the Analyzer display name and description from the Analyzer author +func (a *AnalyzerInitOpts) fetchAnalyzerDisplayNameAndDescription() (err error) { + // Fetch the default analyzer name from the shortcode + // Eg: @deepsource/armory -> Armory + defaultAnalyzerName := strings.Title(strings.Split(a.AnalyzerTOMLData.Shortcode, "/")[1]) // skipcq: SCC-SA1019 + + // Collect name of the Analyzer + msg := "Display name of the Analyzer" + helpText := "The name of the Analyzer which will be displayed on the dashboard." + if a.AnalyzerTOMLData.Name, err = a.PromptUtils.GetSingleLineInput(msg, helpText, defaultAnalyzerName); err != nil { + return err } - // Write the input data to analyzer.toml - if err = os.WriteFile(a.AnalyzerTOMLPath, buf.Bytes(), 0o644); err != nil { + // Collect description of the Analyzer + msg = "Description of the Analyzer" + helpText = "Explain what the Analyzer does and the kinds of issues it detects." + if a.AnalyzerTOMLData.Description, err = a.PromptUtils.GetSingleLineInput(msg, helpText, ""); err != nil { + return err + } + return nil +} + +// fetchTags collects input for any tags/keywords that the Analyzer author would like to +// configure for the Analyzer +func (a *AnalyzerInitOpts) fetchTags() error { + msg := "Tags for the Analyzer (comma or space separated)" + helpText := "Some keywords related to the Analyzer. Use commas/spaces to separate the keywords." + analyzerTags, err := a.PromptUtils.GetSingleLineInput(msg, helpText, "") + if err != nil { + return err + } + + // Parse tags from the user input + a.AnalyzerTOMLData.Tags = processAnalyzerTags(analyzerTags) + return nil +} + +// fetchURLs collects the git repository URL of the Analyzer +func (a *AnalyzerInitOpts) fetchURLs() error { + defaultRemoteURL, err := fetchRemoteURL() + if err != nil { + defaultRemoteURL = "" + } + msg := "Git repository URL of the Analyzer?" + helpText := "The remote repository URL of the Analyzer." + if a.AnalyzerTOMLData.Repository, err = a.PromptUtils.GetSingleLineInput(msg, helpText, strings.TrimRight(defaultRemoteURL, "\n")); err != nil { + return err + } + return nil +} + +// fetchCommands fetches the analysis and test command that the Analyzer author wants to configure +func (a *AnalyzerInitOpts) fetchCommands() (err error) { + // Collect the analysis command of the Analyzer + msg := "Analysis command for the Analyzer" + helpText := "The command used to execute the Analyzer" + if a.AnalyzerTOMLData.Analysis.Command, err = a.PromptUtils.GetSingleLineInput(msg, helpText, ""); err != nil { + return err + } + + // Collect the test command of the Analyzer + msg = "Test command for the Analyzer" + helpText = "The command used to run tests on the Analyzer" + if a.AnalyzerTOMLData.Test.Command, err = a.PromptUtils.GetSingleLineInput(msg, helpText, ""); err != nil { return err } return } -// Returns the list of supported SDKs -// TODO: Send the list of supported SDKs from here once we start supporting any -func getSupportedSDKs() []string { - return []string{""} +// fetchSDKInput fetches the user input for the DeepSource Analyzer SDKs the Analyzer author wants to +// use for the Analyzer +func (a *AnalyzerInitOpts) fetchSDKInput() (err error) { + supportedSDKS := getSupportedSDKs() + if len(supportedSDKS) > 0 { + // Check if DeepSource SDK is needed or not? + msg := "Would you like to use DeepSource Analyzer SDK to build your Analyzer?" + helpText := "DeepSource SDKs help you to easily create an Analyzer" + if a.SDKInput.SDKRequired, err = a.PromptUtils.ConfirmFromUser(msg, helpText); err != nil { + return err + } + + if a.SDKInput.SDKRequired { + msg := "Which language do you want the SDK for:" + helpText := "Choose the language for which the SDK will be generated" + if a.SDKInput.SDKLanguage, err = a.PromptUtils.SelectFromOptions(msg, helpText, supportedSDKS); err != nil { + return err + } + } + } + return } diff --git a/command/analyzer/initialize/init_test.go b/command/analyzer/initialize/init_test.go index ac63097eb..a066b40b0 100644 --- a/command/analyzer/initialize/init_test.go +++ b/command/analyzer/initialize/init_test.go @@ -2,97 +2,104 @@ package initialize import ( "reflect" + "strings" "testing" ) -var ( - singleLineInputResponse, descriptionInputResponse, singleOptionPromptResponse string - confirmationResponse bool -) - -func mockGetSingleLineInput(string, string, string) (string, error) { - return singleLineInputResponse, nil -} - -func mockDescriptionPrompt(string, string, string) (string, error) { - return descriptionInputResponse, nil -} - -func mockConfirmFromUser(string, string) (bool, error) { - return confirmationResponse, nil -} - -func mockSingleOptionPrompt(string, string, []string) (string, error) { - return singleOptionPromptResponse, nil -} - -type Test struct { +type MockInputPrompt struct { AnalyzerShortcode string AnalyzerName string AnalyzerDescription string + AnalyzerTags string + Repository string + AnalysisCommand string + TestCommand string SDKRequired bool SDKLanguage string ExpectedConfig string } -func TestInitAnalyzer(t *testing.T) { - // Creating an instance of AnalyzerInitOpts - - opts := AnalyzerInitOpts{ - SingleLineInputPrompt: mockGetSingleLineInput, - DescriptionPrompt: mockDescriptionPrompt, - ConfirmationPrompt: mockConfirmFromUser, - SingleOptionPrompt: mockSingleOptionPrompt, +func (m MockInputPrompt) GetSingleLineInput(msg, _, _ string) (string, error) { + if strings.Contains(msg, "Display name") { + return m.AnalyzerName, nil + } + if strings.Contains(msg, "Description") { + return m.AnalyzerDescription, nil + } + if strings.Contains(msg, "Tags") { + return m.AnalyzerTags, nil + } + if strings.Contains(msg, "Git repository") { + return m.Repository, nil } + if strings.Contains(msg, "Analysis command") { + return m.AnalysisCommand, nil + } + if strings.Contains(msg, "Test command") { + return m.TestCommand, nil + } + return "", nil +} + +func (m MockInputPrompt) ConfirmFromUser(_, _ string) (bool, error) { + return m.SDKRequired, nil +} + +func (m MockInputPrompt) SelectFromOptions(_, _ string, _ []string) (string, error) { + return m.SDKLanguage, nil +} - testCases := []Test{ +func TestInitAnalyzer(t *testing.T) { + testCases := []MockInputPrompt{ { AnalyzerShortcode: "@deepsource/demo-python", AnalyzerName: "Python Analyzer", AnalyzerDescription: "This is a python analyzer", + AnalyzerTags: "python, analyzer, static-analysis", + Repository: "https://github.com/deepsourcelabs/demo-python", + AnalysisCommand: "./analysis.sh", + TestCommand: "./test-command.sh", SDKRequired: false, SDKLanguage: "", ExpectedConfig: `name = "Python Analyzer" shortcode = "@deepsource/demo-python" description = "This is a python analyzer" -category = "" -tags = [] - -[urls] - source = "" - documentation = "" - bug_tracker = "" +tags = ["python", "analyzer", "static-analysis"] +repository = "https://github.com/deepsourcelabs/demo-python" +documentation = "" +bug_tracker = "" [environment_variables] [analysis] - command = "" + command = "./analysis.sh" [build] - builder = "" + engine = "docker" dockerfile = "" script = "" [test] - command = "" + command = "./test-command.sh" `, }, { AnalyzerShortcode: "@deepsource/demo-go", AnalyzerName: "Go Analyzer", AnalyzerDescription: "This is a golang analyzer", + AnalyzerTags: "golang go analyzer static-analysis", + Repository: "https://gitlab.com/deepsourcelabs/demo-go", + AnalysisCommand: "", + TestCommand: "", SDKRequired: true, SDKLanguage: "Go", ExpectedConfig: `name = "Go Analyzer" shortcode = "@deepsource/demo-go" description = "This is a golang analyzer" -category = "" -tags = [] - -[urls] - source = "" - documentation = "" - bug_tracker = "" +tags = ["golang", "go", "analyzer", "static-analysis"] +repository = "https://gitlab.com/deepsourcelabs/demo-go" +documentation = "" +bug_tracker = "" [environment_variables] @@ -100,7 +107,7 @@ tags = [] command = "" [build] - builder = "" + engine = "docker" dockerfile = "" script = "" @@ -111,12 +118,10 @@ tags = [] } for _, tc := range testCases { + opts := AnalyzerInitOpts{ + PromptUtils: tc, + } opts.AnalyzerShortcodeArg = tc.AnalyzerShortcode - singleLineInputResponse = tc.AnalyzerName - descriptionInputResponse = tc.AnalyzerDescription - confirmationResponse = tc.SDKRequired - singleOptionPromptResponse = tc.SDKLanguage - buf, err := opts.initAnalyzer() if err != nil { t.Error(err) diff --git a/command/analyzer/initialize/utils.go b/command/analyzer/initialize/utils.go new file mode 100644 index 000000000..ff23ea694 --- /dev/null +++ b/command/analyzer/initialize/utils.go @@ -0,0 +1,104 @@ +package initialize + +import ( + "bytes" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" +) + +// Contains the list of supported SDKs for building DeepSource Analyzers +var supportedAnalyzerSDKs = []string{} + +func processAnalyzerTags(userInput string) []string { + re := regexp.MustCompile("[ ,]") + return delete_empty(re.Split(userInput, -1)) +} + +func delete_empty(s []string) []string { + var r []string + for _, str := range s { + if str != "" { + r = append(r, str) + } + } + return r +} + +func fetchRemoteURL() (string, error) { + var remoteRepoURL string + + // TODO: Add support for fetching URLs for other remotes here as well + remoteURL, err := exec.Command("git", "config", "--get", "remote.origin.url").Output() + if err != nil { + return "", err + } + remoteRepoURL = strings.TrimRight(string(remoteURL), "\000\n") + + // Return the remoteURL if it already begins with `https://` + if strings.HasPrefix(remoteRepoURL, "https://") { + return remoteRepoURL, nil + } + + // If the URL doesn't begin with `git@` don't move further and send an empty default remoteURL + if !strings.HasPrefix(remoteRepoURL, "git@") { + return "", fmt.Errorf("couldn't parse the default remote URL") + } + + // If the URL begins with `git@`, extract the substring till the colon(:) in the remote URL + colonIndex := strings.Index(remoteRepoURL, ":") + if colonIndex == -1 { + return remoteRepoURL, fmt.Errorf("couldn't parse the default remote URL") + } + + vcsURL := remoteRepoURL[:colonIndex] + switch vcsURL { + case "git@github.com": + urlComponent := strings.TrimPrefix(remoteRepoURL, "git@github.com:") + remoteRepoURL = "https://github.com/" + urlComponent + case "git@gitlab.com": + urlComponent := strings.TrimPrefix(remoteRepoURL, "git@gitlab.com:") + remoteRepoURL = "https://gitlab.com/" + urlComponent + case "git@bitbucket.org": + urlComponent := strings.TrimPrefix(remoteRepoURL, "git@bitbucket.org:") + remoteRepoURL = "https://bitbucket.org/" + urlComponent + } + return strings.TrimSuffix(remoteRepoURL, ".git"), nil +} + +// Returns the list of supported SDKs +func getSupportedSDKs() []string { + return supportedAnalyzerSDKs +} + +// Sanitize the input of namespace and Analyzer shortcode for any spaces +// or special characters and replace them with hyphen +func sanitizeInput(input string) string { + re := regexp.MustCompile("[^a-zA-Z0-9_]+") + return re.ReplaceAllString(input, "-") +} + +// Writes the Analyzer TOML data to the file +func (a *AnalyzerInitOpts) writeAnalyzerTOMLConfig(buf *bytes.Buffer) (err error) { + // Create the .deepsource/analyzer directory and issues/ directory + directoriesToCreate := []string{".deepsource", ".deepsource/analyzer", ".deepsource/analyzer/issues/"} + + // Create the required directories mentioned above + for _, dir := range directoriesToCreate { + if _, err := os.Stat(filepath.Join(a.ProjectRootPath, dir)); errors.Is(err, os.ErrNotExist) { + if err = os.Mkdir(filepath.Join(a.ProjectRootPath, dir), 0o750); err != nil { + return err + } + } + } + + // Write the input data to analyzer.toml + if err = os.WriteFile(a.AnalyzerTOMLPath, buf.Bytes(), 0o750); err != nil { + return err + } + return +} diff --git a/command/analyzer/verify/build.go b/command/analyzer/verify/build.go index 6f69192c1..481065492 100644 --- a/command/analyzer/verify/build.go +++ b/command/analyzer/verify/build.go @@ -29,14 +29,19 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzerDockerBuild() (err error) { * Check for the presence of `build.Dockerfile` or if not a `Dockerfile` in the current working directory */ if _, err := os.Stat(a.Build.DockerFilePath); err != nil { if errors.Is(err, os.ErrNotExist) { - a.Spinner.StopSpinnerWithError("Failed to build the image", fmt.Errorf("%s not found\n", a.Build.DockerFilePath)) + if a.Build.VerboseMode { + msg := utils.GetFailureMessage("Failed to build the image", fmt.Sprintf("%s not found", a.Build.DockerFilePath)) + fmt.Println(msg) + return fmt.Errorf(msg) + } + a.Spinner.StopSpinnerWithError("Failed to build the image", fmt.Errorf("%s not found", a.Build.DockerFilePath)) return err } } - /* /////////////////////////////////// + /* =================================== * Analyzer docker build verification - * /////////////////////////////////// */ + * =================================== */ /* Initialize the builder with the above fetched details * Use the `GenerateImageVersion` utility to generate a random string of length 7 to tag the image */ @@ -51,8 +56,12 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzerDockerBuild() (err error) { ctxCancelFunc, buildRespReader, buildErr := analyzerBuilder.BuildAnalyzerDockerImage() // Cancel the build context and close the reader before exiting this function - defer buildRespReader.Close() - defer ctxCancelFunc() + if buildRespReader != nil { + defer buildRespReader.Close() + } + if ctxCancelFunc != nil { + defer ctxCancelFunc() + } if buildErr != nil { a.handleBuildError(buildErr) @@ -67,7 +76,7 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzerDockerBuild() (err error) { // In case of verbose mode, no need to stop the spinner if a.Build.VerboseMode { - fmt.Print(utils.GetSuccessMessage("Successfully built the Analyzer image")) + fmt.Print(utils.GetSuccessMessage("Successfully built the Analyzer image\n")) return nil } a.Spinner.StopSpinner() @@ -77,7 +86,7 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzerDockerBuild() (err error) { // Utility to handle the output in case of build errors for different modes func (a *AnalyzerVerifyOpts) handleBuildError(buildError error) { if a.Build.VerboseMode { - fmt.Println(utils.GetFailureMessage("Failed to build the image", buildError.Error())) + fmt.Printf("%s\n", utils.GetFailureMessage("Failed to build the image", buildError.Error())) return } a.Spinner.StopSpinnerWithError("Failed to build the image", fmt.Errorf(buildError.Error())) diff --git a/command/analyzer/verify/verify.go b/command/analyzer/verify/verify.go index c89e22a7f..c1a39094b 100644 --- a/command/analyzer/verify/verify.go +++ b/command/analyzer/verify/verify.go @@ -5,9 +5,10 @@ import ( "fmt" "path/filepath" - "github.com/deepsourcelabs/cli/analyzers/config" "github.com/deepsourcelabs/cli/analyzers/validator" + "github.com/deepsourcelabs/cli/types" "github.com/deepsourcelabs/cli/utils" + "github.com/pterm/pterm" "github.com/spf13/cobra" ) @@ -24,14 +25,14 @@ type AnalyzerBuild struct { } type AnalyzerVerifyOpts struct { - AnalyzerTOMLData *config.AnalyzerMetadata + AnalyzerTOMLData *types.AnalyzerTOML Build AnalyzerBuild Spinner *utils.SpinnerUtils } -/* //////////////////////////////////// +/* ====================================== * $ deepsource analyzer verify - * /////////////////////////////////// */ + * ====================================== */ func NewCmdAnalyzerVerify() *cobra.Command { // Configuring the paths of analyzer.toml and issues directory @@ -54,8 +55,9 @@ func NewCmdAnalyzerVerify() *cobra.Command { Args: utils.NoArgs, RunE: func(_ *cobra.Command, _ []string) error { if err := opts.verifyAnalyzer(); err != nil { - return errors.New("Analyzer verification failed. Exiting...") + return errors.New("Analyzer verification failed. Exiting.") } + pterm.Success.Println("Analyzer verification successful!") return nil }, } @@ -65,21 +67,21 @@ func NewCmdAnalyzerVerify() *cobra.Command { return cmd } -/* //////////////////////////////////// +/* ==================================== * Analyzer configuration verification - * /////////////////////////////////// */ + * ==================================== */ func (a *AnalyzerVerifyOpts) verifyAnalyzer() (err error) { - var validationErrors *[]validator.ValidationError - var analyzerTOMLValidationErrors *validator.ValidationError + var analyzerTOMLValidationErrors *validator.ValidationFailure + var issuesValidationErrors *[]validator.ValidationFailure configurationValid := true - /* ////////////////////////////////////////////////////////////////////////////////// + /* ================================================================================== * Checks for the presence of .deepsource/analyzer directory, * the analyzer.toml file and issues present in .deepsource/analyzer/issues directory - * /////////////////////////////////////////////////////////////////////////////////// */ + * ================================================================================== */ - a.Spinner.StartSpinnerWithLabel("Checking for presence of analyzer.toml and issue descriptions...", "Yay!!Found analyzer.toml and issue descriptions.") + a.Spinner.StartSpinnerWithLabel("Checking for presence of analyzer.toml and issue descriptions...", "Found analyzer.toml and issue descriptions") if err = validator.CheckForAnalyzerConfig(analyzerTOMLPath, issuesDirPath); err != nil { configurationValid = false a.Spinner.StopSpinnerWithError("Failed to locate analyzer configurations", err) @@ -87,43 +89,47 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzer() (err error) { } a.Spinner.StopSpinner() - /* /////////////////////////////// + /* ============================== * Read and verify analyzer.toml - * ////////////////////////////// */ + * ============================== */ a.Spinner.StartSpinnerWithLabel("Validating analyzer.toml...", "Verified analyzer.toml") a.AnalyzerTOMLData, analyzerTOMLValidationErrors, err = validator.ValidateAnalyzerTOML(analyzerTOMLPath) - if len(analyzerTOMLValidationErrors.Errors) > 0 { + // TODO: Handle err here + if err != nil { configurationValid = false - a.Spinner.StopSpinnerWithError("Failed to verify analyzer.toml\n", err) + a.Spinner.StopSpinnerWithError("Failed to verify analyzer.toml", err) + } + + // Check for validation errors in analyzer.toml and display them (if any) + if analyzerTOMLValidationErrors != nil && len(analyzerTOMLValidationErrors.Errors) > 0 { + configurationValid = false + a.Spinner.StopSpinnerWithError("Failed to verify analyzer.toml", err) for _, err := range analyzerTOMLValidationErrors.Errors { - msg := fmt.Sprintf("%s : %s", err.Message, err.Field) - failureMsg := utils.GetFailureMessage(msg, "") - fmt.Printf(" * %s\n", failureMsg) + fmt.Printf(" %s\n", utils.GetBulletMessage(err.Message, "red")) } } a.Spinner.StopSpinner() - /* ////////////////////////////////////// - * Reads and verifies issue descriptions - * ///////////////////////////////////// */ + /* ==================================== + * Read and verify issue descriptions + * ==================================== */ a.Spinner.StartSpinnerWithLabel("Validating issue descriptions...", "Verified issue descriptions") - if validationErrors, err = validator.ValidateIssueDescriptions(issuesDirPath); err != nil { + if issuesValidationErrors, err = validator.ValidateIssueDescriptions(issuesDirPath); err != nil { configurationValid = false - a.Spinner.StopSpinnerWithError("Failed to validate the following issue desriptions", err) + a.Spinner.StopSpinnerWithError("Failed to validate the issues", err) } - // Check if there are any validation errors in issue descriptions - if validationErrors != nil { + // Check for validation errors in analyzer issues and display them (if any) + if issuesValidationErrors != nil && len(*issuesValidationErrors) > 0 { configurationValid = false - a.Spinner.StopSpinnerWithError("Failed to validate the following issue descriptions\n", err) - for _, validationError := range *validationErrors { - fmt.Printf(" * %s\n", validationError.File) + a.Spinner.StopSpinnerWithError("Failed to validate the following issues", err) + for _, validationError := range *issuesValidationErrors { + fmt.Printf(" > %s\n", validationError.File) for _, err := range validationError.Errors { - msg := fmt.Sprintf("%s : %s", err.Message, err.Field) - failureMsg := utils.GetFailureMessage(msg, "") - fmt.Printf(" * %s\n", failureMsg) + failureMsg := utils.GetBulletMessage(err.Message, "red") + fmt.Printf(" %s\n", failureMsg) } } } @@ -131,12 +137,12 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzer() (err error) { // Do not proceed to building the image if the configuration verification fails if !configurationValid { - return + return fmt.Errorf("verification failed") } - /* //////////////////////////////////////////////////// + /* ==================================================== * Verify the local docker image build of the Analyzer - * /////////////////////////////////////////////////// */ + * ==================================================== */ return a.verifyAnalyzerDockerBuild() } diff --git a/command/auth/login/login.go b/command/auth/login/login.go index 249867bdc..279379ee0 100644 --- a/command/auth/login/login.go +++ b/command/auth/login/login.go @@ -19,6 +19,7 @@ type LoginOptions struct { HostName string Interactive bool PAT string + Prompt utils.UserInputPrompt } // NewCmdLogin handles the login functionality for the CLI @@ -41,6 +42,7 @@ func NewCmdLogin() *cobra.Command { TokenExpired: true, User: "", HostName: "", + Prompt: utils.UserInputPrompt{}, } cmd := &cobra.Command{ @@ -92,7 +94,7 @@ func (opts *LoginOptions) Run() (err error) { if !opts.TokenExpired { // The user is already logged in, confirm re-authentication. msg := fmt.Sprintf("You're already logged into DeepSource as %s. Do you want to re-authenticate?", opts.User) - response, err := utils.ConfirmFromUser(msg, "") + response, err := opts.Prompt.ConfirmFromUser(msg, "") if err != nil { return fmt.Errorf("Error in fetching response. Please try again.") } @@ -121,13 +123,13 @@ func (opts *LoginOptions) handleInteractiveLogin() error { hostPromptHelpText := "The hostname of the DeepSource instance to authenticate with" // Display prompt to user - loginType, err := utils.SelectFromOptions(loginPromptMessage, loginPromptHelpText, accountTypes) + loginType, err := opts.Prompt.SelectFromOptions(loginPromptMessage, loginPromptHelpText, accountTypes) if err != nil { return err } // Prompt the user for hostname only in the case of on-premise if loginType == "DeepSource Enterprise" { - opts.HostName, err = utils.GetSingleLineInput(hostPromptMessage, hostPromptHelpText, "") + opts.HostName, err = opts.Prompt.GetSingleLineInput(hostPromptMessage, hostPromptHelpText, "") if err != nil { return err } diff --git a/command/auth/logout/logout.go b/command/auth/logout/logout.go index 1fc12c668..3ba199521 100644 --- a/command/auth/logout/logout.go +++ b/command/auth/logout/logout.go @@ -10,7 +10,9 @@ import ( "github.com/spf13/cobra" ) -type LogoutOptions struct{} +type LogoutOptions struct { + Prompt utils.UserInputPrompt +} // NewCmdLogout handles the logout functionality for the CLI func NewCmdLogout() *cobra.Command { @@ -18,15 +20,17 @@ func NewCmdLogout() *cobra.Command { Use: "logout", Short: "Logout of your active DeepSource account", Args: utils.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - opts := LogoutOptions{} + RunE: func(cmd *cobra.Command, _ []string) error { + opts := LogoutOptions{ + Prompt: utils.UserInputPrompt{}, + } return opts.Run() }, } return cmd } -func (*LogoutOptions) Run() error { +func (opts *LogoutOptions) Run() error { // Fetch config cfg, err := config.GetConfig() if err != nil { @@ -39,7 +43,7 @@ func (*LogoutOptions) Run() error { // Confirm from the user if they want to logout logoutConfirmationMsg := "Are you sure you want to log out of DeepSource account?" - response, err := utils.ConfirmFromUser(logoutConfirmationMsg, "") + response, err := opts.Prompt.ConfirmFromUser(logoutConfirmationMsg, "") if err != nil { return err } diff --git a/command/config/generate/analyzers_input.go b/command/config/generate/analyzers_input.go index 3d0ec13dd..72e082c5b 100644 --- a/command/config/generate/analyzers_input.go +++ b/command/config/generate/analyzers_input.go @@ -26,7 +26,7 @@ func (o *Options) collectAnalyzerInput() (err error) { analyzerPromptMsg := "Which languages/tools does your project use?" analyzerPromptHelpText := "Analyzers will find issues in your code. Add an analyzer by selecting a language you've written your code in." - o.ActivatedAnalyzers, err = utils.SelectFromMultipleOptions(analyzerPromptMsg, analyzerPromptHelpText, utils.AnalyzersData.AnalyzerNames) + o.ActivatedAnalyzers, err = o.Prompt.SelectFromMultipleOptions(analyzerPromptMsg, analyzerPromptHelpText, utils.AnalyzersData.AnalyzerNames) if err != nil { return err } @@ -60,7 +60,7 @@ func (o *Options) inputAnalyzerMeta(requiredFieldsData map[string][]AnalyzerMeta switch metaFields[i].Type { case "boolean": metaFields[i].UserInput = "true" - res, err := utils.ConfirmFromUser(metaFields[i].Title, metaFields[i].Description) + res, err := o.Prompt.ConfirmFromUser(metaFields[i].Title, metaFields[i].Description) if err != nil { return err } @@ -68,12 +68,12 @@ func (o *Options) inputAnalyzerMeta(requiredFieldsData map[string][]AnalyzerMeta metaFields[i].UserInput = "false" } case "enum": - metaFields[i].UserInput, err = utils.SelectFromOptions(metaFields[i].Title, metaFields[i].Description, metaFields[i].Options) + metaFields[i].UserInput, err = o.Prompt.SelectFromOptions(metaFields[i].Title, metaFields[i].Description, metaFields[i].Options) if err != nil { return err } default: - metaFields[i].UserInput, err = utils.GetSingleLineInput(metaFields[i].Title, metaFields[i].Description, "") + metaFields[i].UserInput, err = o.Prompt.GetSingleLineInput(metaFields[i].Title, metaFields[i].Description, "") if err != nil { return err } diff --git a/command/config/generate/generate.go b/command/config/generate/generate.go index 4c719dbee..da17860f1 100644 --- a/command/config/generate/generate.go +++ b/command/config/generate/generate.go @@ -22,11 +22,14 @@ type Options struct { ExcludePatterns []string TestPatterns []string GeneratedConfig string + Prompt utils.UserInputPrompt } // NewCmdConfigGenerate handles the generation of DeepSource config based on user inputs func NewCmdConfigGenerate() *cobra.Command { - o := Options{} + o := Options{ + Prompt: utils.UserInputPrompt{}, + } home, _ := os.UserHomeDir() doc := heredoc.Docf(` diff --git a/command/config/generate/generic_input.go b/command/config/generate/generic_input.go index bb1473193..806c199ec 100644 --- a/command/config/generate/generic_input.go +++ b/command/config/generate/generic_input.go @@ -6,7 +6,6 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/deepsourcelabs/cli/utils" ) // ========== @@ -17,7 +16,7 @@ func (o *Options) collectExcludePatterns() error { helpMsg := "Glob patterns of files that should not be analyzed such as auto-generated files, migrations, compatibility files." // Confirm from the user if they want to add an exclude pattern - response, err := utils.ConfirmFromUser(excludePatternsMsg, helpMsg) + response, err := o.Prompt.ConfirmFromUser(excludePatternsMsg, helpMsg) if err != nil { return err } @@ -40,7 +39,7 @@ func (o *Options) collectTestPatterns() error { helpMsg := "Glob patterns of the test files. This helps us reduce false positives." // Confirm from the user (y/N) if he/she wants to add test patterns - response, err := utils.ConfirmFromUser(testPatternsMsg, helpMsg) + response, err := o.Prompt.ConfirmFromUser(testPatternsMsg, helpMsg) if err != nil { return err } @@ -87,7 +86,7 @@ func (o *Options) inputFilePatterns(field, msg, helpMsg string) error { // Iterating this until user says no // Here field contains : "test"/"exclude" depending upon the invoking confirmationMsg := fmt.Sprintf("Add more %s patterns?", field) - response, err := utils.ConfirmFromUser(confirmationMsg, "") + response, err := o.Prompt.ConfirmFromUser(confirmationMsg, "") if err != nil { return err } diff --git a/command/config/generate/transformers_input.go b/command/config/generate/transformers_input.go index 6e5a24681..91ac3e8a3 100644 --- a/command/config/generate/transformers_input.go +++ b/command/config/generate/transformers_input.go @@ -9,7 +9,7 @@ func (o *Options) collectTransformersInput() (err error) { transformerPromptMsg := "Would you like to activate any Transformers for any languages?" transformerPromptHelpText := "DeepSource Transformers automatically help to achieve auto-formatting of code. Add a transformer by selecting the code formatting tool of your choice." - o.ActivatedTransformers, err = utils.SelectFromMultipleOptions(transformerPromptMsg, transformerPromptHelpText, utils.TransformersData.TransformerNames) + o.ActivatedTransformers, err = o.Prompt.SelectFromMultipleOptions(transformerPromptMsg, transformerPromptHelpText, utils.TransformersData.TransformerNames) if err != nil { return err } diff --git a/analyzers/config/types.go b/types/analyzer.go similarity index 51% rename from analyzers/config/types.go rename to types/analyzer.go index e7d993e08..a779a353a 100644 --- a/analyzers/config/types.go +++ b/types/analyzer.go @@ -1,4 +1,12 @@ -package config +/* ============================================================= + * Contains type definitions with respect to Analyzers, Issues + * and their configuration. + * ============================================================= */ +package types + +/* ==================== + * Analyzer TOML Types + * ==================== */ type Analysis struct { Command string `toml:"command" json:"command" validate:"required"` @@ -10,15 +18,9 @@ type Analysis struct { // } type Build struct { - Builder string `toml:"builder" json:"builder" validate:"omitempty"` + Engine string `toml:"engine" json:"engine" validate:"omitempty,engine"` Dockerfile string `toml:"dockerfile" json:"dockerfile,omitempty" validate:"omitempty"` - Script string `toml:"script" json:"script" validate:"omitempty"` -} - -type URL struct { - Source string `toml:"source" json:"source" validate:"omitempty,url"` - Documentation string `toml:"documentation" json:"documentation,omitempty" validate:"omitempty,url"` - BugTracker string `toml:"bug_tracker" json:"bug_tracker" validate:"omitempty,url"` + Script string `toml:"script,multiline" json:"script" validate:"omitempty"` } type Test struct { @@ -26,14 +28,16 @@ type Test struct { } // analyzer.toml type -type AnalyzerMetadata struct { +type AnalyzerTOML struct { // Analyzer specific data - Name string `toml:"name" json:"name" validate:"required"` - Shortcode string `toml:"shortcode" json:"shortcode" validate:"required"` // New - Description string `toml:"description" json:"description" validate:"required"` - Category string `toml:"category" json:"category" validate:"required"` - Tags []string `toml:"tags" json:"tags,omitempty" validate:"omitempty"` - URL URL `toml:"urls" json:"urls,omitempty" validate:"omitempty"` + Name string `toml:"name" json:"name" validate:"required"` + Shortcode string `toml:"shortcode" json:"shortcode" validate:"required,shortcode"` + Description string `toml:"description" json:"description" validate:"required"` + Tags []string `toml:"tags" json:"tags,omitempty" validate:"omitempty"` + Repository string `toml:"repository" json:"repository" validate:"omitempty,url"` + DocumentationURL string `toml:"documentation" json:"documentation,omitempty" validate:"omitempty,url"` + BugTrackerURL string `toml:"bug_tracker" json:"bug_tracker" validate:"omitempty,url"` + EnvironmentVariables map[string]string `toml:"environment_variables" json:"environment_variables,omitempty" validate:"omitempty"` // Analyzer, Autofix and Transformer config @@ -47,10 +51,14 @@ type AnalyzerMetadata struct { Test Test `toml:"test" json:"test" validate:"omitempty"` } -// Analyzer issue description +/* ========================= + * Analyzer Issue TOML Types + * ========================= */ + +// Analyzer issue type type AnalyzerIssue struct { Shortcode string `validate:"omitempty"` Title string `toml:"title" json:"title" validate:"required"` Description string `toml:"description" json:"description" validate:"required"` - Category string `toml:"category" json:"category" validate:"required"` + Category string `toml:"category" json:"category" validate:"required,category"` } diff --git a/utils/prompt.go b/utils/prompt.go index 7f7a985cb..de6867727 100644 --- a/utils/prompt.go +++ b/utils/prompt.go @@ -2,18 +2,21 @@ package utils import ( "errors" + "strings" "github.com/AlecAivazis/survey/v2" "github.com/AlecAivazis/survey/v2/terminal" "github.com/mgutz/ansi" ) +type UserInputPrompt struct{} + // ========== // Useful APIs of survey library // ========== // Used for (Yes/No) questions -func ConfirmFromUser(msg, helpText string) (bool, error) { +func (UserInputPrompt) ConfirmFromUser(msg, helpText string) (bool, error) { response := false confirmPrompt := &survey.Confirm{ Renderer: survey.Renderer{}, @@ -33,7 +36,7 @@ func ConfirmFromUser(msg, helpText string) (bool, error) { // > * 1 // * 2 // * 3 -func SelectFromOptions(msg, helpText string, opts []string) (string, error) { +func (UserInputPrompt) SelectFromOptions(msg, helpText string, opts []string) (string, error) { var result string prompt := &survey.Select{ Renderer: survey.Renderer{}, @@ -46,12 +49,12 @@ func SelectFromOptions(msg, helpText string, opts []string) (string, error) { if err != nil { return "", checkInterrupt(err) } - return result, nil + return strings.TrimSpace(result), nil } // Used for Single Line Text Input // Being used for getting "Import root" of user for configuring meta of Go analyzer -func GetSingleLineInput(msg, helpText, defaultValue string) (string, error) { +func (UserInputPrompt) GetSingleLineInput(msg, helpText, defaultValue string) (string, error) { response := "" prompt := &survey.Input{ Renderer: survey.Renderer{}, @@ -64,7 +67,7 @@ func GetSingleLineInput(msg, helpText, defaultValue string) (string, error) { if err != nil { return "", checkInterrupt(err) } - return response, nil + return strings.TrimSpace(response), nil } // Used for multiple inputs from the displayed options @@ -75,7 +78,7 @@ func GetSingleLineInput(msg, helpText, defaultValue string) (string, error) { // [ ] Test Coverage // [ ] Python // [ ] Go -func SelectFromMultipleOptions(msg, helpText string, options []string) ([]string, error) { +func (UserInputPrompt) SelectFromMultipleOptions(msg, helpText string, options []string) ([]string, error) { response := make([]string, 0) // Extracting languages and tools being used in the project for Analyzers analyzerPrompt := &survey.MultiSelect{ @@ -102,7 +105,7 @@ func checkInterrupt(err error) error { func GetSuccessMessage(msg string) string { greenTickMark := ansi.Color("✔", "green") - return greenTickMark + " " + msg + "\n" + return greenTickMark + " " + msg } func GetFailureMessage(msg, errorMsg string) string { @@ -111,3 +114,7 @@ func GetFailureMessage(msg, errorMsg string) string { } return ansi.Color("✗"+" "+msg, "red") } + +func GetBulletMessage(msg, color string) string { + return ansi.Color("•"+" "+msg, color) +} diff --git a/utils/remote_resolver.go b/utils/remote_resolver.go index a43933c7b..925379d45 100644 --- a/utils/remote_resolver.go +++ b/utils/remote_resolver.go @@ -54,7 +54,8 @@ func ResolveRemote(repoArg string) (*RemoteData, error) { promptOpts = append(promptOpts, value[3]) } - selectedRemote, err := SelectFromOptions("Please select the repository:", "", promptOpts) + prompt := UserInputPrompt{} + selectedRemote, err := prompt.SelectFromOptions("Please select the repository:", "", promptOpts) if err != nil { return nil, err } diff --git a/utils/spinner.go b/utils/spinner.go index d8462f6e9..8fa474de1 100644 --- a/utils/spinner.go +++ b/utils/spinner.go @@ -1,6 +1,7 @@ package utils import ( + "fmt" "os" "sync" "time" @@ -19,7 +20,11 @@ func (s *SpinnerUtils) StartSpinnerWithLabel(label, finalMessage string) { s.mu.Lock() defer s.mu.Unlock() - sp := spinner.New(spinner.CharSets[11], 120*time.Millisecond, spinner.WithWriter(os.Stdout), spinner.WithWriter(os.Stderr), spinner.WithFinalMSG(GetSuccessMessage(finalMessage))) // Build our new spinner + sp := spinner.New(spinner.CharSets[11], + 120*time.Millisecond, + spinner.WithWriter(os.Stdout), + spinner.WithWriter(os.Stderr), + spinner.WithFinalMSG(fmt.Sprintf("%s\n", GetSuccessMessage(finalMessage)))) // Build our new spinner if label != "" { sp.Suffix = " " + label + " " } @@ -45,9 +50,9 @@ func (s *SpinnerUtils) StopSpinnerWithError(msg string, errorMessage error) { defer s.mu.Unlock() if errorMessage != nil { - s.Spinner.FinalMSG = GetFailureMessage(msg, errorMessage.Error()) + s.Spinner.FinalMSG = GetFailureMessage(msg, errorMessage.Error()) + "\n" } else { - s.Spinner.FinalMSG = GetFailureMessage(msg, "") + s.Spinner.FinalMSG = GetFailureMessage(msg, "") + "\n" } if s.Spinner == nil { From 97ff0c6ffa8d076916577de422dbbb40f418470f Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Thu, 16 Jun 2022 11:37:58 +0530 Subject: [PATCH 08/28] feat(dry-run): add support for skipcq processor and generating syntax highlighted snippets (#148) --- analysis/config/config.go | 6 - analysis/config/format.go | 31 --- analysis/processor/batch_process.go | 153 ++++++++++++ analysis/processor/process.go | 58 +++++ analysis/processor/processors/proc_skip_cq.go | 170 +++++++++++++ .../processors/proc_source_code_load.go | 225 ++++++++++++++++++ analysis/processor/processors/silencers.go | 106 +++++++++ analysis/processor/utils.go | 106 +++++++++ command/analyzer/run/process.go | 39 +++ command/analyzer/run/run.go | 48 ++-- go.mod | 3 + go.sum | 4 + types/result.go | 72 ++++++ 13 files changed, 965 insertions(+), 56 deletions(-) create mode 100644 analysis/processor/batch_process.go create mode 100644 analysis/processor/process.go create mode 100644 analysis/processor/processors/proc_skip_cq.go create mode 100644 analysis/processor/processors/proc_source_code_load.go create mode 100644 analysis/processor/processors/silencers.go create mode 100644 analysis/processor/utils.go create mode 100644 command/analyzer/run/process.go create mode 100644 types/result.go diff --git a/analysis/config/config.go b/analysis/config/config.go index 560b0fa6d..5a2f3dc20 100644 --- a/analysis/config/config.go +++ b/analysis/config/config.go @@ -96,9 +96,3 @@ func (r *AnalysisRun) ConfigureAnalysis() (*AnalysisConfig, error) { // Format the analysis config data into LSP format of analysis_config.json return r.formatAnalysisConfigToLSP(), nil } - -/* Formats the LSP based result to the default DeepSource format - * Not used as of now but keeping it here for future */ -func (r *AnalysisRun) FormatLSPResultToDefault(analysisResult *AnalysisResult) *DefaultAnalysisResult { - return r.formatLSPResultsToDefault(analysisResult) -} diff --git a/analysis/config/format.go b/analysis/config/format.go index 44f094f5c..11c814f51 100644 --- a/analysis/config/format.go +++ b/analysis/config/format.go @@ -34,34 +34,3 @@ func (r *AnalysisRun) formatAnalysisConfigToLSP() *AnalysisConfig { } return &anaConfig } - -/* Converts the LSP based analysis_results.json into the default format supported by DeepSource */ -func (*AnalysisRun) formatLSPResultsToDefault(analysisResult *AnalysisResult) *DefaultAnalysisResult { - defaultAnalysisResult := DefaultAnalysisResult{ - Metrics: analysisResult.Metrics, - IsPassed: analysisResult.IsPassed, - Errors: analysisResult.Errors, - ExtraData: analysisResult.ExtraData, - } - for _, issue := range analysisResult.Issues { - analysisIssue := Issue{ - Code: issue.Code, - Title: issue.Message, - Location: Location{ - Path: issue.RelatedInformation[0].Location.URI, - Position: Position{ - Begin: Coordinate{ - Line: issue.Range.Start.Line, - Column: issue.Range.Start.Character, - }, - End: Coordinate{ - Line: issue.Range.End.Line, - Column: issue.Range.End.Character, - }, - }, - }, - } - defaultAnalysisResult.Issues = append(defaultAnalysisResult.Issues, analysisIssue) - } - return &defaultAnalysisResult -} diff --git a/analysis/processor/batch_process.go b/analysis/processor/batch_process.go new file mode 100644 index 000000000..d5c6885c2 --- /dev/null +++ b/analysis/processor/batch_process.go @@ -0,0 +1,153 @@ +package processor + +import ( + "fmt" + "io/ioutil" + "log" + "path" + "sort" + "strings" + + "github.com/deepsourcelabs/cli/types" +) + +var ( + issueIndex int = 0 + batchSize int = 30 + maxIssueDensity int = 100 +) + +type fileContentNode struct { + Filename string + FileContent []string +} + +// While this loop looks like it would have a complexity of len(filesWIssueRange) * len(cachedFiles) * issues * len(processorList) +// it only has a complexity of O(len(report.Issues)). +// When there are a lot of files to be processed, opening all of them one by one takes time, while the CPU waits idly. +// Opening all files and loading them into memory is expensive in terms of space, since there could be a lot of files. +// Hence, opening files concurrently in batches (of, say, 30 files) and then processing all issues in those 30 files one by one +// appears to be the best option. We cannot process each file's issues concurrently, because only the file loading operation is +// IO intensive, and the rest is CPU intensive. +func (p *ReportProcessor) processIssuesBatch(filesWIssueRange []IssueRange, result *types.AnalysisResult, processedIssues *[]types.Issue) { + // Process files in batches of `batchSize` to avoid `too many files open` error + for processedFiles := 0; processedFiles < len(filesWIssueRange); { + filesToProcess := 0 + + // The default batch size is 30. If the number of files is less than this batchsize assign their count + // as the number of files to process, else assign the batchsize as the number of files to be processed in + // this iteration. + if len(filesWIssueRange)-processedFiles < batchSize { + filesToProcess = len(filesWIssueRange) - processedFiles + } else { + filesToProcess = batchSize + } + + // The slice containing the data about cached files to be processed. + cachedFiles := p.cacheFilesToBeProcessed(filesToProcess, processedFiles, filesWIssueRange) + + // Iterate over the cached files data and process the issues present in them. + for j, cachedFile := range cachedFiles { + for issueIndex < len(result.Issues) { + issue := result.Issues[issueIndex] // initialize the loop + // Check if the file is a generated one, this happens if enormous amount of issues are + // reported in a single file on a single line. + if p.isGeneratedFile(processedFiles+j, &cachedFile, filesWIssueRange, result) { + continue + } + + // Check if the issue is for another file. + // If yes, skip this iteration and go to next file. + if cachedFile.Filename != issue.Location.Path { + break + } + + if err := p.runProcessors(cachedFile, &issue, processedIssues); err != nil { + fmt.Println(err.Error()) + } + issueIndex++ + } + } + + // Increase total number of files processed + processedFiles += filesToProcess + } +} + +// runProcessors runs the supported processors on the issue passed as a parameter +func (p *ReportProcessor) runProcessors(cachedFile fileContentNode, issueToProcess *types.Issue, processedIssues *[]types.Issue) (err error) { + // Loop through processors and execute them on the issue passed as a parameter + for _, processor := range p.Processors { + err = processor.Process(cachedFile.FileContent, issueToProcess, processedIssues) + if err != nil { + return fmt.Errorf("failed to execute the processor %s with the following error: %s", processor, err) + } + } + return +} + +// If the number of issues in this file is more than a certain number of issues +// averaged per line, this may be a generated file. Skip processing of further issues +// in this file +func (p *ReportProcessor) isGeneratedFile(fileIndex int, cachedFile *fileContentNode, filesWIssueRange []IssueRange, result *types.AnalysisResult) bool { + linesInThisFile := len(cachedFile.FileContent) | 1 // bitwise op to ensure no divisionbyzero errs + issuesInThisFile := filesWIssueRange[fileIndex].EndIndex - filesWIssueRange[fileIndex].BeginIndex + if (issuesInThisFile / linesInThisFile) > maxIssueDensity { + log.Printf( + "Skipping file %s. Too many issues per line. Lines: %d, issues: %d\n", + cachedFile.Filename, + linesInThisFile, + issuesInThisFile, + ) + result.Errors = append(result.Errors, types.Error{ + HMessage: fmt.Sprintf( + "Skipped file %s because too many issues were raised. "+ + "Is this a generated file that can be added in [exclude_patterns](https://deepsource.io/docs/config/deepsource-toml.html#exclude-patterns)?", + cachedFile.Filename, + ), + Level: 1, + }) + return true + } + return false +} + +// cacheBatchOfFiles receives the count of files to be cached and caches them in a batch by spawning goroutines. +func (p *ReportProcessor) cacheFilesToBeProcessed(totalFiles, processedFiles int, filesWIssueRange []IssueRange) []fileContentNode { + fileContentChannel := make(chan fileContentNode, totalFiles) + for j := 0; j < totalFiles; j++ { + filename := filesWIssueRange[processedFiles+j].Filename + go addFileToCache(fileContentChannel, filename, p.CodePath) + } + + cachedFiles := []fileContentNode{} + for j := 0; j < totalFiles; j++ { + cachedFiles = append(cachedFiles, <-fileContentChannel) + } + + // sort the cached files by filename, because our issues are sorted by filename + sort.Slice(cachedFiles, func(i, j int) bool { + return cachedFiles[i].Filename < cachedFiles[j].Filename + }) + return cachedFiles +} + +// addFileToCache reads the file and formats its content into a fileContentNode struct instance +// and passes that to the cachedFilesChannel channel since this function is run on a goroutine. +func addFileToCache(cachedFilesChannel chan fileContentNode, filename, codePath string) { + fileContentSlice := []string{} + + fileContentBytes, err := ioutil.ReadFile(path.Join(codePath, filename)) + if err != nil { + fmt.Println("Could not process for file: ", filename, ". Err: ", err) + } else if string(fileContentBytes) != "" { + fileContentSlice = strings.Split(string(fileContentBytes), "\n") + } else { + fileContentSlice = []string{} + } + + cachedFilesChannel <- fileContentNode{ + Filename: filename, + FileContent: fileContentSlice, + } +} diff --git a/analysis/processor/process.go b/analysis/processor/process.go new file mode 100644 index 000000000..c2d7ea01a --- /dev/null +++ b/analysis/processor/process.go @@ -0,0 +1,58 @@ +package processor + +import ( + "fmt" + + "github.com/deepsourcelabs/cli/types" +) + +// Processor interface to receive analysis post-processors. +type IProcessor interface { + String() string + Process([]string, *types.Issue, *[]types.Issue) error +} + +// ReportProcessor struct contains the processor data needed to process the analysis results. +type ReportProcessor struct { + CodePath string // The source code path where the issues got raised. + Processors []IProcessor // The list of supported post-analysis processors. + Report types.AnalyzerReport // The report generated by the Analyzer post analysis. +} + +// ProcessAnalyzerReport accepts the result as a byte array and processes the results in the form of a +// AnalyzerReport struct instance. +// It sorts the issues in an alphabetical order of filenames just to ensure that all issues getting +// reported for the same files come together & processes the issues for the various required processors. +// As of now, there are two processors supported: +// - skipcq : Processes the issues and checks if some of them should be ignored since they have +// been ignored by the user through suitable `skipcq` comments. +// - source_code_load : Processes the issues for the source code snippets, highlights the snippets +// and adds them to the Analysis result. +func (p *ReportProcessor) Process() types.AnalysisResult { + // Covert the Analyzer report from LSP based format to the default results format. + analysisResult := p.formatLSPResultsToDefault() + + // Check if there are issues reported actually. + if len(analysisResult.Issues) <= 0 { + return analysisResult + } + fmt.Println("Total issues reported by the Analyzer: ", len(analysisResult.Issues)) + + // All the files that appear in the issues are now processed by the processors listed in analyzer conf + // We must cache the files in order to not do file IO for every processor. + p.sortIssuesByFile(&analysisResult) + + // Get the issues to file range data. + filesIndex := createIssueFileRange(analysisResult) + + // Iterate over the filesIndex and read the files in batch and process the issues using the suitable processors. + processedIssues := []types.Issue{} + p.processIssuesBatch(filesIndex, &analysisResult, &processedIssues) + analysisResult.Issues = processedIssues + + // Sort again for consistency (mostly for test to pass). + p.sortIssuesByFile(&analysisResult) + + // Return the processed analysis result. + return analysisResult +} diff --git a/analysis/processor/processors/proc_skip_cq.go b/analysis/processor/processors/proc_skip_cq.go new file mode 100644 index 000000000..529b2ba92 --- /dev/null +++ b/analysis/processor/processors/proc_skip_cq.go @@ -0,0 +1,170 @@ +package processors + +import ( + "fmt" + "regexp" + "strings" + + "github.com/deepsourcelabs/cli/types" +) + +type ProcSkipCQ struct{} + +func isSimilarIssue(fileExt, skipCQTag, probableIssueCode, issueCode string) bool { + // if it is // skipcq: SCC-S1002 or similar plain skipcq tag, return + if skipCQTag == "skipcq" { + if probableIssueCode != "" { + return strings.EqualFold(strings.TrimSpace(probableIssueCode), issueCode) + } else { + return true + } + } + + // if the tag to skip CQ is something else, check here + for _, silencer := range languagesMeta[fileExt].Silencers { + if strings.EqualFold(strings.TrimSpace(skipCQTag), silencer.SilencerCode) { + if len(silencer.Issues) == 0 { + // if the silencer doesn't have any issues in it, ignore all the issues + return true + } + + // similarIssues is a comma separated list of issues corresponding to the raised issue + similarIssues, ok := silencer.Issues[strings.Split(issueCode, "-")[1]] + + // if the issue is not found in the silencer's issue map, do not ignore the issue + if !ok { + return false + } + + if probableIssueCode == "" { + // if there is no specific issue silenced, ignore all issues + return true + } else { + for _, similarIssue := range strings.Split(similarIssues, ",") { + // if the silencer has an issue map that contains this particular issue, ignore it + if similarIssue == strings.ToUpper(probableIssueCode) { + return true + } else { + return false + } + } + } + } + } + return false +} + +func checkSkipCQ(fileExt string, skipCQre regexp.Regexp, line, issueCode string) bool { + matches := skipCQre.FindAllStringSubmatch(line, -1) + skipCQTag := "" + + if matches == nil { + return false + } + + ignoreIssue := true + + for i, name := range skipCQre.SubexpNames() { + for _, match := range matches { + if i != 0 && name != "" { + // note the name of the issue silencer and move on + if name == "skipcq_tag" { + skipCQTag = match[i] + } else if name == "issue_codes" { + if match[i] != "" { + for _, probableIssueCode := range strings.Split(match[i], ",") { + // if an issue is to be ignored in this line of code is same as + // the issue that is raised, we have to ignore the issue + + if isSimilarIssue(fileExt, skipCQTag, probableIssueCode, issueCode) { + ignoreIssue = true + // since we are only dealing with one issue at a time + // break at the first occurrence + return ignoreIssue + } else { + ignoreIssue = false + } + } + } else { + // in case there is no issue code associated, check for just the silencer tag + ignoreIssue = isSimilarIssue(fileExt, skipCQTag, "", issueCode) + } + } + } + } + } + return ignoreIssue +} + +/* Check if a given line of code is eligible to be checked for skip CQ. + * Bare minimum eligibility is that the line should either be empty or + * contain a comment only line. */ +func analyzeLineForSkipCQ(line, fileExt string) bool { + var commentIdentifier string + for _, langMeta := range languagesMeta { + if fileExt == langMeta.Extension { + commentIdentifier = langMeta.CommentIdentifier + break + } + } + + line = strings.TrimSpace(line) + + if line == "" { + return true + } + + match, err := regexp.Match(fmt.Sprintf("^%s", commentIdentifier), []byte(line)) + return err == nil && match +} + +// Returns the name of the processor +func (p ProcSkipCQ) String() string { + return "skip_cq" +} + +// Process checks if the issue passed as an argument should be skipped or not +// If it should be skipped, it is not appended to the processedIssues slice while if it is not skipped, it is appended. +func (p ProcSkipCQ) Process(fileContentSlice []string, issue *types.Issue, processedIssues *[]types.Issue) error { + filePath := issue.Location.Path + lineStart := issue.Location.Position.Begin.Line + issueCode := issue.IssueCode + + if lineStart < 1 || lineStart > len(fileContentSlice) { + return fmt.Errorf("issue position is weird for file of %d lines", len(fileContentSlice)) + } + + shouldSkipCQ := false + line := strings.TrimSpace(fileContentSlice[lineStart-1]) + + fileSupported := false + var fileExt string + var skipCQregex regexp.Regexp + for re := range languagesMeta { + match, err := regexp.Match(re, []byte(filePath)) + if err != nil || !match { + continue + } + fileSupported = true + fileExt = re + break + } + if !fileSupported { + fileExt = "default_extension" + } + skipCQregex = regexMap[fileExt] + + // Skip code quality checks for the given issue code on the lineStart + shouldSkipCQ = checkSkipCQ(fileExt, skipCQregex, line, issueCode) + + // Continue looking only if the previous line is a comment-only line specifying the skipcq condition, + // the lineStart is not the first line of the file and shouldSkipCQ is not already true + for index := lineStart - 2; !shouldSkipCQ && index >= 0 && analyzeLineForSkipCQ(fileContentSlice[index], fileExt); index-- { + shouldSkipCQ = checkSkipCQ(fileExt, skipCQregex, fileContentSlice[index], issueCode) + } + + if !shouldSkipCQ { + *processedIssues = append(*processedIssues, *issue) + } + return nil +} diff --git a/analysis/processor/processors/proc_source_code_load.go b/analysis/processor/processors/proc_source_code_load.go new file mode 100644 index 000000000..b6efdb4fc --- /dev/null +++ b/analysis/processor/processors/proc_source_code_load.go @@ -0,0 +1,225 @@ +package processors + +import ( + "bytes" + "fmt" + "log" + "strings" + + "github.com/alecthomas/chroma/formatters/html" + "github.com/alecthomas/chroma/lexers" + "github.com/alecthomas/chroma/styles" + "github.com/deepsourcelabs/cli/types" +) + +const sourceCodeOffset int = 3 + +type ProcSourceCodeLoad struct{} + +type formattedFile struct { + fileContent []string + highlightedContent []string +} + +var ( + lineStartWithOffset, lineEndWithOffset int + formattedFileCache map[string]formattedFile = make(map[string]formattedFile) +) + +// We cache the past file's iterator, taking advantage of the fact that +// issues are sorted according to filenames +func getFinalFormattedSlice(fileContentSlice []string, issue *types.Issue) formattedFile { + filePath := issue.Location.Path + + // Check if the formatted file data is already present in the cache. + // If yes, return the cached data. + if formattedFileData, ok := formattedFileCache[filePath]; ok { + return formattedFileData + } + + // Else, clear the cache. + for k := range formattedFileCache { + delete(formattedFileCache, k) + } + + /* ============================================================ + * Use alecthomas/chroma to generate syntax highlighted snippet + * ============================================================ */ + fileContentString := strings.Join(fileContentSlice, "\n") + lexer := lexers.Match(filePath) + + /* Case: In case of .vue files, use the `html` lexer since the `vue` lexer + * breaks in certain cases. The `html` lexer provides comparatively better results. + * TODO(SNT): Remove this case if vue lexer is improved in future. */ + if strings.HasSuffix(filePath, ".vue") { + lexer = lexers.Get("html") + } + if lexer == nil { + lexer = lexers.Fallback + } + + // Tokenize the file content. + iterator, err := lexer.Tokenise(nil, fileContentString) + if err != nil { + log.Println("Could not tokenize file ", filePath) + return formattedFile{ + fileContent: []string{}, + highlightedContent: []string{}, + } + } + + // Selecting the chroma format in which we expect the output(html) and use the `monokai` colorscheme to highlight the snippet. + formatter := html.New(html.WithLineNumbers(true), html.PreventSurroundingPre(true), html.WithClasses(true)) + style := styles.Get("monokai") + if style == nil { + style = styles.Fallback + } + + var chromaFormattedBytes bytes.Buffer + var chromaFormattedString string + err = formatter.Format(&chromaFormattedBytes, style, iterator) + if err != nil { + fmt.Println(err) + return formattedFile{ + fileContent: []string{}, + highlightedContent: []string{}, + } + } + + // Convert the generated data in bytes to string and also extract the slice containing + // all the lines as the contents. + chromaFormattedString = chromaFormattedBytes.String() + chromaFormattedSlice := strings.Split(chromaFormattedString, "\n") + + // We need to move the trailing span to the previous line in order. + for i := range chromaFormattedSlice { + if i != 0 && !strings.HasPrefix(chromaFormattedSlice[i], "") { + lineStartIndex := strings.Index(chromaFormattedSlice[i], "") + + if lineStartIndex != -1 { + chromaFormattedSlice[i-1] += chromaFormattedSlice[i][:lineStartIndex] + chromaFormattedSlice[i] = chromaFormattedSlice[i][lineStartIndex:] + } + } + } + + // Highlight all lines in the file. + lexer = lexers.Match(filePath) + if lexer == nil { + lexer = lexers.Fallback + } + iterator, err = lexer.Tokenise(nil, fileContentString) + if err != nil { + fmt.Println("Could not tokenize file ", filePath) + return formattedFile{ + fileContent: []string{}, + highlightedContent: []string{}, + } + } + + // Specifying the highlight range. + lineHighlightRange := [][2]int{{1, len(fileContentSlice)}} + + // Format, style and color the snippet. + formatter = html.New(html.WithLineNumbers(true), html.PreventSurroundingPre(true), html.WithClasses(true), html.HighlightLines(lineHighlightRange)) + style = styles.Get("monokai") + if style == nil { + style = styles.Fallback + } + var chromaHighlightedBytes bytes.Buffer + err = formatter.Format(&chromaHighlightedBytes, style, iterator) + if err != nil { + fmt.Println(err) + return formattedFile{ + fileContent: []string{}, + highlightedContent: []string{}, + } + } + chromaHighlightedString := chromaHighlightedBytes.String() + chromaHighlightedSlice := strings.Split(chromaHighlightedString, "\n") + + /* Correct the span elements in the slice. + * Highlighted lines look like this: + * + * 1import os + * 2import random # noqa: F401 + * 3import this # noqa + * 4import sys */ + + // We need to move the trailing span to the previous line in order for our replacement logic to work. + for i := range chromaHighlightedSlice { + if i != 0 && !strings.HasPrefix(chromaHighlightedSlice[i], "") { + lineStartIndex := strings.Index(chromaHighlightedSlice[i], "") + + if lineStartIndex != -1 { + chromaHighlightedSlice[i-1] += chromaHighlightedSlice[i][:lineStartIndex] + chromaHighlightedSlice[i] = chromaHighlightedSlice[i][lineStartIndex:] + } + } + } + + // Create formattedContent variable of `formattedFile` type and return. + formattedContent := formattedFile{ + fileContent: chromaFormattedSlice, + highlightedContent: chromaHighlightedSlice, + } + formattedFileCache[filePath] = formattedContent + + return formattedContent +} + +// Returns the name of the processor +func (p ProcSourceCodeLoad) String() string { + return "source_code_load" +} + +// Process processes the source code to be highlighted using chroma and writes that into the +// analysis result post highlighting. +func (p ProcSourceCodeLoad) Process(fileContentSlice []string, issue *types.Issue, _ *[]types.Issue) error { + lineStart := issue.Location.Position.Begin.Line + lineEnd := issue.Location.Position.End.Line + + // Count lines in the file + numLines := len(fileContentSlice) + + // Calculate the line number from where the highlighting should start + if lineStart-sourceCodeOffset < 1 { + lineStartWithOffset = 1 + } else { + lineStartWithOffset = lineStart - sourceCodeOffset + } + + // Calculate the line number from where the highlighting should end + if lineEnd+sourceCodeOffset > numLines { + lineEndWithOffset = numLines + } else { + lineEndWithOffset = lineEnd + sourceCodeOffset + } + + formattedFileContent := getFinalFormattedSlice(fileContentSlice, issue) + chromaFormattedSlice := formattedFileContent.fileContent + chromaHighlightedSlice := formattedFileContent.highlightedContent + + finalFormattedSlice := make([]string, 0) + finalFormattedSlice = append(finalFormattedSlice, `
`)
+
+	// Get the file slice to write
+	for i := lineStartWithOffset; i <= lineEndWithOffset; i++ {
+		currentLine := chromaFormattedSlice[i-1]
+
+		// for all lines except the last, append a newline
+		if i < lineEndWithOffset {
+			currentLine = currentLine + "\n"
+		}
+
+		// highlight the lines containing the issue
+		// We need not add a \n at the end of highlighted lines, as chroma does it itself
+		if i >= lineStart && i <= lineEnd {
+			currentLine = chromaHighlightedSlice[i-1]
+		}
+		finalFormattedSlice = append(finalFormattedSlice, currentLine)
+	}
+	finalFormattedSlice = append(finalFormattedSlice, "
") + issue.ProcessedData.SourceCode.Rendered = strings.Join(finalFormattedSlice, "") + return nil +} diff --git a/analysis/processor/processors/silencers.go b/analysis/processor/processors/silencers.go new file mode 100644 index 000000000..7cfc0e5c5 --- /dev/null +++ b/analysis/processor/processors/silencers.go @@ -0,0 +1,106 @@ +package processors + +import ( + "regexp" + "strings" +) + +var languagesMeta map[string]LanguageMeta + +// for the extension e.g .py, .go, .js etc build a map of compiled +// regex with the corresponding comment identifier in regex. +var regexMap map[string]regexp.Regexp + +// Silencers data structure +type IssueSilencer struct { + PortName string `json:"port_name"` + SilencerCode string `json:"silencer_code"` + Issues map[string]string `json:"issues"` + TagSeparator string `json:"tag_separator"` +} + +type LanguageMeta struct { + Extension string `json:"extension"` + CommentIdentifier string `json:"comment_identifier"` + Silencers []IssueSilencer `json:"issue_silencers"` +} + +// Reads the `silencers.json` file present in `/toolbox` directory +// and makes a LanguageMeta map which helps in processing skipcq +func prepareSilencersMeta() []LanguageMeta { + // Sane default meta to use when failed to read the silencers file. + // Also, appended to the every config + issuesMeta := []LanguageMeta{ + { + Extension: "default_extension", + CommentIdentifier: `(\#|\/\/)`, + Silencers: []IssueSilencer{}, + }, + } + return issuesMeta +} + +// generateRegExp generates the regex expression used for matching the skipcq comment +func generateRegExp(fileExt string) regexp.Regexp { + // Analyzer specific issues silencer tags, with `skipcq` tag + skipCQTags := []string{"skipcq"} + + // Different analyzers may have different ending token for issue silencing. eg. Pylint has `=` while + // most others have `:` + separators := map[string]int{ + ":": 1, // default, for skipcq + } + for _, silencer := range languagesMeta[fileExt].Silencers { + skipCQTags = append(skipCQTags, silencer.SilencerCode) + separators[silencer.TagSeparator] = 1 + } + + separatorsList := []string{} + for k := range separators { + separatorsList = append(separatorsList, k) + } + + commentIdentifier := languagesMeta[fileExt].CommentIdentifier + regex := *regexp.MustCompile( + // case-insensitive + `(?i)` + + + // group the silencer tags with a name, matching one of the many issue silencers (eg, noqa, nosec) + commentIdentifier + `.*?(?P(` + strings.Join(skipCQTags, "|") + `))` + + + // zero or more occurrences of the issue codes, ends at `)?` later + `(` + + + // separators, like `:` and `=` + `?:(` + strings.Join(separatorsList, "|") + `)[\s]?` + + + // create a group named issue_codes, with pattern similar to PYL-W0614 or SA1022 + `(?P([A-Z]*-?[A-Z]*[0-9]+(?:,(\s+)?)?)+)` + + + // zero or one occurrences of `: issuecode1, issuecode2` and so on + `)?`, + ) + return regex +} + +// generateSilencersRegexMap generates the silencers regex expression used for skipcq processing +func GenerateSilencersRegexMap() { + langMeta := make(map[string]LanguageMeta) + silencerRegexMap := make(map[string]regexp.Regexp) + + // Fetch the silencers meta for the Analyzer + // Keeping it as the default silencer for now + silencersData := prepareSilencersMeta() + + // Mapping the silencers data to the file extension + // in the above declared map `langMeta` + for _, silencerData := range silencersData { + langMeta[silencerData.Extension] = silencerData + } + languagesMeta = langMeta + + for ext := range langMeta { + silencerRegexMap[ext] = generateRegExp(ext) + } + regexMap = silencerRegexMap +} diff --git a/analysis/processor/utils.go b/analysis/processor/utils.go new file mode 100644 index 000000000..53c2dbbd8 --- /dev/null +++ b/analysis/processor/utils.go @@ -0,0 +1,106 @@ +package processor + +import ( + "sort" + + "github.com/deepsourcelabs/cli/types" +) + +// sortIssuesByFile sorts the issues in an alphabetical order according to the filenames +// where they got reported. +func (p *ReportProcessor) sortIssuesByFile(result *types.AnalysisResult) { + sort.Slice(result.Issues, func(i, j int) bool { + return result.Issues[i].Location.Path < result.Issues[j].Location.Path + }) +} + +// Prepare a map with unique filenames as key and the issue range for each file as value +// This is done to ensure fewer loops when processing issues. +type IssueRange struct { + Filename string // The file which has the issues + BeginIndex int // Array index in report.Issues where the particular issue starts + EndIndex int // Array index in report.Issues where the particular issue ends +} + +// GenerateIssueRangeSlice generates an array containing the issue ranges with respect to files +// that helps us to go through them and map them to the files where they got reported instead +// of opening the file for each of them. The generated index looks like this: + +// [{analyzer.go 0 0} {autofix_patch.go 1 1} {difftool.go 2 2} {patch.patch 3 5} {proc_skip_cq_test.go 6 6}] + +// Here, the first field if filename and the second and third fields are the index range in which the issues reported +// in these files lie in the sorted AnalyzerReport slice. +func createIssueFileRange(report types.AnalysisResult) []IssueRange { + fileCount := 0 // for 1 file, 0 based indexing + issuesRange := []IssueRange{} + prevFilename := report.Issues[0].Location.Path + + issueRange := IssueRange{ + BeginIndex: 0, + EndIndex: len(report.Issues) - 1, + Filename: prevFilename, + } + issuesRange = append(issuesRange, issueRange) + + // Iterating over the issues and creating an array containing issues with index data about + // the files in which those issues are present + for i := 1; i < len(report.Issues); i++ { + issue := report.Issues[i] + currentFilename := issue.Location.Path + + // TODO: Check when this condition is implied + if issue.Location.Position.End.Line == -1 { + issue.Location.Position.End.Line = issue.Location.Position.Begin.Line + } + + if currentFilename != prevFilename { + fileCount++ + + issueRange = issuesRange[fileCount-1] + issueRange.EndIndex = i - 1 + issuesRange[fileCount-1] = issueRange + + // Create for the new file + issueRange = IssueRange{ + Filename: currentFilename, + BeginIndex: i, + EndIndex: len(report.Issues) - 1, + } + + issuesRange = append(issuesRange, issueRange) + prevFilename = currentFilename + } + } + return issuesRange +} + +// formatLSPResultsToDefault converts the LSP based analysis results into the default format supported by DeepSource. +func (p *ReportProcessor) formatLSPResultsToDefault() types.AnalysisResult { + analysisResult := types.AnalysisResult{} + analysisResult.IsPassed = p.Report.IsPassed + analysisResult.Metrics = append(p.Report.Metrics, analysisResult.Metrics...) + analysisResult.Errors = append(p.Report.Errors, analysisResult.Errors...) + + // Appending the issues to the default format of Analysis report + for _, issue := range p.Report.Issues { + analysisIssue := types.Issue{ + IssueCode: issue.Code, + IssueText: issue.Message, + Location: types.Location{ + Path: issue.RelatedInformation[0].Location.URI, + Position: types.Position{ + Begin: types.Coordinate{ + Line: issue.Range.Start.Line, + Column: issue.Range.Start.Character, + }, + End: types.Coordinate{ + Line: issue.Range.End.Line, + Column: issue.Range.End.Character, + }, + }, + }, + } + analysisResult.Issues = append(analysisResult.Issues, analysisIssue) + } + return analysisResult +} diff --git a/command/analyzer/run/process.go b/command/analyzer/run/process.go new file mode 100644 index 000000000..f624071ef --- /dev/null +++ b/command/analyzer/run/process.go @@ -0,0 +1,39 @@ +package run + +import ( + "encoding/json" + "fmt" + + "github.com/deepsourcelabs/cli/analysis/processor" + "github.com/deepsourcelabs/cli/analysis/processor/processors" + "github.com/deepsourcelabs/cli/types" +) + +// processAnalyzerReport processes the analysis report generated by the Analyzer +func (a *AnalyzerDryRun) processAnalyzerReport(reportBytes []byte) (types.AnalysisResult, error) { + report := types.AnalyzerReport{} + skipCQProcessor := processors.ProcSkipCQ{} + sourceCodeHighlightingProcessor := processors.ProcSourceCodeLoad{} + + // Initializing the processors using the IProcessor interface provided by the `processor` package + var skip_cq, source_code_load processor.IProcessor + skip_cq = skipCQProcessor + source_code_load = sourceCodeHighlightingProcessor + + processor := processor.ReportProcessor{ + CodePath: a.SourcePath, + Processors: []processor.IProcessor{skip_cq, source_code_load}, + } + + // Generate the silencers regexMap. + processors.GenerateSilencersRegexMap() + + if err := json.Unmarshal(reportBytes, &report); err != nil { + fmt.Println(err) + return types.AnalysisResult{}, err + } + + processor.Report = report + analysisResult := processor.Process() + return analysisResult, nil +} diff --git a/command/analyzer/run/run.go b/command/analyzer/run/run.go index 9eb04c5f2..61c59b041 100644 --- a/command/analyzer/run/run.go +++ b/command/analyzer/run/run.go @@ -4,10 +4,11 @@ import ( "fmt" "os" + "github.com/deepsourcelabs/cli/types" "github.com/deepsourcelabs/cli/utils" "github.com/spf13/cobra" - analysis_config "github.com/deepsourcelabs/cli/analysis/config" + "github.com/deepsourcelabs/cli/analysis/config" "github.com/deepsourcelabs/cli/analyzers/backend/docker" ) @@ -20,18 +21,19 @@ var ( analysisResultsName string = "analysis_results" analysisConfigExt string = ".json" analysisResultsExt string = ".json" + // supportedProcessors []string = []string{"skip_cq", "source_code_load"} ) // The params required while running the Analysis locally type AnalyzerDryRun struct { - Client *docker.DockerClient // The client to be used for all docker related ops - RemoteSource bool // True if the source to be analyzed is a remote VCS repository - SourcePath string // The path of the directory of source code to be analyzed - AnalysisFiles []string // The list of analysis files - TempCloneDirectory string // The temporary directory where the source of the remote VCS will be cloned to - TempToolBoxDirectory string // The temporary directory where the analysis_config is present - - AnalysisConfig *analysis_config.AnalysisConfig // The analysis_config.json file containing the meta for analysis + Client *docker.DockerClient // The client to be used for all docker related ops. + RemoteSource bool // True if the source to be analyzed is a remote VCS repository. + SourcePath string // The path of the directory of source code to be analyzed. + TempCloneDirectory string // The temporary directory where the source of the remote VCS will be cloned to. + TempToolBoxDirectory string // The temporary directory where the analysis_config is present. + AnalysisFiles []string // The list of analysis files. + AnalysisConfig *config.AnalysisConfig // The analysis_config.json file containing the meta for analysis. + AnalysisResult types.AnalysisResult } func NewCmdAnalyzerRun() *cobra.Command { @@ -42,6 +44,7 @@ func NewCmdAnalyzerRun() *cobra.Command { opts := AnalyzerDryRun{ SourcePath: cwd, RemoteSource: false, + // Processors: supportedProcessors, } cmd := &cobra.Command{ @@ -66,7 +69,6 @@ func NewCmdAnalyzerRun() *cobra.Command { // Run the Analyzer locally on a certain directory or repository func (a *AnalyzerDryRun) AnalyzerRun() (err error) { - // runtime.Breakpoint() err = a.createDockerClient() if err != nil { return err @@ -91,20 +93,19 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { return err } - /* Create temporary toolbox directory to store analysis config and later analyis results - * If already passed through --output-file flag, use that one */ + // Create temporary toolbox directory to store analysis config and later analyis results + // If already passed through --output-file flag, use that one if err = a.createTemporaryToolBoxDir(); err != nil { return err } // Resolve the path of source code to be analyzed based on the user input - a.Client.AnalysisOpts.HostCodePath, err = a.resolveAnalysisCodePath() - if err != nil { + if a.Client.AnalysisOpts.HostCodePath, err = a.resolveAnalysisCodePath(); err != nil { return err } - /* Generate the analysis_config.json file - * Also, write the analysis_config data into a temp /toolbox directory to be mounted into the container */ + // Generate the analysis_config.json file + // Also, write the analysis_config data into a temp /toolbox directory to be mounted into the container if err = a.prepareAnalysisConfig(); err != nil { return err } @@ -114,8 +115,8 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { return err } - /* Starts the Docker container which analyzes the code and stores the analysis results - * in a variable */ + // Starts the Docker container which analyzes the code and stores the analysis results + // in a variable if err = a.Client.StartDockerContainer(); err != nil { return err } @@ -127,5 +128,14 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { } // Write the analysis results to the file - return a.writeAnalysisResults(analysisResultBuf, analysisResultFileName) + if err = a.writeAnalysisResults(analysisResultBuf, analysisResultFileName); err != nil { + return err + } + + // Process the analyzer report once it is received. + if a.AnalysisResult, err = a.processAnalyzerReport(analysisResultBuf); err != nil { + return err + } + fmt.Println("Issues after processing:", len(a.AnalysisResult.Issues)) + return nil } diff --git a/go.mod b/go.mod index 59da01294..9842ca1e8 100644 --- a/go.mod +++ b/go.mod @@ -69,6 +69,8 @@ require ( gopkg.in/ini.v1 v1.66.4 // indirect ) +require github.com/alecthomas/chroma v0.10.0 + require ( github.com/Microsoft/go-winio v0.5.2 // indirect github.com/Microsoft/hcsshim v0.9.2 // indirect @@ -76,6 +78,7 @@ require ( github.com/containerd/cgroups v1.0.3 // indirect github.com/containerd/containerd v1.6.3 // indirect github.com/containerd/continuity v0.3.0 // indirect + github.com/dlclark/regexp2 v1.4.0 // indirect github.com/docker/distribution v2.8.1+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect diff --git a/go.sum b/go.sum index e8cb80d16..2afaf98e1 100644 --- a/go.sum +++ b/go.sum @@ -103,6 +103,8 @@ github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:H github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= +github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= 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= @@ -299,6 +301,8 @@ github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= +github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= diff --git a/types/result.go b/types/result.go new file mode 100644 index 000000000..135d74d65 --- /dev/null +++ b/types/result.go @@ -0,0 +1,72 @@ +package types + +import "github.com/deepsourcelabs/cli/analysis/lsp" + +/////////////////////////////////////// +// LSP based Analysis Report Types // +///////////////////////////////////// + +type AnalyzerReport struct { + Issues []lsp.Diagnostic `json:"issues"` + Metrics []Metric `json:"metrics,omitempty"` + IsPassed bool `json:"is_passed"` + Errors []Error `json:"errors"` + // Errors []lsp.Diagnostic `json:"errors"` + ExtraData interface{} `json:"extra_data"` +} + +///////////////////////////// +// Final Analysis Result // +/////////////////////////// + +type AnalysisResult struct { + Issues []Issue `json:"issues"` + Metrics []Metric `json:"metrics,omitempty"` + IsPassed bool `json:"is_passed"` + Errors []Error `json:"errors"` +} + +type SourceCode struct { + Rendered string `json:"rendered"` +} + +type ProcessedData struct { + SourceCode SourceCode `json:"source_code,omitempty"` +} + +type Issue struct { + IssueCode string `json:"issue_code"` + IssueText string `json:"issue_text"` + Location Location `json:"location"` + ProcessedData ProcessedData `json:"processed_data,omitempty"` +} + +type Error struct { + HMessage string `json:"hmessage"` + Level int `json:"level"` +} + +type Namespace struct { + Key string `json:"key"` + Value float64 `json:"value"` +} + +type Metric struct { + MetricCode string `json:"metric_code"` + Namespaces []Namespace `json:"namespaces"` +} + +type Coordinate struct { + Line int `json:"line"` + Column int `json:"column"` +} + +type Position struct { + Begin Coordinate `json:"begin"` + End Coordinate `json:"end"` +} + +type Location struct { + Path string `json:"path"` + Position Position `json:"position"` +} From da2578667466bb4d693deb42c50232f691686ee3 Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Mon, 20 Jun 2022 17:38:26 +0530 Subject: [PATCH 09/28] chore(dry-run): improve user interface and other minor improvements (#153) --- analysis/processor/batch_process.go | 7 ++-- analysis/processor/process.go | 10 ++--- analysis/processor/utils.go | 8 +++- analyzers/validator/utils.go | 2 +- command/analyzer/analyzer.go | 4 +- .../.deepsource/analyzer/analyzer.toml | 0 command/analyzer/{run => dryrun}/client.go | 2 +- command/analyzer/{run => dryrun}/config.go | 4 +- command/analyzer/{run => dryrun}/process.go | 9 ++-- command/analyzer/{run => dryrun}/result.go | 6 +-- command/analyzer/{run => dryrun}/run.go | 42 +++++++++++++++---- command/analyzer/{run => dryrun}/source.go | 12 ++++-- .../analyzer/{run => dryrun}/source_test.go | 4 +- .../test/expected_analysis_results.json | 0 .../analyzer/{run => dryrun}/test/run_test.go | 2 +- .../.deepsource/analyzer/analyzer.toml | 0 .../.deepsource/analyzer/issues/I001.toml | 0 .../test/todo-checker/Dockerfile | 0 .../test/todo-checker/config.go | 0 .../{run => dryrun}/test/todo-checker/go.mod | 0 .../{run => dryrun}/test/todo-checker/go.sum | 0 .../{run => dryrun}/test/todo-checker/main.go | 0 .../test/todo-checker/types.go | 0 .../test/todo-checker/utils.go | 0 .../testdata/project1/.deepsource.toml | 0 .../testdata/project1/.gitignore | 0 .../testdata/project1/README.md | 0 .../{run => dryrun}/testdata/project1/bind.go | 0 .../{run => dryrun}/testdata/project1/cmd.go | 0 .../{run => dryrun}/testdata/project1/code.go | 0 .../{run => dryrun}/testdata/project1/go.mod | 0 .../{run => dryrun}/testdata/project1/go.sum | 0 .../testdata/project1/hex_example.go | 0 .../{run => dryrun}/testdata/project1/html.go | 0 .../{run => dryrun}/testdata/project1/main.go | 0 .../testdata/project1/sync_example.go | 0 .../testdata/project1/unsafe_example.go | 0 .../testdata/project1/unsafe_header.go | 0 .../testdata/project1/weak_crypto.go | 0 .../testdata/project2/.deepsource.toml | 0 .../testdata/project2/.rubocop.yml | 0 .../testdata/project2/README.md | 0 .../{run => dryrun}/testdata/project2/code.rb | 0 .../testdata/project3/.deepsource.toml | 0 .../testdata/project3/.gitignore | 0 .../testdata/project3/Cargo.lock | 0 .../testdata/project3/Cargo.toml | 0 .../testdata/project3/README.md | 0 .../testdata/project3/src/main.rs | 0 .../testdata/project4/.deepsource.toml | 0 .../project4/.github/workflows/CI.yml | 0 .../testdata/project4/.gitignore | 0 .../{run => dryrun}/testdata/project4/Pipfile | 0 .../testdata/project4/README.md | 0 .../testdata/project4/assignment.py | 0 .../testdata/project4/demo_code.py | 0 .../testdata/project4/django_issues.py | 0 .../project4/duplicate_bases_class.py | 0 .../testdata/project4/miscellaneous.py | 0 .../project4/return_not_implemented.py | 0 .../testdata/project4/security.py | 0 .../testdata/project4/tests/__init__.py | 0 .../testdata/project4/tests/test_code.py | 0 .../testdata/project4/type_checks.py | 0 .../toolbox/project1/analysis_config.json | 0 .../toolbox/project2/analysis_config.json | 0 .../toolbox/project3/analysis_config.json | 0 .../toolbox/project4/analysis_config.json | 0 command/analyzer/{run => dryrun}/types.go | 2 +- command/analyzer/{run => dryrun}/utils.go | 2 +- command/analyzer/verify/verify.go | 16 +++---- go.mod | 5 ++- utils/prompt.go | 14 ++++--- utils/spinner.go | 16 ++++++- 74 files changed, 108 insertions(+), 59 deletions(-) rename command/analyzer/{run => dryrun}/.deepsource/analyzer/analyzer.toml (100%) rename command/analyzer/{run => dryrun}/client.go (98%) rename command/analyzer/{run => dryrun}/config.go (94%) rename command/analyzer/{run => dryrun}/process.go (85%) rename command/analyzer/{run => dryrun}/result.go (83%) rename command/analyzer/{run => dryrun}/run.go (64%) rename command/analyzer/{run => dryrun}/source.go (79%) rename command/analyzer/{run => dryrun}/source_test.go (97%) rename command/analyzer/{run => dryrun}/test/expected_analysis_results.json (100%) rename command/analyzer/{run => dryrun}/test/run_test.go (99%) rename command/analyzer/{run => dryrun}/test/todo-checker/.deepsource/analyzer/analyzer.toml (100%) rename command/analyzer/{run => dryrun}/test/todo-checker/.deepsource/analyzer/issues/I001.toml (100%) rename command/analyzer/{run => dryrun}/test/todo-checker/Dockerfile (100%) rename command/analyzer/{run => dryrun}/test/todo-checker/config.go (100%) rename command/analyzer/{run => dryrun}/test/todo-checker/go.mod (100%) rename command/analyzer/{run => dryrun}/test/todo-checker/go.sum (100%) rename command/analyzer/{run => dryrun}/test/todo-checker/main.go (100%) rename command/analyzer/{run => dryrun}/test/todo-checker/types.go (100%) rename command/analyzer/{run => dryrun}/test/todo-checker/utils.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/.deepsource.toml (100%) rename command/analyzer/{run => dryrun}/testdata/project1/.gitignore (100%) rename command/analyzer/{run => dryrun}/testdata/project1/README.md (100%) rename command/analyzer/{run => dryrun}/testdata/project1/bind.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/cmd.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/code.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/go.mod (100%) rename command/analyzer/{run => dryrun}/testdata/project1/go.sum (100%) rename command/analyzer/{run => dryrun}/testdata/project1/hex_example.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/html.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/main.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/sync_example.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/unsafe_example.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/unsafe_header.go (100%) rename command/analyzer/{run => dryrun}/testdata/project1/weak_crypto.go (100%) rename command/analyzer/{run => dryrun}/testdata/project2/.deepsource.toml (100%) rename command/analyzer/{run => dryrun}/testdata/project2/.rubocop.yml (100%) rename command/analyzer/{run => dryrun}/testdata/project2/README.md (100%) rename command/analyzer/{run => dryrun}/testdata/project2/code.rb (100%) rename command/analyzer/{run => dryrun}/testdata/project3/.deepsource.toml (100%) rename command/analyzer/{run => dryrun}/testdata/project3/.gitignore (100%) rename command/analyzer/{run => dryrun}/testdata/project3/Cargo.lock (100%) rename command/analyzer/{run => dryrun}/testdata/project3/Cargo.toml (100%) rename command/analyzer/{run => dryrun}/testdata/project3/README.md (100%) rename command/analyzer/{run => dryrun}/testdata/project3/src/main.rs (100%) rename command/analyzer/{run => dryrun}/testdata/project4/.deepsource.toml (100%) rename command/analyzer/{run => dryrun}/testdata/project4/.github/workflows/CI.yml (100%) rename command/analyzer/{run => dryrun}/testdata/project4/.gitignore (100%) rename command/analyzer/{run => dryrun}/testdata/project4/Pipfile (100%) rename command/analyzer/{run => dryrun}/testdata/project4/README.md (100%) rename command/analyzer/{run => dryrun}/testdata/project4/assignment.py (100%) rename command/analyzer/{run => dryrun}/testdata/project4/demo_code.py (100%) rename command/analyzer/{run => dryrun}/testdata/project4/django_issues.py (100%) rename command/analyzer/{run => dryrun}/testdata/project4/duplicate_bases_class.py (100%) rename command/analyzer/{run => dryrun}/testdata/project4/miscellaneous.py (100%) rename command/analyzer/{run => dryrun}/testdata/project4/return_not_implemented.py (100%) rename command/analyzer/{run => dryrun}/testdata/project4/security.py (100%) rename command/analyzer/{run => dryrun}/testdata/project4/tests/__init__.py (100%) rename command/analyzer/{run => dryrun}/testdata/project4/tests/test_code.py (100%) rename command/analyzer/{run => dryrun}/testdata/project4/type_checks.py (100%) rename command/analyzer/{run => dryrun}/testdata/toolbox/project1/analysis_config.json (100%) rename command/analyzer/{run => dryrun}/testdata/toolbox/project2/analysis_config.json (100%) rename command/analyzer/{run => dryrun}/testdata/toolbox/project3/analysis_config.json (100%) rename command/analyzer/{run => dryrun}/testdata/toolbox/project4/analysis_config.json (100%) rename command/analyzer/{run => dryrun}/types.go (95%) rename command/analyzer/{run => dryrun}/utils.go (99%) diff --git a/analysis/processor/batch_process.go b/analysis/processor/batch_process.go index d5c6885c2..00de911df 100644 --- a/analysis/processor/batch_process.go +++ b/analysis/processor/batch_process.go @@ -4,7 +4,6 @@ import ( "fmt" "io/ioutil" "log" - "path" "sort" "strings" @@ -117,7 +116,7 @@ func (p *ReportProcessor) cacheFilesToBeProcessed(totalFiles, processedFiles int fileContentChannel := make(chan fileContentNode, totalFiles) for j := 0; j < totalFiles; j++ { filename := filesWIssueRange[processedFiles+j].Filename - go addFileToCache(fileContentChannel, filename, p.CodePath) + go addFileToCache(fileContentChannel, filename) } cachedFiles := []fileContentNode{} @@ -134,10 +133,10 @@ func (p *ReportProcessor) cacheFilesToBeProcessed(totalFiles, processedFiles int // addFileToCache reads the file and formats its content into a fileContentNode struct instance // and passes that to the cachedFilesChannel channel since this function is run on a goroutine. -func addFileToCache(cachedFilesChannel chan fileContentNode, filename, codePath string) { +func addFileToCache(cachedFilesChannel chan fileContentNode, filename string) { fileContentSlice := []string{} - fileContentBytes, err := ioutil.ReadFile(path.Join(codePath, filename)) + fileContentBytes, err := ioutil.ReadFile(filename) if err != nil { fmt.Println("Could not process for file: ", filename, ". Err: ", err) } else if string(fileContentBytes) != "" { diff --git a/analysis/processor/process.go b/analysis/processor/process.go index c2d7ea01a..4467276bb 100644 --- a/analysis/processor/process.go +++ b/analysis/processor/process.go @@ -1,8 +1,6 @@ package processor import ( - "fmt" - "github.com/deepsourcelabs/cli/types" ) @@ -14,9 +12,10 @@ type IProcessor interface { // ReportProcessor struct contains the processor data needed to process the analysis results. type ReportProcessor struct { - CodePath string // The source code path where the issues got raised. - Processors []IProcessor // The list of supported post-analysis processors. - Report types.AnalyzerReport // The report generated by the Analyzer post analysis. + LocalSourcePath string // The local source code path which was analyzed by the Analyzer. + ContainerCodePath string // The codepath set for the Analysis container. + Processors []IProcessor // The list of supported post-analysis processors. + Report types.AnalyzerReport // The report generated by the Analyzer post analysis. } // ProcessAnalyzerReport accepts the result as a byte array and processes the results in the form of a @@ -36,7 +35,6 @@ func (p *ReportProcessor) Process() types.AnalysisResult { if len(analysisResult.Issues) <= 0 { return analysisResult } - fmt.Println("Total issues reported by the Analyzer: ", len(analysisResult.Issues)) // All the files that appear in the issues are now processed by the processors listed in analyzer conf // We must cache the files in order to not do file IO for every processor. diff --git a/analysis/processor/utils.go b/analysis/processor/utils.go index 53c2dbbd8..ad013e6fa 100644 --- a/analysis/processor/utils.go +++ b/analysis/processor/utils.go @@ -1,7 +1,9 @@ package processor import ( + "path" "sort" + "strings" "github.com/deepsourcelabs/cli/types" ) @@ -87,7 +89,7 @@ func (p *ReportProcessor) formatLSPResultsToDefault() types.AnalysisResult { IssueCode: issue.Code, IssueText: issue.Message, Location: types.Location{ - Path: issue.RelatedInformation[0].Location.URI, + Path: p.sanitizeFilePath(issue.RelatedInformation[0].Location.URI), Position: types.Position{ Begin: types.Coordinate{ Line: issue.Range.Start.Line, @@ -104,3 +106,7 @@ func (p *ReportProcessor) formatLSPResultsToDefault() types.AnalysisResult { } return analysisResult } + +func (p *ReportProcessor) sanitizeFilePath(filePath string) string { + return path.Join(p.LocalSourcePath, strings.TrimPrefix(filePath, p.ContainerCodePath)) +} diff --git a/analyzers/validator/utils.go b/analyzers/validator/utils.go index 01e91629b..7fa291721 100644 --- a/analyzers/validator/utils.go +++ b/analyzers/validator/utils.go @@ -40,7 +40,7 @@ func handleTOMLDecodeErrors(err error, filePath string) *ValidationFailure { // Handle strict mode error when some alien fields are added in the user configured TOML if strings.HasPrefix(err.Error(), "strict mode") { - decodeErrorMessage = fmt.Sprintf("failed to parse %s. Invalid fields detected.", path.Base(filePath)) + decodeErrorMessage = fmt.Sprintf("Failed to parse %s. Invalid fields detected.", path.Base(filePath)) } validationError := ValidationFailure{ File: filePath, diff --git a/command/analyzer/analyzer.go b/command/analyzer/analyzer.go index 7d7d04b9b..24a46d3c6 100644 --- a/command/analyzer/analyzer.go +++ b/command/analyzer/analyzer.go @@ -3,8 +3,8 @@ package analyzer import ( "github.com/spf13/cobra" + dryrun "github.com/deepsourcelabs/cli/command/analyzer/dryrun" initialize "github.com/deepsourcelabs/cli/command/analyzer/initialize" - "github.com/deepsourcelabs/cli/command/analyzer/run" verify "github.com/deepsourcelabs/cli/command/analyzer/verify" ) @@ -17,7 +17,7 @@ func NewCmdAnalyzer() *cobra.Command { Use: "analyzer", Short: "Operations related to DeepSource Analyzers", } - cmd.AddCommand(run.NewCmdAnalyzerRun()) + cmd.AddCommand(dryrun.NewCmdAnalyzerRun()) cmd.AddCommand(verify.NewCmdAnalyzerVerify()) cmd.AddCommand(initialize.NewCmdAnalyzerInit()) return cmd diff --git a/command/analyzer/run/.deepsource/analyzer/analyzer.toml b/command/analyzer/dryrun/.deepsource/analyzer/analyzer.toml similarity index 100% rename from command/analyzer/run/.deepsource/analyzer/analyzer.toml rename to command/analyzer/dryrun/.deepsource/analyzer/analyzer.toml diff --git a/command/analyzer/run/client.go b/command/analyzer/dryrun/client.go similarity index 98% rename from command/analyzer/run/client.go rename to command/analyzer/dryrun/client.go index 8c3f77cf3..0a84f1c8b 100644 --- a/command/analyzer/run/client.go +++ b/command/analyzer/dryrun/client.go @@ -1,4 +1,4 @@ -package run +package dryrun import ( "strings" diff --git a/command/analyzer/run/config.go b/command/analyzer/dryrun/config.go similarity index 94% rename from command/analyzer/run/config.go rename to command/analyzer/dryrun/config.go index bf9bc8c8e..71587b7da 100644 --- a/command/analyzer/run/config.go +++ b/command/analyzer/dryrun/config.go @@ -1,8 +1,7 @@ -package run +package dryrun import ( "encoding/json" - "fmt" "os" "path" @@ -39,6 +38,5 @@ func (a *AnalyzerDryRun) writeAnalysisConfig() (err error) { a.Client.AnalysisOpts.AnalysisConfigPath = path.Join(a.TempToolBoxDirectory, analysisConfigName+analysisConfigExt) // Create a temporary directory - fmt.Printf("Writing analysis_config to %s\n", a.TempToolBoxDirectory) return os.WriteFile(path.Join(a.TempToolBoxDirectory, analysisConfigName+analysisConfigExt), analysisConfigJSON, 0o644) } diff --git a/command/analyzer/run/process.go b/command/analyzer/dryrun/process.go similarity index 85% rename from command/analyzer/run/process.go rename to command/analyzer/dryrun/process.go index f624071ef..d688560fd 100644 --- a/command/analyzer/run/process.go +++ b/command/analyzer/dryrun/process.go @@ -1,8 +1,7 @@ -package run +package dryrun import ( "encoding/json" - "fmt" "github.com/deepsourcelabs/cli/analysis/processor" "github.com/deepsourcelabs/cli/analysis/processor/processors" @@ -21,15 +20,15 @@ func (a *AnalyzerDryRun) processAnalyzerReport(reportBytes []byte) (types.Analys source_code_load = sourceCodeHighlightingProcessor processor := processor.ReportProcessor{ - CodePath: a.SourcePath, - Processors: []processor.IProcessor{skip_cq, source_code_load}, + LocalSourcePath: a.SourcePath, + ContainerCodePath: a.Client.AnalysisOpts.ContainerCodePath, + Processors: []processor.IProcessor{skip_cq, source_code_load}, } // Generate the silencers regexMap. processors.GenerateSilencersRegexMap() if err := json.Unmarshal(reportBytes, &report); err != nil { - fmt.Println(err) return types.AnalysisResult{}, err } diff --git a/command/analyzer/run/result.go b/command/analyzer/dryrun/result.go similarity index 83% rename from command/analyzer/run/result.go rename to command/analyzer/dryrun/result.go index 015cc1199..8ce5afb11 100644 --- a/command/analyzer/run/result.go +++ b/command/analyzer/dryrun/result.go @@ -1,8 +1,7 @@ -package run +package dryrun import ( "errors" - "fmt" "os" "path" "strings" @@ -14,12 +13,9 @@ func (a *AnalyzerDryRun) writeAnalysisResults(buf []byte, fileName string) (err // Ref: https://deepsource.io/directory/analyzers/go/issues/GSC-G305 if !strings.Contains(string(buf), "..") { - fmt.Println("Writing analysis result to", path.Join(a.Client.AnalysisOpts.AnalysisResultsPath, fileName)) - // Check if the results file already exists if _, err := os.Stat(analysisResultsPath); err != nil { if errors.Is(err, os.ErrNotExist) { - fmt.Println("File doesn't exist already. Creating it.") // Create the file and allocate permissions to it _, err := os.Create(analysisResultsPath) if err != nil { diff --git a/command/analyzer/run/run.go b/command/analyzer/dryrun/run.go similarity index 64% rename from command/analyzer/run/run.go rename to command/analyzer/dryrun/run.go index 61c59b041..b59723799 100644 --- a/command/analyzer/run/run.go +++ b/command/analyzer/dryrun/run.go @@ -1,11 +1,13 @@ -package run +package dryrun import ( "fmt" "os" + "path" "github.com/deepsourcelabs/cli/types" "github.com/deepsourcelabs/cli/utils" + "github.com/morikuni/aec" "github.com/spf13/cobra" "github.com/deepsourcelabs/cli/analysis/config" @@ -21,7 +23,6 @@ var ( analysisResultsName string = "analysis_results" analysisConfigExt string = ".json" analysisResultsExt string = ".json" - // supportedProcessors []string = []string{"skip_cq", "source_code_load"} ) // The params required while running the Analysis locally @@ -33,7 +34,8 @@ type AnalyzerDryRun struct { TempToolBoxDirectory string // The temporary directory where the analysis_config is present. AnalysisFiles []string // The list of analysis files. AnalysisConfig *config.AnalysisConfig // The analysis_config.json file containing the meta for analysis. - AnalysisResult types.AnalysisResult + AnalysisResult types.AnalysisResult // The analysis result received after post processing Analyzer report. + Spinner *utils.SpinnerUtils } func NewCmdAnalyzerRun() *cobra.Command { @@ -42,9 +44,9 @@ func NewCmdAnalyzerRun() *cobra.Command { // Initializing the run params and setting defaults opts := AnalyzerDryRun{ + Spinner: &utils.SpinnerUtils{}, SourcePath: cwd, RemoteSource: false, - // Processors: supportedProcessors, } cmd := &cobra.Command{ @@ -67,7 +69,7 @@ func NewCmdAnalyzerRun() *cobra.Command { return cmd } -// Run the Analyzer locally on a certain directory or repository +// AnalyzerRun runs the Analyzer locally on a certain directory or repository. func (a *AnalyzerDryRun) AnalyzerRun() (err error) { err = a.createDockerClient() if err != nil { @@ -75,7 +77,7 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { } // Building the Analyzer image - fmt.Println("Building Analyzer image...") + a.Spinner.StartSpinnerWithLabel("Building Analyzer image...", "Built Analyzer image") ctxCancelFunc, buildRespReader, buildError := a.Client.BuildAnalyzerDockerImage() // Cancel the build context and close the reader before exiting this function @@ -84,58 +86,82 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { } defer ctxCancelFunc() if buildError != nil { + a.Spinner.StopSpinnerWithError("Failed to build the Analyzer image", err) return buildError } // Check the docker build response - // TODO: Tweak the behaviour here when the spinners are added to the run command if err = docker.CheckBuildResponse(buildRespReader, false); err != nil { + a.Spinner.StopSpinnerWithError("Failed to build the Analyzer image", err) return err } + a.Spinner.StopSpinner() // Create temporary toolbox directory to store analysis config and later analyis results // If already passed through --output-file flag, use that one + a.Spinner.StartSpinnerWithLabel("Creating temporary toolbox directory...", "Temporary toolbox directory created") if err = a.createTemporaryToolBoxDir(); err != nil { + a.Spinner.StopSpinnerWithError("Failed to create temporary toolbox directory", err) return err } + a.Spinner.StopSpinner() // Resolve the path of source code to be analyzed based on the user input + a.Spinner.StartSpinnerWithLabel("Resolving the path of source code to be analyzed...", "") if a.Client.AnalysisOpts.HostCodePath, err = a.resolveAnalysisCodePath(); err != nil { + a.Spinner.StopSpinnerWithError("Failed to resolve path of source code to be analyzed", err) return err } + a.Spinner.StopSpinner() // Generate the analysis_config.json file // Also, write the analysis_config data into a temp /toolbox directory to be mounted into the container + a.Spinner.StartSpinnerWithLabel("Generating analysis config...", fmt.Sprint("Analysis config (analysis_config.json) generated at ", path.Join(a.TempToolBoxDirectory, "analysis_config.json"))) if err = a.prepareAnalysisConfig(); err != nil { + a.Spinner.StopSpinnerWithError("Failed to generate analysis_config.json", err) return err } + a.Spinner.StopSpinner() // Write the analysis_config.json to local toolbox directory if err = a.writeAnalysisConfig(); err != nil { + a.Spinner.StopSpinnerWithError("Failed to write analysis_config.json", err) return err } + a.Spinner.StopSpinner() // Starts the Docker container which analyzes the code and stores the analysis results // in a variable + + fmt.Println(aec.Apply("[+] Starting the Analysis container", aec.LightYellowF)) if err = a.Client.StartDockerContainer(); err != nil { return err } // Fetch the analysis results + a.Spinner.StartSpinnerWithLabel("Fetching Analyzer report...", "Successfully fetched Analyzer report") analysisResultBuf, analysisResultFileName, err := a.Client.FetchAnalysisResults() if err != nil { + a.Spinner.StopSpinnerWithError("Failed to fetch Analyzer report", err) return err } + a.Spinner.StopSpinner() // Write the analysis results to the file + a.Spinner.StartSpinnerWithLabel("Writing Analyzer report...", fmt.Sprintf("Analyzer report written to %s", path.Join(a.Client.AnalysisOpts.AnalysisResultsPath, analysisResultFileName))) if err = a.writeAnalysisResults(analysisResultBuf, analysisResultFileName); err != nil { + a.Spinner.StopSpinnerWithError("Failed to write Analyzer report", err) return err } + a.Spinner.StopSpinner() // Process the analyzer report once it is received. + a.Spinner.StartSpinnerWithLabel("Processing Analyzer report...", "Successfully processed Analyzer report") if a.AnalysisResult, err = a.processAnalyzerReport(analysisResultBuf); err != nil { + a.Spinner.StopSpinnerWithError("Failed to process Analyzer report", err) return err } - fmt.Println("Issues after processing:", len(a.AnalysisResult.Issues)) + a.Spinner.StopSpinner() + fmt.Println(aec.Apply(fmt.Sprintf("[✔] Issues after processing: %d", len(a.AnalysisResult.Issues)), aec.LightGreenF)) return nil } diff --git a/command/analyzer/run/source.go b/command/analyzer/dryrun/source.go similarity index 79% rename from command/analyzer/run/source.go rename to command/analyzer/dryrun/source.go index d498f6cd5..d4d88d1b7 100644 --- a/command/analyzer/run/source.go +++ b/command/analyzer/dryrun/source.go @@ -1,8 +1,8 @@ -package run +package dryrun import ( + "bytes" "fmt" - "os" "path/filepath" "github.com/go-git/go-git/v5" @@ -20,6 +20,7 @@ func (a *AnalyzerDryRun) resolveAnalysisCodePath() (string, error) { } a.SourcePath = tempCloneDir } else { + // Resolve the path if it is a relative path a.SourcePath, _ = filepath.Abs(a.SourcePath) } return a.SourcePath, nil @@ -28,17 +29,20 @@ func (a *AnalyzerDryRun) resolveAnalysisCodePath() (string, error) { // Clones the remote repository which is to be analyzed func (a *AnalyzerDryRun) cloneRemoteSource() (string, error) { var err error + buf := bytes.NewBuffer(nil) a.RemoteSource = true + + a.Spinner.SetSuffix(fmt.Sprintf("Creating temporary directory to clone %s", a.SourcePath)) if a.TempCloneDirectory, err = createTemporaryDirectory("code"); err != nil { return "", err } // Clone the repository to a temporary directory - fmt.Printf("Cloning %s to %s\n", a.SourcePath, a.TempCloneDirectory) + a.Spinner.SetSuffix(fmt.Sprintf("Cloning %s to %s", a.SourcePath, a.TempCloneDirectory)) if _, err := git.PlainClone(a.TempCloneDirectory, false, &git.CloneOptions{ URL: a.SourcePath, Depth: 1, - Progress: os.Stdout, + Progress: buf, }); err != nil { return "", err } diff --git a/command/analyzer/run/source_test.go b/command/analyzer/dryrun/source_test.go similarity index 97% rename from command/analyzer/run/source_test.go rename to command/analyzer/dryrun/source_test.go index 520cbe74c..c5c561507 100644 --- a/command/analyzer/run/source_test.go +++ b/command/analyzer/dryrun/source_test.go @@ -1,4 +1,4 @@ -package run +package dryrun import ( "bytes" @@ -8,6 +8,7 @@ import ( "testing" "github.com/deepsourcelabs/cli/analyzers/backend/docker" + "github.com/deepsourcelabs/cli/utils" ) func TestPrepareAnalysisConfig(t *testing.T) { @@ -116,6 +117,7 @@ func TestResolveAnalysisCodePath(t *testing.T) { for _, tc := range testCases { opts := AnalyzerDryRun{ SourcePath: tc.Path, + Spinner: &utils.SpinnerUtils{}, } resolvedPath, err := opts.resolveAnalysisCodePath() if err != nil && err.Error() != "authentication required" { diff --git a/command/analyzer/run/test/expected_analysis_results.json b/command/analyzer/dryrun/test/expected_analysis_results.json similarity index 100% rename from command/analyzer/run/test/expected_analysis_results.json rename to command/analyzer/dryrun/test/expected_analysis_results.json diff --git a/command/analyzer/run/test/run_test.go b/command/analyzer/dryrun/test/run_test.go similarity index 99% rename from command/analyzer/run/test/run_test.go rename to command/analyzer/dryrun/test/run_test.go index 17babdd2a..98fe4844d 100644 --- a/command/analyzer/run/test/run_test.go +++ b/command/analyzer/dryrun/test/run_test.go @@ -1,4 +1,4 @@ -package run +package dryrun import ( "bytes" diff --git a/command/analyzer/run/test/todo-checker/.deepsource/analyzer/analyzer.toml b/command/analyzer/dryrun/test/todo-checker/.deepsource/analyzer/analyzer.toml similarity index 100% rename from command/analyzer/run/test/todo-checker/.deepsource/analyzer/analyzer.toml rename to command/analyzer/dryrun/test/todo-checker/.deepsource/analyzer/analyzer.toml diff --git a/command/analyzer/run/test/todo-checker/.deepsource/analyzer/issues/I001.toml b/command/analyzer/dryrun/test/todo-checker/.deepsource/analyzer/issues/I001.toml similarity index 100% rename from command/analyzer/run/test/todo-checker/.deepsource/analyzer/issues/I001.toml rename to command/analyzer/dryrun/test/todo-checker/.deepsource/analyzer/issues/I001.toml diff --git a/command/analyzer/run/test/todo-checker/Dockerfile b/command/analyzer/dryrun/test/todo-checker/Dockerfile similarity index 100% rename from command/analyzer/run/test/todo-checker/Dockerfile rename to command/analyzer/dryrun/test/todo-checker/Dockerfile diff --git a/command/analyzer/run/test/todo-checker/config.go b/command/analyzer/dryrun/test/todo-checker/config.go similarity index 100% rename from command/analyzer/run/test/todo-checker/config.go rename to command/analyzer/dryrun/test/todo-checker/config.go diff --git a/command/analyzer/run/test/todo-checker/go.mod b/command/analyzer/dryrun/test/todo-checker/go.mod similarity index 100% rename from command/analyzer/run/test/todo-checker/go.mod rename to command/analyzer/dryrun/test/todo-checker/go.mod diff --git a/command/analyzer/run/test/todo-checker/go.sum b/command/analyzer/dryrun/test/todo-checker/go.sum similarity index 100% rename from command/analyzer/run/test/todo-checker/go.sum rename to command/analyzer/dryrun/test/todo-checker/go.sum diff --git a/command/analyzer/run/test/todo-checker/main.go b/command/analyzer/dryrun/test/todo-checker/main.go similarity index 100% rename from command/analyzer/run/test/todo-checker/main.go rename to command/analyzer/dryrun/test/todo-checker/main.go diff --git a/command/analyzer/run/test/todo-checker/types.go b/command/analyzer/dryrun/test/todo-checker/types.go similarity index 100% rename from command/analyzer/run/test/todo-checker/types.go rename to command/analyzer/dryrun/test/todo-checker/types.go diff --git a/command/analyzer/run/test/todo-checker/utils.go b/command/analyzer/dryrun/test/todo-checker/utils.go similarity index 100% rename from command/analyzer/run/test/todo-checker/utils.go rename to command/analyzer/dryrun/test/todo-checker/utils.go diff --git a/command/analyzer/run/testdata/project1/.deepsource.toml b/command/analyzer/dryrun/testdata/project1/.deepsource.toml similarity index 100% rename from command/analyzer/run/testdata/project1/.deepsource.toml rename to command/analyzer/dryrun/testdata/project1/.deepsource.toml diff --git a/command/analyzer/run/testdata/project1/.gitignore b/command/analyzer/dryrun/testdata/project1/.gitignore similarity index 100% rename from command/analyzer/run/testdata/project1/.gitignore rename to command/analyzer/dryrun/testdata/project1/.gitignore diff --git a/command/analyzer/run/testdata/project1/README.md b/command/analyzer/dryrun/testdata/project1/README.md similarity index 100% rename from command/analyzer/run/testdata/project1/README.md rename to command/analyzer/dryrun/testdata/project1/README.md diff --git a/command/analyzer/run/testdata/project1/bind.go b/command/analyzer/dryrun/testdata/project1/bind.go similarity index 100% rename from command/analyzer/run/testdata/project1/bind.go rename to command/analyzer/dryrun/testdata/project1/bind.go diff --git a/command/analyzer/run/testdata/project1/cmd.go b/command/analyzer/dryrun/testdata/project1/cmd.go similarity index 100% rename from command/analyzer/run/testdata/project1/cmd.go rename to command/analyzer/dryrun/testdata/project1/cmd.go diff --git a/command/analyzer/run/testdata/project1/code.go b/command/analyzer/dryrun/testdata/project1/code.go similarity index 100% rename from command/analyzer/run/testdata/project1/code.go rename to command/analyzer/dryrun/testdata/project1/code.go diff --git a/command/analyzer/run/testdata/project1/go.mod b/command/analyzer/dryrun/testdata/project1/go.mod similarity index 100% rename from command/analyzer/run/testdata/project1/go.mod rename to command/analyzer/dryrun/testdata/project1/go.mod diff --git a/command/analyzer/run/testdata/project1/go.sum b/command/analyzer/dryrun/testdata/project1/go.sum similarity index 100% rename from command/analyzer/run/testdata/project1/go.sum rename to command/analyzer/dryrun/testdata/project1/go.sum diff --git a/command/analyzer/run/testdata/project1/hex_example.go b/command/analyzer/dryrun/testdata/project1/hex_example.go similarity index 100% rename from command/analyzer/run/testdata/project1/hex_example.go rename to command/analyzer/dryrun/testdata/project1/hex_example.go diff --git a/command/analyzer/run/testdata/project1/html.go b/command/analyzer/dryrun/testdata/project1/html.go similarity index 100% rename from command/analyzer/run/testdata/project1/html.go rename to command/analyzer/dryrun/testdata/project1/html.go diff --git a/command/analyzer/run/testdata/project1/main.go b/command/analyzer/dryrun/testdata/project1/main.go similarity index 100% rename from command/analyzer/run/testdata/project1/main.go rename to command/analyzer/dryrun/testdata/project1/main.go diff --git a/command/analyzer/run/testdata/project1/sync_example.go b/command/analyzer/dryrun/testdata/project1/sync_example.go similarity index 100% rename from command/analyzer/run/testdata/project1/sync_example.go rename to command/analyzer/dryrun/testdata/project1/sync_example.go diff --git a/command/analyzer/run/testdata/project1/unsafe_example.go b/command/analyzer/dryrun/testdata/project1/unsafe_example.go similarity index 100% rename from command/analyzer/run/testdata/project1/unsafe_example.go rename to command/analyzer/dryrun/testdata/project1/unsafe_example.go diff --git a/command/analyzer/run/testdata/project1/unsafe_header.go b/command/analyzer/dryrun/testdata/project1/unsafe_header.go similarity index 100% rename from command/analyzer/run/testdata/project1/unsafe_header.go rename to command/analyzer/dryrun/testdata/project1/unsafe_header.go diff --git a/command/analyzer/run/testdata/project1/weak_crypto.go b/command/analyzer/dryrun/testdata/project1/weak_crypto.go similarity index 100% rename from command/analyzer/run/testdata/project1/weak_crypto.go rename to command/analyzer/dryrun/testdata/project1/weak_crypto.go diff --git a/command/analyzer/run/testdata/project2/.deepsource.toml b/command/analyzer/dryrun/testdata/project2/.deepsource.toml similarity index 100% rename from command/analyzer/run/testdata/project2/.deepsource.toml rename to command/analyzer/dryrun/testdata/project2/.deepsource.toml diff --git a/command/analyzer/run/testdata/project2/.rubocop.yml b/command/analyzer/dryrun/testdata/project2/.rubocop.yml similarity index 100% rename from command/analyzer/run/testdata/project2/.rubocop.yml rename to command/analyzer/dryrun/testdata/project2/.rubocop.yml diff --git a/command/analyzer/run/testdata/project2/README.md b/command/analyzer/dryrun/testdata/project2/README.md similarity index 100% rename from command/analyzer/run/testdata/project2/README.md rename to command/analyzer/dryrun/testdata/project2/README.md diff --git a/command/analyzer/run/testdata/project2/code.rb b/command/analyzer/dryrun/testdata/project2/code.rb similarity index 100% rename from command/analyzer/run/testdata/project2/code.rb rename to command/analyzer/dryrun/testdata/project2/code.rb diff --git a/command/analyzer/run/testdata/project3/.deepsource.toml b/command/analyzer/dryrun/testdata/project3/.deepsource.toml similarity index 100% rename from command/analyzer/run/testdata/project3/.deepsource.toml rename to command/analyzer/dryrun/testdata/project3/.deepsource.toml diff --git a/command/analyzer/run/testdata/project3/.gitignore b/command/analyzer/dryrun/testdata/project3/.gitignore similarity index 100% rename from command/analyzer/run/testdata/project3/.gitignore rename to command/analyzer/dryrun/testdata/project3/.gitignore diff --git a/command/analyzer/run/testdata/project3/Cargo.lock b/command/analyzer/dryrun/testdata/project3/Cargo.lock similarity index 100% rename from command/analyzer/run/testdata/project3/Cargo.lock rename to command/analyzer/dryrun/testdata/project3/Cargo.lock diff --git a/command/analyzer/run/testdata/project3/Cargo.toml b/command/analyzer/dryrun/testdata/project3/Cargo.toml similarity index 100% rename from command/analyzer/run/testdata/project3/Cargo.toml rename to command/analyzer/dryrun/testdata/project3/Cargo.toml diff --git a/command/analyzer/run/testdata/project3/README.md b/command/analyzer/dryrun/testdata/project3/README.md similarity index 100% rename from command/analyzer/run/testdata/project3/README.md rename to command/analyzer/dryrun/testdata/project3/README.md diff --git a/command/analyzer/run/testdata/project3/src/main.rs b/command/analyzer/dryrun/testdata/project3/src/main.rs similarity index 100% rename from command/analyzer/run/testdata/project3/src/main.rs rename to command/analyzer/dryrun/testdata/project3/src/main.rs diff --git a/command/analyzer/run/testdata/project4/.deepsource.toml b/command/analyzer/dryrun/testdata/project4/.deepsource.toml similarity index 100% rename from command/analyzer/run/testdata/project4/.deepsource.toml rename to command/analyzer/dryrun/testdata/project4/.deepsource.toml diff --git a/command/analyzer/run/testdata/project4/.github/workflows/CI.yml b/command/analyzer/dryrun/testdata/project4/.github/workflows/CI.yml similarity index 100% rename from command/analyzer/run/testdata/project4/.github/workflows/CI.yml rename to command/analyzer/dryrun/testdata/project4/.github/workflows/CI.yml diff --git a/command/analyzer/run/testdata/project4/.gitignore b/command/analyzer/dryrun/testdata/project4/.gitignore similarity index 100% rename from command/analyzer/run/testdata/project4/.gitignore rename to command/analyzer/dryrun/testdata/project4/.gitignore diff --git a/command/analyzer/run/testdata/project4/Pipfile b/command/analyzer/dryrun/testdata/project4/Pipfile similarity index 100% rename from command/analyzer/run/testdata/project4/Pipfile rename to command/analyzer/dryrun/testdata/project4/Pipfile diff --git a/command/analyzer/run/testdata/project4/README.md b/command/analyzer/dryrun/testdata/project4/README.md similarity index 100% rename from command/analyzer/run/testdata/project4/README.md rename to command/analyzer/dryrun/testdata/project4/README.md diff --git a/command/analyzer/run/testdata/project4/assignment.py b/command/analyzer/dryrun/testdata/project4/assignment.py similarity index 100% rename from command/analyzer/run/testdata/project4/assignment.py rename to command/analyzer/dryrun/testdata/project4/assignment.py diff --git a/command/analyzer/run/testdata/project4/demo_code.py b/command/analyzer/dryrun/testdata/project4/demo_code.py similarity index 100% rename from command/analyzer/run/testdata/project4/demo_code.py rename to command/analyzer/dryrun/testdata/project4/demo_code.py diff --git a/command/analyzer/run/testdata/project4/django_issues.py b/command/analyzer/dryrun/testdata/project4/django_issues.py similarity index 100% rename from command/analyzer/run/testdata/project4/django_issues.py rename to command/analyzer/dryrun/testdata/project4/django_issues.py diff --git a/command/analyzer/run/testdata/project4/duplicate_bases_class.py b/command/analyzer/dryrun/testdata/project4/duplicate_bases_class.py similarity index 100% rename from command/analyzer/run/testdata/project4/duplicate_bases_class.py rename to command/analyzer/dryrun/testdata/project4/duplicate_bases_class.py diff --git a/command/analyzer/run/testdata/project4/miscellaneous.py b/command/analyzer/dryrun/testdata/project4/miscellaneous.py similarity index 100% rename from command/analyzer/run/testdata/project4/miscellaneous.py rename to command/analyzer/dryrun/testdata/project4/miscellaneous.py diff --git a/command/analyzer/run/testdata/project4/return_not_implemented.py b/command/analyzer/dryrun/testdata/project4/return_not_implemented.py similarity index 100% rename from command/analyzer/run/testdata/project4/return_not_implemented.py rename to command/analyzer/dryrun/testdata/project4/return_not_implemented.py diff --git a/command/analyzer/run/testdata/project4/security.py b/command/analyzer/dryrun/testdata/project4/security.py similarity index 100% rename from command/analyzer/run/testdata/project4/security.py rename to command/analyzer/dryrun/testdata/project4/security.py diff --git a/command/analyzer/run/testdata/project4/tests/__init__.py b/command/analyzer/dryrun/testdata/project4/tests/__init__.py similarity index 100% rename from command/analyzer/run/testdata/project4/tests/__init__.py rename to command/analyzer/dryrun/testdata/project4/tests/__init__.py diff --git a/command/analyzer/run/testdata/project4/tests/test_code.py b/command/analyzer/dryrun/testdata/project4/tests/test_code.py similarity index 100% rename from command/analyzer/run/testdata/project4/tests/test_code.py rename to command/analyzer/dryrun/testdata/project4/tests/test_code.py diff --git a/command/analyzer/run/testdata/project4/type_checks.py b/command/analyzer/dryrun/testdata/project4/type_checks.py similarity index 100% rename from command/analyzer/run/testdata/project4/type_checks.py rename to command/analyzer/dryrun/testdata/project4/type_checks.py diff --git a/command/analyzer/run/testdata/toolbox/project1/analysis_config.json b/command/analyzer/dryrun/testdata/toolbox/project1/analysis_config.json similarity index 100% rename from command/analyzer/run/testdata/toolbox/project1/analysis_config.json rename to command/analyzer/dryrun/testdata/toolbox/project1/analysis_config.json diff --git a/command/analyzer/run/testdata/toolbox/project2/analysis_config.json b/command/analyzer/dryrun/testdata/toolbox/project2/analysis_config.json similarity index 100% rename from command/analyzer/run/testdata/toolbox/project2/analysis_config.json rename to command/analyzer/dryrun/testdata/toolbox/project2/analysis_config.json diff --git a/command/analyzer/run/testdata/toolbox/project3/analysis_config.json b/command/analyzer/dryrun/testdata/toolbox/project3/analysis_config.json similarity index 100% rename from command/analyzer/run/testdata/toolbox/project3/analysis_config.json rename to command/analyzer/dryrun/testdata/toolbox/project3/analysis_config.json diff --git a/command/analyzer/run/testdata/toolbox/project4/analysis_config.json b/command/analyzer/dryrun/testdata/toolbox/project4/analysis_config.json similarity index 100% rename from command/analyzer/run/testdata/toolbox/project4/analysis_config.json rename to command/analyzer/dryrun/testdata/toolbox/project4/analysis_config.json diff --git a/command/analyzer/run/types.go b/command/analyzer/dryrun/types.go similarity index 95% rename from command/analyzer/run/types.go rename to command/analyzer/dryrun/types.go index 8523d4cc3..0885ce452 100644 --- a/command/analyzer/run/types.go +++ b/command/analyzer/dryrun/types.go @@ -1,4 +1,4 @@ -package run +package dryrun type AnalysisConfig struct { Files []string `json:"files"` diff --git a/command/analyzer/run/utils.go b/command/analyzer/dryrun/utils.go similarity index 99% rename from command/analyzer/run/utils.go rename to command/analyzer/dryrun/utils.go index e6211c4fb..6c6d900de 100644 --- a/command/analyzer/run/utils.go +++ b/command/analyzer/dryrun/utils.go @@ -1,4 +1,4 @@ -package run +package dryrun import ( "net/url" diff --git a/command/analyzer/verify/verify.go b/command/analyzer/verify/verify.go index c1a39094b..4dc312db5 100644 --- a/command/analyzer/verify/verify.go +++ b/command/analyzer/verify/verify.go @@ -35,14 +35,6 @@ type AnalyzerVerifyOpts struct { * ====================================== */ func NewCmdAnalyzerVerify() *cobra.Command { - // Configuring the paths of analyzer.toml and issues directory - projectRoot, err := utils.ExtractProjectRootPath() - if err != nil { - fmt.Printf("Couldn't find the root directory of the project. Error:%s", err) - } - analyzerTOMLPath = filepath.Join(projectRoot, configFolder, "analyzer.toml") - issuesDirPath = filepath.Join(projectRoot, configFolder, "issues/") - opts := AnalyzerVerifyOpts{ Spinner: &utils.SpinnerUtils{}, Build: AnalyzerBuild{ @@ -76,6 +68,14 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzer() (err error) { var issuesValidationErrors *[]validator.ValidationFailure configurationValid := true + // Configuring the paths of analyzer.toml and issues directory + projectRoot, err := utils.ExtractProjectRootPath() + if err != nil { + fmt.Printf("Couldn't find the root directory of the project. Error: %s\n", err) + } + analyzerTOMLPath = filepath.Join(projectRoot, configFolder, "analyzer.toml") + issuesDirPath = filepath.Join(projectRoot, configFolder, "issues/") + /* ================================================================================== * Checks for the presence of .deepsource/analyzer directory, * the analyzer.toml file and issues present in .deepsource/analyzer/issues directory diff --git a/go.mod b/go.mod index 9842ca1e8..9f7733dc5 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,10 @@ require ( gopkg.in/ini.v1 v1.66.4 // indirect ) -require github.com/alecthomas/chroma v0.10.0 +require ( + github.com/alecthomas/chroma v0.10.0 + github.com/morikuni/aec v1.0.0 +) require ( github.com/Microsoft/go-winio v0.5.2 // indirect diff --git a/utils/prompt.go b/utils/prompt.go index de6867727..2b8f14ea2 100644 --- a/utils/prompt.go +++ b/utils/prompt.go @@ -6,7 +6,7 @@ import ( "github.com/AlecAivazis/survey/v2" "github.com/AlecAivazis/survey/v2/terminal" - "github.com/mgutz/ansi" + "github.com/morikuni/aec" ) type UserInputPrompt struct{} @@ -104,17 +104,21 @@ func checkInterrupt(err error) error { } func GetSuccessMessage(msg string) string { - greenTickMark := ansi.Color("✔", "green") + greenTickMark := aec.Apply("[✔]", aec.LightGreenF) return greenTickMark + " " + msg } func GetFailureMessage(msg, errorMsg string) string { if errorMsg != "" { - return ansi.Color("✗"+" "+msg+". "+"Error: "+errorMsg, "red") + return aec.Apply("[✗]"+" "+msg+". "+"Error: "+errorMsg, aec.LightRedF) } - return ansi.Color("✗"+" "+msg, "red") + return aec.Apply("[✗]"+" "+msg, aec.LightRedF) } func GetBulletMessage(msg, color string) string { - return ansi.Color("•"+" "+msg, color) + switch color { + case "red": + return aec.Apply("•"+" "+msg, aec.LightRedF) + } + return "" } diff --git a/utils/spinner.go b/utils/spinner.go index 8fa474de1..1fcabb587 100644 --- a/utils/spinner.go +++ b/utils/spinner.go @@ -24,10 +24,13 @@ func (s *SpinnerUtils) StartSpinnerWithLabel(label, finalMessage string) { 120*time.Millisecond, spinner.WithWriter(os.Stdout), spinner.WithWriter(os.Stderr), - spinner.WithFinalMSG(fmt.Sprintf("%s\n", GetSuccessMessage(finalMessage)))) // Build our new spinner + ) // Build our new spinner if label != "" { sp.Suffix = " " + label + " " } + if finalMessage != "" { + sp.FinalMSG = fmt.Sprintf("%s\n", GetSuccessMessage(finalMessage)) + } sp.Start() // Start the spinner s.Spinner = sp } @@ -44,6 +47,17 @@ func (s *SpinnerUtils) StopSpinner() { s.Spinner = nil } +// Stops the spinner +func (s *SpinnerUtils) SetSuffix(suffix string) { + s.mu.Lock() + defer s.mu.Unlock() + + if s.Spinner == nil { + return + } + s.Spinner.Suffix = " " + suffix + " " +} + // Stops the spinner and displays an error message with a cross emoji func (s *SpinnerUtils) StopSpinnerWithError(msg string, errorMessage error) { s.mu.Lock() From 699a0d973f4d66dce7972b73fb4a29b5d2d1dab8 Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Tue, 28 Jun 2022 19:00:01 +0530 Subject: [PATCH 10/28] feat(dry-run): template to show the analysis results on browser (#154) --- .../processors/proc_source_code_load.go | 4 +- analyzers/backend/docker/container.go | 2 +- cmd/Dockerfile_new | 2 - command/analyzer/dryrun/client.go | 1 + command/analyzer/dryrun/process.go | 8 +- command/analyzer/dryrun/render/category.go | 26 + command/analyzer/dryrun/render/metrics.go | 14 + command/analyzer/dryrun/render/occurences.go | 78 ++ command/analyzer/dryrun/render/render.go | 85 ++ command/analyzer/dryrun/render/route.go | 78 ++ command/analyzer/dryrun/render/types.go | 54 + command/analyzer/dryrun/render/utils.go | 201 +++ .../dryrun/render/views/assets/cli.css | 1169 +++++++++++++++++ .../analyzer/dryrun/render/views/index.html | 123 ++ .../dryrun/render/views/occurence.html | 111 ++ command/analyzer/dryrun/run.go | 78 +- command/analyzer/dryrun/test/run_test.go | 85 +- command/analyzer/dryrun/types.go | 1 + go.mod | 15 +- go.sum | 27 +- types/analyzer.go | 2 +- types/constants.go | 24 + types/result.go | 11 +- 23 files changed, 2130 insertions(+), 69 deletions(-) delete mode 100644 cmd/Dockerfile_new create mode 100644 command/analyzer/dryrun/render/category.go create mode 100644 command/analyzer/dryrun/render/metrics.go create mode 100644 command/analyzer/dryrun/render/occurences.go create mode 100644 command/analyzer/dryrun/render/render.go create mode 100644 command/analyzer/dryrun/render/route.go create mode 100644 command/analyzer/dryrun/render/types.go create mode 100644 command/analyzer/dryrun/render/utils.go create mode 100644 command/analyzer/dryrun/render/views/assets/cli.css create mode 100644 command/analyzer/dryrun/render/views/index.html create mode 100644 command/analyzer/dryrun/render/views/occurence.html create mode 100644 types/constants.go diff --git a/analysis/processor/processors/proc_source_code_load.go b/analysis/processor/processors/proc_source_code_load.go index b6efdb4fc..7521e3763 100644 --- a/analysis/processor/processors/proc_source_code_load.go +++ b/analysis/processor/processors/proc_source_code_load.go @@ -148,8 +148,8 @@ func getFinalFormattedSlice(fileContentSlice []string, issue *types.Issue) forma // We need to move the trailing span to the previous line in order for our replacement logic to work. for i := range chromaHighlightedSlice { - if i != 0 && !strings.HasPrefix(chromaHighlightedSlice[i], "") { - lineStartIndex := strings.Index(chromaHighlightedSlice[i], "") + if i != 0 && !strings.HasPrefix(chromaHighlightedSlice[i], "") { + lineStartIndex := strings.Index(chromaHighlightedSlice[i], "") if lineStartIndex != -1 { chromaHighlightedSlice[i-1] += chromaHighlightedSlice[i][:lineStartIndex] diff --git a/analyzers/backend/docker/container.go b/analyzers/backend/docker/container.go index 250f17898..2ea5f4df0 100644 --- a/analyzers/backend/docker/container.go +++ b/analyzers/backend/docker/container.go @@ -20,6 +20,7 @@ import ( type AnalysisParams struct { AnalyzerName string + AnalyzerShortcode string HostCodePath string HostToolBoxPath string AnalysisCommand string @@ -44,7 +45,6 @@ func (d *DockerClient) StartDockerContainer() error { * - CMD instruction * - Environment variables * ========================================================== */ - config := container.Config{ Image: fmt.Sprintf("%s:%s", d.ImageName, d.ImageTag), Cmd: strings.Split(d.AnalysisOpts.AnalysisCommand, " "), diff --git a/cmd/Dockerfile_new b/cmd/Dockerfile_new deleted file mode 100644 index 611fc0609..000000000 --- a/cmd/Dockerfile_new +++ /dev/null @@ -1,2 +0,0 @@ - -FROM alpine diff --git a/command/analyzer/dryrun/client.go b/command/analyzer/dryrun/client.go index 0a84f1c8b..d0ec39c82 100644 --- a/command/analyzer/dryrun/client.go +++ b/command/analyzer/dryrun/client.go @@ -34,6 +34,7 @@ func (a *AnalyzerDryRun) createDockerClient() error { DockerfilePath: dockerFilePath, AnalysisOpts: docker.AnalysisParams{ AnalyzerName: analyzerTOMLData.Name, + AnalyzerShortcode: analyzerTOMLData.Shortcode, AnalysisCommand: analyzerTOMLData.Analysis.Command, ContainerCodePath: containerCodePath, ContainerToolBoxPath: containerToolBoxPath, diff --git a/command/analyzer/dryrun/process.go b/command/analyzer/dryrun/process.go index d688560fd..81a2b922e 100644 --- a/command/analyzer/dryrun/process.go +++ b/command/analyzer/dryrun/process.go @@ -11,23 +11,27 @@ import ( // processAnalyzerReport processes the analysis report generated by the Analyzer func (a *AnalyzerDryRun) processAnalyzerReport(reportBytes []byte) (types.AnalysisResult, error) { report := types.AnalyzerReport{} + + // Creating instances of skipcq and source code highlighting processors skipCQProcessor := processors.ProcSkipCQ{} sourceCodeHighlightingProcessor := processors.ProcSourceCodeLoad{} // Initializing the processors using the IProcessor interface provided by the `processor` package var skip_cq, source_code_load processor.IProcessor + + // Assigning the instances to the IProcessor interface skip_cq = skipCQProcessor source_code_load = sourceCodeHighlightingProcessor + // Start the processors workflow processor := processor.ReportProcessor{ LocalSourcePath: a.SourcePath, ContainerCodePath: a.Client.AnalysisOpts.ContainerCodePath, - Processors: []processor.IProcessor{skip_cq, source_code_load}, + Processors: []processor.IProcessor{source_code_load, skip_cq}, } // Generate the silencers regexMap. processors.GenerateSilencersRegexMap() - if err := json.Unmarshal(reportBytes, &report); err != nil { return types.AnalysisResult{}, err } diff --git a/command/analyzer/dryrun/render/category.go b/command/analyzer/dryrun/render/category.go new file mode 100644 index 000000000..82c6f573d --- /dev/null +++ b/command/analyzer/dryrun/render/category.go @@ -0,0 +1,26 @@ +package render + +// fetchIssueCategoryData creates a map of issue category to issue occurences count of that category. +func (r *ResultRenderOpts) fetchIssueCategoryData() { + // Iterate over the map and then keep adding the issue counts. + issueCategoryMap := make(map[string]int) + + // Creating a map of issue categories present to their count. + for _, occurenceData := range r.AnalysisResultData.IssuesOccurenceMap { + if _, ok := issueCategoryMap[occurenceData.IssueMeta.Category]; !ok { + issueCategoryMap[occurenceData.IssueMeta.Category] = len(occurenceData.Occurences) + continue + } + issueCategoryMap[occurenceData.IssueMeta.Category] = issueCategoryMap[occurenceData.IssueMeta.Category] + len(occurenceData.Occurences) + } + + // Add remaining categories to the map other than what are reported in the issues by the Analyzer since + // need to render all the categories. + for categoryShortcode := range r.IssueCategoryNameMap { + if _, ok := issueCategoryMap[categoryShortcode]; !ok { + issueCategoryMap[categoryShortcode] = 0 + continue + } + } + r.AnalysisResultData.IssueCategoryCountMap = issueCategoryMap +} diff --git a/command/analyzer/dryrun/render/metrics.go b/command/analyzer/dryrun/render/metrics.go new file mode 100644 index 000000000..25fcf9206 --- /dev/null +++ b/command/analyzer/dryrun/render/metrics.go @@ -0,0 +1,14 @@ +package render + +// fetchIssueMetricsData fetches the metrics data to be rendered. +func (r *ResultRenderOpts) fetchIssueMetricsData() { + metricsMap := make(map[string]float64) + for _, metric := range r.AnalysisResultData.AnalysisResult.Metrics { + if _, ok := r.MetricNameMap[metric.MetricCode]; !ok { + continue + } + metricName := r.MetricNameMap[metric.MetricCode] + metricsMap[metricName] = metric.Namespaces[0].Value + } + r.AnalysisResultData.MetricsMap = metricsMap +} diff --git a/command/analyzer/dryrun/render/occurences.go b/command/analyzer/dryrun/render/occurences.go new file mode 100644 index 000000000..554a75ac7 --- /dev/null +++ b/command/analyzer/dryrun/render/occurences.go @@ -0,0 +1,78 @@ +package render + +import ( + "fmt" + "path/filepath" + "strings" +) + +// fetchIssueOccurencesData collects all the occurence related data. +func (r *ResultRenderOpts) fetchIssueOccurencesData(cwd string) { + // Create a map of occurences of the issues. + issueOccurenceMap := make(map[string]OccurenceData) + + // Iterate over the analysis result issues. + for _, issue := range r.AnalysisResultData.AnalysisResult.Issues { + currentOccurence := OccurenceData{} + + // Fix path of the issues(remove cwd prefix from them). + issue.Location.Path = strings.TrimPrefix(issue.Location.Path, filepath.Join(r.AnalysisResultData.SourcePath, string(filepath.Separator))) + + if _, ok := issueOccurenceMap[issue.IssueCode]; !ok { + // Fetch issue meta for the issue code raised. + issueMeta, err := getIssueMeta(cwd, issue.IssueCode) + if err != nil { + fmt.Println("Couldn't resolve issue meta for the issue:", issue.IssueCode) + continue + } + currentOccurence = OccurenceData{ + IssueMeta: issueMeta, + } + currentOccurence.Occurences = append(currentOccurence.Occurences, issue) + currentOccurence.Files = append(currentOccurence.Files, issue.Location.Path) + issueOccurenceMap[issue.IssueCode] = currentOccurence + continue + } + + // Get past occurences and append to it since maps don't allow direct append to a slice value. + pastOccurences := issueOccurenceMap[issue.IssueCode] + currentOccurence.IssueMeta = pastOccurences.IssueMeta + currentOccurence.Occurences = append(pastOccurences.Occurences, issue) + currentOccurence.Files = append(pastOccurences.Files, issue.Location.Path) + issueOccurenceMap[issue.IssueCode] = currentOccurence + } + + // Remove duplicates from the files array. + for issueCode, occurenceData := range issueOccurenceMap { + filesMap := make(map[string]int, 0) + uniqueFiles := make([]string, 0) + + // Setting the map value to 1 for the files in order to identify unique files. + for _, file := range occurenceData.Files { + filesMap[file] = 1 + } + + // Appending the unique files. + for file := range filesMap { + uniqueFiles = append(uniqueFiles, file) + } + occurence := issueOccurenceMap[issueCode] + occurence.Files = append(occurence.Files, uniqueFiles...) + issueOccurenceMap[issueCode] = occurence + } + + // Create the files information string. + for issueCode, occurenceData := range issueOccurenceMap { + occurenceData.FilesInfo = fmt.Sprintf("Found in %s and %d other file(s)", occurenceData.Files[0], len(occurenceData.Files)-1) + issueOccurenceMap[issueCode] = occurenceData + } + r.AnalysisResultData.IssuesOccurenceMap = issueOccurenceMap + + // Find out total number of occurences of all the issues. + for _, v := range issueOccurenceMap { + r.AnalysisResultData.TotalOccurences = r.AnalysisResultData.TotalOccurences + len(v.Occurences) + } + + // Finds the unique issues count(the length of the occurences map since its mapped by issue codes which are unique). + r.AnalysisResultData.UniqueIssuesCount = len(r.AnalysisResultData.IssuesOccurenceMap) +} diff --git a/command/analyzer/dryrun/render/render.go b/command/analyzer/dryrun/render/render.go new file mode 100644 index 000000000..6eae9f60e --- /dev/null +++ b/command/analyzer/dryrun/render/render.go @@ -0,0 +1,85 @@ +package render + +import ( + "context" + "embed" + "fmt" + "html/template" + "io/fs" + "net/http" + "os" + "os/signal" + "time" + + "github.com/cli/browser" + "github.com/pterm/pterm" +) + +//go:embed views/*.html views/**/*.css +var tmplFS embed.FS + +// renderResultsOnBrowser renders the results on the browser through a local server, +// go template and an awesome frontend. +func (r *ResultRenderOpts) RenderResultsOnBrowser(server IRenderServer) (err error) { + // Collect all other data to be rendered. + r.collectResultToBeRendered() + + // In order to serve the static css files, this creates a handler to serve any static assets stored under + // `views/` at `/static/assets/*`. + fsys, err := fs.Sub(tmplFS, "views") + if err != nil { + return err + } + + // Parse the HTML templates. + r.Template = template.Must(template.ParseFS(tmplFS, "views/*.html")) + + // Define the routes using echo and start the server. + r.EchoServer = server.GetEchoContext() + server.DeclareRoutes(http.FS((fsys))) + serverPort := getServerPort() + + // Spawn the server in a goroutine. + go func() { + if err := r.EchoServer.Start(fmt.Sprintf(":%s", serverPort)); err != nil && err != http.ErrServerClosed { + r.EchoServer.Logger.Fatal("Shutting down the server") + } + }() + pterm.Success.Printf("Analysis results live at http://localhost:%s..\n", serverPort) + + // Having received the user code, open the browser at the localhost. + browser.OpenURL(fmt.Sprintf("http://localhost:%s", serverPort)) + + // Wait for interrupt signal to gracefully shutdown the server with a timeout of 10 seconds. + // Use a buffered channel to avoid missing signals as recommended for signal.Notify + quit := make(chan os.Signal, 1) + signal.Notify(quit, os.Interrupt) + <-quit + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + return r.EchoServer.Shutdown(ctx) +} + +// collectResultToBeRendered formats all the result received after post-processing and then adds the +// extra data required for rendering on the browser +func (r *ResultRenderOpts) collectResultToBeRendered() { + cwd, _ := os.Getwd() + + // Fetch the run summary data. + r.Summary.RunDuration, r.Summary.TimeSinceRun = fetchRunSummary(r.Summary.AnalysisStartTime, r.Summary.AnalysisEndTime) + + // Inject the Analyzer VCS information. + r.VCSInfo.Branch, r.VCSInfo.CommitSHA = fetchVCSDetails(cwd) + + // Fetch the data as to status of Analyzer w.r.t the latest version/tag. + r.VCSInfo.VersionDiff = fetchAnalyzerVCSData(cwd) + + // Get occurence data. + r.fetchIssueOccurencesData(cwd) + + // Get the category data. + r.fetchIssueCategoryData() + + // Fetch metrics data. + r.fetchIssueMetricsData() +} diff --git a/command/analyzer/dryrun/render/route.go b/command/analyzer/dryrun/render/route.go new file mode 100644 index 000000000..83ea1bf84 --- /dev/null +++ b/command/analyzer/dryrun/render/route.go @@ -0,0 +1,78 @@ +package render + +import ( + "fmt" + "html/template" + "net/http" + + "github.com/labstack/echo/v4" +) + +type IRenderServer interface { + GetEchoContext() *echo.Echo + DeclareRoutes(http.FileSystem) +} + +/* Declared Routes: + * / + * /issues + * /issue/{issue_code}/occurences + * /issues?category=all + * /issues?category={issue_category} */ + +// getEchoContext returns a new Echo server instance. +func (r *ResultRenderOpts) GetEchoContext() *echo.Echo { + e := echo.New() + e.HideBanner = true + return e +} + +// declareRoutes declares routes for various incoming requests to the Analyzer dry run local server. +func (r *ResultRenderOpts) DeclareRoutes(staticFS http.FileSystem) { + // Issues page containing all the reported issues. + r.EchoServer.GET("/", r.IssuesHandler) + r.EchoServer.GET("/issues", r.IssuesHandler) + + // Handle serving static assets. + assetHandler := http.FileServer(staticFS) + r.EchoServer.GET("/static/*", echo.WrapHandler(http.StripPrefix("/static/", assetHandler))) + + // Handle showing issues for a certain category. + r.EchoServer.GET("/issue/:issue_code/occurences", r.IssueOccurencesHandler) +} + +// IssuesHandler handles serving the list of issues reported +func (r *ResultRenderOpts) IssuesHandler(c echo.Context) error { + // Check URL query parameters + qParams := c.QueryParams() + + if qParams.Has("category") { + r.SelectedCategory = qParams.Get("category") + } else { + r.SelectedCategory = "all" + } + + err := r.Template.ExecuteTemplate(c.Response().Writer, "index.html", *r) + if err != nil { + fmt.Println(err) + return c.String(http.StatusOK, "Occurence page served.") + } + return c.String(http.StatusOK, "Issues page served.") +} + +// IssuesOccurencesHandler handles serving the issue occurences. +func (r *ResultRenderOpts) IssueOccurencesHandler(c echo.Context) error { + // Fetch the issue code from URI. + r.SelectedIssueCode = c.Param("issue_code") + + issueOccurences := r.AnalysisResultData.IssuesOccurenceMap[r.SelectedIssueCode] + for _, occurence := range issueOccurences.Occurences { + r.AnalysisResultData.RenderedSourceCode = append(r.AnalysisResultData.RenderedSourceCode, template.HTML(occurence.ProcessedData.SourceCode.Rendered)) // skipcq: GSC-G203 + } + err := r.Template.ExecuteTemplate(c.Response().Writer, "occurence.html", *r) + if err != nil { + fmt.Println(err) + return c.String(http.StatusOK, "Occurence page served.") + } + return c.String(http.StatusOK, "Occurence page served.") +} diff --git a/command/analyzer/dryrun/render/types.go b/command/analyzer/dryrun/render/types.go new file mode 100644 index 000000000..e6340fb92 --- /dev/null +++ b/command/analyzer/dryrun/render/types.go @@ -0,0 +1,54 @@ +package render + +import ( + "html/template" + "time" + + "github.com/deepsourcelabs/cli/types" + "github.com/labstack/echo/v4" +) + +type RunSummary struct { + RunDuration string // Time taken to complete analysis. + TimeSinceRun string // Time elapsed since the completion of the analysis run. + AnalysisStartTime time.Time + AnalysisEndTime time.Time +} + +type VCSInfo struct { + Branch string // VCS branch of the Analyzer. + CommitSHA string // The latest commit SHA of the Analyzer. + VersionDiff string // The string specifying the status of Analyzer w.r.t previous version. +} + +type OccurenceData struct { + IssueMeta types.AnalyzerIssue // Contains the data stored in issue TOMLs for the respective issue. + Files []string // Files where this issue has been reported. + FilesInfo string // The string containing the data of which files the issue has been reported in. + Occurences []types.Issue // The slice of occurences for a certain issue code. +} + +type ResultData struct { + UniqueIssuesCount int // The unique issues count. + TotalOccurences int // Total issues reported by the Analyzer. + SourcePath string // The path where the source code to be analyzer is stored. + IssuesOccurenceMap map[string]OccurenceData // The map of issue code to its occurences data. + IssueCategoryCountMap map[string]int // The map of issue category to the count of the issues of that category. + AnalysisResult types.AnalysisResult // The analysis result post running processors. + MetricsMap map[string]float64 // The map of metric names to their values. + RenderedSourceCode []template.HTML // The slice containing the source code snippets for each occurence. +} + +type ResultRenderOpts struct { + EchoServer *echo.Echo // The Echo server instance to run the renderer server. + Template *template.Template // The go template field so that it can be accessible in `route.go` as well. + PageTitle string // The title of the HTML page. + AnalyzerShortcode string // The shortcode of the Analyzer. + VCSInfo VCSInfo // The VCS information of the Analyzer. + Summary RunSummary // The run summary. + AnalysisResultData ResultData // The analysis result data. + SelectedIssueCode string // The field used to recognize which issue code the user has clicked on to check its occurences. + SelectedCategory string // The field used to recognize which category the user has clicked to filter the issues based on it. + IssueCategoryNameMap map[string]string // The map used to route category names to their codes. Eg: `Documentation`->`doc`. + MetricNameMap map[string]string // The map of metrics shortcodes with their names. +} diff --git a/command/analyzer/dryrun/render/utils.go b/command/analyzer/dryrun/render/utils.go new file mode 100644 index 000000000..06cc42156 --- /dev/null +++ b/command/analyzer/dryrun/render/utils.go @@ -0,0 +1,201 @@ +package render + +import ( + "fmt" + "net" + "os" + "path/filepath" + "strings" + "time" + + "github.com/deepsourcelabs/cli/types" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/hako/durafmt" + "github.com/pelletier/go-toml/v2" +) + +// fetchRunSummary fetches the data for the run summary section involving the time since latest run +// and the run duration. +func fetchRunSummary(startTime, endTime time.Time) (string, string) { + // Find the time elapsed since the analysis run. + timeSinceRun := fmt.Sprintf("%s ago", durafmt.Parse(time.Since(startTime)).LimitFirstN(1).String()) + + // Find the run duration i.e. the time between the analysis start and end time. + runDuration := durafmt.Parse(endTime.Sub(startTime)).LimitFirstN(1).String() + return runDuration, timeSinceRun +} + +// fetchHeadManually fetches the latest commit hash using the command `git rev-parse HEAD` +// through go-git. +func fetchHeadManually(directoryPath string) (string, error) { + gitOpts := &git.PlainOpenOptions{ + DetectDotGit: true, + } + + // Open a new repository targeting the given path (the .git folder) + repo, err := git.PlainOpenWithOptions(directoryPath, gitOpts) + if err != nil { + return "", err + } + + // Resolve revision into a sha1 commit + commitHash, err := repo.ResolveRevision(plumbing.Revision("HEAD")) + if err != nil { + return "", err + } + return commitHash.String(), nil +} + +// fetchVCSDetails fetches the VCS details to be shown on the dashboard. +func fetchVCSDetails(dir string) (string, string) { + branch := "" + latestCommitHash := "" + + repo, err := git.PlainOpen(dir) + if err != nil { + return "", "" + } + + // Fetch the repository HEAD reference. + headRef, _ := repo.Head() + + // Fetch the commit SHA of the latest commit + latestCommitHash, _ = fetchHeadManually(dir) + + // Fetch the branch name. + branchData := headRef.String() + branch = branchData[strings.LastIndex(branchData, "/")+1:] + + return branch, latestCommitHash[:7] +} + +// fetchAnalyzerVCSDetails fetches Analyzer VCS details like how many commits is the Analyzer +// ahead of the latest git tag. +func fetchAnalyzerVCSData(dir string) string { + // Open the Analyzer's git directory. + repo, err := git.PlainOpenWithOptions(dir, &git.PlainOpenOptions{ + DetectDotGit: true, + }) + if err != nil { + fmt.Println(err) + return "" + } + + // Fetch the repo tags list. + tagReferences, _ := repo.Tags() + currentTagRef := []string{} + if err = tagReferences.ForEach(func(t *plumbing.Reference) error { + currentTagRef = append(currentTagRef, t.Name().String()) + return nil + }); err != nil { + fmt.Println(err) + return "" + } + + // currentTagRef slice is empty if there are not tags in the Analyzer git directory. + if len(currentTagRef) == 0 { + return "" + } + + // Convert refs/tags/v0.2.1 -> v0.2.1 + latestTag := strings.TrimPrefix(currentTagRef[len(currentTagRef)-1], "refs/tags/") + + // Fetch the iterator to the tag objects latest git tag. + tagsIter, _ := repo.TagObjects() + + // Fetch the current tag and the commit pointed by the current tag. + currentTag := "" + var currentCommitSHA plumbing.Hash + var currentTagPushTime time.Time + if err = tagsIter.ForEach(func(t *object.Tag) (err error) { + if t.Name != latestTag { + return nil + } + currentTag = t.Name + commit, err := t.Commit() + if err != nil { + fmt.Println(err) + return err + } + + // Finds the hash of the commit and the timestamp of when the commit was pushed. + currentCommitSHA = commit.Hash + currentTagPushTime = commit.Author.When + return nil + }); err != nil { + fmt.Println(err) + return "" + } + + // Retrieve the commit history from the current tag. + commitIter, err := repo.Log(&git.LogOptions{ + Order: git.LogOrderCommitterTime, + Since: ¤tTagPushTime, + }) + if err != nil { + fmt.Println(err) + return "" + } + + // Just iterates over the commits and finds the count of how many commits have been + // made since the current git tag. + commitsSinceCurrentTag := 0 + if err = commitIter.ForEach(func(c *object.Commit) error { + if c.Hash == currentCommitSHA { + return nil + } + commitsSinceCurrentTag++ + return nil + }); err != nil { + fmt.Println(err) + return "" + } + + if commitsSinceCurrentTag == 0 { + return fmt.Sprintf("This Analyzer is up to date with %s", currentTag) + } + return fmt.Sprintf("This Analyzer is %d commits ahead of %s", commitsSinceCurrentTag, currentTag) +} + +// getServerPort returns the port used to render the server. +func getServerPort() string { + serverPort := ":8080" + + // Check if the default port(8080) is available. + listener, err := net.Listen("tcp", serverPort) + if err == nil { + // Close the listener if it starts to listen on the default port. + listener.Close() + return strings.TrimPrefix(serverPort, ":") + } + + // If the port is busy, get a new port. + listener, _ = net.Listen("tcp", ":0") + // Close the listener if it starts to listen on the default port. + serverPort = strings.TrimPrefix(listener.Addr().String(), "[::]:") + listener.Close() + return serverPort +} + +// getIssueMeta receives the issuecode that is raised and it reads the TOML of that issue and returns +// its details configured in the TOML like title, description and category. +func getIssueMeta(cwd, issueCode string) (types.AnalyzerIssue, error) { + analyzerIssue := types.AnalyzerIssue{} + // Read the toml file of the issue in .deepsource/analyzer/issues directory + issueFilePath := filepath.Join(cwd, ".deepsource/analyzer/issues", fmt.Sprintf("%s.toml", issueCode)) + + // Read the issue and populate the data of issue category and description + issueData, err := os.ReadFile(issueFilePath) + if err != nil { + return analyzerIssue, err + } + + // Unmarshal the data from the issue TOMLs into the struct + err = toml.Unmarshal(issueData, &analyzerIssue) + if err != nil { + return analyzerIssue, err + } + return analyzerIssue, nil +} diff --git a/command/analyzer/dryrun/render/views/assets/cli.css b/command/analyzer/dryrun/render/views/assets/cli.css new file mode 100644 index 000000000..49345c10b --- /dev/null +++ b/command/analyzer/dryrun/render/views/assets/cli.css @@ -0,0 +1,1169 @@ +/* +! tailwindcss v3.1.4 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: currentColor; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input:-ms-input-placeholder, textarea:-ms-input-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::-webkit-backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: -webkit-sticky; + position: sticky; +} + +.top-0 { + top: 0px; +} + +.top-2 { + top: 0.5rem; +} + +.top-1\.5 { + top: 0.375rem; +} + +.left-1\.5 { + left: 0.375rem; +} + +.top-1 { + top: 0.25rem; +} + +.left-1 { + left: 0.25rem; +} + +.left-2 { + left: 0.5rem; +} + +.z-20 { + z-index: 20; +} + +.col-span-2 { + grid-column: span 2 / span 2; +} + +.row-span-2 { + grid-row: span 2 / span 2; +} + +.mr-4 { + margin-right: 1rem; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.block { + display: block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.h-12 { + height: 3rem; +} + +.h-full { + height: 100%; +} + +.h-3 { + height: 0.75rem; +} + +.h-8 { + height: 2rem; +} + +.min-h-screen { + min-height: 100vh; +} + +.w-28 { + width: 7rem; +} + +.w-full { + width: 100%; +} + +.w-3 { + width: 0.75rem; +} + +.max-w-2xl { + max-width: 42rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-shrink-0 { + flex-shrink: 0; +} + +.flex-grow { + flex-grow: 1; +} + +.cursor-pointer { + cursor: pointer; +} + +.auto-rows-min { + grid-auto-rows: -webkit-min-content; + grid-auto-rows: min-content; +} + +.grid-cols-\[48px_1fr\] { + grid-template-columns: 48px 1fr; +} + +.grid-cols-\[18rem_1fr_22rem\] { + grid-template-columns: 18rem 1fr 22rem; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.place-content-center { + place-content: center; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-5 { + gap: 1.25rem; +} + +.gap-2\.5 { + gap: 0.625rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-x-4 { + -moz-column-gap: 1rem; + column-gap: 1rem; +} + +.gap-y-2\.5 { + row-gap: 0.625rem; +} + +.gap-y-2 { + row-gap: 0.5rem; +} + +.gap-x-2 { + -moz-column-gap: 0.5rem; + column-gap: 0.5rem; +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.divide-x > :not([hidden]) ~ :not([hidden]) { + --tw-divide-x-reverse: 0; + border-right-width: calc(1px * var(--tw-divide-x-reverse)); + border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse))); +} + +.divide-ink-200 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(35 38 46 / var(--tw-divide-opacity)); +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-ellipsis { + text-overflow: ellipsis; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.whitespace-pre { + white-space: pre; +} + +.rounded-sm { + border-radius: 0.125rem; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.border { + border-width: 1px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-ink-200 { + --tw-border-opacity: 1; + border-color: rgb(35 38 46 / var(--tw-border-opacity)); +} + +.border-ink-300 { + --tw-border-opacity: 1; + border-color: rgb(26 29 35 / var(--tw-border-opacity)); +} + +.bg-ink-400 { + --tw-bg-opacity: 1; + background-color: rgb(22 24 29 / var(--tw-bg-opacity)); +} + +.bg-ink-200 { + --tw-bg-opacity: 1; + background-color: rgb(35 38 46 / var(--tw-bg-opacity)); +} + +.bg-ink-300 { + --tw-bg-opacity: 1; + background-color: rgb(26 29 35 / var(--tw-bg-opacity)); +} + +.bg-ink-100 { + --tw-bg-opacity: 1; + background-color: rgb(42 46 55 / var(--tw-bg-opacity)); +} + +.stroke-current { + stroke: currentColor; +} + +.stroke-1 { + stroke-width: 1; +} + +.p-6 { + padding: 1.5rem; +} + +.p-4 { + padding: 1rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-2 { + padding: 0.5rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.pt-5 { + padding-top: 1.25rem; +} + +.pl-5 { + padding-left: 1.25rem; +} + +.pl-8 { + padding-left: 2rem; +} + +.pl-9 { + padding-left: 2.25rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.font-medium { + font-weight: 500; +} + +.font-semibold { + font-weight: 600; +} + +.font-normal { + font-weight: 400; +} + +.uppercase { + text-transform: uppercase; +} + +.leading-tight { + line-height: 1.25; +} + +.leading-none { + line-height: 1; +} + +.leading-10 { + line-height: 2.5rem; +} + +.tracking-wide { + letter-spacing: 0.025em; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.text-vanilla-100 { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-vanilla-400 { + --tw-text-opacity: 1; + color: rgb(192 193 195 / var(--tw-text-opacity)); +} + +.text-vanilla-200 { + --tw-text-opacity: 1; + color: rgb(245 245 245 / var(--tw-text-opacity)); +} + +.text-ink-200 { + --tw-text-opacity: 1; + color: rgb(35 38 46 / var(--tw-text-opacity)); +} + +.text-ink-50 { + --tw-text-opacity: 1; + color: rgb(48 53 64 / var(--tw-text-opacity)); +} + +.text-vanilla-300 { + --tw-text-opacity: 1; + color: rgb(238 238 238 / var(--tw-text-opacity)); +} + +.button { + display: flex; + height: 100%; + align-items: center; + gap: 0.5rem; + border-radius: 0.125rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + padding-right: 1rem; + font-size: 0.75rem; + line-height: 1rem; +} + +.sidebar { + display: flex; + height: 2rem; + width: 100%; + align-items: center; + gap: 0.5rem; + border-radius: 0.125rem; + padding: 0.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + --tw-text-opacity: 1; + color: rgb(192 193 195 / var(--tw-text-opacity)); +} + +.sidebar:hover { + --tw-bg-opacity: 1; + background-color: rgb(35 38 46 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.sidebar.selected { + display: flex; + height: 100%; + width: 100%; + align-items: center; + gap: 0.5rem; + border-radius: 0.125rem; + --tw-bg-opacity: 1; + background-color: rgb(26 29 35 / var(--tw-bg-opacity)); + padding: 0.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.sidebar.selected:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.sidebar .tag { + justify-self: end; + border-radius: 9999px; + --tw-bg-opacity: 1; + background-color: rgb(35 38 46 / var(--tw-bg-opacity)); + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + line-height: 1; +} + +.sidebar .label { + flex-grow: 1; + text-align: left; + line-height: 1; +} + +.info { + display: flex; + align-items: center; + gap: 0.25rem; + font-size: 0.875rem; + line-height: 1.25rem; + --tw-text-opacity: 1; + color: rgb(192 193 195 / var(--tw-text-opacity)); +} + +.hover\:bg-ink-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(42 46 55 / var(--tw-bg-opacity)); +} + +.hover\:bg-ink-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(26 29 35 / var(--tw-bg-opacity)); +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.group:hover .group-hover\:border-ink-200 { + --tw-border-opacity: 1; + border-color: rgb(35 38 46 / var(--tw-border-opacity)); +} + +@media (min-width: 640px) { + .sm\:flex { + display: flex; + } + + .sm\:border-l { + border-left-width: 1px; + } +} + +@media (min-width: 768px) { + .md\:mr-2 { + margin-right: 0.5rem; + } + + .md\:block { + display: block; + } + + .md\:w-4\/5 { + width: 80%; + } + + .md\:w-1\/5 { + width: 20%; + } + + .md\:flex-row { + flex-direction: row; + } + + .md\:flex-wrap { + flex-wrap: wrap; + } +} + +@media (min-width: 1024px) { + .lg\:gap-y-2 { + row-gap: 0.5rem; + } +} diff --git a/command/analyzer/dryrun/render/views/index.html b/command/analyzer/dryrun/render/views/index.html new file mode 100644 index 000000000..1934307a5 --- /dev/null +++ b/command/analyzer/dryrun/render/views/index.html @@ -0,0 +1,123 @@ + + + + + {{ .PageTitle }} + + + + +
+
+ {{ .AnalyzerShortcode }}
+ {{ .AnalysisResultData.UniqueIssuesCount }} issues {{ .VCSInfo.Branch }} {{ .VCSInfo.CommitSHA }} {{ .VCSInfo.VersionDiff }} +
+ + +
+

+ All Issues  {{ .AnalysisResultData.TotalOccurences }}
+ {{ $categoryMap := .IssueCategoryNameMap}} + {{ range $key, $value := .AnalysisResultData.IssueCategoryCountMap }} + {{ $categoryName := (index $categoryMap $key) }} +

  • {{ $categoryName }}: {{ $value }}
  • + {{ end }} +

    + + +
    +

    Run Summary

    + {{ .Summary.TimeSinceRun }}
    + {{ .AnalysisResultData.SourcePath }}
    + {{ .Summary.RunDuration}} +
    +
    + + + +
    +

    + {{ range $index, $error := .AnalysisResultData.AnalysisResult.Errors }} + {{ if eq $error.Level 0}} + Error {{ $error.HMessage }} + {{ else }}{{ if eq $error.Level 1}} + Warning {{ $error.HMessage }} + {{ end }}{{ end }} + {{ end }} +

    +

    + {{ $defaultIssueCategory := "all"}} + {{ $selectedCategory := .SelectedCategory }} + {{ $categoryMap := .IssueCategoryNameMap}} + {{ range $key, $value := .AnalysisResultData.IssuesOccurenceMap }} + {{ $categoryName := (index $categoryMap $value.IssueMeta.Category) }} + {{ if eq $selectedCategory $defaultIssueCategory }} + {{ $value.IssueMeta.Title }} {{ $key }} {{ len $value.Occurences }}
    + {{ $categoryName }}  {{ $value.FilesInfo }}
    + {{else }} {{ if eq $selectedCategory $value.IssueMeta.Category }} + {{ $value.IssueMeta.Title }} {{ $key }} {{ len $value.Occurences }}
    + {{ $categoryName }}  {{ $value.FilesInfo }}
    + {{ end}} + {{end}} + {{ end }} +

    +
    + +
    +

    + Metrics
    + {{ range $name, $metric := .AnalysisResultData.MetricsMap }} + {{ $name }}: {{ $metric }}
    + {{ end }} +

    +
    +
    + + diff --git a/command/analyzer/dryrun/render/views/occurence.html b/command/analyzer/dryrun/render/views/occurence.html new file mode 100644 index 000000000..c937d6138 --- /dev/null +++ b/command/analyzer/dryrun/render/views/occurence.html @@ -0,0 +1,111 @@ + + + + + {{ .PageTitle }} + + + + +
    +
    + {{ .AnalyzerShortcode }}
    + {{ .AnalysisResultData.UniqueIssuesCount }} issues {{ .VCSInfo.Branch }} {{ .VCSInfo.CommitSHA }} {{ .VCSInfo.VersionDiff }} +
    + + +
    +

    + All Issues  {{ .AnalysisResultData.TotalOccurences }}
    + {{ $categoryMap := .IssueCategoryNameMap}} + {{ range $key, $value := .AnalysisResultData.IssueCategoryCountMap }} + {{ $categoryShortCode := (index $categoryMap $key) }} +

  • {{ $key }}: {{ $value }}
  • + {{ end }} +

    + + +
    +

    Run Summary

    + {{ .Summary.TimeSinceRun }}
    + {{ .AnalysisResultData.SourcePath }}
    + {{ .Summary.RunDuration}} +
    + +
    + + +
    +

    + All issues /{{ .SelectedIssueCode }}

    + {{ $issueData := (index .AnalysisResultData.IssuesOccurenceMap .SelectedIssueCode)}} + {{ $issueData.IssueMeta.Title}}
    + {{ $issueData.IssueMeta.Category }}
    + + {{ $src := .AnalysisResultData.RenderedSourceCode }} + {{ range $index, $occurence := $issueData.Occurences}} + {{ $occurence.IssueText }}
    + {{ $occurence.Location.Path }}
    + {{ index $src $index}} + {{ end }} +

    +
    + + +
    + Description +

    + {{ $issueData := (index .AnalysisResultData.IssuesOccurenceMap .SelectedIssueCode)}} + {{ $issueData.IssueMeta.Description}} +

    +
    +
    + + diff --git a/command/analyzer/dryrun/run.go b/command/analyzer/dryrun/run.go index b59723799..0a59e8f7e 100644 --- a/command/analyzer/dryrun/run.go +++ b/command/analyzer/dryrun/run.go @@ -4,18 +4,21 @@ import ( "fmt" "os" "path" + "time" - "github.com/deepsourcelabs/cli/types" - "github.com/deepsourcelabs/cli/utils" + "github.com/fatih/color" "github.com/morikuni/aec" "github.com/spf13/cobra" "github.com/deepsourcelabs/cli/analysis/config" "github.com/deepsourcelabs/cli/analyzers/backend/docker" + "github.com/deepsourcelabs/cli/command/analyzer/dryrun/render" + "github.com/deepsourcelabs/cli/types" + "github.com/deepsourcelabs/cli/utils" ) // Variables to hold the value of CODE_PATH and TOOLBOX_PATH to be injected -// into the analysis container +// into the analysis container. var ( containerCodePath string containerToolBoxPath string @@ -25,7 +28,7 @@ var ( analysisResultsExt string = ".json" ) -// The params required while running the Analysis locally +// The params required while running the Analysis locally. type AnalyzerDryRun struct { Client *docker.DockerClient // The client to be used for all docker related ops. RemoteSource bool // True if the source to be analyzed is a remote VCS repository. @@ -35,14 +38,15 @@ type AnalyzerDryRun struct { AnalysisFiles []string // The list of analysis files. AnalysisConfig *config.AnalysisConfig // The analysis_config.json file containing the meta for analysis. AnalysisResult types.AnalysisResult // The analysis result received after post processing Analyzer report. - Spinner *utils.SpinnerUtils + Spinner *utils.SpinnerUtils // The spinner command line utility. + RenderOpts render.ResultRenderOpts } func NewCmdAnalyzerRun() *cobra.Command { - // Setting the current working directory as the default path of the source to be analyzed + // Setting the current working directory as the default path of the source to be analyzed. cwd, _ := os.Getwd() - // Initializing the run params and setting defaults + // Initializing the run params and setting defaults. opts := AnalyzerDryRun{ Spinner: &utils.SpinnerUtils{}, SourcePath: cwd, @@ -64,7 +68,7 @@ func NewCmdAnalyzerRun() *cobra.Command { }, } - // --output-file/ -o flag + // --output-file/ -o flag. cmd.Flags().StringVarP(&opts.TempToolBoxDirectory, "output-file", "o", "", "The path of analysis results") return cmd } @@ -76,11 +80,11 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { return err } - // Building the Analyzer image + // Building the Analyzer image. a.Spinner.StartSpinnerWithLabel("Building Analyzer image...", "Built Analyzer image") ctxCancelFunc, buildRespReader, buildError := a.Client.BuildAnalyzerDockerImage() - // Cancel the build context and close the reader before exiting this function + // Cancel the build context and close the reader before exiting this function. if buildRespReader != nil { defer buildRespReader.Close() } @@ -90,15 +94,15 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { return buildError } - // Check the docker build response + // Check the docker build response. if err = docker.CheckBuildResponse(buildRespReader, false); err != nil { a.Spinner.StopSpinnerWithError("Failed to build the Analyzer image", err) return err } a.Spinner.StopSpinner() - // Create temporary toolbox directory to store analysis config and later analyis results - // If already passed through --output-file flag, use that one + // Create temporary toolbox directory to store analysis config and later analyis results. + // If already passed through --output-file flag, use that one. a.Spinner.StartSpinnerWithLabel("Creating temporary toolbox directory...", "Temporary toolbox directory created") if err = a.createTemporaryToolBoxDir(); err != nil { a.Spinner.StopSpinnerWithError("Failed to create temporary toolbox directory", err) @@ -106,7 +110,7 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { } a.Spinner.StopSpinner() - // Resolve the path of source code to be analyzed based on the user input + // Resolve the path of source code to be analyzed based on the user input. a.Spinner.StartSpinnerWithLabel("Resolving the path of source code to be analyzed...", "") if a.Client.AnalysisOpts.HostCodePath, err = a.resolveAnalysisCodePath(); err != nil { a.Spinner.StopSpinnerWithError("Failed to resolve path of source code to be analyzed", err) @@ -114,16 +118,17 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { } a.Spinner.StopSpinner() - // Generate the analysis_config.json file - // Also, write the analysis_config data into a temp /toolbox directory to be mounted into the container - a.Spinner.StartSpinnerWithLabel("Generating analysis config...", fmt.Sprint("Analysis config (analysis_config.json) generated at ", path.Join(a.TempToolBoxDirectory, "analysis_config.json"))) + // Generate the analysis_config.json file. + // Also, write the analysis_config data into a temp /toolbox directory to be mounted into the container. + a.Spinner.StartSpinnerWithLabel("Generating analysis config...", fmt.Sprint("Analysis config (analysis_config.json) generated at ", + path.Join(a.TempToolBoxDirectory, "analysis_config.json"))) if err = a.prepareAnalysisConfig(); err != nil { a.Spinner.StopSpinnerWithError("Failed to generate analysis_config.json", err) return err } a.Spinner.StopSpinner() - // Write the analysis_config.json to local toolbox directory + // Write the analysis_config.json to local toolbox directory. if err = a.writeAnalysisConfig(); err != nil { a.Spinner.StopSpinnerWithError("Failed to write analysis_config.json", err) return err @@ -131,14 +136,14 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { a.Spinner.StopSpinner() // Starts the Docker container which analyzes the code and stores the analysis results - // in a variable - + // in a variable. fmt.Println(aec.Apply("[+] Starting the Analysis container", aec.LightYellowF)) + analysisStartTime := time.Now() if err = a.Client.StartDockerContainer(); err != nil { return err } - // Fetch the analysis results + // Fetch the analysis results. a.Spinner.StartSpinnerWithLabel("Fetching Analyzer report...", "Successfully fetched Analyzer report") analysisResultBuf, analysisResultFileName, err := a.Client.FetchAnalysisResults() if err != nil { @@ -146,9 +151,11 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { return err } a.Spinner.StopSpinner() + analysisEndTime := time.Now() - // Write the analysis results to the file - a.Spinner.StartSpinnerWithLabel("Writing Analyzer report...", fmt.Sprintf("Analyzer report written to %s", path.Join(a.Client.AnalysisOpts.AnalysisResultsPath, analysisResultFileName))) + // Write the analysis results to the file. + a.Spinner.StartSpinnerWithLabel("Writing Analyzer report...", fmt.Sprintf("Analyzer report written to %s", + path.Join(a.Client.AnalysisOpts.AnalysisResultsPath, analysisResultFileName))) if err = a.writeAnalysisResults(analysisResultBuf, analysisResultFileName); err != nil { a.Spinner.StopSpinnerWithError("Failed to write Analyzer report", err) return err @@ -163,5 +170,28 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { } a.Spinner.StopSpinner() fmt.Println(aec.Apply(fmt.Sprintf("[✔] Issues after processing: %d", len(a.AnalysisResult.Issues)), aec.LightGreenF)) - return nil + + // Prompt the user to press return in order to check results on browser. + c := color.New(color.FgCyan, color.Bold) + c.Printf("Press enter to view the analysis results in the browser...") + fmt.Scanln() + + // Showcase the analysis results on the browser. + // Initialize `ResultRenderOpts` with some of the initial data that needs to be rendered. + a.RenderOpts = render.ResultRenderOpts{ + PageTitle: fmt.Sprintf("Issues | %s", a.Client.AnalysisOpts.AnalyzerShortcode), + AnalyzerShortcode: a.Client.AnalysisOpts.AnalyzerShortcode, + AnalysisResultData: render.ResultData{ + AnalysisResult: a.AnalysisResult, + SourcePath: a.SourcePath, + }, + SelectedCategory: "all", + IssueCategoryNameMap: types.IssueCategoryMap, + MetricNameMap: types.MetricMap, + Summary: render.RunSummary{ + AnalysisStartTime: analysisStartTime, + AnalysisEndTime: analysisEndTime, + }, + } + return a.RenderOpts.RenderResultsOnBrowser(&a.RenderOpts) } diff --git a/command/analyzer/dryrun/test/run_test.go b/command/analyzer/dryrun/test/run_test.go index 98fe4844d..9f849f4cb 100644 --- a/command/analyzer/dryrun/test/run_test.go +++ b/command/analyzer/dryrun/test/run_test.go @@ -2,16 +2,20 @@ package dryrun import ( "bytes" + "fmt" + "log" "os" "os/exec" "path" "testing" + "github.com/fsnotify/fsnotify" "github.com/google/go-cmp/cmp" ) // Execute the command from there func TestAnalyzerRun(t *testing.T) { + var analysisCmd *exec.Cmd /* ============================================================================= // Copying the todo-checker directory to $APP_PATH for the integration tests /* ============================================================================= */ @@ -33,18 +37,75 @@ func TestAnalyzerRun(t *testing.T) { // Run the command err := cmd.Run() - outStr, outErr := stdout.String(), stderr.String() + _, outErr := stdout.String(), stderr.String() if err != nil { t.Errorf("Failed to copy the analyzer code to %s. Error:%s\n%s", appPath, err, outErr) } - t.Log(outStr) + + // Create the file to watch. + os.Create(fmt.Sprintf("%s/analysis_results.json", appPath)) + + // Watch for the output file for any changes. Once the file is written, kill the dry-run process. + watcher, err := fsnotify.NewWatcher() + if err != nil { + t.Error(err) + } + defer watcher.Close() + + done := make(chan bool) + go func() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { + return + } + t.Log("Event:", event) + if event.Op&fsnotify.Write == fsnotify.Write { + t.Log("Modified file:", event.Name) + + // Kill the process once the file has been modified(the results have been received). + log.Println("KILLING THE PROCESS") + analysisCmd.Process.Kill() + + /* ============================================================================= + // Compare the results + /* ============================================================================= */ + receivedAnalysisResults, err := os.ReadFile(path.Join(appPath, "analysis_results.json")) + if err != nil { + t.Errorf("Failed to read the received analysis result. Error:%s", err) + } + expectedAnalysisResults, err := os.ReadFile(path.Join(cwd, "expected_analysis_results.json")) + if err != nil { + t.Errorf("Failed to read the expected analysis result. Error:%s", err) + } + if !bytes.Equal(receivedAnalysisResults, expectedAnalysisResults) { + diff := cmp.Diff(receivedAnalysisResults, expectedAnalysisResults) + t.Errorf("Failed to verify analysis results. Expected: %s\n==========\nGot: %s\n=========\nDiff:%s", expectedAnalysisResults, receivedAnalysisResults, diff) + } + done <- true + } + case err, ok := <-watcher.Errors: + if !ok { + return + } + log.Println("Error:", err) + } + } + }() + + err = watcher.Add(fmt.Sprintf("%s/analysis_results.json", appPath)) + if err != nil { + t.Error(err) + } /* ============================================================================= * Run the analyzer dry-run command on the testdata/todo-checker directory * ============================================================================= */ - analysisCmd := exec.Command("/tmp/deepsource", "analyzer", "dry-run", analyzerPath, "--output-file", appPath) + analysisCmd = exec.Command("/tmp/deepsource", "analyzer", "dry-run", analyzerPath, "--output-file", appPath) analysisCmd.Dir = appPath + analysisCmd.Env = []string{"TOOLBOX_PATH=/toolbox", "CODE_PATH=/code"} var stdout1, stderr1 bytes.Buffer analysisErr := analysisCmd.Run() @@ -53,21 +114,5 @@ func TestAnalyzerRun(t *testing.T) { t.Errorf("Failed to run the analyzer. Error:%s\n%s", analysisErr, outErr1) } t.Log(outStr1) - - /* ============================================================================= - // Compare the results - /* ============================================================================= */ - - receivedAnalysisResults, err := os.ReadFile(path.Join(appPath, "analysis_results.json")) - if err != nil { - t.Errorf("Failed to read the received analysis result. Error:%s", err) - } - expectedAnalysisResults, err := os.ReadFile(path.Join(cwd, "expected_analysis_results.json")) - if err != nil { - t.Errorf("Failed to read the expected analysis result. Error:%s", err) - } - if !bytes.Equal(receivedAnalysisResults, expectedAnalysisResults) { - diff := cmp.Diff(receivedAnalysisResults, expectedAnalysisResults) - t.Errorf("Failed to verify analysis results. Expected: %s\n==========\nGot: %s\n=========\nDiff:%s", expectedAnalysisResults, receivedAnalysisResults, diff) - } + <-done } diff --git a/command/analyzer/dryrun/types.go b/command/analyzer/dryrun/types.go index 0885ce452..f4ef9800a 100644 --- a/command/analyzer/dryrun/types.go +++ b/command/analyzer/dryrun/types.go @@ -8,3 +8,4 @@ type AnalysisConfig struct { TestPatterns []string `json:"test_patterns"` AnalyzerMeta interface{} `json:"analyzer_meta"` } + diff --git a/go.mod b/go.mod index 9f7733dc5..88bfbcaa3 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/AlecAivazis/survey/v2 v2.3.4 github.com/Jeffail/gabs/v2 v2.6.1 github.com/MakeNowJust/heredoc v1.0.0 - github.com/ProtonMail/go-crypto v0.0.0-20220407094043-a94812496cf5 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20220623141421-5afb4c282135 // indirect github.com/briandowns/spinner v1.18.1 github.com/cli/browser v1.1.0 github.com/deepsourcelabs/graphql v0.2.2 @@ -26,7 +26,7 @@ require ( require ( github.com/atomicgo/cursor v0.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/fsnotify/fsnotify v1.5.1 github.com/go-git/go-git/v5 v5.4.2 github.com/go-playground/validator/v10 v10.10.1 github.com/gobwas/glob v0.2.3 @@ -61,9 +61,9 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88 // indirect - golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect - golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 // indirect + golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect + golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect + golang.org/x/sys v0.0.0-20220624220833-87e55d714810 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect gopkg.in/ini.v1 v1.66.4 // indirect @@ -71,6 +71,8 @@ require ( require ( github.com/alecthomas/chroma v0.10.0 + github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b + github.com/labstack/echo/v4 v4.7.2 github.com/morikuni/aec v1.0.0 ) @@ -94,12 +96,15 @@ require ( github.com/golang/protobuf v1.5.2 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/labstack/gommon v0.3.1 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moby/sys/mountinfo v0.6.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/runc v1.1.1 // indirect github.com/sirupsen/logrus v1.8.1 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.1 // indirect go.opencensus.io v0.23.0 // indirect google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa // indirect google.golang.org/grpc v1.43.0 // indirect diff --git a/go.sum b/go.sum index 2afaf98e1..493be98ce 100644 --- a/go.sum +++ b/go.sum @@ -92,8 +92,8 @@ github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63n github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= -github.com/ProtonMail/go-crypto v0.0.0-20220407094043-a94812496cf5 h1:cSHEbLj0GZeHM1mWG84qEnGFojNEQ83W7cwaPRjcwXU= -github.com/ProtonMail/go-crypto v0.0.0-20220407094043-a94812496cf5/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20220623141421-5afb4c282135 h1:xDc/cFH/hwyr9KyWc0sm26lpsscqtfZBvU8NpRLHwJ0= +github.com/ProtonMail/go-crypto v0.0.0-20220623141421-5afb4c282135/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= @@ -524,6 +524,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/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/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4= +github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= 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-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= @@ -604,7 +606,11 @@ 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/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/echo/v4 v4.7.2 h1:Kv2/p8OaQ+M6Ex4eGimg9b9e6icoxA42JSlOR3msKtI= +github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= +github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= @@ -622,6 +628,7 @@ github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwM github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 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-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -877,9 +884,12 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb 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/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= 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= @@ -958,8 +968,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88 h1:Tgea0cVUD0ivh5ADBX4WwuI12DUd2to3nCYe2eayMIw= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1042,8 +1052,8 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1154,10 +1164,11 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/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-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/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-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810 h1:rHZQSjJdAI4Xf5Qzeh2bBc5YJIkPFVM6oDtMFYmgws0= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= diff --git a/types/analyzer.go b/types/analyzer.go index a779a353a..69dd66256 100644 --- a/types/analyzer.go +++ b/types/analyzer.go @@ -55,7 +55,7 @@ type AnalyzerTOML struct { * Analyzer Issue TOML Types * ========================= */ -// Analyzer issue type +// Analyzer issue type. type AnalyzerIssue struct { Shortcode string `validate:"omitempty"` Title string `toml:"title" json:"title" validate:"required"` diff --git a/types/constants.go b/types/constants.go new file mode 100644 index 000000000..b06185a06 --- /dev/null +++ b/types/constants.go @@ -0,0 +1,24 @@ +package types + +// Issue category maps. +var IssueCategoryMap = map[string]string{ + "bug-risk": "Bug risk", + "antipattern": "Anti-pattern", + "performance": "Performance", + "style": "Style", + "security": "Security", + "coverage": "Coverage", + "typecheck": "Type check", + "doc": "Documentation", +} + +// Default supported metrics map. +var MetricMap = map[string]string{ + "BCV": "Branch coverage", + "ADC": "API documentation coverage", + "TDC": "Test documentation coverage", + "IDP": "Indirect dependencies", + "TCV": "Test coverage", + "DDP": "Direct dependencies", + "DCV": "Application documentation coverage", +} diff --git a/types/result.go b/types/result.go index 135d74d65..e571bd09e 100644 --- a/types/result.go +++ b/types/result.go @@ -35,10 +35,13 @@ type ProcessedData struct { } type Issue struct { - IssueCode string `json:"issue_code"` - IssueText string `json:"issue_text"` - Location Location `json:"location"` - ProcessedData ProcessedData `json:"processed_data,omitempty"` + IssueCode string `json:"issue_code"` + IssueText string `json:"issue_text"` + IssueTitle string + IssueCategory string + IssueDescription string + Location Location `json:"location"` + ProcessedData ProcessedData `json:"processed_data,omitempty"` } type Error struct { From b1e96f4cca98220da88eb58a44d258af351285fc Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi Date: Tue, 28 Jun 2022 22:09:24 +0530 Subject: [PATCH 11/28] fix: fix CI Signed-off-by: Siddhant N Trivedi --- .github/workflows/CI.yml | 1 + command/analyzer/dryrun/test/run_test.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e0dc92a5f..872203967 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -38,6 +38,7 @@ jobs: env: CODE_PATH: /home/runner/code APP_PATH: /home/runner/app + TOOLBOX_PATH: /home/runner/toolbox - name: Report test coverage to DeepSource uses: deepsourcelabs/test-coverage-action@master diff --git a/command/analyzer/dryrun/test/run_test.go b/command/analyzer/dryrun/test/run_test.go index 9f849f4cb..fd0395fe9 100644 --- a/command/analyzer/dryrun/test/run_test.go +++ b/command/analyzer/dryrun/test/run_test.go @@ -105,7 +105,7 @@ func TestAnalyzerRun(t *testing.T) { analysisCmd = exec.Command("/tmp/deepsource", "analyzer", "dry-run", analyzerPath, "--output-file", appPath) analysisCmd.Dir = appPath - analysisCmd.Env = []string{"TOOLBOX_PATH=/toolbox", "CODE_PATH=/code"} + analysisCmd.Env = []string{fmt.Sprintf("TOOLBOX_PATH=%s", os.Getenv("TOOLBOX_PATH")), fmt.Sprintf("CODE_PATH=%s", os.Getenv("CODE_PATH"))} var stdout1, stderr1 bytes.Buffer analysisErr := analysisCmd.Run() From 5e210f9719ed35f2509c87780e5c38d9a52aa620 Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Wed, 29 Jun 2022 13:23:26 +0530 Subject: [PATCH 12/28] Update CI.yml --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 872203967..b141d90bd 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -1,7 +1,7 @@ name: CI on: - pull_request: + pull_request_target: branches: - '**' push: From 45bd8e7f74ed865297a285a6c645be45e451dad2 Mon Sep 17 00:00:00 2001 From: Aadhav Vignesh <53528139+burntcarrot@users.noreply.github.com> Date: Wed, 29 Jun 2022 23:03:06 +0530 Subject: [PATCH 13/28] fix: set arch for docker build (#156) --- analyzers/backend/docker/build.go | 3 ++- analyzers/backend/docker/container.go | 11 ++++++++++- command/analyzer/dryrun/client.go | 1 + command/analyzer/dryrun/run.go | 7 +++++++ command/analyzer/dryrun/test/run_test.go | 5 ++--- command/analyzer/verify/build.go | 1 + command/analyzer/verify/verify.go | 13 ++++++++++--- 7 files changed, 33 insertions(+), 8 deletions(-) diff --git a/analyzers/backend/docker/build.go b/analyzers/backend/docker/build.go index db046d858..9b856eab1 100644 --- a/analyzers/backend/docker/build.go +++ b/analyzers/backend/docker/build.go @@ -24,6 +24,7 @@ type DockerClient struct { ContainerID string ImageName string ImageTag string + ImagePlatform string DockerfilePath string AnalysisOpts AnalysisParams ShowLogs bool @@ -73,7 +74,7 @@ func (d *DockerClient) executeImageBuild() (context.CancelFunc, io.ReadCloser, e Dockerfile: d.DockerfilePath, Tags: []string{fmt.Sprintf("%s:%s", d.ImageName, d.ImageTag)}, Remove: true, - Platform: "linux", + Platform: d.ImagePlatform, } res, err := d.Client.ImageBuild(ctx, tar, opts) if err != nil { diff --git a/analyzers/backend/docker/container.go b/analyzers/backend/docker/container.go index 2ea5f4df0..7576e444e 100644 --- a/analyzers/backend/docker/container.go +++ b/analyzers/backend/docker/container.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "os" "path" + "runtime" "strings" "time" @@ -64,8 +65,16 @@ func (d *DockerClient) StartDockerContainer() error { // Prepare the network config networkConfig := network.NetworkingConfig{} + + // Configure the platform(mostly architecture) for the container. If specified by the user, use that else + // determine it using runtime.GOARCH. + containerArch := runtime.GOARCH + if d.ImagePlatform != "" { + containerArch = strings.SplitN(d.ImagePlatform, "/", 2)[1] + } + platform := v1.Platform{ - Architecture: "amd64", + Architecture: containerArch, OS: "linux", } diff --git a/command/analyzer/dryrun/client.go b/command/analyzer/dryrun/client.go index d0ec39c82..de015f5fc 100644 --- a/command/analyzer/dryrun/client.go +++ b/command/analyzer/dryrun/client.go @@ -29,6 +29,7 @@ func (a *AnalyzerDryRun) createDockerClient() error { a.Client = &docker.DockerClient{ ImageName: dockerFileName, + ImagePlatform: a.DockerImagePlatform, ImageTag: docker.GenerateImageVersion(7), ContainerName: analyzerName + "-" + docker.GenerateImageVersion(7), DockerfilePath: dockerFilePath, diff --git a/command/analyzer/dryrun/run.go b/command/analyzer/dryrun/run.go index 0a59e8f7e..008420355 100644 --- a/command/analyzer/dryrun/run.go +++ b/command/analyzer/dryrun/run.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path" + "runtime" "time" "github.com/fatih/color" @@ -31,6 +32,7 @@ var ( // The params required while running the Analysis locally. type AnalyzerDryRun struct { Client *docker.DockerClient // The client to be used for all docker related ops. + DockerImagePlatform string // The platform for which the Docker image is to be built. RemoteSource bool // True if the source to be analyzed is a remote VCS repository. SourcePath string // The path of the directory of source code to be analyzed. TempCloneDirectory string // The temporary directory where the source of the remote VCS will be cloned to. @@ -70,6 +72,11 @@ func NewCmdAnalyzerRun() *cobra.Command { // --output-file/ -o flag. cmd.Flags().StringVarP(&opts.TempToolBoxDirectory, "output-file", "o", "", "The path of analysis results") + + // --platform flag; used for explicitly setting up the build platform for the Docker image. Defaults to linux/ if not provided. + defaultPlatform := fmt.Sprintf("linux/%s", runtime.GOARCH) + cmd.Flags().StringVar(&opts.DockerImagePlatform, "platform", defaultPlatform, "Explicitly set build platform for Docker image.") + return cmd } diff --git a/command/analyzer/dryrun/test/run_test.go b/command/analyzer/dryrun/test/run_test.go index fd0395fe9..9f912c26e 100644 --- a/command/analyzer/dryrun/test/run_test.go +++ b/command/analyzer/dryrun/test/run_test.go @@ -105,14 +105,13 @@ func TestAnalyzerRun(t *testing.T) { analysisCmd = exec.Command("/tmp/deepsource", "analyzer", "dry-run", analyzerPath, "--output-file", appPath) analysisCmd.Dir = appPath - analysisCmd.Env = []string{fmt.Sprintf("TOOLBOX_PATH=%s", os.Getenv("TOOLBOX_PATH")), fmt.Sprintf("CODE_PATH=%s", os.Getenv("CODE_PATH"))} + analysisCmd.Env = []string{"TOOLBOX_PATH=/toolbox", "CODE_PATH=/code"} var stdout1, stderr1 bytes.Buffer analysisErr := analysisCmd.Run() - outStr1, outErr1 := stdout1.String(), stderr1.String() + _, outErr1 := stdout1.String(), stderr1.String() if err != nil { t.Errorf("Failed to run the analyzer. Error:%s\n%s", analysisErr, outErr1) } - t.Log(outStr1) <-done } diff --git a/command/analyzer/verify/build.go b/command/analyzer/verify/build.go index 481065492..dd571bde6 100644 --- a/command/analyzer/verify/build.go +++ b/command/analyzer/verify/build.go @@ -47,6 +47,7 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzerDockerBuild() (err error) { * Use the `GenerateImageVersion` utility to generate a random string of length 7 to tag the image */ analyzerBuilder := build.DockerClient{ ImageName: a.Build.DockerImageName, + ImagePlatform: a.Build.DockerImagePlatform, DockerfilePath: a.Build.DockerFilePath, ImageTag: build.GenerateImageVersion(7), ShowLogs: a.Build.VerboseMode, diff --git a/command/analyzer/verify/verify.go b/command/analyzer/verify/verify.go index 4dc312db5..704552af8 100644 --- a/command/analyzer/verify/verify.go +++ b/command/analyzer/verify/verify.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "path/filepath" + "runtime" "github.com/deepsourcelabs/cli/analyzers/validator" "github.com/deepsourcelabs/cli/types" @@ -19,9 +20,10 @@ var ( ) type AnalyzerBuild struct { - DockerFilePath string - DockerImageName string - VerboseMode bool + DockerFilePath string + DockerImageName string + DockerImagePlatform string + VerboseMode bool } type AnalyzerVerifyOpts struct { @@ -56,6 +58,11 @@ func NewCmdAnalyzerVerify() *cobra.Command { // --verbose flag. On being set, the build logs as well as the verification diagnostics are visible to the user cmd.Flags().BoolVar(&opts.Build.VerboseMode, "verbose", false, "Output build logs and diagnostics related to verification failures") + + // --platform flag; used for explicitly setting up the build platform for the Docker image. Defaults to linux/ if not provided. + defaultPlatform := fmt.Sprintf("linux/%s", runtime.GOARCH) + cmd.Flags().StringVar(&opts.Build.DockerImagePlatform, "platform", defaultPlatform, "Explicitly set build platform for Docker image.") + return cmd } From 987139aeca09cea8c232731f6e36002f28224089 Mon Sep 17 00:00:00 2001 From: Shivam Mishra <77610151+shivam-deepsource@users.noreply.github.com> Date: Thu, 30 Jun 2022 14:42:57 +0530 Subject: [PATCH 14/28] feat: Issues list page template (#155) * feat: add issues page * fix: merge conflicts * feat: add occurences page * chore: update sprites * chore: ignore node modules * fix: template errors * feat: sticky layouts * feat: add favicon * feat: add meta data * feat: update icons * Delete hello.html * chore: ignore certain files while embedding and other minor fixes Signed-off-by: Siddhant N Trivedi * Autofix issues in 1 file Resolved issues in command/analyzer/dryrun/render/route.go via DeepSource Autofix * chore: fix DeepSource issue Signed-off-by: Siddhant N Trivedi * chore: add skipcq Signed-off-by: Siddhant N Trivedi Co-authored-by: Sourya Vatsyayan Co-authored-by: Siddhant N Trivedi Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> --- .gitignore | 3 + .../dryrun/.deepsource/analyzer/analyzer.toml | 0 command/analyzer/dryrun/render/occurences.go | 23 +- command/analyzer/dryrun/render/render.go | 5 +- command/analyzer/dryrun/render/route.go | 10 +- command/analyzer/dryrun/render/utils.go | 22 +- .../dryrun/render/views/assets/cli.css | 1398 ++-------- .../render/views/assets/deepsource-cli.css | 2326 +++++++++++++++++ .../render/views/assets/images/deepsource.svg | 20 + .../views/assets/images/favicon-dark.svg | 3 + .../render/views/assets/images/favicon.svg | 3 + .../views/assets/images/feather-sprite.svg | 1587 +++++++++++ .../analyzer/dryrun/render/views/header.html | 96 + .../analyzer/dryrun/render/views/index.html | 184 +- .../analyzer/dryrun/render/views/links.html | 13 + command/analyzer/dryrun/render/views/nav.html | 57 + .../dryrun/render/views/occurence.html | 239 +- .../analyzer/dryrun/render/views/package.json | 14 + .../analyzer/dryrun/render/views/sidebar.html | 95 + .../dryrun/render/views/tailwind.config.js | 157 ++ .../dryrun/render/views/typography.js | 288 ++ .../analyzer/dryrun/render/views/yarn.lock | 449 ++++ go.mod | 1 + go.sum | 2 + types/analyzer.go | 11 +- 25 files changed, 5629 insertions(+), 1377 deletions(-) delete mode 100644 command/analyzer/dryrun/.deepsource/analyzer/analyzer.toml create mode 100644 command/analyzer/dryrun/render/views/assets/deepsource-cli.css create mode 100644 command/analyzer/dryrun/render/views/assets/images/deepsource.svg create mode 100644 command/analyzer/dryrun/render/views/assets/images/favicon-dark.svg create mode 100644 command/analyzer/dryrun/render/views/assets/images/favicon.svg create mode 100644 command/analyzer/dryrun/render/views/assets/images/feather-sprite.svg create mode 100644 command/analyzer/dryrun/render/views/header.html create mode 100644 command/analyzer/dryrun/render/views/links.html create mode 100644 command/analyzer/dryrun/render/views/nav.html create mode 100644 command/analyzer/dryrun/render/views/package.json create mode 100644 command/analyzer/dryrun/render/views/sidebar.html create mode 100644 command/analyzer/dryrun/render/views/tailwind.config.js create mode 100644 command/analyzer/dryrun/render/views/typography.js create mode 100644 command/analyzer/dryrun/render/views/yarn.lock diff --git a/.gitignore b/.gitignore index cfa172c02..87e720c08 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ dist # Test coverage reports coverage.out cover.out + +# node +node_modules \ No newline at end of file diff --git a/command/analyzer/dryrun/.deepsource/analyzer/analyzer.toml b/command/analyzer/dryrun/.deepsource/analyzer/analyzer.toml deleted file mode 100644 index e69de29bb..000000000 diff --git a/command/analyzer/dryrun/render/occurences.go b/command/analyzer/dryrun/render/occurences.go index 554a75ac7..b91ca293a 100644 --- a/command/analyzer/dryrun/render/occurences.go +++ b/command/analyzer/dryrun/render/occurences.go @@ -2,7 +2,7 @@ package render import ( "fmt" - "path/filepath" + "os" "strings" ) @@ -16,7 +16,7 @@ func (r *ResultRenderOpts) fetchIssueOccurencesData(cwd string) { currentOccurence := OccurenceData{} // Fix path of the issues(remove cwd prefix from them). - issue.Location.Path = strings.TrimPrefix(issue.Location.Path, filepath.Join(r.AnalysisResultData.SourcePath, string(filepath.Separator))) + issue.Location.Path = strings.TrimPrefix(issue.Location.Path, r.AnalysisResultData.SourcePath+string(os.PathSeparator)) if _, ok := issueOccurenceMap[issue.IssueCode]; !ok { // Fetch issue meta for the issue code raised. @@ -52,20 +52,29 @@ func (r *ResultRenderOpts) fetchIssueOccurencesData(cwd string) { filesMap[file] = 1 } - // Appending the unique files. + // Creating a slice of unique files. for file := range filesMap { uniqueFiles = append(uniqueFiles, file) } - occurence := issueOccurenceMap[issueCode] - occurence.Files = append(occurence.Files, uniqueFiles...) - issueOccurenceMap[issueCode] = occurence + + // Assign the unique files slice to the map. + issueOccurence := issueOccurenceMap[issueCode] + issueOccurence.Files = uniqueFiles } // Create the files information string. for issueCode, occurenceData := range issueOccurenceMap { - occurenceData.FilesInfo = fmt.Sprintf("Found in %s and %d other file(s)", occurenceData.Files[0], len(occurenceData.Files)-1) + switch len(occurenceData.Files) - 1 { + case 0: + occurenceData.FilesInfo = fmt.Sprintf("Found in %s", occurenceData.Files[0]) + case 1: + occurenceData.FilesInfo = fmt.Sprintf("Found in %s and %d other file", occurenceData.Files[0], len(occurenceData.Files)-1) + default: + occurenceData.FilesInfo = fmt.Sprintf("Found in %s and %d other files", occurenceData.Files[0], len(occurenceData.Files)-1) + } issueOccurenceMap[issueCode] = occurenceData } + // Assign the value of local IssueOccurenceMap to global struct field. r.AnalysisResultData.IssuesOccurenceMap = issueOccurenceMap // Find out total number of occurences of all the issues. diff --git a/command/analyzer/dryrun/render/render.go b/command/analyzer/dryrun/render/render.go index 6eae9f60e..3eef16d83 100644 --- a/command/analyzer/dryrun/render/render.go +++ b/command/analyzer/dryrun/render/render.go @@ -15,7 +15,10 @@ import ( "github.com/pterm/pterm" ) -//go:embed views/*.html views/**/*.css +/* Embedding the required files in views folder + into the binary using go embed */ + +//go:embed views/*.html views/assets var tmplFS embed.FS // renderResultsOnBrowser renders the results on the browser through a local server, diff --git a/command/analyzer/dryrun/render/route.go b/command/analyzer/dryrun/render/route.go index 83ea1bf84..dde9008b1 100644 --- a/command/analyzer/dryrun/render/route.go +++ b/command/analyzer/dryrun/render/route.go @@ -21,7 +21,7 @@ type IRenderServer interface { * /issues?category={issue_category} */ // getEchoContext returns a new Echo server instance. -func (r *ResultRenderOpts) GetEchoContext() *echo.Echo { +func (*ResultRenderOpts) GetEchoContext() *echo.Echo { e := echo.New() e.HideBanner = true return e @@ -55,9 +55,9 @@ func (r *ResultRenderOpts) IssuesHandler(c echo.Context) error { err := r.Template.ExecuteTemplate(c.Response().Writer, "index.html", *r) if err != nil { fmt.Println(err) - return c.String(http.StatusOK, "Occurence page served.") + return c.String(http.StatusInternalServerError, err.Error()) } - return c.String(http.StatusOK, "Issues page served.") + return c.NoContent(http.StatusOK) } // IssuesOccurencesHandler handles serving the issue occurences. @@ -72,7 +72,7 @@ func (r *ResultRenderOpts) IssueOccurencesHandler(c echo.Context) error { err := r.Template.ExecuteTemplate(c.Response().Writer, "occurence.html", *r) if err != nil { fmt.Println(err) - return c.String(http.StatusOK, "Occurence page served.") + return c.String(http.StatusInternalServerError, err.Error()) } - return c.String(http.StatusOK, "Occurence page served.") + return c.NoContent(http.StatusOK) } diff --git a/command/analyzer/dryrun/render/utils.go b/command/analyzer/dryrun/render/utils.go index 06cc42156..9b30fa932 100644 --- a/command/analyzer/dryrun/render/utils.go +++ b/command/analyzer/dryrun/render/utils.go @@ -1,7 +1,9 @@ package render import ( + "bytes" "fmt" + "html/template" "net" "os" "path/filepath" @@ -14,6 +16,7 @@ import ( "github.com/go-git/go-git/v5/plumbing/object" "github.com/hako/durafmt" "github.com/pelletier/go-toml/v2" + "github.com/yuin/goldmark" ) // fetchRunSummary fetches the data for the run summary section involving the time since latest run @@ -153,9 +156,14 @@ func fetchAnalyzerVCSData(dir string) string { return "" } - if commitsSinceCurrentTag == 0 { + // Return the Analyzer diff info. + switch commitsSinceCurrentTag { + case 0: return fmt.Sprintf("This Analyzer is up to date with %s", currentTag) + case 1: + return fmt.Sprintf("This Analyzer is %d commit ahead of %s", commitsSinceCurrentTag, currentTag) } + return fmt.Sprintf("This Analyzer is %d commits ahead of %s", commitsSinceCurrentTag, currentTag) } @@ -193,9 +201,17 @@ func getIssueMeta(cwd, issueCode string) (types.AnalyzerIssue, error) { } // Unmarshal the data from the issue TOMLs into the struct - err = toml.Unmarshal(issueData, &analyzerIssue) - if err != nil { + if err = toml.Unmarshal(issueData, &analyzerIssue); err != nil { return analyzerIssue, err } + + // Parsing the markdown issue description and passing it as an HTML string. + var buf bytes.Buffer + if err := goldmark.Convert([]byte(analyzerIssue.Description), &buf); err != nil { + return types.AnalyzerIssue{}, err + } + + // Goldmark already provides a secure HTML. Ref: https://github.com/yuin/goldmark#security + analyzerIssue.HTMLDescription = template.HTML(buf.String()) // skipcq: GSC-G203 return analyzerIssue, nil } diff --git a/command/analyzer/dryrun/render/views/assets/cli.css b/command/analyzer/dryrun/render/views/assets/cli.css index 49345c10b..268cfeb08 100644 --- a/command/analyzer/dryrun/render/views/assets/cli.css +++ b/command/analyzer/dryrun/render/views/assets/cli.css @@ -1,1169 +1,285 @@ -/* -! tailwindcss v3.1.4 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: currentColor; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -*/ - -html { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font family by default. -2. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-size: 1em; - /* 2 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - font-weight: inherit; - /* 1 */ - line-height: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -*, ::before, ::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -::-webkit-backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.sticky { - position: -webkit-sticky; - position: sticky; -} - -.top-0 { - top: 0px; -} - -.top-2 { - top: 0.5rem; -} - -.top-1\.5 { - top: 0.375rem; -} - -.left-1\.5 { - left: 0.375rem; -} - -.top-1 { - top: 0.25rem; -} - -.left-1 { - left: 0.25rem; -} - -.left-2 { - left: 0.5rem; -} - -.z-20 { - z-index: 20; -} - -.col-span-2 { - grid-column: span 2 / span 2; -} - -.row-span-2 { - grid-row: span 2 / span 2; -} - -.mr-4 { - margin-right: 1rem; -} - -.mr-1 { - margin-right: 0.25rem; -} - -.mb-3 { - margin-bottom: 0.75rem; -} - -.block { - display: block; -} - -.inline { - display: inline; -} - -.flex { - display: flex; -} - -.grid { - display: grid; -} - -.hidden { - display: none; -} - -.h-12 { - height: 3rem; -} - -.h-full { - height: 100%; -} - -.h-3 { - height: 0.75rem; -} - -.h-8 { - height: 2rem; -} - -.min-h-screen { - min-height: 100vh; -} - -.w-28 { - width: 7rem; -} - -.w-full { - width: 100%; -} - -.w-3 { - width: 0.75rem; -} - -.max-w-2xl { - max-width: 42rem; -} - -.flex-1 { - flex: 1 1 0%; -} - -.flex-shrink-0 { - flex-shrink: 0; -} - -.flex-grow { - flex-grow: 1; -} - -.cursor-pointer { - cursor: pointer; -} - -.auto-rows-min { - grid-auto-rows: -webkit-min-content; - grid-auto-rows: min-content; -} - -.grid-cols-\[48px_1fr\] { - grid-template-columns: 48px 1fr; -} - -.grid-cols-\[18rem_1fr_22rem\] { - grid-template-columns: 18rem 1fr 22rem; -} - -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.flex-col { - flex-direction: column; -} - -.flex-wrap { - flex-wrap: wrap; -} - -.place-content-center { - place-content: center; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.gap-1 { - gap: 0.25rem; -} - -.gap-5 { - gap: 1.25rem; -} - -.gap-2\.5 { - gap: 0.625rem; -} - -.gap-2 { - gap: 0.5rem; -} - -.gap-4 { - gap: 1rem; -} - -.gap-x-4 { - -moz-column-gap: 1rem; - column-gap: 1rem; -} - -.gap-y-2\.5 { - row-gap: 0.625rem; -} - -.gap-y-2 { - row-gap: 0.5rem; -} - -.gap-x-2 { - -moz-column-gap: 0.5rem; - column-gap: 0.5rem; -} - -.space-y-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); -} - -.space-x-2 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.5rem * var(--tw-space-x-reverse)); - margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-y-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1rem * var(--tw-space-y-reverse)); -} - -.divide-x > :not([hidden]) ~ :not([hidden]) { - --tw-divide-x-reverse: 0; - border-right-width: calc(1px * var(--tw-divide-x-reverse)); - border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse))); -} - -.divide-ink-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(35 38 46 / var(--tw-divide-opacity)); -} - -.overflow-hidden { - overflow: hidden; -} - -.overflow-ellipsis { - text-overflow: ellipsis; -} - -.whitespace-nowrap { - white-space: nowrap; -} - -.whitespace-pre { - white-space: pre; -} - -.rounded-sm { - border-radius: 0.125rem; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.rounded-md { - border-radius: 0.375rem; -} - -.border { - border-width: 1px; -} - -.border-b { - border-bottom-width: 1px; -} - -.border-ink-200 { - --tw-border-opacity: 1; - border-color: rgb(35 38 46 / var(--tw-border-opacity)); -} - -.border-ink-300 { - --tw-border-opacity: 1; - border-color: rgb(26 29 35 / var(--tw-border-opacity)); -} - -.bg-ink-400 { - --tw-bg-opacity: 1; - background-color: rgb(22 24 29 / var(--tw-bg-opacity)); -} - -.bg-ink-200 { - --tw-bg-opacity: 1; - background-color: rgb(35 38 46 / var(--tw-bg-opacity)); -} - -.bg-ink-300 { - --tw-bg-opacity: 1; - background-color: rgb(26 29 35 / var(--tw-bg-opacity)); -} - -.bg-ink-100 { - --tw-bg-opacity: 1; - background-color: rgb(42 46 55 / var(--tw-bg-opacity)); -} - -.stroke-current { - stroke: currentColor; -} - -.stroke-1 { - stroke-width: 1; -} - -.p-6 { - padding: 1.5rem; -} - -.p-4 { - padding: 1rem; -} - -.p-3 { - padding: 0.75rem; -} - -.p-2 { - padding: 0.5rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.pt-5 { - padding-top: 1.25rem; -} - -.pl-5 { - padding-left: 1.25rem; -} - -.pl-8 { - padding-left: 2rem; -} - -.pl-9 { - padding-left: 2.25rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} - -.text-2xl { - font-size: 1.5rem; - line-height: 2rem; -} - -.font-medium { - font-weight: 500; -} - -.font-semibold { - font-weight: 600; -} - -.font-normal { - font-weight: 400; -} - -.uppercase { - text-transform: uppercase; -} - -.leading-tight { - line-height: 1.25; -} - -.leading-none { - line-height: 1; -} - -.leading-10 { - line-height: 2.5rem; -} - -.tracking-wide { - letter-spacing: 0.025em; -} - -.tracking-wider { - letter-spacing: 0.05em; -} - -.text-vanilla-100 { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.text-vanilla-400 { - --tw-text-opacity: 1; - color: rgb(192 193 195 / var(--tw-text-opacity)); -} - -.text-vanilla-200 { - --tw-text-opacity: 1; - color: rgb(245 245 245 / var(--tw-text-opacity)); -} - -.text-ink-200 { - --tw-text-opacity: 1; - color: rgb(35 38 46 / var(--tw-text-opacity)); -} - -.text-ink-50 { - --tw-text-opacity: 1; - color: rgb(48 53 64 / var(--tw-text-opacity)); -} - -.text-vanilla-300 { - --tw-text-opacity: 1; - color: rgb(238 238 238 / var(--tw-text-opacity)); -} +@tailwind base; +@tailwind components; +@tailwind utilities; .button { - display: flex; - height: 100%; - align-items: center; - gap: 0.5rem; - border-radius: 0.125rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - padding-right: 1rem; - font-size: 0.75rem; - line-height: 1rem; + @apply text-xs h-full py-2 px-4 gap-2 flex items-center rounded-sm; } .sidebar { - display: flex; - height: 2rem; - width: 100%; - align-items: center; - gap: 0.5rem; - border-radius: 0.125rem; - padding: 0.5rem; - font-size: 0.875rem; - line-height: 1.25rem; - --tw-text-opacity: 1; - color: rgb(192 193 195 / var(--tw-text-opacity)); -} - -.sidebar:hover { - --tw-bg-opacity: 1; - background-color: rgb(35 38 46 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); + @apply text-sm p-2 h-8 gap-2 flex items-center rounded-sm hover:bg-ink-300 w-full text-vanilla-400 hover:text-vanilla-100; } .sidebar.selected { - display: flex; - height: 100%; - width: 100%; - align-items: center; - gap: 0.5rem; - border-radius: 0.125rem; - --tw-bg-opacity: 1; - background-color: rgb(26 29 35 / var(--tw-bg-opacity)); - padding: 0.5rem; - font-size: 0.875rem; - line-height: 1.25rem; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.sidebar.selected:hover { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); + @apply bg-ink-200 hover:bg-ink-300 text-vanilla-100 hover:text-vanilla-100; } .sidebar .tag { - justify-self: end; - border-radius: 9999px; - --tw-bg-opacity: 1; - background-color: rgb(35 38 46 / var(--tw-bg-opacity)); - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - font-size: 0.75rem; - line-height: 1rem; - line-height: 1; + @apply px-2 text-xs rounded-full py-1 leading-none bg-ink-200 justify-self-end; } .sidebar .label { - flex-grow: 1; - text-align: left; - line-height: 1; + @apply leading-none flex-grow text-left; } .info { - display: flex; - align-items: center; - gap: 0.25rem; - font-size: 0.875rem; - line-height: 1.25rem; - --tw-text-opacity: 1; - color: rgb(192 193 195 / var(--tw-text-opacity)); + @apply flex items-center gap-1 text-sm text-vanilla-400; } -.hover\:bg-ink-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(42 46 55 / var(--tw-bg-opacity)); +.highlight .hll, +.highlight .hl { + background-color: #21242c; + display: block; } - -.hover\:bg-ink-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(26 29 35 / var(--tw-bg-opacity)); +.highlight .hlr { + background-color: #582c27; + display: inherit; +} +.highlight .hlg { + background-color: #004f41; + display: inherit; +} +.highlight .c { + color: #75715e; +} /* Comment */ +.highlight .err { + color: #960050; + background-color: #1e0010; +} /* Error */ +.highlight .k { + color: #66d9ef; +} /* Keyword */ +.highlight .l { + color: #ae81ff; +} /* Literal */ +.highlight .n { + color: #f8f8f2; +} /* Name */ +.highlight .o { + color: #f92672; +} /* Operator */ +.highlight .p { + color: #f8f8f2; +} /* Punctuation */ +.highlight .cm { + color: #75715e; +} /* Comment.Multiline */ +.highlight .cp { + color: #75715e; +} /* Comment.Preproc */ +.highlight .c1, +.highlight .ch { + color: #75715e; +} /* Comment.Single */ +.highlight .cs { + color: #75715e; +} /* Comment.Special */ +.highlight .ge { + font-style: italic; +} /* Generic.Emph */ +.highlight .gs { + font-weight: bold; +} /* Generic.Strong */ +.highlight .kc { + color: #66d9ef; +} /* Keyword.Constant */ +.highlight .kd { + color: #66d9ef; +} /* Keyword.Declaration */ +.highlight .kn { + color: #f92672; +} /* Keyword.Namespace */ +.highlight .kp { + color: #66d9ef; +} /* Keyword.Pseudo */ +.highlight .kr { + color: #66d9ef; +} /* Keyword.Reserved */ +.highlight .kt { + color: #66d9ef; +} /* Keyword.Type */ +.highlight .ld { + color: #e6db74; +} /* Literal.Date */ +.highlight .m { + color: #ae81ff; +} /* Literal.Number */ +.highlight .s { + color: #e6db74; +} /* Literal.String */ +.highlight .na { + color: #a6e22e; +} /* Name.Attribute */ +.highlight .nb { + color: #f8f8f2; +} /* Name.Builtin */ +.highlight .nc { + color: #a6e22e; +} /* Name.Class */ +.highlight .no { + color: #66d9ef; +} /* Name.Constant */ +.highlight .nd { + color: #a6e22e; +} /* Name.Decorator */ +.highlight .ni { + color: #f8f8f2; +} /* Name.Entity */ +.highlight .ne { + color: #a6e22e; +} /* Name.Exception */ +.highlight .nf { + color: #a6e22e; +} /* Name.Function */ +.highlight .fm { + color: #a6e22e; +} /* Name.SpecialFunction */ +.highlight .nl { + color: #f8f8f2; +} /* Name.Label */ +.highlight .nn { + color: #f8f8f2; +} /* Name.Namespace */ +.highlight .nx { + color: #a6e22e; +} /* Name.Other */ +.highlight .py { + color: #f8f8f2; +} /* Name.Property */ +.highlight .nt { + color: #f92672; +} /* Name.Tag */ +.highlight .nv { + color: #f8f8f2; +} /* Name.Variable */ +.highlight .ow { + color: #f92672; +} /* Operator.Word */ +.highlight .w { + color: #f8f8f2; +} /* Text.Whitespace */ +.highlight .mf { + color: #ae81ff; +} /* Literal.Number.Float */ +.highlight .mh { + color: #ae81ff; +} /* Literal.Number.Hex */ +.highlight .mi { + color: #ae81ff; +} /* Literal.Number.Integer */ +.highlight .mo { + color: #ae81ff; +} /* Literal.Number.Oct */ +.highlight .sb { + color: #e6db74; +} /* Literal.String.Backtick */ +.highlight .sc { + color: #e6db74; +} /* Literal.String.Char */ +.highlight .sd { + color: #e6db74; +} /* Literal.String.Doc */ +.highlight .s2 { + color: #e6db74; +} /* Literal.String.Double */ +.highlight .se { + color: #ae81ff; +} /* Literal.String.Escape */ +.highlight .sh { + color: #e6db74; +} /* Literal.String.Heredoc */ +.highlight .si { + color: #e6db74; +} /* Literal.String.Interpol */ +.highlight .sx { + color: #e6db74; +} /* Literal.String.Other */ +.highlight .sr { + color: #e6db74; +} /* Literal.String.Regex */ +.highlight .s1 { + color: #e6db74; +} /* Literal.String.Single */ +.highlight .ss { + color: #e6db74; +} /* Literal.String.Symbol */ +.highlight .bp { + color: #f8f8f2; +} /* Name.Builtin.Pseudo */ +.highlight .vc { + color: #f8f8f2; +} /* Name.Variable.Class */ +.highlight .vg { + color: #f8f8f2; +} /* Name.Variable.Global */ +.highlight .vi { + color: #f8f8f2; +} /* Name.Variable.Instance */ +.highlight .il { + color: #ae81ff; +} /* Literal.Number.Integer.Long */ +.highlight .vm { + color: #a6e22e; +} + +.highlight .gh { +} /* Generic Heading & Diff Header */ +.highlight .gu { + color: #75715e; +} /* Generic.Subheading & Diff Unified/Comment? */ +.highlight .gd { + color: #f92672; +} /* Generic.Deleted & Diff Deleted */ +.highlight .gi { + color: #a6e22e; +} /* Generic.Inserted & Diff Inserted */ + +.highlight .ln { + padding-right: 0.75rem; + padding-left: 0.75rem; + color: #6a737d; +} + +.highlight .hl .ln { + color: #c0c1c3; +} + +.highlight .hl .ln, +.highlight .hll .ln { + background-color: #21242c; +} +.highlight .hlg .ln { + background-color: #004f41; +} +.highlight .hlr .ln { + background-color: #582c27; +} + +.highlight pre { + font-size: 13px; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + color: #ccc; + overflow-x: auto; + position: relative; } -.focus\:outline-none:focus { - outline: 2px solid transparent; - outline-offset: 2px; +.highlight :not(.prose) pre { + background-color: #16181d !important; } -.group:hover .group-hover\:border-ink-200 { - --tw-border-opacity: 1; - border-color: rgb(35 38 46 / var(--tw-border-opacity)); +.highlighttable { + background: #16181d; + width: 100%; } - -@media (min-width: 640px) { - .sm\:flex { - display: flex; - } - - .sm\:border-l { - border-left-width: 1px; - } +.highlighttable td.code { + width: 100%; + padding-left: 0.75rem; } - -@media (min-width: 768px) { - .md\:mr-2 { - margin-right: 0.5rem; - } - - .md\:block { - display: block; - } - - .md\:w-4\/5 { - width: 80%; - } - - .md\:w-1\/5 { - width: 20%; - } - - .md\:flex-row { - flex-direction: row; - } - - .md\:flex-wrap { - flex-wrap: wrap; - } +.highlighttable .linenos { + padding-left: 0.75rem; + color: #6a737d; } - -@media (min-width: 1024px) { - .lg\:gap-y-2 { - row-gap: 0.5rem; - } +.highlighttable .linenos pre { + font-size: 13px; } diff --git a/command/analyzer/dryrun/render/views/assets/deepsource-cli.css b/command/analyzer/dryrun/render/views/assets/deepsource-cli.css new file mode 100644 index 000000000..1d1623d31 --- /dev/null +++ b/command/analyzer/dryrun/render/views/assets/deepsource-cli.css @@ -0,0 +1,2326 @@ +/* +! tailwindcss v3.1.4 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: currentColor; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input:-ms-input-placeholder, textarea:-ms-input-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::-webkit-backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.prose { + color: #ffffff; + max-width: 65ch; +} + +.prose :where([class~="lead"]):not(:where([class~="not-prose"] *)) { + color: #c0c1c3; + font-size: 1.25em; + line-height: 1.6; + margin-top: 1.2em; + margin-bottom: 1.2em; +} + +.prose :where(a):not(:where([class~="not-prose"] *)) { + color: #33cb9a; + -webkit-text-decoration: normal; + text-decoration: normal; + font-weight: 500; +} + +.prose :where(strong):not(:where([class~="not-prose"] *)) { + color: #ffffff; + font-weight: 600; +} + +.prose :where(ol):not(:where([class~="not-prose"] *)) { + list-style-type: decimal; + padding-left: 1.625em; +} + +.prose :where(ol[type="A"]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a"]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="A" s]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a" s]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="I"]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i"]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="I" s]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i" s]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="1"]):not(:where([class~="not-prose"] *)) { + list-style-type: decimal; +} + +.prose :where(ul):not(:where([class~="not-prose"] *)) { + list-style-type: none; + padding-left: 1.625em; + list-style: none; +} + +.prose :where(ol > li):not(:where([class~="not-prose"] *))::marker { + font-weight: 400; + color: var(--tw-prose-counters); +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *))::marker { + color: var(--tw-prose-bullets); +} + +.prose :where(hr):not(:where([class~="not-prose"] *)) { + border-color: #2a2e37; + border-top-width: 1px; + margin-top: 3em; + margin-bottom: 3em; +} + +.prose :where(blockquote):not(:where([class~="not-prose"] *)) { + font-weight: 500; + font-style: normal; + color: inherit; + border-left-width: 0.25rem; +} + +.prose :where(blockquote):not(:where([class~="not-prose"] *)) borderLeftColor { + 100: #b5ecda; + 150: #a5e8d2; + 200: #94e4ca; + 300: #74dcba; + 400: #53d4aa; + 500: #33cb9a; + 600: #2eb78b; + -d-e-f-a-u-l-t: #33cb9a; +} + +.prose :where(blockquote):not(:where([class~="not-prose"] *)) { + quotes: "\201C""\201D""\2018""\2019"; + margin-top: 1.6em; + margin-bottom: 1.6em; + padding-left: 1em; + line-height: 1.5; + font-size: 1.125rem; + font-size: [object Object]; +} + +.prose :where(blockquote p:first-of-type):not(:where([class~="not-prose"] *))::before { + content: open-quote; +} + +.prose :where(blockquote p:last-of-type):not(:where([class~="not-prose"] *))::after { + content: close-quote; +} + +.prose :where(h1):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 700; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; +} + +.prose :where(h1 strong):not(:where([class~="not-prose"] *)) { + font-weight: 900; +} + +.prose :where(h2):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; +} + +.prose :where(h2 strong):not(:where([class~="not-prose"] *)) { + font-weight: 800; +} + +.prose :where(h3):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.25em; + margin-top: 1.6em; + margin-bottom: 0.6em; + line-height: 1.6; +} + +.prose :where(h3 strong):not(:where([class~="not-prose"] *)) { + font-weight: 700; +} + +.prose :where(h4):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.5em; + margin-bottom: 0.5em; + line-height: 1.5; +} + +.prose :where(h4 strong):not(:where([class~="not-prose"] *)) { + font-weight: 700; +} + +.prose :where(figure > *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose :where(figcaption):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-captions); + font-size: 0.875em; + line-height: 1.4285714; + margin-top: 0.8571429em; +} + +.prose :where(code):not(:where([class~="not-prose"] *)) { + color: #eeeeee; + font-weight: 600; + font-size: 0.875em; +} + +.prose :where(code):not(:where([class~="not-prose"] *))::before { + content: "`"; +} + +.prose :where(code):not(:where([class~="not-prose"] *))::after { + content: "`"; +} + +.prose :where(a code):not(:where([class~="not-prose"] *)) { + color: #33cb9a; +} + +.prose :where(pre):not(:where([class~="not-prose"] *)) { + color: #c0c1c3; + background-color: #23262e; + overflow-x: auto; + font-weight: 400; + font-size: 0.875em; + line-height: 1.7142857; + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; + border-radius: 0.25rem; + padding-top: 0.8571429em; + padding-right: 1.1428571em; + padding-bottom: 0.8571429em; + padding-left: 1.1428571em; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *)) { + background-color: transparent; + border-width: 0; + border-radius: 0; + padding: 0; + font-weight: 400; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *))::before { + content: none; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *))::after { + content: none; +} + +.prose :where(table):not(:where([class~="not-prose"] *)) { + width: 100%; + table-layout: auto; + text-align: left; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; +} + +.prose :where(thead):not(:where([class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-th-borders); + color: #c0c1c3; +} + +.prose :where(thead th):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 500; + vertical-align: bottom; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose :where(tbody tr):not(:where([class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-td-borders); +} + +.prose :where(tbody tr:last-child):not(:where([class~="not-prose"] *)) { + border-bottom-width: 0; +} + +.prose :where(tbody td):not(:where([class~="not-prose"] *)) { + vertical-align: top; + padding-top: 0.5714286em; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose { + --tw-prose-body: #374151; + --tw-prose-headings: #111827; + --tw-prose-lead: #4b5563; + --tw-prose-links: #111827; + --tw-prose-bold: #111827; + --tw-prose-counters: #6b7280; + --tw-prose-bullets: #d1d5db; + --tw-prose-hr: #e5e7eb; + --tw-prose-quotes: #111827; + --tw-prose-quote-borders: #e5e7eb; + --tw-prose-captions: #6b7280; + --tw-prose-code: #111827; + --tw-prose-pre-code: #e5e7eb; + --tw-prose-pre-bg: #1f2937; + --tw-prose-th-borders: #d1d5db; + --tw-prose-td-borders: #e5e7eb; + --tw-prose-invert-body: #d1d5db; + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: #9ca3af; + --tw-prose-invert-bullets: #4b5563; + --tw-prose-invert-hr: #374151; + --tw-prose-invert-quotes: #f3f4f6; + --tw-prose-invert-quote-borders: #374151; + --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: #d1d5db; + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); + --tw-prose-invert-th-borders: #4b5563; + --tw-prose-invert-td-borders: #374151; + font-size: 1rem; + line-height: 1.75; +} + +.prose :where(p):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; +} + +.prose :where(img):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(video):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(figure):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(h2 code):not(:where([class~="not-prose"] *)) { + font-size: 0.875em; +} + +.prose :where(h3 code):not(:where([class~="not-prose"] *)) { + font-size: 0.9em; +} + +.prose :where(li):not(:where([class~="not-prose"] *)) { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.375em; + position: relative; +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.375em; + position: relative; +} + +.prose > :where(ul > li p):not(:where([class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose > :where(ul > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose > :where(ul > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose > :where(ol > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose > :where(ol > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(hr + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h2 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h3 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h4 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(thead th:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose :where(thead th:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose :where(tbody td:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose :where(tbody td:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose > :where(:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose > :where(:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 0; +} + +.prose :where(a:hover):not(:where([class~="not-prose"] *)) { + text-decoration: underline; +} + +.prose :where(ol > li):not(:where([class~="not-prose"] *))::before { + content: counter(list-item) "."; + position: absolute; + font-weight: 400; + color: #c0c1c3; +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *))::before { + content: "—"; + margin-right: 0.5rem; + width: 0; + top: 0; + left: 0; + height: 0; + position: absolute; +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *))::before color { + 100: #b5ecda; + 150: #a5e8d2; + 200: #94e4ca; + 300: #74dcba; + 400: #53d4aa; + 500: #33cb9a; + 600: #2eb78b; + -d-e-f-a-u-l-t: #33cb9a; +} + +.prose :where(h1, h2, h3, h4, h5):not(:where([class~="not-prose"] *)) { + color: #ffffff; +} + +.prose :where(h3, h4, h5):not(:where([class~="not-prose"] *)) { + font-weight: 500; +} + +.prose :where(figure figcaption):not(:where([class~="not-prose"] *)) { + color: #c0c1c3; + text-align: center; +} + +@media (min-width: 640px) { + .prose :where(figure figcaption):not(:where([class~="not-prose"] *)) { + text-align: left; + } +} + +.prose :where(figure img):not(:where([class~="not-prose"] *)) { + border-radius: 0.25rem; +} + +.prose :where(code::before, code):not(:where([class~="not-prose"] *))::after { + content: ""; +} + +.prose :where(pre code::before, pre code):not(:where([class~="not-prose"] *))::after { + content: ""; +} + +.prose :where(thead, tbody tr):not(:where([class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: #2a2e37; +} + +.prose-sm { + font-size: 0.875rem; + line-height: 1.7142857; +} + +.prose-sm :where(p):not(:where([class~="not-prose"] *)) { + margin-top: 1.1428571em; + margin-bottom: 1.1428571em; +} + +.prose-sm :where([class~="lead"]):not(:where([class~="not-prose"] *)) { + font-size: 1.2857143em; + line-height: 1.5555556; + margin-top: 0.8888889em; + margin-bottom: 0.8888889em; +} + +.prose-sm :where(blockquote):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; + margin-bottom: 1.3333333em; + padding-left: 1.1111111em; +} + +.prose-sm :where(h1):not(:where([class~="not-prose"] *)) { + font-size: 2.1428571em; + margin-top: 0; + margin-bottom: 0.8em; + line-height: 1.2; +} + +.prose-sm :where(h2):not(:where([class~="not-prose"] *)) { + font-size: 1.4285714em; + margin-top: 1.6em; + margin-bottom: 0.8em; + line-height: 1.4; +} + +.prose-sm :where(h3):not(:where([class~="not-prose"] *)) { + font-size: 1.2857143em; + margin-top: 1.5555556em; + margin-bottom: 0.4444444em; + line-height: 1.5555556; +} + +.prose-sm :where(h4):not(:where([class~="not-prose"] *)) { + margin-top: 1.4285714em; + margin-bottom: 0.5714286em; + line-height: 1.4285714; +} + +.prose-sm :where(img):not(:where([class~="not-prose"] *)) { + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; +} + +.prose-sm :where(video):not(:where([class~="not-prose"] *)) { + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; +} + +.prose-sm :where(figure):not(:where([class~="not-prose"] *)) { + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; +} + +.prose-sm :where(figure > *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose-sm :where(figcaption):not(:where([class~="not-prose"] *)) { + font-size: 0.8571429em; + line-height: 1.3333333; + margin-top: 0.6666667em; +} + +.prose-sm :where(code):not(:where([class~="not-prose"] *)) { + font-size: 0.8571429em; +} + +.prose-sm :where(h2 code):not(:where([class~="not-prose"] *)) { + font-size: 0.9em; +} + +.prose-sm :where(h3 code):not(:where([class~="not-prose"] *)) { + font-size: 0.8888889em; +} + +.prose-sm :where(pre):not(:where([class~="not-prose"] *)) { + font-size: 0.8571429em; + line-height: 1.6666667; + margin-top: 1.6666667em; + margin-bottom: 1.6666667em; + border-radius: 0; + padding-top: 0.6666667em; + padding-right: 1em; + padding-bottom: 0.6666667em; + padding-left: 1em; + color: #c0c1c3; + background-color: #23262e; + overflow-x: auto; +} + +.prose-sm :where(ol):not(:where([class~="not-prose"] *)) { + padding-left: 1.5714286em; +} + +.prose-sm :where(ul):not(:where([class~="not-prose"] *)) { + padding-left: 1.5714286em; +} + +.prose-sm :where(li):not(:where([class~="not-prose"] *)) { + margin-top: 0.2857143em; + margin-bottom: 0.2857143em; +} + +.prose-sm :where(ol > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.4285714em; +} + +.prose-sm :where(ul > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.4285714em; +} + +.prose-sm > :where(ul > li p):not(:where([class~="not-prose"] *)) { + margin-top: 0.5714286em; + margin-bottom: 0.5714286em; +} + +.prose-sm > :where(ul > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.1428571em; +} + +.prose-sm > :where(ul > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.1428571em; +} + +.prose-sm > :where(ol > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.1428571em; +} + +.prose-sm > :where(ol > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.1428571em; +} + +.prose-sm :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"] *)) { + margin-top: 0.5714286em; + margin-bottom: 0.5714286em; +} + +.prose-sm :where(hr):not(:where([class~="not-prose"] *)) { + margin-top: 2.8571429em; + margin-bottom: 2.8571429em; +} + +.prose-sm :where(hr + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-sm :where(h2 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-sm :where(h3 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-sm :where(h4 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-sm :where(table):not(:where([class~="not-prose"] *)) { + font-size: 0.8571429em; + line-height: 1.5; +} + +.prose-sm :where(thead th):not(:where([class~="not-prose"] *)) { + padding-right: 1em; + padding-bottom: 0.6666667em; + padding-left: 1em; +} + +.prose-sm :where(thead th:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose-sm :where(thead th:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose-sm :where(tbody td):not(:where([class~="not-prose"] *)) { + padding-top: 0.6666667em; + padding-right: 1em; + padding-bottom: 0.6666667em; + padding-left: 1em; +} + +.prose-sm :where(tbody td:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose-sm :where(tbody td:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose-sm > :where(:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-sm > :where(:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 0; +} + +.prose-sm :where(ul > li):not(:where([class~="not-prose"] *))::before { + content: "—"; + margin-right: 0.5rem; + width: 0; + top: 0; + left: 0; + height: 0; + position: absolute; +} + +.prose-sm :where(ul > li):not(:where([class~="not-prose"] *))::before color { + 100: #b5ecda; + 150: #a5e8d2; + 200: #94e4ca; + 300: #74dcba; + 400: #53d4aa; + 500: #33cb9a; + 600: #2eb78b; + -d-e-f-a-u-l-t: #33cb9a; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: -webkit-sticky; + position: sticky; +} + +.top-12 { + top: 3rem; +} + +.top-0 { + top: 0px; +} + +.top-36 { + top: 9rem; +} + +.z-20 { + z-index: 20; +} + +.z-50 { + z-index: 50; +} + +.col-span-2 { + grid-column: span 2 / span 2; +} + +.row-span-2 { + grid-row: span 2 / span 2; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mr-4 { + margin-right: 1rem; +} + +.block { + display: block; +} + +.flex { + display: flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.list-item { + display: list-item; +} + +.h-24 { + height: 6rem; +} + +.h-full { + height: 100%; +} + +.h-12 { + height: 3rem; +} + +.h-auto { + height: auto; +} + +.h-\[calc\(100vh-9rem\)\] { + height: calc(100vh - 9rem); +} + +.min-h-screen { + min-height: 100vh; +} + +.w-full { + width: 100%; +} + +.w-28 { + width: 7rem; +} + +.max-w-xs { + max-width: 20rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-shrink-0 { + flex-shrink: 0; +} + +.flex-grow { + flex-grow: 1; +} + +.list-none { + list-style-type: none; +} + +.auto-rows-min { + grid-auto-rows: -webkit-min-content; + grid-auto-rows: min-content; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.grid-cols-\[48px_1fr\] { + grid-template-columns: 48px 1fr; +} + +.grid-cols-\[16rem_1fr_20rem\] { + grid-template-columns: 16rem 1fr 20rem; +} + +.grid-cols-\[1fr_10rem\] { + grid-template-columns: 1fr 10rem; +} + +.grid-cols-\[16rem_1fr\] { + grid-template-columns: 16rem 1fr; +} + +.grid-cols-\[1fr_20rem\] { + grid-template-columns: 1fr 20rem; +} + +.flex-row { + flex-direction: row; +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.place-content-center { + place-content: center; +} + +.items-center { + align-items: center; +} + +.items-baseline { + align-items: baseline; +} + +.justify-between { + justify-content: space-between; +} + +.gap-5 { + gap: 1.25rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-2\.5 { + gap: 0.625rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-x-4 { + -moz-column-gap: 1rem; + column-gap: 1rem; +} + +.gap-y-2\.5 { + row-gap: 0.625rem; +} + +.gap-y-2 { + row-gap: 0.5rem; +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.divide-x > :not([hidden]) ~ :not([hidden]) { + --tw-divide-x-reverse: 0; + border-right-width: calc(1px * var(--tw-divide-x-reverse)); + border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse))); +} + +.divide-ink-200 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(35 38 46 / var(--tw-divide-opacity)); +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-scroll { + overflow-x: scroll; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.rounded-sm { + border-radius: 0.125rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.border { + border-width: 1px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-dashed { + border-style: dashed; +} + +.border-ink-200 { + --tw-border-opacity: 1; + border-color: rgb(35 38 46 / var(--tw-border-opacity)); +} + +.bg-ink-400 { + --tw-bg-opacity: 1; + background-color: rgb(22 24 29 / var(--tw-bg-opacity)); +} + +.bg-ink-300 { + --tw-bg-opacity: 1; + background-color: rgb(26 29 35 / var(--tw-bg-opacity)); +} + +.bg-ink-200 { + --tw-bg-opacity: 1; + background-color: rgb(35 38 46 / var(--tw-bg-opacity)); +} + +.p-6 { + padding: 1.5rem; +} + +.p-4 { + padding: 1rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-3 { + padding: 0.75rem; +} + +.py-16 { + padding-top: 4rem; + padding-bottom: 4rem; +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.pt-5 { + padding-top: 1.25rem; +} + +.pl-4 { + padding-left: 1rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + +.text-center { + text-align: center; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.font-medium { + font-weight: 500; +} + +.font-normal { + font-weight: 400; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.leading-tight { + line-height: 1.25; +} + +.leading-none { + line-height: 1; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.tracking-wide { + letter-spacing: 0.025em; +} + +.text-vanilla-100 { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-vanilla-400 { + --tw-text-opacity: 1; + color: rgb(192 193 195 / var(--tw-text-opacity)); +} + +.underline { + -webkit-text-decoration-line: underline; + text-decoration-line: underline; +} + +.button { + display: flex; + height: 100%; + align-items: center; + gap: 0.5rem; + border-radius: 0.125rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + padding-right: 1rem; + font-size: 0.75rem; + line-height: 1rem; +} + +.sidebar { + display: flex; + height: 2rem; + width: 100%; + align-items: center; + gap: 0.5rem; + border-radius: 0.125rem; + padding: 0.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + --tw-text-opacity: 1; + color: rgb(192 193 195 / var(--tw-text-opacity)); +} + +.sidebar:hover { + --tw-bg-opacity: 1; + background-color: rgb(26 29 35 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.sidebar.selected { + --tw-bg-opacity: 1; + background-color: rgb(35 38 46 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.sidebar.selected:hover { + --tw-bg-opacity: 1; + background-color: rgb(26 29 35 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.sidebar .tag { + justify-self: end; + border-radius: 9999px; + --tw-bg-opacity: 1; + background-color: rgb(35 38 46 / var(--tw-bg-opacity)); + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + line-height: 1; +} + +.sidebar .label { + flex-grow: 1; + text-align: left; + line-height: 1; +} + +.info { + display: flex; + align-items: center; + gap: 0.25rem; + font-size: 0.875rem; + line-height: 1.25rem; + --tw-text-opacity: 1; + color: rgb(192 193 195 / var(--tw-text-opacity)); +} + +.highlight .hll, +.highlight .hl { + background-color: #21242c; + display: block; +} + +.highlight .hlr { + background-color: #582c27; + display: inherit; +} + +.highlight .hlg { + background-color: #004f41; + display: inherit; +} + +.highlight .c { + color: #75715e; +} + +/* Comment */ + +.highlight .err { + color: #960050; + background-color: #1e0010; +} + +/* Error */ + +.highlight .k { + color: #66d9ef; +} + +/* Keyword */ + +.highlight .l { + color: #ae81ff; +} + +/* Literal */ + +.highlight .n { + color: #f8f8f2; +} + +/* Name */ + +.highlight .o { + color: #f92672; +} + +/* Operator */ + +.highlight .p { + color: #f8f8f2; +} + +/* Punctuation */ + +.highlight .cm { + color: #75715e; +} + +/* Comment.Multiline */ + +.highlight .cp { + color: #75715e; +} + +/* Comment.Preproc */ + +.highlight .c1, +.highlight .ch { + color: #75715e; +} + +/* Comment.Single */ + +.highlight .cs { + color: #75715e; +} + +/* Comment.Special */ + +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ + +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ + +.highlight .kc { + color: #66d9ef; +} + +/* Keyword.Constant */ + +.highlight .kd { + color: #66d9ef; +} + +/* Keyword.Declaration */ + +.highlight .kn { + color: #f92672; +} + +/* Keyword.Namespace */ + +.highlight .kp { + color: #66d9ef; +} + +/* Keyword.Pseudo */ + +.highlight .kr { + color: #66d9ef; +} + +/* Keyword.Reserved */ + +.highlight .kt { + color: #66d9ef; +} + +/* Keyword.Type */ + +.highlight .ld { + color: #e6db74; +} + +/* Literal.Date */ + +.highlight .m { + color: #ae81ff; +} + +/* Literal.Number */ + +.highlight .s { + color: #e6db74; +} + +/* Literal.String */ + +.highlight .na { + color: #a6e22e; +} + +/* Name.Attribute */ + +.highlight .nb { + color: #f8f8f2; +} + +/* Name.Builtin */ + +.highlight .nc { + color: #a6e22e; +} + +/* Name.Class */ + +.highlight .no { + color: #66d9ef; +} + +/* Name.Constant */ + +.highlight .nd { + color: #a6e22e; +} + +/* Name.Decorator */ + +.highlight .ni { + color: #f8f8f2; +} + +/* Name.Entity */ + +.highlight .ne { + color: #a6e22e; +} + +/* Name.Exception */ + +.highlight .nf { + color: #a6e22e; +} + +/* Name.Function */ + +.highlight .fm { + color: #a6e22e; +} + +/* Name.SpecialFunction */ + +.highlight .nl { + color: #f8f8f2; +} + +/* Name.Label */ + +.highlight .nn { + color: #f8f8f2; +} + +/* Name.Namespace */ + +.highlight .nx { + color: #a6e22e; +} + +/* Name.Other */ + +.highlight .py { + color: #f8f8f2; +} + +/* Name.Property */ + +.highlight .nt { + color: #f92672; +} + +/* Name.Tag */ + +.highlight .nv { + color: #f8f8f2; +} + +/* Name.Variable */ + +.highlight .ow { + color: #f92672; +} + +/* Operator.Word */ + +.highlight .w { + color: #f8f8f2; +} + +/* Text.Whitespace */ + +.highlight .mf { + color: #ae81ff; +} + +/* Literal.Number.Float */ + +.highlight .mh { + color: #ae81ff; +} + +/* Literal.Number.Hex */ + +.highlight .mi { + color: #ae81ff; +} + +/* Literal.Number.Integer */ + +.highlight .mo { + color: #ae81ff; +} + +/* Literal.Number.Oct */ + +.highlight .sb { + color: #e6db74; +} + +/* Literal.String.Backtick */ + +.highlight .sc { + color: #e6db74; +} + +/* Literal.String.Char */ + +.highlight .sd { + color: #e6db74; +} + +/* Literal.String.Doc */ + +.highlight .s2 { + color: #e6db74; +} + +/* Literal.String.Double */ + +.highlight .se { + color: #ae81ff; +} + +/* Literal.String.Escape */ + +.highlight .sh { + color: #e6db74; +} + +/* Literal.String.Heredoc */ + +.highlight .si { + color: #e6db74; +} + +/* Literal.String.Interpol */ + +.highlight .sx { + color: #e6db74; +} + +/* Literal.String.Other */ + +.highlight .sr { + color: #e6db74; +} + +/* Literal.String.Regex */ + +.highlight .s1 { + color: #e6db74; +} + +/* Literal.String.Single */ + +.highlight .ss { + color: #e6db74; +} + +/* Literal.String.Symbol */ + +.highlight .bp { + color: #f8f8f2; +} + +/* Name.Builtin.Pseudo */ + +.highlight .vc { + color: #f8f8f2; +} + +/* Name.Variable.Class */ + +.highlight .vg { + color: #f8f8f2; +} + +/* Name.Variable.Global */ + +.highlight .vi { + color: #f8f8f2; +} + +/* Name.Variable.Instance */ + +.highlight .il { + color: #ae81ff; +} + +/* Literal.Number.Integer.Long */ + +.highlight .vm { + color: #a6e22e; +} + +.highlight .gh { +} + +/* Generic Heading & Diff Header */ + +.highlight .gu { + color: #75715e; +} + +/* Generic.Subheading & Diff Unified/Comment? */ + +.highlight .gd { + color: #f92672; +} + +/* Generic.Deleted & Diff Deleted */ + +.highlight .gi { + color: #a6e22e; +} + +/* Generic.Inserted & Diff Inserted */ + +.highlight .ln { + padding-right: 0.75rem; + padding-left: 0.75rem; + color: #6a737d; +} + +.highlight .hl .ln { + color: #c0c1c3; +} + +.highlight .hl .ln, +.highlight .hll .ln { + background-color: #21242c; +} + +.highlight .hlg .ln { + background-color: #004f41; +} + +.highlight .hlr .ln { + background-color: #582c27; +} + +.highlight pre { + font-size: 13px; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + color: #ccc; + overflow-x: auto; + position: relative; +} + +.highlight :not(.prose) pre { + background-color: #16181d !important; +} + +.highlighttable { + background: #16181d; + width: 100%; +} + +.highlighttable td.code { + width: 100%; + padding-left: 0.75rem; +} + +.highlighttable .linenos { + padding-left: 0.75rem; + color: #6a737d; +} + +.highlighttable .linenos pre { + font-size: 13px; +} + +.hover\:bg-ink-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(26 29 35 / var(--tw-bg-opacity)); +} + +.hover\:bg-ink-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(42 46 55 / var(--tw-bg-opacity)); +} + +.hover\:text-vanilla-200:hover { + --tw-text-opacity: 1; + color: rgb(245 245 245 / var(--tw-text-opacity)); +} + +@media (min-width: 640px) { + .sm\:w-auto { + width: auto; + } + + .sm\:space-y-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0px * var(--tw-space-y-reverse)); + } +} + +@media (min-width: 768px) { + .md\:flex { + display: flex; + } + + .md\:items-start { + align-items: flex-start; + } + + .md\:space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); + } +} + +@media (min-width: 1280px) { + .xl\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } +} diff --git a/command/analyzer/dryrun/render/views/assets/images/deepsource.svg b/command/analyzer/dryrun/render/views/assets/images/deepsource.svg new file mode 100644 index 000000000..29c007d48 --- /dev/null +++ b/command/analyzer/dryrun/render/views/assets/images/deepsource.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/command/analyzer/dryrun/render/views/assets/images/favicon-dark.svg b/command/analyzer/dryrun/render/views/assets/images/favicon-dark.svg new file mode 100644 index 000000000..fe8167c4a --- /dev/null +++ b/command/analyzer/dryrun/render/views/assets/images/favicon-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/command/analyzer/dryrun/render/views/assets/images/favicon.svg b/command/analyzer/dryrun/render/views/assets/images/favicon.svg new file mode 100644 index 000000000..c41e1dcf5 --- /dev/null +++ b/command/analyzer/dryrun/render/views/assets/images/favicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/command/analyzer/dryrun/render/views/assets/images/feather-sprite.svg b/command/analyzer/dryrun/render/views/assets/images/feather-sprite.svg new file mode 100644 index 000000000..f958c1149 --- /dev/null +++ b/command/analyzer/dryrun/render/views/assets/images/feather-sprite.svg @@ -0,0 +1,1587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/command/analyzer/dryrun/render/views/header.html b/command/analyzer/dryrun/render/views/header.html new file mode 100644 index 000000000..580001887 --- /dev/null +++ b/command/analyzer/dryrun/render/views/header.html @@ -0,0 +1,96 @@ +{{ define "header" }} +
    + + +

    + {{ .AnalyzerShortcode }} +

    +
    + {{ if not (eq .AnalysisResultData.UniqueIssuesCount 0) }} +
    + + + + + {{ .AnalysisResultData.UniqueIssuesCount }} + {{ if eq .AnalysisResultData.UniqueIssuesCount 1 }} + issue + {{ else }} + issues + {{ end }} + +
    + {{ end }} + {{ if not (eq .VCSInfo.Branch "") }} +
    + + + + {{ .VCSInfo.Branch }} +
    + {{ end }} + + {{ if not (eq .VCSInfo.CommitSHA "") }} +
    + + + + {{ .VCSInfo.CommitSHA }} +
    + {{ end }} + + {{ if not (eq .VCSInfo.VersionDiff "") }} +
    + + + + {{ .VCSInfo.VersionDiff }} +
    + {{ end }} +
    +
    +{{ end }} \ No newline at end of file diff --git a/command/analyzer/dryrun/render/views/index.html b/command/analyzer/dryrun/render/views/index.html index 1934307a5..022ce1935 100644 --- a/command/analyzer/dryrun/render/views/index.html +++ b/command/analyzer/dryrun/render/views/index.html @@ -3,121 +3,81 @@ {{ .PageTitle }} - - + {{ template "links" }} - -
    -
    - {{ .AnalyzerShortcode }}
    - {{ .AnalysisResultData.UniqueIssuesCount }} issues {{ .VCSInfo.Branch }} {{ .VCSInfo.CommitSHA }} {{ .VCSInfo.VersionDiff }} -
    - - -
    -

    - All Issues  {{ .AnalysisResultData.TotalOccurences }}
    - {{ $categoryMap := .IssueCategoryNameMap}} - {{ range $key, $value := .AnalysisResultData.IssueCategoryCountMap }} - {{ $categoryName := (index $categoryMap $key) }} -

  • {{ $categoryName }}: {{ $value }}
  • - {{ end }} -

    - - -
    -

    Run Summary

    - {{ .Summary.TimeSinceRun }}
    - {{ .AnalysisResultData.SourcePath }}
    - {{ .Summary.RunDuration}} -
    -
    - - - -
    -

    - {{ range $index, $error := .AnalysisResultData.AnalysisResult.Errors }} - {{ if eq $error.Level 0}} - Error {{ $error.HMessage }} - {{ else }}{{ if eq $error.Level 1}} - Warning {{ $error.HMessage }} - {{ end }}{{ end }} - {{ end }} -

    -

    - {{ $defaultIssueCategory := "all"}} - {{ $selectedCategory := .SelectedCategory }} - {{ $categoryMap := .IssueCategoryNameMap}} + {{ $defaultIssueCategory := "all" }} + {{ $selectedCategory := .SelectedCategory }} + {{ $categoryMap := .IssueCategoryNameMap }} + + {{ template "navbar" . }} + {{ template "header" . }} +

    + {{ template "sidebar" . }} +
    + {{ if eq (len .AnalysisResultData.IssuesOccurenceMap) 0 }} +
    No issues to show
    + {{ else }} {{ range $key, $value := .AnalysisResultData.IssuesOccurenceMap }} - {{ $categoryName := (index $categoryMap $value.IssueMeta.Category) }} - {{ if eq $selectedCategory $defaultIssueCategory }} - {{ $value.IssueMeta.Title }} {{ $key }} {{ len $value.Occurences }}
    - {{ $categoryName }}  {{ $value.FilesInfo }}
    - {{else }} {{ if eq $selectedCategory $value.IssueMeta.Category }} - {{ $value.IssueMeta.Title }} {{ $key }} {{ len $value.Occurences }}
    - {{ $categoryName }}  {{ $value.FilesInfo }}
    - {{ end}} - {{end}} + {{ if or (eq $selectedCategory $value.IssueMeta.Category) (eq $selectedCategory $defaultIssueCategory) }} + +
    +

    {{ $value.IssueMeta.Title }}

    +
    +
    + + + + {{ index $categoryMap $value.IssueMeta.Category }} +
    +
    + + + + {{ $value.FilesInfo }} +
    +
    +
    +
    {{ len $value.Occurences }}
    +
    + {{ end }} {{ end }} -

    -
    - -
    -

    - Metrics
    - {{ range $name, $metric := .AnalysisResultData.MetricsMap }} - {{ $name }}: {{ $metric }}
    + {{ end }} + +

    +
    + + diff --git a/command/analyzer/dryrun/render/views/links.html b/command/analyzer/dryrun/render/views/links.html new file mode 100644 index 000000000..0f0ed761d --- /dev/null +++ b/command/analyzer/dryrun/render/views/links.html @@ -0,0 +1,13 @@ +{{ define "links" }} + + + + + + + + +{{ end }} \ No newline at end of file diff --git a/command/analyzer/dryrun/render/views/nav.html b/command/analyzer/dryrun/render/views/nav.html new file mode 100644 index 000000000..4ac6a5f9c --- /dev/null +++ b/command/analyzer/dryrun/render/views/nav.html @@ -0,0 +1,57 @@ +{{ define "navbar" }} + +{{ end }} \ No newline at end of file diff --git a/command/analyzer/dryrun/render/views/occurence.html b/command/analyzer/dryrun/render/views/occurence.html index c937d6138..ba59709fd 100644 --- a/command/analyzer/dryrun/render/views/occurence.html +++ b/command/analyzer/dryrun/render/views/occurence.html @@ -1,111 +1,142 @@ - - - {{ .PageTitle }} - - - - -
    -
    - {{ .AnalyzerShortcode }}
    - {{ .AnalysisResultData.UniqueIssuesCount }} issues {{ .VCSInfo.Branch }} {{ .VCSInfo.CommitSHA }} {{ .VCSInfo.VersionDiff }} + + + {{ .PageTitle }} + {{ template "links" . }} + +{{ $issueData := (index .AnalysisResultData.IssuesOccurenceMap .SelectedIssueCode)}} + + {{ template "navbar" . }} {{ template "header" . }} +
    + {{ template "sidebar" . }} +
    +
    +
    +
    +
    +
    + + {{ $issueData.IssueMeta.Title }} + + {{ .SelectedIssueCode }} +
    - -
    -

    - All Issues  {{ .AnalysisResultData.TotalOccurences }}
    - {{ $categoryMap := .IssueCategoryNameMap}} - {{ range $key, $value := .AnalysisResultData.IssueCategoryCountMap }} - {{ $categoryShortCode := (index $categoryMap $key) }} -

  • {{ $key }}: {{ $value }}
  • - {{ end }} -

    - - -
    -

    Run Summary

    - {{ .Summary.TimeSinceRun }}
    - {{ .AnalysisResultData.SourcePath }}
    - {{ .Summary.RunDuration}} +
    +
    +
    + + + + + {{ $categoryMap := .IssueCategoryNameMap }} + {{ index $categoryMap $issueData.IssueMeta.Category }} + +
    +
    + + + + + {{ $issueData.FilesInfo }} + +
    +
    +
    +
    - -
    - - -
    -

    - All issues /{{ .SelectedIssueCode }}

    - {{ $issueData := (index .AnalysisResultData.IssuesOccurenceMap .SelectedIssueCode)}} - {{ $issueData.IssueMeta.Title}}
    - {{ $issueData.IssueMeta.Category }}
    - - {{ $src := .AnalysisResultData.RenderedSourceCode }} - {{ range $index, $occurence := $issueData.Occurences}} - {{ $occurence.IssueText }}
    - {{ $occurence.Location.Path }}
    - {{ index $src $index}} - {{ end }} -

    -
    - - -
    - Description -

    - {{ $issueData := (index .AnalysisResultData.IssuesOccurenceMap .SelectedIssueCode)}} - {{ $issueData.IssueMeta.Description}} -

    +
    +
    +
    + {{ $src := .AnalysisResultData.RenderedSourceCode }} + {{ range $index, $occurence := $issueData.Occurences}} +
    +
    +
    + {{ $occurence.IssueText }} +
    +
    + + + + + {{ $occurence.Location.Path }} + +
    +
    +
    +
    + {{ index $src $index}} +
    +
    +
    + {{ end }} +
    +
    +
    +
    + Description +
    +
    + {{ $issueData := (index .AnalysisResultData.IssuesOccurenceMap + .SelectedIssueCode)}} {{ $issueData.IssueMeta.HTMLDescription }} +
    +
    -
    - +
    +
    + diff --git a/command/analyzer/dryrun/render/views/package.json b/command/analyzer/dryrun/render/views/package.json new file mode 100644 index 000000000..5de32eaff --- /dev/null +++ b/command/analyzer/dryrun/render/views/package.json @@ -0,0 +1,14 @@ +{ + "name": "dry-run", + "version": "1.0.0", + "main": "index.js", + "author": "Shivam Mishra ", + "scripts": { + "dev": "npx tailwindcss -i ./assets/cli.css -o ./assets/deepsource-cli.css --watch" + }, + "license": "MIT", + "devDependencies": { + "@tailwindcss/typography": "^0.5.2", + "tailwindcss": "^3.1.4" + } +} diff --git a/command/analyzer/dryrun/render/views/sidebar.html b/command/analyzer/dryrun/render/views/sidebar.html new file mode 100644 index 000000000..62bb00b78 --- /dev/null +++ b/command/analyzer/dryrun/render/views/sidebar.html @@ -0,0 +1,95 @@ +{{ define "sidebar" }} +{{ $defaultIssueCategory := "all" }} +{{ $selectedCategory := .SelectedCategory }} + +{{ end }} \ No newline at end of file diff --git a/command/analyzer/dryrun/render/views/tailwind.config.js b/command/analyzer/dryrun/render/views/tailwind.config.js new file mode 100644 index 000000000..42dd85014 --- /dev/null +++ b/command/analyzer/dryrun/render/views/tailwind.config.js @@ -0,0 +1,157 @@ +const typographyConfig = require('./typography.js') + +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["*.{html,js}"], + theme: { + fontFamily: { + sans: [ + 'Inter', + 'ui-sans-serif', + 'system-ui', + '-apple-system', + 'BlinkMacSystemFont', + '"Segoe UI"', + 'Roboto', + '"Helvetica Neue"', + 'Arial', + '"Noto Sans"', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"' + ], + serif: ['Georgia', 'Cambria', '"Times New Roman"', 'Times', 'serif'], + mono: [ + 'ui-monospace', + 'Menlo', + 'Monaco', + 'Consolas', + '"Liberation Mono"', + '"Courier New"', + 'monospace' + ], + }, + colors: { + transparent: 'transparent', + current: 'currentColor', + black: '#000000', + slate: '#52575c', + github: '#414141', + gitlab: '#6753b5', + bitbucket: '#1e54c5', + lavender: '#7a97fa', + lilac: '#c97bd4', + 'sea-glass': '#49f9cf', + pink: '#f977ff', + 'light-juniper': '#2eb78b', // legacy + 'light-cherry': '#d6435b', // legacy + juniper: { + DEFAULT: '#33cb9a', + 600: '#2eb78b', + 500: '#33cb9a', + 400: '#53d4aa', + 300: '#74dcba', + 200: '#94e4ca', + 150: '#a5e8d2', + 100: '#b5ecda' + }, + robin: { + DEFAULT: '#4568dc', + 600: '#2449c1', + 500: '#4568dc', + 400: '#6784e2', + 200: '#acbcef', + 300: '#8aa0e9', + 150: '#bdcaf3', + 100: '#ced8f6' + }, + cherry: { + DEFAULT: '#da5565', + 600: '#d6435b', + 500: '#da5565', + 400: '#e17783', + 300: '#e998a2', + 200: '#f0bac0', + 150: '#f4cacf', + 100: '#f7dbde' + }, + honey: { + DEFAULT: '#f6d87c', + 600: '#f0bf28', + 500: '#f6d87c', + 400: '#f9e3a2', + 300: '#fbefc8', + 200: '#fefaef', + 150: '#ffffff', + 100: '#ffffff' + }, + aqua: { + DEFAULT: '#23c4f8', + 600: '#07aade', + 500: '#23c4f8', + 400: '#4bcff9', + 300: '#72d9fb', + 200: '#9ae4fc', + 150: '#ade9fc', + 100: '#c1eefd' + }, + ink: { + 50: '#303540', + 100: '#2a2e37', + 200: '#23262e', + 300: '#1a1d23', + 400: '#16181d' + }, + vanilla: { + 100: '#ffffff', + 200: '#f5f5f5', + 300: '#eeeeee', + 400: '#c0c1c3' + } + }, + extend: { + typography: (theme) => ({ + DEFAULT: { + css: { + ...typographyConfig.DEFAULT(theme) + } + }, + muted: { + css: { + ...typographyConfig.MUTED(theme) + } + }, + rte: { + css: { + ...typographyConfig.RTE(theme) + } + }, + sm: { + css: { + ...typographyConfig.SMALL_SCREEN_CSS(theme) + } + }, + lg: { + css: { + ...typographyConfig.LARGE_SCREEN_CSS(theme) + } + }, + xl: { + css: { + ...typographyConfig.LARGE_SCREEN_CSS(theme) + } + }, + '2xl': { + css: { + ...typographyConfig.LARGE_SCREEN_CSS(theme) + } + } + }) + } + }, + plugins: [ + require('@tailwindcss/typography') + ], +} \ No newline at end of file diff --git a/command/analyzer/dryrun/render/views/typography.js b/command/analyzer/dryrun/render/views/typography.js new file mode 100644 index 000000000..dc48cd8a5 --- /dev/null +++ b/command/analyzer/dryrun/render/views/typography.js @@ -0,0 +1,288 @@ +const BEFORE_LIST_ITEM = function (theme, muted = false) { + return { + content: '"—"', + marginRight: theme('spacing.2'), + width: '0', + top: '0', + left: '0', + height: '0', + position: 'absolute', + color: muted ? theme('colors.vanilla.400') : theme('colors.juniper') + } +} + +const DEFAULT = function (theme) { + return { + color: theme('colors.vanilla.100'), + '[class~="lead"]': { + color: theme('colors.vanilla.400') + }, + a: { + color: theme('colors.juniper.DEFAULT'), + textDecoration: 'normal', + fontWeight: theme('fontWeight.medium') + }, + 'a:hover': { + textDecoration: 'underline' + }, + strong: { + color: theme('colors.vanilla.100'), + fontWeight: theme('fontWeight.semibold') + }, + 'ol > li': { + position: 'relative' + }, + 'ol > li::before': { + content: 'counter(list-item) "."', + position: 'absolute', + fontWeight: theme('fontWeight.normal'), + color: theme('colors.vanilla.400') + }, + ul: { + listStyleType: 'none', + listStyle: 'none' + }, + 'ul > li': { + position: 'relative' + }, + 'ul > li::before': { + ...BEFORE_LIST_ITEM(theme) + }, + hr: { + borderColor: theme('colors.ink.100'), + borderTopWidth: 1 + }, + blockquote: { + fontWeight: theme('fontWeight.medium'), + lineHeight: theme('lineHeight.normal'), + fontSize: theme('fontSize.lg'), + fontStyle: 'normal', + color: 'inherit', + borderLeftWidth: '0.25rem', + borderLeftColor: theme('colors.juniper'), + quotes: '"\\201C""\\201D""\\2018""\\2019"' + }, + 'blockquote p:first-of-type::before': { + content: 'open-quote' + }, + 'blockquote p:last-of-type::after': { + content: 'close-quote' + }, + 'h1, h2, h3, h4, h5': { + color: theme('colors.vanilla.100') + }, + h1: { + fontWeight: theme('fontWeight.bold') + }, + h2: { + fontWeight: theme('fontWeight.semibold') + }, + 'h3, h4, h5': { + fontWeight: theme('fontWeight.medium') + }, + 'figure figcaption': { + color: theme('colors.vanilla.400'), + textAlign: 'center', + [`@media (min-width: ${theme('screens.sm')})`]: { + textAlign: 'left' + } + }, + 'figure img': { + borderRadius: `${theme('spacing.1')}` + }, + code: { + color: theme('colors.vanilla.300'), + fontWeight: theme('fontWeight.semibold') + }, + 'code::before, code::after': { + content: '""' + }, + 'a code': { + color: theme('colors.juniper.DEFAULT') + }, + pre: { + color: theme('colors.vanilla.400'), + backgroundColor: theme('colors.ink.200'), + overflowX: 'auto', + borderRadius: `${theme('spacing.1')}` + }, + 'pre code': { + backgroundColor: 'transparent', + borderWidth: '0', + borderRadius: '0', + padding: '0', + fontWeight: theme('fontWeight.normal'), + color: 'inherit', + fontSize: 'inherit', + fontFamily: 'inherit', + lineHeight: 'inherit' + }, + 'pre code::before, pre code::after': { + content: '""' + }, + table: { + width: '100%', + tableLayout: 'auto', + textAlign: 'left' + }, + thead: { + color: theme('colors.vanilla.400') + }, + 'thead th': { + fontWeight: theme('fontWeight.medium'), + verticalAlign: 'bottom' + }, + 'thead, tbody tr': { + borderBottomWidth: theme('spacing.px'), + borderBottomColor: theme('colors.ink.100') + }, + 'tbody tr:last-child': { + borderBottomWidth: '0' + }, + 'tbody td': { + verticalAlign: 'top' + } + } +} + +const SMALL_SCREEN_CSS = function (theme) { + return { + 'ul > li::before': { + ...BEFORE_LIST_ITEM(theme) + }, + pre: { + color: theme('colors.vanilla.400'), + backgroundColor: theme('colors.ink.200'), + overflowX: 'auto', + borderRadius: '0' + } + } +} + +const LARGE_SCREEN_CSS = function (theme) { + return { + 'ul > li::before': { + ...BEFORE_LIST_ITEM(theme) + }, + 'figure img': { + borderRadius: `${theme('spacing.1')}` + } + } +} + +const MUTED = function (theme) { + return { + 'ul > li::before': { + ...BEFORE_LIST_ITEM(theme, true) + }, + a: { + color: theme('colors.vanilla.400'), + textDecoration: 'normal', + fontWeight: theme('fontWeight.medium') + } + } +} + +const RTE = function (theme) { + return { + p: { + fontSize: theme('fontSize.sm'), + lineHeight: theme('lineHeight.relaxed'), + marginBottom: 0, + marginTop: 0 + }, + '*:not(p)': { + marginBottom: 0, + marginTop: 0 + }, + '*:not(p) + *:not(p), *:not(p) + p': { + marginBottom: '10px', + marginTop: '8px' + }, + 'p + p': { + marginBottom: '10px', + marginTop: '10px' + }, + 'li + li': { + marginBottom: 0, + marginTop: 0 + }, + h1: { + fontSize: theme('fontSize.xl'), + fontWeight: theme('fontWeight.medium'), + lineHeight: theme('lineHeight["9"]') + }, + h2: { + fontSize: theme('fontSize.lg'), + fontWeight: theme('fontWeight.medium'), + lineHeight: theme('lineHeight["7"]') + }, + 'h1::before, h2::before, h3::before, h4::before, h5::before': { + content: '""', + marginRight: theme('spacing.0') + }, + code: { + backgroundColor: theme('colors.ink.200'), + fontSize: theme('fontSize.sm'), + padding: theme('padding["1"]'), + borderRadius: theme('borderRadius.md'), + fontWeight: theme('fontWeight.normal') + }, + 'code::before, code::after': { + content: '""' + }, + a: { + fontWeight: theme('fontWeight.normal'), + color: theme('colors.juniper.DEFAULT') + }, + blockquote: { + fontWeight: theme('fontWeight.normal'), + borderLeftColor: theme('colors.vanilla.400'), + paddingLeft: theme('padding["2"]') + }, + 'blockquote p:first-of-type::before, blockquote p:last-of-type::after': { + content: 'none' + }, + 'ol > li > :last-child, ul > li > :last-child': { + marginBottom: 0 + }, + 'ol > li > :first-child, ul > li > :first-child': { + marginTop: 0 + }, + 'ol > li::before': { + color: 'inherit', + marginTop: theme('margin["-px"]'), + fontSize: theme('fontSize.sm') + }, + 'ol > li': { + paddingLeft: theme('padding["6"]') + }, + 'ul > li::before': { + color: 'inherit', + content: 'none' + }, + 'ul > li': { + paddingLeft: 0 + }, + 'ul > li > p': { + paddingLeft: theme('padding["2"]'), + margin: 0 + }, + ul: { + listStyleType: 'disc', + paddingLeft: theme('padding["4"]') + }, + 'ul ul, ul ol, ol ul, ol ol': { + margin: 0 + } + } +} + +module.exports = { + BEFORE_LIST_ITEM, + DEFAULT, + SMALL_SCREEN_CSS, + LARGE_SCREEN_CSS, + MUTED, + RTE +} diff --git a/command/analyzer/dryrun/render/views/yarn.lock b/command/analyzer/dryrun/render/views/yarn.lock new file mode 100644 index 000000000..03a03bfc8 --- /dev/null +++ b/command/analyzer/dryrun/render/views/yarn.lock @@ -0,0 +1,449 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@tailwindcss/typography@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.2.tgz#24b069dab24d7a2467d01aca0dd432cb4b29f0ee" + integrity sha512-coq8DBABRPFcVhVIk6IbKyyHUt7YTEC/C992tatFB+yEx5WGBQrCgsSFjxHUr8AWXphWckadVJbominEduYBqw== + dependencies: + lodash.castarray "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +color-name@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + +detective@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +fast-glob@^3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +lilconfig@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== + +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-nested@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.6: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.4.14: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resolve@^1.1.7, resolve@^1.22.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.1.4.tgz#64b09059805505902139fa805d97046080bd90b9" + integrity sha512-NrxbFV4tYsga/hpWbRyUfIaBrNMXDxx5BsHgBS4v5tlyjf+sDsgBg5m9OxjrXIqAS/uR9kicxLKP+bEHI7BSeQ== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.1" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.11" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.14" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== diff --git a/go.mod b/go.mod index 88bfbcaa3..fc5acbe1d 100644 --- a/go.mod +++ b/go.mod @@ -74,6 +74,7 @@ require ( github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b github.com/labstack/echo/v4 v4.7.2 github.com/morikuni/aec v1.0.0 + github.com/yuin/goldmark v1.4.12 ) require ( diff --git a/go.sum b/go.sum index 493be98ce..0473716ba 100644 --- a/go.sum +++ b/go.sum @@ -925,6 +925,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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.12 h1:6hffw6vALvEDqJ19dOJvJKOoAOKe4NDaTqvd2sktGN0= +github.com/yuin/goldmark v1.4.12/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 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= diff --git a/types/analyzer.go b/types/analyzer.go index 69dd66256..d63eb603c 100644 --- a/types/analyzer.go +++ b/types/analyzer.go @@ -4,6 +4,8 @@ * ============================================================= */ package types +import "html/template" + /* ==================== * Analyzer TOML Types * ==================== */ @@ -57,8 +59,9 @@ type AnalyzerTOML struct { // Analyzer issue type. type AnalyzerIssue struct { - Shortcode string `validate:"omitempty"` - Title string `toml:"title" json:"title" validate:"required"` - Description string `toml:"description" json:"description" validate:"required"` - Category string `toml:"category" json:"category" validate:"required,category"` + Shortcode string `validate:"omitempty"` + Title string `toml:"title" json:"title" validate:"required"` + Description string `toml:"description" json:"description" validate:"required"` + HTMLDescription template.HTML + Category string `toml:"category" json:"category" validate:"required,category"` } From decd62c8833f8ba407dfdd7b865e00eb9be532d2 Mon Sep 17 00:00:00 2001 From: Aadhav Vignesh <53528139+burntcarrot@users.noreply.github.com> Date: Tue, 5 Jul 2022 18:25:31 +0530 Subject: [PATCH 15/28] feat(backend/docker): add --image flag for running analyzers (#161) --- analyzers/backend/docker/build.go | 15 ++++-- analyzers/backend/docker/pull.go | 21 ++++++++ analyzers/backend/docker/utils.go | 34 +++++++++++++ command/analyzer/dryrun/run.go | 80 ++++++++++++++++++++++++------- command/analyzer/dryrun/utils.go | 11 +++++ command/analyzer/verify/build.go | 6 +++ utils/spinner.go | 3 +- 7 files changed, 147 insertions(+), 23 deletions(-) create mode 100644 analyzers/backend/docker/pull.go diff --git a/analyzers/backend/docker/build.go b/analyzers/backend/docker/build.go index 9b856eab1..fb975c785 100644 --- a/analyzers/backend/docker/build.go +++ b/analyzers/backend/docker/build.go @@ -38,16 +38,21 @@ func (d *DockerBuildError) Error() string { return d.Message } -// BuildAnalyzerDockerImage is the docker image build API used by various CLI commands -func (d *DockerClient) BuildAnalyzerDockerImage() (context.CancelFunc, io.ReadCloser, *DockerBuildError) { +// SetupClient initializes the Docker client with opts. +func (d *DockerClient) SetupClient() error { var err error d.Client, err = client.NewClientWithOpts(client.FromEnv) if err != nil { - return nil, nil, &DockerBuildError{ - Message: err.Error(), - } + return err } + return nil +} + +// BuildAnalyzerDockerImage is the docker image build API used by various CLI commands +func (d *DockerClient) BuildAnalyzerDockerImage() (context.CancelFunc, io.ReadCloser, *DockerBuildError) { + var err error + cancelFunc, responseReader, err := d.executeImageBuild() if err != nil { return cancelFunc, nil, &DockerBuildError{ diff --git a/analyzers/backend/docker/pull.go b/analyzers/backend/docker/pull.go new file mode 100644 index 000000000..75fc3610e --- /dev/null +++ b/analyzers/backend/docker/pull.go @@ -0,0 +1,21 @@ +package docker + +import ( + "context" + "io" + + "github.com/docker/docker/api/types" +) + +// PullImage pulls an image from a registry. +func (d *DockerClient) PullImage(imageName string) (context.CancelFunc, io.ReadCloser, error) { + ctx, ctxCancelFunc := context.WithTimeout(context.Background(), buildTimeout) + + reader, err := d.Client.ImagePull(ctx, imageName, types.ImagePullOptions{}) + if err != nil { + ctxCancelFunc() + return ctxCancelFunc, nil, err + } + + return ctxCancelFunc, reader, nil +} diff --git a/analyzers/backend/docker/utils.go b/analyzers/backend/docker/utils.go index 712607331..df0a6608d 100644 --- a/analyzers/backend/docker/utils.go +++ b/analyzers/backend/docker/utils.go @@ -22,6 +22,12 @@ type DockerBuildResponse struct { Stream string `json:"stream"` } +type DockerPullResponse struct { + Status string `json:"status"` + Progress string `json:"progress"` + ID string `json:"id"` +} + /* Checks the docker build response and prints all the logs if `showAllLogs` is true * Used in `deepsource analyzer run` and `deepsource analyzer verify` commands */ func CheckBuildResponse(rd io.Reader, showAllLogs bool) error { // skipcq: RVV-A0005 @@ -54,3 +60,31 @@ func CheckBuildResponse(rd io.Reader, showAllLogs bool) error { // skipcq: RVV-A } return scanner.Err() } + +/* Checks the docker pull response and prints all the logs if `showAllLogs` is true + * Used in `deepsource analyzer dry-run` command. */ +func CheckPullResponse(rd io.Reader, showAllLogs bool) error { // skipcq: RVV-A0005 + var lastLine []byte + count := 0 + + scanner := bufio.NewScanner(rd) + for scanner.Scan() { + lastLine = scanner.Bytes() + d := &DockerPullResponse{} + err := json.Unmarshal(lastLine, d) + if err != nil { + return err + } + if showAllLogs { + fmt.Printf("%s %s\n", d.Status, d.Progress) + } + count++ + } + + errLine := &ErrorLine{} + json.Unmarshal([]byte(lastLine), errLine) + if errLine.Error != "" { + return errors.New(errLine.Error) + } + return scanner.Err() +} diff --git a/command/analyzer/dryrun/run.go b/command/analyzer/dryrun/run.go index 008420355..eaee7af13 100644 --- a/command/analyzer/dryrun/run.go +++ b/command/analyzer/dryrun/run.go @@ -32,6 +32,7 @@ var ( // The params required while running the Analysis locally. type AnalyzerDryRun struct { Client *docker.DockerClient // The client to be used for all docker related ops. + DockerImageName string // The docker image supplied by the user that needs to be pulled and run. DockerImagePlatform string // The platform for which the Docker image is to be built. RemoteSource bool // True if the source to be analyzed is a remote VCS repository. SourcePath string // The path of the directory of source code to be analyzed. @@ -73,6 +74,9 @@ func NewCmdAnalyzerRun() *cobra.Command { // --output-file/ -o flag. cmd.Flags().StringVarP(&opts.TempToolBoxDirectory, "output-file", "o", "", "The path of analysis results") + // --image flag. + cmd.Flags().StringVar(&opts.DockerImageName, "image", "", "The Analyzer docker image to build and run") + // --platform flag; used for explicitly setting up the build platform for the Docker image. Defaults to linux/ if not provided. defaultPlatform := fmt.Sprintf("linux/%s", runtime.GOARCH) cmd.Flags().StringVar(&opts.DockerImagePlatform, "platform", defaultPlatform, "Explicitly set build platform for Docker image.") @@ -87,26 +91,68 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { return err } - // Building the Analyzer image. - a.Spinner.StartSpinnerWithLabel("Building Analyzer image...", "Built Analyzer image") - ctxCancelFunc, buildRespReader, buildError := a.Client.BuildAnalyzerDockerImage() - - // Cancel the build context and close the reader before exiting this function. - if buildRespReader != nil { - defer buildRespReader.Close() - } - defer ctxCancelFunc() - if buildError != nil { - a.Spinner.StopSpinnerWithError("Failed to build the Analyzer image", err) - return buildError + err = a.Client.SetupClient() + if err != nil { + return err } - // Check the docker build response. - if err = docker.CheckBuildResponse(buildRespReader, false); err != nil { - a.Spinner.StopSpinnerWithError("Failed to build the Analyzer image", err) - return err + if a.DockerImageName != "" { + a.Spinner.StartSpinnerWithLabel(fmt.Sprintf("Pulling Analyzer image (%s)...", a.DockerImageName), fmt.Sprintf("Pulled Analyzer image (%s)", a.DockerImageName)) + + // Pull image from registry. + ctxCancelFunc, pullRespReader, pullErr := a.Client.PullImage(a.DockerImageName) + + // Cancel context and close the reader before exiting. + if pullRespReader != nil { + defer pullRespReader.Close() + } + if ctxCancelFunc != nil { + defer ctxCancelFunc() + } + + if pullErr != nil { + a.Spinner.StopSpinnerWithError("Failed to pull the Analyzer image", pullErr) + return pullErr + } + + // Check the docker pull response. + if err = docker.CheckPullResponse(pullRespReader, false); err != nil { + a.Spinner.StopSpinnerWithError("Failed to pull the Analyzer image", err) + return err + } + + // Setup image name and image tag. The image name and image tag are used while building the container. + a.Client.ImageName, a.Client.ImageTag = a.parseImageName() + + // Notify the user that we use the latest tag. + // TODO: Setting the suffix doesn't work. + if a.Client.ImageTag == "latest" { + a.Spinner.SetSuffix("(no image tag found, using latest)") + } + + a.Spinner.StopSpinner() + } else { + // Building the Analyzer image. + a.Spinner.StartSpinnerWithLabel("Building Analyzer image...", "Built Analyzer image") + ctxCancelFunc, buildRespReader, buildError := a.Client.BuildAnalyzerDockerImage() + + // Cancel the build context and close the reader before exiting this function. + if buildRespReader != nil { + defer buildRespReader.Close() + } + defer ctxCancelFunc() + if buildError != nil { + a.Spinner.StopSpinnerWithError("Failed to build the Analyzer image", err) + return buildError + } + + // Check the docker build response. + if err = docker.CheckBuildResponse(buildRespReader, false); err != nil { + a.Spinner.StopSpinnerWithError("Failed to build the Analyzer image", err) + return err + } + a.Spinner.StopSpinner() } - a.Spinner.StopSpinner() // Create temporary toolbox directory to store analysis config and later analyis results. // If already passed through --output-file flag, use that one. diff --git a/command/analyzer/dryrun/utils.go b/command/analyzer/dryrun/utils.go index 6c6d900de..21cbe6f88 100644 --- a/command/analyzer/dryrun/utils.go +++ b/command/analyzer/dryrun/utils.go @@ -83,3 +83,14 @@ func (a *AnalyzerDryRun) createTemporaryToolBoxDir() (err error) { a.Client.AnalysisOpts.AnalysisResultsPath = a.TempToolBoxDirectory return nil } + +// parseImageName returns the image name and the image tag from the complete image name. +func (a *AnalyzerDryRun) parseImageName() (string, string) { + components := strings.Split(a.DockerImageName, ":") + + if len(components) > 1 { + return components[0], components[1] + } else { + return components[0], "latest" + } +} diff --git a/command/analyzer/verify/build.go b/command/analyzer/verify/build.go index dd571bde6..b33c8f2a6 100644 --- a/command/analyzer/verify/build.go +++ b/command/analyzer/verify/build.go @@ -53,6 +53,12 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzerDockerBuild() (err error) { ShowLogs: a.Build.VerboseMode, } + // Setup client for the builder. + err = analyzerBuilder.SetupClient() + if err != nil { + return err + } + // Build the docker image :rocket: ctxCancelFunc, buildRespReader, buildErr := analyzerBuilder.BuildAnalyzerDockerImage() diff --git a/utils/spinner.go b/utils/spinner.go index 1fcabb587..45d37834a 100644 --- a/utils/spinner.go +++ b/utils/spinner.go @@ -25,6 +25,7 @@ func (s *SpinnerUtils) StartSpinnerWithLabel(label, finalMessage string) { spinner.WithWriter(os.Stdout), spinner.WithWriter(os.Stderr), ) // Build our new spinner + if label != "" { sp.Suffix = " " + label + " " } @@ -47,7 +48,7 @@ func (s *SpinnerUtils) StopSpinner() { s.Spinner = nil } -// Stops the spinner +// Sets a suffix to the spinner. func (s *SpinnerUtils) SetSuffix(suffix string) { s.mu.Lock() defer s.mu.Unlock() From b62e522c6ad393f91a724083737ce92a8cad5005 Mon Sep 17 00:00:00 2001 From: Siddhant N Trivedi <68370997+siddhant-deepsource@users.noreply.github.com> Date: Thu, 7 Jul 2022 03:29:13 +0530 Subject: [PATCH 16/28] feat: `analyzer push` command (#157) * chore: init analyzer push command Signed-off-by: Siddhant N Trivedi * chore: fix merge conflicts Signed-off-by: Siddhant N Trivedi * chore: fix test failure Signed-off-by: Siddhant N Trivedi --- .github/workflows/CI.yml | 13 +- .gitignore | 2 +- Makefile | 5 + analyzers/backend/docker/push.go | 40 +++ command/analyzer/analyzer.go | 2 + command/analyzer/dryrun/run.go | 1 - command/analyzer/push/push.go | 198 +++++++++++++ command/analyzer/push/push_test.go | 153 ++++++++++ command/analyzer/push/sync.go | 34 +++ command/analyzer/push/utils.go | 77 +++++ command/analyzer/push/utils_test.go | 34 +++ command/analyzer/verify/build.go | 4 +- config/config.go | 14 +- config/config_test.go | 1 + .../analyzers/mutations/sync_analyzer.go | 66 +++++ deepsource/analyzers/sync.go | 10 + deepsource/client.go | 66 ++++- go.mod | 131 ++++----- go.sum | 263 +++++++----------- types/analyzer.go | 23 +- utils/prompt.go | 2 + 21 files changed, 867 insertions(+), 272 deletions(-) create mode 100644 analyzers/backend/docker/push.go create mode 100644 command/analyzer/push/push.go create mode 100644 command/analyzer/push/push_test.go create mode 100644 command/analyzer/push/sync.go create mode 100644 command/analyzer/push/utils.go create mode 100644 command/analyzer/push/utils_test.go create mode 100644 deepsource/analyzers/mutations/sync_analyzer.go create mode 100644 deepsource/analyzers/sync.go diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b141d90bd..915629dcd 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -13,17 +13,18 @@ jobs: runs-on: ubuntu-latest steps: - - name: Set up Go 1.x - uses: actions/setup-go@v2 - with: - go-version: ^1.18 - - name: Check out code into the Go module directory - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 1 ref: ${{ github.event.pull_request.head.sha }} + - name: Set up Go 1.x + uses: actions/setup-go@v3 + with: + go-version: ^1.18 + + - name: Build the binary run: make build diff --git a/.gitignore b/.gitignore index 87e720c08..974c1fb11 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ coverage.out cover.out # node -node_modules \ No newline at end of file +node_modules diff --git a/Makefile b/Makefile index 63ebb5b57..b6c061897 100644 --- a/Makefile +++ b/Makefile @@ -20,3 +20,8 @@ test_setup: git clone https://github.com/deepsourcelabs/cli ${CODE_PATH} chmod +x /tmp/deepsource cp ./command/report/tests/dummy/python_coverage.xml /tmp + # Setup git user and email on CI. + ifeq ($(CI),true) + git config --global user.name github-actions + git config --global user.email github-actions@github.com + endif diff --git a/analyzers/backend/docker/push.go b/analyzers/backend/docker/push.go new file mode 100644 index 000000000..0d720689c --- /dev/null +++ b/analyzers/backend/docker/push.go @@ -0,0 +1,40 @@ +package docker + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "time" + + "github.com/docker/docker/api/types" +) + +const imagePushTimeout = 10 * time.Minute + +// PushImageToRegistry pushes the Analyzer image to the docker registry post authenticating using the +// credentials passed as arguments. +func (d *DockerClient) PushImageToRegistry(user, token string) (context.CancelFunc, io.ReadCloser, error) { + ctx, ctxCancelFunc := context.WithTimeout(context.Background(), imagePushTimeout) + authConfig := types.AuthConfig{ + Username: user, + Password: token, + } + + // Encode the authentication config as a JSON. + encodedJSON, err := json.Marshal(authConfig) + if err != nil { + return ctxCancelFunc, nil, err + } + // Encode the config to base64. + authStr := base64.URLEncoding.EncodeToString(encodedJSON) + + // Push the image. + imagePushRespReader, err := d.Client.ImagePush(ctx, fmt.Sprintf("%s:%s", d.ImageName, d.ImageTag), types.ImagePushOptions{RegistryAuth: authStr}) + if err != nil { + return ctxCancelFunc, nil, err + } + + return ctxCancelFunc, imagePushRespReader, nil +} diff --git a/command/analyzer/analyzer.go b/command/analyzer/analyzer.go index 24a46d3c6..b5d9dd8f8 100644 --- a/command/analyzer/analyzer.go +++ b/command/analyzer/analyzer.go @@ -5,6 +5,7 @@ import ( dryrun "github.com/deepsourcelabs/cli/command/analyzer/dryrun" initialize "github.com/deepsourcelabs/cli/command/analyzer/initialize" + push "github.com/deepsourcelabs/cli/command/analyzer/push" verify "github.com/deepsourcelabs/cli/command/analyzer/verify" ) @@ -20,5 +21,6 @@ func NewCmdAnalyzer() *cobra.Command { cmd.AddCommand(dryrun.NewCmdAnalyzerRun()) cmd.AddCommand(verify.NewCmdAnalyzerVerify()) cmd.AddCommand(initialize.NewCmdAnalyzerInit()) + cmd.AddCommand(push.NewCmdAnalyzerPush()) return cmd } diff --git a/command/analyzer/dryrun/run.go b/command/analyzer/dryrun/run.go index eaee7af13..83a8a0ab3 100644 --- a/command/analyzer/dryrun/run.go +++ b/command/analyzer/dryrun/run.go @@ -129,7 +129,6 @@ func (a *AnalyzerDryRun) AnalyzerRun() (err error) { if a.Client.ImageTag == "latest" { a.Spinner.SetSuffix("(no image tag found, using latest)") } - a.Spinner.StopSpinner() } else { // Building the Analyzer image. diff --git a/command/analyzer/push/push.go b/command/analyzer/push/push.go new file mode 100644 index 000000000..6c95a1983 --- /dev/null +++ b/command/analyzer/push/push.go @@ -0,0 +1,198 @@ +package push + +import ( + "fmt" + "strings" + + "github.com/deepsourcelabs/cli/analyzers/backend/docker" + "github.com/deepsourcelabs/cli/command/analyzer/verify" + "github.com/deepsourcelabs/cli/config" + "github.com/deepsourcelabs/cli/types" + "github.com/deepsourcelabs/cli/utils" + "github.com/pterm/pterm" + "github.com/spf13/cobra" +) + +var ( + defaultRegistryURL string = "registry.deepsource.io" + analyzerImagePlatform string = "linux/amd64" +) + +type AnalyzerPushOpts struct { + RegistryURL string + AnalyzerTOMLData types.AnalyzerTOML + IssuesData *[]types.AnalyzerIssue + DockerClient *docker.DockerClient + Spinner *utils.SpinnerUtils // The spinner command line utility. + cliConfig *config.CLIConfig +} + +/* ============================================================= + * $ deepsource analyzer push + * + * Pushes the Analyzer image and configuration to DeepSource. + * ============================================================== */ +func NewCmdAnalyzerPush() *cobra.Command { + cmd := &cobra.Command{ + Use: "push", + Short: "Push the Analyzer image and configuration to DeepSource", + Args: utils.MaxNArgs(1), + PreRunE: verify.NewCmdAnalyzerVerify().RunE, + RunE: func(_ *cobra.Command, _ []string) error { + // Initialize the push utilities. + a := AnalyzerPushOpts{ + Spinner: &utils.SpinnerUtils{}, + } + + if err := a.pushAndSyncAnalyzer(); err != nil { + return fmt.Errorf("Failed to push the Analyzer changes to DeepSource.") + } + pterm.Success.Println("Analyzer push successful.") + return nil + }, + } + return cmd +} + +func (a *AnalyzerPushOpts) pushAndSyncAnalyzer() (err error) { + if err = a.checkAuthentication(); err != nil { + return err + } + if err = a.pushAnalyzer(); err != nil { + return err + } + if err = a.syncAnalyzerData(); err != nil { + return err + } + return nil +} + +func (a *AnalyzerPushOpts) checkAuthentication() (err error) { + // Get the DeepSource CLI config contents. + a.Spinner.StartSpinnerWithLabel("Verifying CLI authentication...", "Verified CLI authentication") + a.cliConfig, err = config.GetConfig() + if err != nil { + a.Spinner.StopSpinnerWithError("Failed to read the CLI authentication config", err) + return fmt.Errorf("error while reading DeepSource CLI config : %v", err) + } + + // Verify the DeepSource CLI authentication of the user. + if err = a.cliConfig.VerifyAuthentication(); err != nil { + a.Spinner.StopSpinnerWithError("Failed to verify authentication status", err) + return err + } + a.Spinner.StopSpinner() + return nil +} + +// pushAnalyzer contains the pipeline to build the Analyzer image and then push it to +// the registry post authentication. +func (a *AnalyzerPushOpts) pushAnalyzer() (err error) { + // Fetch docker registry URL and the data required to build the Analyzer image. + a.Spinner.StartSpinnerWithLabel("Fetching Analyzer registry URL and image data...", "Fetched the Analyzer registry URL and image data") + a.RegistryURL = getImageRegistryURL() + if a.AnalyzerTOMLData, a.AnalyzerTOMLData.AnalyzerVersion, err = getAnalyzerData(); err != nil { + a.Spinner.StopSpinnerWithError("Failed to fetch the image data", err) + return err + } + a.Spinner.StopSpinner() + + // Build the Analyzer image using the received version. + analyzerImageName := fmt.Sprintf("%s/%s:%s", a.RegistryURL, strings.TrimPrefix(a.AnalyzerTOMLData.Shortcode, "@"), a.AnalyzerTOMLData.AnalyzerVersion) + a.Spinner.StartSpinnerWithLabel(fmt.Sprintf("Building the Analyzer image with the name %s", analyzerImageName), "Built the Analyzer image") + if err = a.buildAnalyzerImage(a.AnalyzerTOMLData.AnalyzerVersion, &a.AnalyzerTOMLData); err != nil { + a.Spinner.StopSpinnerWithError("Failed to build the image", err) + return err + } + a.Spinner.StopSpinner() + + // Push the Analyzer image to the registry. + a.Spinner.StartSpinnerWithLabel(fmt.Sprintf("Pushing the Analyzer image to DeepSource with the name %s", analyzerImageName), "Pushed the Analyzer image to DeepSource") + if err = a.pushAnalyzerImage(a.cliConfig.User, a.cliConfig.Token); err != nil { + a.Spinner.StopSpinnerWithError("Failed to push the image to DeepSource", err) + return err + } + a.Spinner.StopSpinner() + return nil +} + +func (a *AnalyzerPushOpts) syncAnalyzerData() (err error) { + // Run the data sync mutation. + a.Spinner.StartSpinnerWithLabel(fmt.Sprintf("Syncing the latest changes in %s:%s", a.AnalyzerTOMLData.Shortcode, a.AnalyzerTOMLData.AnalyzerVersion), "Synced the latest changes") + syncSuccessful, syncWarnings, err := a.syncAnalyzer(a.cliConfig.Host, a.cliConfig.Token) + if err != nil { + a.Spinner.StopSpinnerWithError("Failed to sync the Analyzer", err) + return err + } + + // Check if the Analyzer sync passed or failed. + if !syncSuccessful { + a.Spinner.StopSpinnerWithError("Failed to sync the Analyzer", err) + } else { + a.Spinner.StopSpinner() + } + + // Check if there are any warnings in the response and handle print them accordingly. + if len(syncWarnings) != 0 { + for _, warning := range syncWarnings { + warningMessage := utils.GetBulletMessage(warning, "yellow") + fmt.Printf(" %s\n", warningMessage) + } + } + return nil +} + +// buildAnalyzerImage builds the Analyzer image and tags it with the latest git tag or commit (if tag not found). +func (a *AnalyzerPushOpts) buildAnalyzerImage(analyzerVersion string, analyzerTOMLData *types.AnalyzerTOML) error { + // Fetch the details of the dockerfile to build and also the name of the docker image + dockerFilePath, dockerImageName := docker.GetDockerImageDetails(analyzerTOMLData) + + // Initialize the builder with the above fetched details + a.DockerClient = &docker.DockerClient{ + ImageName: fmt.Sprintf("%s/%s", a.RegistryURL, dockerImageName), + DockerfilePath: dockerFilePath, + ImageTag: analyzerVersion, + ImagePlatform: analyzerImagePlatform, + } + + err := a.DockerClient.SetupClient() + if err != nil { + return err + } + + // Build the Analyzer docker image. + ctxCancelFunc, buildRespReader, buildErr := a.DockerClient.BuildAnalyzerDockerImage() + + // Cancel the build context and close the reader before exiting this function. + if buildRespReader != nil { + defer buildRespReader.Close() + } + if ctxCancelFunc != nil { + defer ctxCancelFunc() + } + if buildErr != nil { + return buildErr + } + + // Read the docker build response. + // Passing `verboseMode` as false since its not required as of now in the `push` command. + return docker.CheckBuildResponse(buildRespReader, false) +} + +// pushAnalyzerImage pushes the Analyzer image to the registry. +func (a *AnalyzerPushOpts) pushAnalyzerImage(user, token string) error { + ctxCancelFunc, pushResponseReader, pushErr := a.DockerClient.PushImageToRegistry(user, token) + if pushResponseReader != nil { + defer pushResponseReader.Close() + } + if ctxCancelFunc != nil { + defer ctxCancelFunc() + } + if pushErr != nil { + return pushErr + } + + // Read the docker push response. + // Passing `verboseMode` as false since its not required as of now in the `push` command. + return docker.CheckBuildResponse(pushResponseReader, false) +} diff --git a/command/analyzer/push/push_test.go b/command/analyzer/push/push_test.go new file mode 100644 index 000000000..a2c8f7937 --- /dev/null +++ b/command/analyzer/push/push_test.go @@ -0,0 +1,153 @@ +package push + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "path/filepath" + "testing" + "time" + + "github.com/deepsourcelabs/cli/analyzers/backend/docker" + "github.com/deepsourcelabs/cli/analyzers/config" + cliConfig "github.com/deepsourcelabs/cli/config" + "github.com/deepsourcelabs/cli/types" + "github.com/deepsourcelabs/cli/utils" +) + +func TestPushAnalyzer(t *testing.T) { + /* ---------------------------------------------------------------------------- + // 1. Run the registry locally. + /* ---------------------------------------------------------------------------- */ + appPath := os.Getenv("APP_PATH") + if appPath == "" { + appPath = "/app/" + } + + // Set REGISTRY_URL as localhost:5000 otherwise it will use the default value which is registry.deepsource.io. + os.Setenv("REGISTRY_URL", "localhost:5000") + + /* ---------------------------------------------------------------------------- + // Setup the local docker registry for testing at localhost:5000. + /* ---------------------------------------------------------------------------- */ + if err := runCmd("docker", appPath, "run", "-d", "-p", "5000:5000", "--restart=always", "--name", "registry", "registry:2"); err != nil { + t.Error(err) + } + + /* ---------------------------------------------------------------------------- + // Copying the todo-checker directory to $APP_PATH for the integration tests + /* ---------------------------------------------------------------------------- */ + analyzerPath, _ := filepath.Abs("../dryrun/test/todo-checker") + + // Copy all the files to APP_PATH + if err := runCmd("cp", appPath, "-a", "-f", analyzerPath+"/.", "."); err != nil { + t.Error(err) + } + + /* ---------------------------------------------------------------------------- + // Initialize appPath as git repo and add a commit to it + /* ---------------------------------------------------------------------------- */ + + if err := runCmd("git", appPath, "init"); err != nil { + t.Error(err) + } + + if err := runCmd("git", appPath, "add", "."); err != nil { + t.Error(err) + } + + if err := runCmd("git", appPath, "commit", "--no-gpg-sign", "-m", "hello"); err != nil { + t.Error(err) + } + /* ------------------------------------------------------------------------------------- + // Fetch the analyzer.toml data and the issue descriptions of the todo-checker Analyzer + /* ------------------------------------------------------------------------------------- */ + os.Chdir(appPath) + analyzerTOMLData, err := config.GetAnalyzerTOML() + if err != nil { + t.Error(err) + } + + issuesData, err := config.GetIssueDescriptions() + if err != nil { + t.Error(err) + } + + /* ------------------------------------------------------------------------------------- + // Create test cases. + /* ------------------------------------------------------------------------------------- */ + type fields struct { + RegistryURL string + AnalyzerTOMLData types.AnalyzerTOML + IssuesData *[]types.AnalyzerIssue + DockerClient *docker.DockerClient + Spinner *utils.SpinnerUtils + } + tests := []struct { + name string + fields fields + wantErr bool + }{ + { + name: "Test Analyzer push to the registry", + fields: fields{ + RegistryURL: "localhost:5000", + AnalyzerTOMLData: *analyzerTOMLData, + IssuesData: issuesData, + DockerClient: &docker.DockerClient{}, + Spinner: &utils.SpinnerUtils{}, + }, + wantErr: false, + }, + } + + cliConf := cliConfig.CLIConfig{ + Host: "deepsource.io", + Token: "dsp_2c14cf8d5c46485e8b811687760caf526a4", + TokenExpiresIn: time.Unix(1<<63-1, 0), + User: "test@deepsource.io", + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + a := &AnalyzerPushOpts{ + RegistryURL: tt.fields.RegistryURL, + AnalyzerTOMLData: tt.fields.AnalyzerTOMLData, + IssuesData: tt.fields.IssuesData, + DockerClient: tt.fields.DockerClient, + Spinner: tt.fields.Spinner, + cliConfig: &cliConf, + } + if err := a.pushAnalyzer(); (err != nil) != tt.wantErr { + t.Errorf("AnalyzerPushOpts.pushAnalyzer() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } + + /* Stop the registry. */ + if err := runCmd("docker", appPath, "container", "stop", "registry"); err != nil { + t.Log(err) + } + if err := runCmd("docker", appPath, "container", "rm", "-v", "registry"); err != nil { + t.Log(err) + } +} + +func runCmd(command, directory string, cmdArgs ...string) (err error) { + // Stop the running registry instance. + cmd := exec.Command(command, cmdArgs...) + cmd.Dir = directory + + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + // Run the command + err = cmd.Run() + _, outErr := stdout.String(), stderr.String() + if err != nil { + return fmt.Errorf("Failed to run the command. Error:%s\n", outErr) + } + return nil +} diff --git a/command/analyzer/push/sync.go b/command/analyzer/push/sync.go new file mode 100644 index 000000000..28a8ab690 --- /dev/null +++ b/command/analyzer/push/sync.go @@ -0,0 +1,34 @@ +package push + +import ( + "context" + + analyzerConfig "github.com/deepsourcelabs/cli/analyzers/config" + "github.com/deepsourcelabs/cli/deepsource" +) + +// syncAnalyzer uses the asgard public API to sync the Analyzer data with DeepSource. +func (a *AnalyzerPushOpts) syncAnalyzer(host, token string) (bool, []string, error) { + var err error + + // Fetch the issues data. + if a.IssuesData, err = analyzerConfig.GetIssueDescriptions(); err != nil { + return false, []string{}, err + } + + // Use the SDK for syncing the Analyzer through the public API. + deepsource, err := deepsource.New(deepsource.ClientOpts{ + Token: token, + HostName: host, + }) + if err != nil { + return false, []string{}, err + } + + ctx := context.Background() + syncResponse, err := deepsource.SyncAnalyzer(ctx, &a.AnalyzerTOMLData, a.IssuesData) + if err != nil { + return false, []string{}, err + } + return syncResponse.Ok, syncResponse.Warnings, nil +} diff --git a/command/analyzer/push/utils.go b/command/analyzer/push/utils.go new file mode 100644 index 000000000..38fb30590 --- /dev/null +++ b/command/analyzer/push/utils.go @@ -0,0 +1,77 @@ +package push + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + analyzerConfig "github.com/deepsourcelabs/cli/analyzers/config" + "github.com/deepsourcelabs/cli/types" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" +) + +// getAnalyzerVersion fetches the latest git tag version of the Analyzer. +func getAnalyzerVersion(analyzerDir string) (string, error) { + analyzerDir, _ = filepath.Abs(analyzerDir) + + // Open the Analyzer's git directory. + repo, err := git.PlainOpenWithOptions(analyzerDir, &git.PlainOpenOptions{ + DetectDotGit: true, + }) + if err != nil { + return "", err + } + + // Fetch the repo tags list. + tagReferences, _ := repo.Tags() + currentTagRef := []string{} + if err = tagReferences.ForEach(func(t *plumbing.Reference) error { + currentTagRef = append(currentTagRef, t.Name().String()) + return nil + }); err != nil { + return "", err + } + + if len(currentTagRef) != 0 { + // Convert refs/tags/v0.2.1 -> v0.2.1 + return strings.TrimPrefix(currentTagRef[len(currentTagRef)-1], "refs/tags/"), nil + } + + // currentTagRef slice is empty if there are not tags in the Analyzer git directory. + headRef, err := repo.Head() + if err != nil { + return "", fmt.Errorf("couldn't find the latest git tag or commit") + } + return headRef.Hash().String()[:7], nil +} + +// getImageRegistryURL fetches the registry URL to which the image has to be pushed. +func getImageRegistryURL() string { + if envRegistryURL, envConfigured := os.LookupEnv("REGISTRY_URL"); envConfigured { + return envRegistryURL + } + return defaultRegistryURL +} + +// getAnalyzerData fetches the data required to build and push the image: +// - The analyzer.toml data which contains the Analyzer shortcode which would be the image name. +// - The latest git tag or the git commit if the tag doesn't exist which will be used to tag the image. +func getAnalyzerData() (types.AnalyzerTOML, string, error) { + cwd, err := os.Getwd() + if err != nil { + return types.AnalyzerTOML{}, "", err + } + + analyzerTOML, err := analyzerConfig.GetAnalyzerTOML() + if err != nil { + return types.AnalyzerTOML{}, "", err + } + + analyzerVersion, err := getAnalyzerVersion(cwd) + if err != nil { + return types.AnalyzerTOML{}, "", err + } + return *analyzerTOML, analyzerVersion, nil +} diff --git a/command/analyzer/push/utils_test.go b/command/analyzer/push/utils_test.go new file mode 100644 index 000000000..ac0f78556 --- /dev/null +++ b/command/analyzer/push/utils_test.go @@ -0,0 +1,34 @@ +package push + +import ( + "os" + "testing" +) + +func TestGetImageRegistryURL(t *testing.T) { + tests := []struct { + registryURL string + want string + }{ + { + registryURL: "us.gcr.io/deepsource-dev", + want: "us.gcr.io/deepsource-dev", + }, + { + registryURL: "", + want: "registry.deepsource.io", + }, + } + + for _, tt := range tests { + t.Run(tt.registryURL, func(t *testing.T) { + if tt.registryURL != "" { + os.Setenv("REGISTRY_URL", tt.registryURL) + } + if got := getImageRegistryURL(); got != tt.want { + t.Errorf("Incorrect registry URL. Got = %v, want %v", got, tt.want) + } + os.Unsetenv("REGISTRY_URL") + }) + } +} diff --git a/command/analyzer/verify/build.go b/command/analyzer/verify/build.go index b33c8f2a6..4cd4757d1 100644 --- a/command/analyzer/verify/build.go +++ b/command/analyzer/verify/build.go @@ -59,7 +59,7 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzerDockerBuild() (err error) { return err } - // Build the docker image :rocket: + // Build the docker image. ctxCancelFunc, buildRespReader, buildErr := analyzerBuilder.BuildAnalyzerDockerImage() // Cancel the build context and close the reader before exiting this function @@ -90,7 +90,7 @@ func (a *AnalyzerVerifyOpts) verifyAnalyzerDockerBuild() (err error) { return nil } -// Utility to handle the output in case of build errors for different modes +// Utility to handle the output in case of build errors for different modes. func (a *AnalyzerVerifyOpts) handleBuildError(buildError error) { if a.Build.VerboseMode { fmt.Printf("%s\n", utils.GetFailureMessage("Failed to build the image", buildError.Error())) diff --git a/config/config.go b/config/config.go index 8f8d816f0..4d021c5bd 100644 --- a/config/config.go +++ b/config/config.go @@ -17,7 +17,7 @@ var ( const ( ConfigDirName = "/.deepsource/" ConfigFileName = "/config.toml" - DefaultHostName = "deepsource.io" + DefaultHostName = "deepsource.icu" ) type CLIConfig struct { @@ -38,9 +38,6 @@ func (cfg *CLIConfig) SetTokenExpiry(str string) { // Checks if the token has expired or not func (cfg *CLIConfig) IsExpired() bool { - if cfg.TokenExpiresIn.IsZero() { - return true - } return time.Now().After(cfg.TokenExpiresIn) } @@ -87,6 +84,7 @@ func (cfg *CLIConfig) ReadConfigFile() error { return nil } +// GetConfig returns the CLI config after reading it. func GetConfig() (*CLIConfig, error) { if Cfg.Token != "" { return &Cfg, nil @@ -147,10 +145,10 @@ func (cfg *CLIConfig) VerifyAuthentication() error { return errors.New("You are not logged into DeepSource. Run \"deepsource auth login\" to authenticate.") } - // // Check if the token has already expired - // if cfg.IsExpired() { - // return errors.New("The authentication has expired. Run \"deepsource auth refresh\" to refresh the credentials.") - // } + // Check if the token has already expired + if cfg.IsExpired() { + return errors.New("The authentication has expired. Run \"deepsource auth refresh\" to refresh the credentials.") + } return nil } diff --git a/config/config_test.go b/config/config_test.go index 62002b6b7..05991eed6 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -56,6 +56,7 @@ func TestGetConfig(t *testing.T) { func TestVerifyAuthentication(t *testing.T) { t.Run("must return nil when token is provided", func(t *testing.T) { + cfg.TokenExpiresIn = time.Date(2023, time.Month(2), 13, 1, 10, 30, 0, time.UTC) err := cfg.VerifyAuthentication() assert.Nil(t, err) }) diff --git a/deepsource/analyzers/mutations/sync_analyzer.go b/deepsource/analyzers/mutations/sync_analyzer.go new file mode 100644 index 000000000..4d3be38be --- /dev/null +++ b/deepsource/analyzers/mutations/sync_analyzer.go @@ -0,0 +1,66 @@ +package analyzers + +import ( + "context" + "fmt" + + "github.com/deepsourcelabs/cli/deepsource/analyzers" + "github.com/deepsourcelabs/cli/types" + "github.com/deepsourcelabs/graphql" +) + +// GraphQL query to sync a custom Analyzer with DeepSource. +const syncAnalyzerMutation = ` +mutation SyncAnalyzer($input:SyncAnalyzerInput!) { + syncAnalyzer(input:$input) { + ok + warnings + } +}` + +type AnalyzerInput struct { + Name string `json:"name"` + Version string `json:"version"` + Shortcode string `json:"shortcode"` + Description string `json:"description,omitempty"` + Tags []string `json:"tags,omitempty"` + RepositoryUrl string `json:"repositoryUrl,omitempty"` + DocumentationUrl string `json:"documentationUrl,omitempty"` + BugTrackerUrl string `json:"bugtrackerUrl,omitempty"` + AnalysisCommand string `json:"analysisCommand"` + AutofixCommand string `json:"autofixCommand,omitempty"` +} + +type SyncAnalyzerInput struct { + Analyzer AnalyzerInput `json:"analyzer"` + Issues []types.AnalyzerIssue `json:"issues"` +} + +type SyncAnalyzerRequest struct { + Input SyncAnalyzerInput +} + +// GraphQL interface of API client. +type IGQLClient interface { + GQL() *graphql.Client + GetToken() string +} + +func (s SyncAnalyzerRequest) Do(ctx context.Context, client IGQLClient) (*analyzers.SyncResponse, error) { + req := graphql.NewRequest(syncAnalyzerMutation) + // Add request variables. + req.Var("input", s.Input) + + // Set header fields. + req.Header.Set("Cache-Control", "no-cache") + tokenHeader := fmt.Sprintf("Bearer %s", client.GetToken()) + req.Header.Add("Authorization", tokenHeader) + + // Run the mutation and capture the response. + var respData analyzers.SyncResponse + if err := client.GQL().Run(ctx, req, &respData); err != nil { + return nil, err + } + fmt.Println(respData) + return &respData, nil +} diff --git a/deepsource/analyzers/sync.go b/deepsource/analyzers/sync.go new file mode 100644 index 000000000..3187fee8d --- /dev/null +++ b/deepsource/analyzers/sync.go @@ -0,0 +1,10 @@ +package analyzers + +type SyncResponse struct { + SyncAnalyzer `json:"syncAnalyzer"` +} + +type SyncAnalyzer struct { + Ok bool `json:"ok"` + Warnings []string `json:"warnings"` +} diff --git a/deepsource/client.go b/deepsource/client.go index 75264ad4d..74befb7fa 100644 --- a/deepsource/client.go +++ b/deepsource/client.go @@ -6,19 +6,22 @@ import ( "fmt" "github.com/deepsourcelabs/cli/deepsource/analyzers" - analyzerQuery "github.com/deepsourcelabs/cli/deepsource/analyzers/queries" "github.com/deepsourcelabs/cli/deepsource/auth" - authmut "github.com/deepsourcelabs/cli/deepsource/auth/mutations" "github.com/deepsourcelabs/cli/deepsource/issues" - issuesQuery "github.com/deepsourcelabs/cli/deepsource/issues/queries" "github.com/deepsourcelabs/cli/deepsource/repository" - repoQuery "github.com/deepsourcelabs/cli/deepsource/repository/queries" "github.com/deepsourcelabs/cli/deepsource/transformers" - transformerQuery "github.com/deepsourcelabs/cli/deepsource/transformers/queries" + "github.com/deepsourcelabs/cli/types" "github.com/deepsourcelabs/graphql" + + analyzerMutation "github.com/deepsourcelabs/cli/deepsource/analyzers/mutations" + analyzerQuery "github.com/deepsourcelabs/cli/deepsource/analyzers/queries" + authMutation "github.com/deepsourcelabs/cli/deepsource/auth/mutations" + issuesQuery "github.com/deepsourcelabs/cli/deepsource/issues/queries" + repoQuery "github.com/deepsourcelabs/cli/deepsource/repository/queries" + transformerQuery "github.com/deepsourcelabs/cli/deepsource/transformers/queries" ) -var defaultHostName = "deepsource.io" +var defaultHostName = "deepsource.icu" type ClientOpts struct { Token string @@ -56,7 +59,7 @@ func getAPIClientURL(hostName string) string { // Check if the domain is different from the default domain (In case of Enterprise users) if hostName != defaultHostName { - apiClientURL = fmt.Sprintf("https://%s/api/graphql/", hostName) + apiClientURL = fmt.Sprintf("http://%s/graphql/", hostName) } return apiClientURL } @@ -64,7 +67,7 @@ func getAPIClientURL(hostName string) string { // Registers the device and allots it a device code which is further used for fetching // the PAT and other authentication data func (c Client) RegisterDevice(ctx context.Context) (*auth.Device, error) { - req := authmut.RegisterDeviceRequest{} + req := authMutation.RegisterDeviceRequest{} res, err := req.Do(ctx, c) if err != nil { return nil, err @@ -74,8 +77,8 @@ func (c Client) RegisterDevice(ctx context.Context) (*auth.Device, error) { // Logs in the client using the deviceCode and the user Code and returns the PAT and data which is required for authentication func (c Client) Login(ctx context.Context, deviceCode, description string) (*auth.PAT, error) { - req := authmut.RequestPATRequest{ - Params: authmut.RequestPATParams{ + req := authMutation.RequestPATRequest{ + Params: authMutation.RequestPATParams{ DeviceCode: deviceCode, Description: description, }, @@ -90,8 +93,8 @@ func (c Client) Login(ctx context.Context, deviceCode, description string) (*aut // Refreshes the authentication credentials. Takes the refreshToken as a parameter. func (c Client) RefreshAuthCreds(ctx context.Context, token string) (*auth.PAT, error) { - req := authmut.RefreshTokenRequest{ - Params: authmut.RefreshTokenParams{ + req := authMutation.RefreshTokenRequest{ + Params: authMutation.RefreshTokenParams{ Token: token, }, } @@ -187,3 +190,42 @@ func (c Client) GetIssuesForFile(ctx context.Context, owner, repoName, provider, } return res, nil } + +// SyncAnalyzer syncs the local custom Analyzer with DeepSource. +func (c Client) SyncAnalyzer(ctx context.Context, analyzerTOMLData *types.AnalyzerTOML, issuesData *[]types.AnalyzerIssue) (*analyzers.SyncResponse, error) { + req := analyzerMutation.SyncAnalyzerRequest{ + Input: analyzerMutation.SyncAnalyzerInput{ + Analyzer: analyzerMutation.AnalyzerInput{ + Name: analyzerTOMLData.Name, + Version: analyzerTOMLData.AnalyzerVersion, + Shortcode: analyzerTOMLData.Shortcode, + Description: analyzerTOMLData.Description, + Tags: analyzerTOMLData.Tags, + RepositoryUrl: analyzerTOMLData.Repository, + DocumentationUrl: analyzerTOMLData.DocumentationURL, + BugTrackerUrl: analyzerTOMLData.BugTrackerURL, + AnalysisCommand: analyzerTOMLData.Analysis.Command, + // TODO(SNT): Activate this when Autofix is supported for custom Analyzers. + // AutofixCommand: analyzerTOMLData.AutofixCommand, + }, + }, + } + + // Making a duplicate instance of the issuesData slice since the category needs to be modified to + // match the enum values expected by the syncAnalyzer mutation. + issuesList := *issuesData + + // Assigning the enum value of issue category. + for i := 0; i < len(issuesList); i++ { + issuesList[i].Category = types.IssueCategoryEnumMap[issuesList[i].Category] + } + + // Appending issues to the parameters. + req.Input.Issues = append(req.Input.Issues, issuesList...) + + res, err := req.Do(ctx, c) + if err != nil { + return &analyzers.SyncResponse{}, err + } + return res, nil +} diff --git a/go.mod b/go.mod index fc5acbe1d..e18e9f7b0 100644 --- a/go.mod +++ b/go.mod @@ -3,115 +3,106 @@ module github.com/deepsourcelabs/cli go 1.18 require ( - github.com/AlecAivazis/survey/v2 v2.3.4 + github.com/AlecAivazis/survey/v2 v2.3.5 github.com/Jeffail/gabs/v2 v2.6.1 github.com/MakeNowJust/heredoc v1.0.0 - github.com/ProtonMail/go-crypto v0.0.0-20220623141421-5afb4c282135 // indirect + github.com/alecthomas/chroma v0.10.0 github.com/briandowns/spinner v1.18.1 github.com/cli/browser v1.1.0 github.com/deepsourcelabs/graphql v0.2.2 - github.com/docker/docker v20.10.14+incompatible - github.com/emirpasic/gods v1.18.1 // indirect + github.com/docker/docker v20.10.17+incompatible github.com/fatih/color v1.13.0 - github.com/getsentry/sentry-go v0.6.0 - github.com/owenrumney/go-sarif/v2 v2.1.0 - github.com/pelletier/go-toml v1.9.4 - github.com/pterm/pterm v0.12.23 - github.com/spf13/cobra v1.4.0 - github.com/spf13/viper v1.10.1 - github.com/stretchr/testify v1.7.1 - github.com/xeipuuv/gojsonschema v1.2.0 -) - -require ( - github.com/atomicgo/cursor v0.0.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.5.1 + github.com/fsnotify/fsnotify v1.5.4 + github.com/getsentry/sentry-go v0.13.0 github.com/go-git/go-git/v5 v5.4.2 - github.com/go-playground/validator/v10 v10.10.1 + github.com/go-playground/validator/v10 v10.11.0 github.com/gobwas/glob v0.2.3 - github.com/google/go-cmp v0.5.6 - github.com/gookit/color v1.4.2 // indirect - github.com/gorilla/mux v1.8.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/matryer/is v1.4.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/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d - github.com/mitchellh/mapstructure v1.4.3 // indirect - github.com/moby/sys/mount v0.3.2 // indirect - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 - github.com/pelletier/go-toml/v2 v2.0.1 - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/sergi/go-diff v1.2.0 // indirect - github.com/spf13/afero v1.8.2 // indirect - github.com/spf13/cast v1.4.1 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.2.0 // indirect - github.com/xanzy/ssh-agent v0.3.1 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect - golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect - golang.org/x/sys v0.0.0-20220624220833-87e55d714810 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect - gopkg.in/ini.v1 v1.66.4 // indirect -) - -require ( - github.com/alecthomas/chroma v0.10.0 + github.com/google/go-cmp v0.5.8 github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b github.com/labstack/echo/v4 v4.7.2 + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d github.com/morikuni/aec v1.0.0 + github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 + github.com/owenrumney/go-sarif/v2 v2.1.2 + github.com/pelletier/go-toml v1.9.5 + github.com/pelletier/go-toml/v2 v2.0.2 + github.com/pterm/pterm v0.12.42 + github.com/spf13/cobra v1.5.0 + github.com/spf13/viper v1.12.0 + github.com/stretchr/testify v1.8.0 + github.com/xeipuuv/gojsonschema v1.2.0 github.com/yuin/goldmark v1.4.12 ) require ( + atomicgo.dev/cursor v0.1.1 // indirect + atomicgo.dev/keyboard v0.2.8 // indirect github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/Microsoft/hcsshim v0.9.2 // indirect + github.com/Microsoft/hcsshim v0.9.3 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/containerd/cgroups v1.0.3 // indirect - github.com/containerd/containerd v1.6.3 // indirect + github.com/containerd/console v1.0.3 // indirect + github.com/containerd/containerd v1.6.6 // indirect github.com/containerd/continuity v0.3.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/dlclark/regexp2 v1.4.0 // indirect github.com/docker/distribution v2.8.1+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect + github.com/emirpasic/gods v1.12.0 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/gookit/color v1.5.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/imdario/mergo v0.3.12 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect github.com/labstack/gommon v0.3.1 // indirect github.com/leodido/go-urn v1.2.1 // indirect + github.com/lithammer/fuzzysearch v1.1.5 // indirect + github.com/magiconair/properties v1.8.6 // 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/mitchellh/go-homedir v1.1.0 // indirect - github.com/moby/sys/mountinfo v0.6.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/sys/mount v0.3.3 // indirect + github.com/moby/sys/mountinfo v0.6.2 // indirect + github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/runc v1.1.1 // indirect + github.com/opencontainers/runc v1.1.3 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/sergi/go-diff v1.2.0 // indirect github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.3.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.1 // indirect + github.com/xanzy/ssh-agent v0.3.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect go.opencensus.io v0.23.0 // indirect - google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa // indirect - google.golang.org/grpc v1.43.0 // indirect - google.golang.org/protobuf v1.27.1 // indirect + golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect + golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - gotest.tools/v3 v3.2.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.3.0 // indirect ) diff --git a/go.sum b/go.sum index 0473716ba..98859808d 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,7 @@ +atomicgo.dev/cursor v0.1.1 h1:0t9sxQomCTRh5ug+hAMCs59x/UmC9QL6Ci5uosINKD4= +atomicgo.dev/cursor v0.1.1/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= +atomicgo.dev/keyboard v0.2.8 h1:Di09BitwZgdTV1hPyX/b9Cqxi8HVuJQwWivnZUEqlj4= +atomicgo.dev/keyboard v0.2.8/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -37,9 +41,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.4 h1:pchTU9rsLUSvWEl2Aq9Pv3k0IE2fkqtGxazskAMd9Ng= -github.com/AlecAivazis/survey/v2 v2.3.4/go.mod h1:hrV6Y/kQCLhIZXGcriDCUBtB3wnN7156gMXJ3+b23xM= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= +github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= @@ -56,14 +59,18 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ 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/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/Jeffail/gabs/v2 v2.6.1 h1:wwbE6nTQTwIMsMxzi6XFQQYRZ6wDc1mSdxoAN+9U4Gk= github.com/Jeffail/gabs/v2 v2.6.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= +github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= +github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= +github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= +github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= +github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c= +github.com/MarvinJWendt/testza v0.4.2 h1:Vbw9GkSB5erJI2BPnBL9SVGV9myE+XmUSFahBGUhW2Q= +github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= 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= @@ -72,7 +79,6 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX 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.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= @@ -83,26 +89,23 @@ github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2 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.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY= -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.3 h1:k371PzBuRrz2b+ebGuI2nVgVhgsVX60jMfSw80NECxo= +github.com/Microsoft/hcsshim v0.9.3/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= 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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= -github.com/ProtonMail/go-crypto v0.0.0-20220623141421-5afb4c282135 h1:xDc/cFH/hwyr9KyWc0sm26lpsscqtfZBvU8NpRLHwJ0= -github.com/ProtonMail/go-crypto v0.0.0-20220623141421-5afb4c282135/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/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -118,10 +121,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= 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/atomicgo/cursor v0.0.1 h1:xdogsqa6YYlLfM+GyClC/Lchf7aiMerFiZQn7soTOoU= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= 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= @@ -161,13 +162,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk 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-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= 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= @@ -189,6 +185,7 @@ github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/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/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= 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= @@ -204,8 +201,8 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.6.3 h1:JfgUEIAH07xDWk6kqz0P3ArZt+KJ9YeihSC9uyFtSKg= -github.com/containerd/containerd v1.6.3/go.mod h1:gCVGrYRYFm2E8GmuUIbj/NGD7DLZQLzSJQazjVKDOig= +github.com/containerd/containerd v1.6.6 h1:xJNPhbrmz8xAMDNoVjHy9YHtWwEQNS+CDkcIRh7t8Y0= +github.com/containerd/containerd v1.6.6/go.mod h1:ZoP1geJldzCVY3Tonoz7b1IXk8rIX0Nltt5QE4OMNk0= 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= @@ -261,7 +258,6 @@ github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgU 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/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= @@ -275,10 +271,9 @@ github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ 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-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/cpuguy83/go-md2man/v2 v2.0.2/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= @@ -296,10 +291,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deepsourcelabs/graphql v0.2.2 h1:6CtKGvVSIY6Jnf72VyfXB77AaaoHATBzXsrh64irtVQ= github.com/deepsourcelabs/graphql v0.2.2/go.mod h1:2hqi4vS0LxP9wMjbkbMOdR/fap2zwDlzqGGO8WEgyBA= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= 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-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= @@ -311,8 +304,8 @@ github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4Kfc github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.14+incompatible h1:+T9/PRYWNDo5SZl5qS1r9Mo/0Q8AwxKKPtu9S1yxM0w= -github.com/docker/docker v20.10.14+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= @@ -327,50 +320,39 @@ github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZ 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/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= 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 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= 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.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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= 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/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= 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 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= 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/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/sentry-go v0.6.0 h1:kPd+nr+dlXmaarUBg7xlC/qn+7wyMJL6PMsSn5fA+RM= -github.com/getsentry/sentry-go v0.6.0/go.mod h1:0yZBuzSvbZwBnvaF9VwZIMen3kXscY8/uasKtAX1qG8= +github.com/getsentry/sentry-go v0.13.0 h1:20dgTiUSfxRB/EhMPtxcL9ZEbM1ZdR+W/7f7NWD+xWo= +github.com/getsentry/sentry-go v0.13.0/go.mod h1:EOsfu5ZdvKPfeHYV6pTVQnsjfp30+XA7//UooKNumH0= 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.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= 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= @@ -390,7 +372,6 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 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-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= 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= @@ -408,14 +389,11 @@ github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig= -github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-playground/validator/v10 v10.11.0 h1:0W+xRM511GY47Yy3bZUbJVitCNg2BOGlCyvTqsp/xIw= +github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= 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= @@ -462,9 +440,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD 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.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= 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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -478,10 +453,10 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= 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= @@ -506,14 +481,13 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.4.2 h1:tXy44JFSFkKnELV6WaMo/lLfu/meqITX3iAV52do7lk= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= +github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= 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 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -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.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -530,7 +504,6 @@ github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FK github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 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-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -546,13 +519,8 @@ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= @@ -567,29 +535,21 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ 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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/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.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 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/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= 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= @@ -605,15 +565,15 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 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/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.7.2 h1:Kv2/p8OaQ+M6Ex4eGimg9b9e6icoxA42JSlOR3msKtI= github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/lithammer/fuzzysearch v1.1.5 h1:Ag7aKU08wp0R9QCfF4GoGST9HbmAIeLP7xwMrOBEp1c= +github.com/lithammer/fuzzysearch v1.1.5/go.mod h1:1R1LRNk7yKid1BaQkmuLQaHruxcC4HmAH30Dh61Ih1Q= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -622,9 +582,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN 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/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -632,9 +591,7 @@ github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb 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-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.7/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.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= 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= @@ -643,32 +600,28 @@ github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4 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.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -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/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= 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/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/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/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/sys/mount v0.3.2 h1:uq/CiGDZPvr+c85RYHtKIUORFbmavBUyWH3E1NEyjqI= -github.com/moby/sys/mount v0.3.2/go.mod h1:iN27Ec0LtJ0Mx/++rE6t6mTdbbEEZd+oKfAHP1y6vHs= +github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= +github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= 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/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/mountinfo v0.6.1 h1:+H/KnGEAGRpTrEAqNVQ2AM3SiwMgJUt/TXj+Z8cmCIc= -github.com/moby/sys/mountinfo v0.6.1/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= 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-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= @@ -679,15 +632,11 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= 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/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= 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= @@ -725,8 +674,8 @@ github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= 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/runc v1.1.1 h1:PJ9DSs2sVwE0iVr++pAHE6QkS9tzcVWozlPifdwMgrU= -github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= +github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= 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= @@ -739,17 +688,16 @@ github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3 github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U= -github.com/owenrumney/go-sarif/v2 v2.1.0 h1:Xp4RUbbQc5O2/t5YYZ+1QzJ8FZVdJwXeiWssiF5vQrA= -github.com/owenrumney/go-sarif/v2 v2.1.0/go.mod h1:MSqMMx9WqlBSY7pXoOZWgEsVB4FDNfhcaXDA1j6Sr+w= +github.com/owenrumney/go-sarif/v2 v2.1.2 h1:PMDK7tXShJ9zsB7bfvlpADH5NEw1dfA9xwU8Xtdj73U= +github.com/owenrumney/go-sarif/v2 v2.1.2/go.mod h1:MSqMMx9WqlBSY7pXoOZWgEsVB4FDNfhcaXDA1j6Sr+w= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= +github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= 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= @@ -789,8 +737,15 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O 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/pterm/pterm v0.12.23 h1:+PL0YqmmT0QiDLOpevE3e2HPb5UIDBxh6OlLm8jDhxg= -github.com/pterm/pterm v0.12.23/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= +github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= +github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= +github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= +github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= +github.com/pterm/pterm v0.12.42 h1:hDxPyaPHJalzI+uJ+Cnh7tk8GKFkTUHcRmH7FuGcWfc= +github.com/pterm/pterm v0.12.42/go.mod h1:hJgLlBafm45w/Hr0dKXxY//POD7CgowhePaG1sdPNBg= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -799,16 +754,13 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -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/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= 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/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -824,7 +776,6 @@ 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/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/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= 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= @@ -832,14 +783,13 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= 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.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -849,15 +799,15 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn 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= -github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= 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/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 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= @@ -865,10 +815,12 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P 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/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= 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= @@ -876,21 +828,14 @@ github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ 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/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/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/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= 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= @@ -901,12 +846,10 @@ github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+ github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= 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/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -github.com/xanzy/ssh-agent v0.3.1 h1:AmzO1SSWxw73zxFZPRwaMN1MohDw8UyHnmuxyceTEGo= -github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= +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/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/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/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= @@ -916,10 +859,6 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= 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= @@ -954,7 +893,6 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 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-20181203042331-505ab145d0a9/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -967,11 +905,10 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 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-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1015,7 +952,6 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/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-20190327091125-710a502c58a2/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= @@ -1054,8 +990,8 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1081,7 +1017,6 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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-20181205085412-a5c9d58dba9a/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= @@ -1100,7 +1035,6 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190813064441-fde4db37ae7a/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= @@ -1165,15 +1099,20 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/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-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/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-20220624220833-87e55d714810 h1:rHZQSjJdAI4Xf5Qzeh2bBc5YJIkPFVM6oDtMFYmgws0= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1197,13 +1136,11 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm 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-20181221001348-537d06c36207/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-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-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-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/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= @@ -1259,7 +1196,6 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1330,8 +1266,6 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D 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-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1355,8 +1289,6 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5 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.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= 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= @@ -1369,7 +1301,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj 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= @@ -1384,12 +1315,9 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS 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/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= 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= @@ -1409,13 +1337,14 @@ 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= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/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= -gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= -gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= +gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= 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= diff --git a/types/analyzer.go b/types/analyzer.go index d63eb603c..c19e2b08d 100644 --- a/types/analyzer.go +++ b/types/analyzer.go @@ -34,6 +34,7 @@ type AnalyzerTOML struct { // Analyzer specific data Name string `toml:"name" json:"name" validate:"required"` Shortcode string `toml:"shortcode" json:"shortcode" validate:"required,shortcode"` + AnalyzerVersion string `toml:",omitempty" json:",omitempty"` Description string `toml:"description" json:"description" validate:"required"` Tags []string `toml:"tags" json:"tags,omitempty" validate:"omitempty"` Repository string `toml:"repository" json:"repository" validate:"omitempty,url"` @@ -59,9 +60,21 @@ type AnalyzerTOML struct { // Analyzer issue type. type AnalyzerIssue struct { - Shortcode string `validate:"omitempty"` - Title string `toml:"title" json:"title" validate:"required"` - Description string `toml:"description" json:"description" validate:"required"` - HTMLDescription template.HTML - Category string `toml:"category" json:"category" validate:"required,category"` + Shortcode string `json:"shortcode" validate:"omitempty"` + HTMLDescription template.HTML `json:",omitempty"` + Title string `toml:"title" json:"title" validate:"required"` + Description string `toml:"description" json:"description" validate:"required"` + Category string `toml:"category" json:"category" validate:"required,category"` +} + +// Issue category enum used in +var IssueCategoryEnumMap = map[string]string{ + "bug-risk": "BUG_RISK", + "antipattern": "ANTI_PATTERN", + "performance": "PERFORMANCEW", + "style": "STYLE", + "security": "SECURITY", + "coverage": "COVERAGE", + "typecheck": "TYPECHECK", + "doc": "DOCUMENTATION", } diff --git a/utils/prompt.go b/utils/prompt.go index 2b8f14ea2..5e8e3b6ee 100644 --- a/utils/prompt.go +++ b/utils/prompt.go @@ -119,6 +119,8 @@ func GetBulletMessage(msg, color string) string { switch color { case "red": return aec.Apply("•"+" "+msg, aec.LightRedF) + case "yellow": + return aec.Apply("•"+" "+msg, aec.LightYellowF) } return "" } From 9088aea12c97cadcf3d63875eed2dd2393714669 Mon Sep 17 00:00:00 2001 From: burntcarrot Date: Mon, 11 Jul 2022 21:50:04 +0530 Subject: [PATCH 17/28] feat(command/analyzer): add diagnostics to analyzer command --- analyzers/diagnostics/diagnostics.go | 78 +++++++++++++++++++++++++++ cmd/deepsource_tcv/deepsource | Bin 0 -> 10118123 bytes command/analyzer/verify/verify.go | 13 ++++- 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 analyzers/diagnostics/diagnostics.go create mode 100755 cmd/deepsource_tcv/deepsource diff --git a/analyzers/diagnostics/diagnostics.go b/analyzers/diagnostics/diagnostics.go new file mode 100644 index 000000000..25a83456e --- /dev/null +++ b/analyzers/diagnostics/diagnostics.go @@ -0,0 +1,78 @@ +// TODO: add comments + +package diagnostics + +import ( + "os" + "strings" + + "github.com/deepsourcelabs/cli/analyzers/validator" + "github.com/fatih/color" +) + +type Diagnostic struct { + Line int + Column int + Content string + + ErrorMessage string +} + +func GetDiagnostics(failure validator.ValidationFailure) ([]string, error) { + diagnostics := []string{} + + fileContent, err := readFileContent(failure.File) + if err != nil { + return nil, err + } + + diags := getDiagnosticsFromFile(fileContent, failure.Errors) + + for _, diag := range diags { + message := getMessage(diag) + diagnostics = append(diagnostics, message) + } + + return diagnostics, nil +} + +func getMessage(diag Diagnostic) string { + errMsg := "\n" + errMsg += color.RedString("At line number %d:\n", diag.Line) + errMsg += color.BlueString(" > %s \n", diag.Content) + errMsg += color.RedString("ERROR: %s", diag.ErrorMessage) + errMsg += "\n" + + return errMsg +} + +func readFileContent(filename string) (string, error) { + content, err := os.ReadFile(filename) + if err != nil { + return "", err + } + + return string(content), nil +} + +func getDiagnosticsFromFile(fileContent string, errors []validator.ErrorMeta) []Diagnostic { + lines := strings.Split(string(fileContent), "\n") + + diagnostics := []Diagnostic{} + + for _, err := range errors { + for lineNum, line := range lines { + if strings.Contains(line, err.Field) { + diag := Diagnostic{ + Line: lineNum, + Content: line, + ErrorMessage: err.Message, + } + + diagnostics = append(diagnostics, diag) + } + } + } + + return diagnostics +} diff --git a/cmd/deepsource_tcv/deepsource b/cmd/deepsource_tcv/deepsource new file mode 100755 index 0000000000000000000000000000000000000000..f731802fa5ce2ec78efe10a950b1fbe1389f6a7b GIT binary patch literal 10118123 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

    coOGf+`u; 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»` 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

    -u{e8)3lmc|}|C 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�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�-j(wHn6mq?p#1jOgbs0v1TGWb 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