From 09f2b7db3cfa6ac0a5b48755472217c1346d8601 Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Mon, 7 Apr 2025 13:15:31 +0200 Subject: [PATCH 01/11] Update configuration files and paths for Codacy integration - Added cli-v2 and cli-config.yaml to .gitignore. - Downgraded ESLint version in codacy.yaml from 9.3.0 to 8.57.0. - Updated file creation paths in init.go to use localCodacyDir for ESLint, Trivy, and PMD configuration files, ensuring they are saved in the correct directory. --- .codacy/codacy.yaml | 2 +- .gitignore | 2 ++ cmd/init.go | 35 +++++++++++++++++++---------------- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/.codacy/codacy.yaml b/.codacy/codacy.yaml index 820f105f..cc5bd6b6 100644 --- a/.codacy/codacy.yaml +++ b/.codacy/codacy.yaml @@ -2,7 +2,7 @@ runtimes: - node@22.2.0 - python@3.11.11 tools: - - eslint@9.3.0 + - eslint@8.57.0 - trivy@0.59.1 - pylint@3.3.6 - pmd@6.55.0 diff --git a/.gitignore b/.gitignore index 6b64633d..8246f382 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,6 @@ go.work.sum .idea/ .vscode/ +# Codacy CLI cli-v2 +cli-config.yaml \ No newline at end of file diff --git a/cmd/init.go b/cmd/init.go index ca09413a..8de6816d 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -10,6 +10,7 @@ import ( "log" "net/http" "os" + "path/filepath" "time" "github.com/spf13/cobra" @@ -142,6 +143,8 @@ func buildRepositoryConfigurationFiles(token string) error { fmt.Println("Building repository configuration files ...") fmt.Println("Fetching repository configuration from codacy ...") + localCodacyDir := config.Config.LocalCodacyDirectory() + // API call to fetch settings url := CodacyApiBase + "/2.0/project/analysis/configuration" @@ -198,7 +201,7 @@ func buildRepositoryConfigurationFiles(token string) error { eslintDomainConfiguration := convertAPIToolConfigurationToDomain(*eslintApiConfiguration) eslintConfigurationString := tools.CreateEslintConfig(eslintDomainConfiguration) - eslintConfigFile, err := os.Create("eslint.config.mjs") + eslintConfigFile, err := os.Create(filepath.Join(localCodacyDir, "eslint.config.mjs")) if err != nil { return fmt.Errorf("failed to create eslint config file: %v", err) } @@ -210,7 +213,7 @@ func buildRepositoryConfigurationFiles(token string) error { } fmt.Println("ESLint configuration created based on Codacy settings") } else { - err = createDefaultEslintConfigFile() + err = createDefaultEslintConfigFile(localCodacyDir) if err != nil { return fmt.Errorf("failed to create default ESLint config: %v", err) } @@ -220,13 +223,13 @@ func buildRepositoryConfigurationFiles(token string) error { // Trivy configuration trivyApiConfiguration := extractTrivyConfiguration(apiToolConfigurations) if trivyApiConfiguration != nil { - err = createTrivyConfigFile(*trivyApiConfiguration) + err = createTrivyConfigFile(*trivyApiConfiguration, localCodacyDir) if err != nil { return fmt.Errorf("failed to create Trivy config: %v", err) } fmt.Println("Trivy configuration created based on Codacy settings") } else { - err = createDefaultTrivyConfigFile() + err = createDefaultTrivyConfigFile(localCodacyDir) if err != nil { return fmt.Errorf("failed to create default Trivy config: %v", err) } @@ -236,13 +239,13 @@ func buildRepositoryConfigurationFiles(token string) error { // PMD configuration pmdApiConfiguration := extractPMDConfiguration(apiToolConfigurations) if pmdApiConfiguration != nil { - err = createPMDConfigFile(*pmdApiConfiguration) + err = createPMDConfigFile(*pmdApiConfiguration, localCodacyDir) if err != nil { return fmt.Errorf("failed to create PMD config: %v", err) } fmt.Println("PMD configuration created based on Codacy settings") } else { - err = createDefaultPMDConfigFile() + err = createDefaultPMDConfigFile(localCodacyDir) if err != nil { return fmt.Errorf("failed to create default PMD config: %v", err) } @@ -318,16 +321,16 @@ func extractPMDConfiguration(toolConfigurations []CodacyToolConfiguration) *Coda return nil } -func createPMDConfigFile(config CodacyToolConfiguration) error { +func createPMDConfigFile(config CodacyToolConfiguration, localCodacyDir string) error { pmdDomainConfiguration := convertAPIToolConfigurationToDomain(config) pmdConfigurationString := tools.CreatePmdConfig(pmdDomainConfiguration) - return os.WriteFile("pmd-ruleset.xml", []byte(pmdConfigurationString), 0644) + return os.WriteFile(filepath.Join(localCodacyDir, "pmd-ruleset.xml"), []byte(pmdConfigurationString), 0644) } -func createDefaultPMDConfigFile() error { +func createDefaultPMDConfigFile(localCodacyDir string) error { emptyConfig := tools.ToolConfiguration{} content := tools.CreatePmdConfig(emptyConfig) - return os.WriteFile("pmd-ruleset.xml", []byte(content), 0644) + return os.WriteFile(filepath.Join(localCodacyDir, "pmd-ruleset.xml"), []byte(content), 0644) } type CodacyToolConfiguration struct { @@ -347,7 +350,7 @@ type ParameterConfiguration struct { } // createTrivyConfigFile creates a trivy.yaml configuration file based on the API configuration -func createTrivyConfigFile(config CodacyToolConfiguration) error { +func createTrivyConfigFile(config CodacyToolConfiguration, localCodacyDir string) error { // Convert CodacyToolConfiguration to tools.ToolConfiguration trivyDomainConfiguration := convertAPIToolConfigurationForTrivy(config) @@ -355,7 +358,7 @@ func createTrivyConfigFile(config CodacyToolConfiguration) error { trivyConfigurationString := tools.CreateTrivyConfig(trivyDomainConfiguration) // Write to file - return os.WriteFile("trivy.yaml", []byte(trivyConfigurationString), 0644) + return os.WriteFile(filepath.Join(localCodacyDir, "trivy.yaml"), []byte(trivyConfigurationString), 0644) } // convertAPIToolConfigurationForTrivy converts API tool configuration to domain model for Trivy @@ -399,21 +402,21 @@ func convertAPIToolConfigurationForTrivy(config CodacyToolConfiguration) tools.T } // createDefaultTrivyConfigFile creates a default trivy.yaml configuration file -func createDefaultTrivyConfigFile() error { +func createDefaultTrivyConfigFile(localCodacyDir string) error { // Use empty tool configuration to get default settings emptyConfig := tools.ToolConfiguration{} content := tools.CreateTrivyConfig(emptyConfig) // Write to file - return os.WriteFile("trivy.yaml", []byte(content), 0644) + return os.WriteFile(filepath.Join(localCodacyDir, "trivy.yaml"), []byte(content), 0644) } // createDefaultEslintConfigFile creates a default eslint.config.mjs configuration file -func createDefaultEslintConfigFile() error { +func createDefaultEslintConfigFile(localCodacyDir string) error { // Use empty tool configuration to get default settings emptyConfig := tools.ToolConfiguration{} content := tools.CreateEslintConfig(emptyConfig) // Write to file - return os.WriteFile("eslint.config.mjs", []byte(content), 0644) + return os.WriteFile(filepath.Join(localCodacyDir, "eslint.config.mjs"), []byte(content), 0644) } From 32902e53632e9e58d115c31de1e1780c8eaa340a Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Mon, 7 Apr 2025 13:20:08 +0200 Subject: [PATCH 02/11] place in folder --- .codacy/cli-config.yaml | 2 +- .gitignore | 2 +- cmd/init.go | 38 ++++++++++++++++++++++---------------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/.codacy/cli-config.yaml b/.codacy/cli-config.yaml index 6ae4b29d..644407e1 100644 --- a/.codacy/cli-config.yaml +++ b/.codacy/cli-config.yaml @@ -1 +1 @@ -mode: local \ No newline at end of file +mode: remote \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8246f382..272028d1 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,4 @@ go.work.sum # Codacy CLI cli-v2 -cli-config.yaml \ No newline at end of file +.codacy/tools-configs \ No newline at end of file diff --git a/cmd/init.go b/cmd/init.go index 8de6816d..512818ea 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -144,6 +144,12 @@ func buildRepositoryConfigurationFiles(token string) error { fmt.Println("Fetching repository configuration from codacy ...") localCodacyDir := config.Config.LocalCodacyDirectory() + toolsConfigDir := filepath.Join(localCodacyDir, "tools-configs") + + // Create tools-configs directory if it doesn't exist + if err := os.MkdirAll(toolsConfigDir, 0777); err != nil { + return fmt.Errorf("failed to create tools-configs directory: %w", err) + } // API call to fetch settings url := CodacyApiBase + "/2.0/project/analysis/configuration" @@ -201,7 +207,7 @@ func buildRepositoryConfigurationFiles(token string) error { eslintDomainConfiguration := convertAPIToolConfigurationToDomain(*eslintApiConfiguration) eslintConfigurationString := tools.CreateEslintConfig(eslintDomainConfiguration) - eslintConfigFile, err := os.Create(filepath.Join(localCodacyDir, "eslint.config.mjs")) + eslintConfigFile, err := os.Create(filepath.Join(toolsConfigDir, "eslint.config.mjs")) if err != nil { return fmt.Errorf("failed to create eslint config file: %v", err) } @@ -213,7 +219,7 @@ func buildRepositoryConfigurationFiles(token string) error { } fmt.Println("ESLint configuration created based on Codacy settings") } else { - err = createDefaultEslintConfigFile(localCodacyDir) + err = createDefaultEslintConfigFile(toolsConfigDir) if err != nil { return fmt.Errorf("failed to create default ESLint config: %v", err) } @@ -223,13 +229,13 @@ func buildRepositoryConfigurationFiles(token string) error { // Trivy configuration trivyApiConfiguration := extractTrivyConfiguration(apiToolConfigurations) if trivyApiConfiguration != nil { - err = createTrivyConfigFile(*trivyApiConfiguration, localCodacyDir) + err = createTrivyConfigFile(*trivyApiConfiguration, toolsConfigDir) if err != nil { return fmt.Errorf("failed to create Trivy config: %v", err) } fmt.Println("Trivy configuration created based on Codacy settings") } else { - err = createDefaultTrivyConfigFile(localCodacyDir) + err = createDefaultTrivyConfigFile(toolsConfigDir) if err != nil { return fmt.Errorf("failed to create default Trivy config: %v", err) } @@ -239,13 +245,13 @@ func buildRepositoryConfigurationFiles(token string) error { // PMD configuration pmdApiConfiguration := extractPMDConfiguration(apiToolConfigurations) if pmdApiConfiguration != nil { - err = createPMDConfigFile(*pmdApiConfiguration, localCodacyDir) + err = createPMDConfigFile(*pmdApiConfiguration, toolsConfigDir) if err != nil { return fmt.Errorf("failed to create PMD config: %v", err) } fmt.Println("PMD configuration created based on Codacy settings") } else { - err = createDefaultPMDConfigFile(localCodacyDir) + err = createDefaultPMDConfigFile(toolsConfigDir) if err != nil { return fmt.Errorf("failed to create default PMD config: %v", err) } @@ -321,16 +327,16 @@ func extractPMDConfiguration(toolConfigurations []CodacyToolConfiguration) *Coda return nil } -func createPMDConfigFile(config CodacyToolConfiguration, localCodacyDir string) error { +func createPMDConfigFile(config CodacyToolConfiguration, toolsConfigDir string) error { pmdDomainConfiguration := convertAPIToolConfigurationToDomain(config) pmdConfigurationString := tools.CreatePmdConfig(pmdDomainConfiguration) - return os.WriteFile(filepath.Join(localCodacyDir, "pmd-ruleset.xml"), []byte(pmdConfigurationString), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "pmd-ruleset.xml"), []byte(pmdConfigurationString), 0644) } -func createDefaultPMDConfigFile(localCodacyDir string) error { +func createDefaultPMDConfigFile(toolsConfigDir string) error { emptyConfig := tools.ToolConfiguration{} content := tools.CreatePmdConfig(emptyConfig) - return os.WriteFile(filepath.Join(localCodacyDir, "pmd-ruleset.xml"), []byte(content), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "pmd-ruleset.xml"), []byte(content), 0644) } type CodacyToolConfiguration struct { @@ -350,7 +356,7 @@ type ParameterConfiguration struct { } // createTrivyConfigFile creates a trivy.yaml configuration file based on the API configuration -func createTrivyConfigFile(config CodacyToolConfiguration, localCodacyDir string) error { +func createTrivyConfigFile(config CodacyToolConfiguration, toolsConfigDir string) error { // Convert CodacyToolConfiguration to tools.ToolConfiguration trivyDomainConfiguration := convertAPIToolConfigurationForTrivy(config) @@ -358,7 +364,7 @@ func createTrivyConfigFile(config CodacyToolConfiguration, localCodacyDir string trivyConfigurationString := tools.CreateTrivyConfig(trivyDomainConfiguration) // Write to file - return os.WriteFile(filepath.Join(localCodacyDir, "trivy.yaml"), []byte(trivyConfigurationString), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "trivy.yaml"), []byte(trivyConfigurationString), 0644) } // convertAPIToolConfigurationForTrivy converts API tool configuration to domain model for Trivy @@ -402,21 +408,21 @@ func convertAPIToolConfigurationForTrivy(config CodacyToolConfiguration) tools.T } // createDefaultTrivyConfigFile creates a default trivy.yaml configuration file -func createDefaultTrivyConfigFile(localCodacyDir string) error { +func createDefaultTrivyConfigFile(toolsConfigDir string) error { // Use empty tool configuration to get default settings emptyConfig := tools.ToolConfiguration{} content := tools.CreateTrivyConfig(emptyConfig) // Write to file - return os.WriteFile(filepath.Join(localCodacyDir, "trivy.yaml"), []byte(content), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "trivy.yaml"), []byte(content), 0644) } // createDefaultEslintConfigFile creates a default eslint.config.mjs configuration file -func createDefaultEslintConfigFile(localCodacyDir string) error { +func createDefaultEslintConfigFile(toolsConfigDir string) error { // Use empty tool configuration to get default settings emptyConfig := tools.ToolConfiguration{} content := tools.CreateEslintConfig(emptyConfig) // Write to file - return os.WriteFile(filepath.Join(localCodacyDir, "eslint.config.mjs"), []byte(content), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "eslint.config.mjs"), []byte(content), 0644) } From 08979c72baece96781e9cee4ac466b48bf51dfd3 Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Mon, 7 Apr 2025 13:24:41 +0200 Subject: [PATCH 03/11] Runners use conf files form .codacy - Removed cli-config.yaml from the repository and updated .gitignore accordingly. - Added ESLint and Trivy configuration files to the tools-configs directory. - Modified ESLint and Trivy runner functions to utilize the new configuration files. - Cleaned up PMD runner to default to the new ruleset configuration if none is specified. --- .codacy/cli-config.yaml | 1 - .gitignore | 4 +- cmd/analyze.go | 4 +- cmd/init.go | 3 +- config/config.go | 6 +++ tools/eslintConfigCreator.go | 1 - tools/eslintRunner.go | 9 +++++ tools/pmdRunner.go | 37 +++++++++++++------ .../repositories/test1/expected.sarif | 2 +- .../tools-configs}/eslint.config.mjs | 0 .../{ => .codacy/tools-configs}/trivy.yaml | 0 tools/trivyRunner.go | 5 +++ 12 files changed, 51 insertions(+), 21 deletions(-) delete mode 100644 .codacy/cli-config.yaml rename tools/testdata/repositories/test1/src/{ => .codacy/tools-configs}/eslint.config.mjs (100%) rename tools/testdata/repositories/trivy/src/{ => .codacy/tools-configs}/trivy.yaml (100%) diff --git a/.codacy/cli-config.yaml b/.codacy/cli-config.yaml deleted file mode 100644 index 644407e1..00000000 --- a/.codacy/cli-config.yaml +++ /dev/null @@ -1 +0,0 @@ -mode: remote \ No newline at end of file diff --git a/.gitignore b/.gitignore index 272028d1..c5b1dca9 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,6 @@ go.work.sum # Codacy CLI cli-v2 -.codacy/tools-configs \ No newline at end of file +.codacy/cli-config.yaml +.codacy/tools-configs +.codacy/tools-configs/* \ No newline at end of file diff --git a/cmd/analyze.go b/cmd/analyze.go index 56108e0e..8821d501 100644 --- a/cmd/analyze.go +++ b/cmd/analyze.go @@ -20,7 +20,6 @@ var outputFormat string var sarifPath string var commitUuid string var projectToken string -var pmdRulesetFile string type Sarif struct { Runs []struct { @@ -96,7 +95,6 @@ func init() { analyzeCmd.Flags().StringVarP(&toolToAnalyze, "tool", "t", "", "Which tool to run analysis with") analyzeCmd.Flags().StringVar(&outputFormat, "format", "", "Output format (use 'sarif' for SARIF format)") analyzeCmd.Flags().BoolVar(&autoFix, "fix", false, "Apply auto fix to your issues when available") - analyzeCmd.Flags().StringVar(&pmdRulesetFile, "rulesets", "", "Path to PMD ruleset file") rootCmd.AddCommand(analyzeCmd) } @@ -209,7 +207,7 @@ func runPmdAnalysis(workDirectory string, pathsToCheck []string, outputFile stri pmd := config.Config.Tools()["pmd"] pmdBinary := pmd.Binaries["pmd"] - err := tools.RunPmd(workDirectory, pmdBinary, pathsToCheck, outputFile, outputFormat, pmdRulesetFile) + err := tools.RunPmd(workDirectory, pmdBinary, pathsToCheck, outputFile, outputFormat, "") if err != nil { log.Fatalf("Error running PMD: %v", err) } diff --git a/cmd/init.go b/cmd/init.go index 512818ea..928c2c77 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -143,8 +143,7 @@ func buildRepositoryConfigurationFiles(token string) error { fmt.Println("Building repository configuration files ...") fmt.Println("Fetching repository configuration from codacy ...") - localCodacyDir := config.Config.LocalCodacyDirectory() - toolsConfigDir := filepath.Join(localCodacyDir, "tools-configs") + toolsConfigDir := config.Config.ToolsConfigDirectory() // Create tools-configs directory if it doesn't exist if err := os.MkdirAll(toolsConfigDir, 0777); err != nil { diff --git a/config/config.go b/config/config.go index 8bff582d..00e71c1c 100644 --- a/config/config.go +++ b/config/config.go @@ -15,6 +15,7 @@ type ConfigType struct { runtimesDirectory string toolsDirectory string localCodacyDirectory string + toolsConfigDirectory string projectConfigFile string cliConfigFile string @@ -88,11 +89,16 @@ func (c *ConfigType) AddTools(configs []plugins.ToolConfig) error { return nil } +func (c *ConfigType) ToolsConfigDirectory() string { + return c.toolsConfigDirectory +} + func (c *ConfigType) setupCodacyPaths() { c.globalCacheDirectory = filepath.Join(c.homePath, ".cache", "codacy") c.runtimesDirectory = filepath.Join(c.globalCacheDirectory, "runtimes") c.toolsDirectory = filepath.Join(c.globalCacheDirectory, "tools") c.localCodacyDirectory = ".codacy" + c.toolsConfigDirectory = filepath.Join(c.localCodacyDirectory, "tools-configs") c.projectConfigFile = filepath.Join(c.localCodacyDirectory, "codacy.yaml") c.cliConfigFile = filepath.Join(c.localCodacyDirectory, "cli-config.yaml") diff --git a/tools/eslintConfigCreator.go b/tools/eslintConfigCreator.go index f52bf776..2bddf973 100644 --- a/tools/eslintConfigCreator.go +++ b/tools/eslintConfigCreator.go @@ -26,7 +26,6 @@ func CreateEslintConfig(configuration ToolConfiguration) string { for _, patternConfiguration := range configuration.PatternsConfiguration { rule := strings.TrimPrefix(patternConfiguration.PatternId, "ESLint8_") - fmt.Println("Rule:", rule) const tempstring = "TEMPORARYSTRING" rule = strings.ReplaceAll(rule, "__", tempstring) diff --git a/tools/eslintRunner.go b/tools/eslintRunner.go index 798b87f9..35e075fa 100644 --- a/tools/eslintRunner.go +++ b/tools/eslintRunner.go @@ -14,6 +14,15 @@ func RunEslint(repositoryToAnalyseDirectory string, eslintInstallationDirectory eslintJsPath := filepath.Join(eslintInstallationNodeModules, ".bin", "eslint") cmd := exec.Command(nodeBinary, eslintJsPath) + + // For Eslint compatibility with version 8. + // https://eslint.org/docs/v8.x/use/configure/configuration-files-new + cmd.Env = append(cmd.Env, "ESLINT_USE_FLAT_CONFIG=true") + + // Add config file from tools-configs directory + configFile := filepath.Join(".codacy", "tools-configs", "eslint.config.mjs") + cmd.Args = append(cmd.Args, "-c", configFile) + if autoFix { cmd.Args = append(cmd.Args, "--fix") } diff --git a/tools/pmdRunner.go b/tools/pmdRunner.go index 996d30b9..6c7c3081 100644 --- a/tools/pmdRunner.go +++ b/tools/pmdRunner.go @@ -3,39 +3,52 @@ package tools import ( "os" "os/exec" + "path/filepath" "strings" ) // RunPmd executes PMD static code analyzer with the specified options +// +// Parameters: +// - repositoryToAnalyseDirectory: The root directory of the repository to analyze +// - pmdBinary: Path to the PMD executable +// - pathsToCheck: List of specific paths to analyze, if empty analyzes whole repository +// - outputFile: Path where analysis results should be written +// - outputFormat: Format for the output (e.g. "sarif") +// - rulesetFile: Path to custom ruleset XML file, if empty uses default ruleset +// +// Returns: +// - error: nil if analysis succeeds or violations found, error otherwise func RunPmd(repositoryToAnalyseDirectory string, pmdBinary string, pathsToCheck []string, outputFile string, outputFormat string, rulesetFile string) error { - cmdArgs := []string{"pmd"} + cmd := exec.Command(pmdBinary, "pmd") + + // Add config file from tools-configs directory if not specified + if rulesetFile == "" { + configFile := filepath.Join(".codacy", "tools-configs", "pmd-ruleset.xml") + cmd.Args = append(cmd.Args, "-R", configFile) + } else { + cmd.Args = append(cmd.Args, "-R", rulesetFile) + } // Add source directories (comma-separated list for PMD) if len(pathsToCheck) > 0 { dirArg := strings.Join(pathsToCheck, ",") - cmdArgs = append(cmdArgs, "-d", dirArg) + cmd.Args = append(cmd.Args, "-d", dirArg) } else { // Fall back to whole repo if no specific paths given - cmdArgs = append(cmdArgs, "-d", repositoryToAnalyseDirectory) - } - - // Add ruleset - if rulesetFile != "" { - cmdArgs = append(cmdArgs, "-R", rulesetFile) + cmd.Args = append(cmd.Args, "-d", repositoryToAnalyseDirectory) } // Format if outputFormat != "" { - cmdArgs = append(cmdArgs, "-f", outputFormat) + cmd.Args = append(cmd.Args, "-f", outputFormat) } // Output file if outputFile != "" { - cmdArgs = append(cmdArgs, "-r", outputFile) + cmd.Args = append(cmd.Args, "-r", outputFile) } - cmd := exec.Command(pmdBinary, cmdArgs...) - cmd.Dir = repositoryToAnalyseDirectory cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout diff --git a/tools/testdata/repositories/test1/expected.sarif b/tools/testdata/repositories/test1/expected.sarif index 742893c1..baadde16 100644 --- a/tools/testdata/repositories/test1/expected.sarif +++ b/tools/testdata/repositories/test1/expected.sarif @@ -14,7 +14,7 @@ "artifacts": [ { "location": { - "uri": "testdata/repositories/test1/src/eslint.config.mjs" + "uri": "testdata/repositories/test1/src/.codacy/tools-configs/eslint.config.mjs" } }, { diff --git a/tools/testdata/repositories/test1/src/eslint.config.mjs b/tools/testdata/repositories/test1/src/.codacy/tools-configs/eslint.config.mjs similarity index 100% rename from tools/testdata/repositories/test1/src/eslint.config.mjs rename to tools/testdata/repositories/test1/src/.codacy/tools-configs/eslint.config.mjs diff --git a/tools/testdata/repositories/trivy/src/trivy.yaml b/tools/testdata/repositories/trivy/src/.codacy/tools-configs/trivy.yaml similarity index 100% rename from tools/testdata/repositories/trivy/src/trivy.yaml rename to tools/testdata/repositories/trivy/src/.codacy/tools-configs/trivy.yaml diff --git a/tools/trivyRunner.go b/tools/trivyRunner.go index 784a65bb..8cf6a78a 100644 --- a/tools/trivyRunner.go +++ b/tools/trivyRunner.go @@ -3,12 +3,17 @@ package tools import ( "os" "os/exec" + "path/filepath" ) // RunTrivy executes Trivy vulnerability scanner with the specified options func RunTrivy(repositoryToAnalyseDirectory string, trivyBinary string, pathsToCheck []string, outputFile string, outputFormat string) error { cmd := exec.Command(trivyBinary, "fs") + // Add config file from tools-configs directory + configFile := filepath.Join(".codacy", "tools-configs", "trivy.yaml") + cmd.Args = append(cmd.Args, "--config", configFile) + // Add format options if outputFile != "" { cmd.Args = append(cmd.Args, "--output", outputFile) From 0c0680793f1cd928e2c2769b93dfa4e10f3fd844 Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Mon, 7 Apr 2025 17:25:55 +0200 Subject: [PATCH 04/11] revert eslint version --- .codacy/codacy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.codacy/codacy.yaml b/.codacy/codacy.yaml index cc5bd6b6..820f105f 100644 --- a/.codacy/codacy.yaml +++ b/.codacy/codacy.yaml @@ -2,7 +2,7 @@ runtimes: - node@22.2.0 - python@3.11.11 tools: - - eslint@8.57.0 + - eslint@9.3.0 - trivy@0.59.1 - pylint@3.3.6 - pmd@6.55.0 From 3735b88c927b1f5723413ef89e7b3fe4c84643b0 Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Tue, 8 Apr 2025 09:39:40 +0200 Subject: [PATCH 05/11] Add .gitignore file creation in init command - Implemented a function to create a .gitignore file during the initialization of Codacy configuration. - Updated .gitignore to include cli-v2 and removed unnecessary entries. - Ensured the .gitignore file contains relevant entries for Codacy CLI tools. --- .gitignore | 5 +---- cmd/init.go | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index c5b1dca9..6422c1b9 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,4 @@ go.work.sum .vscode/ # Codacy CLI -cli-v2 -.codacy/cli-config.yaml -.codacy/tools-configs -.codacy/tools-configs/* \ No newline at end of file +cli-v2 \ No newline at end of file diff --git a/cmd/init.go b/cmd/init.go index 928c2c77..0da5b22e 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -56,6 +56,7 @@ var initCmd = &cobra.Command{ if err != nil { log.Fatal(err) } + createGitIgnoreFile() } fmt.Println() fmt.Println("✅ Successfully initialized Codacy configuration!") @@ -67,6 +68,27 @@ var initCmd = &cobra.Command{ }, } +func createGitIgnoreFile() error { + gitIgnorePath := filepath.Join(config.Config.LocalCodacyDirectory(), ".gitignore") + gitIgnoreFile, err := os.Create(gitIgnorePath) + if err != nil { + return fmt.Errorf("failed to create .gitignore file: %w", err) + } + defer gitIgnoreFile.Close() + + content := `# Codacy CLI +tools-configs +tools-configs/* +.gitignore +cli-config.yaml +` + if _, err := gitIgnoreFile.WriteString(content); err != nil { + return fmt.Errorf("failed to write to .gitignore file: %w", err) + } + + return nil +} + func createConfigurationFiles(tools []tools.Tool, cliLocalMode bool) error { configFile, err := os.Create(config.Config.ProjectConfigFile()) defer configFile.Close() From 7c209a5a7bb05572b8f4d5994b9df30756d246ad Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Tue, 8 Apr 2025 10:06:03 +0200 Subject: [PATCH 06/11] review improvements --- config/config.go | 4 ++++ tools/eslintRunner.go | 9 +++++---- tools/pmdRunner.go | 3 ++- tools/trivyRunner.go | 3 ++- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/config/config.go b/config/config.go index 00e71c1c..d293c33b 100644 --- a/config/config.go +++ b/config/config.go @@ -43,6 +43,10 @@ func (c *ConfigType) LocalCodacyDirectory() string { return c.localCodacyDirectory } +func (c *ConfigType) ToolsConfigsDirectory() string { + return c.toolsConfigDirectory +} + func (c *ConfigType) ProjectConfigFile() string { return c.projectConfigFile } diff --git a/tools/eslintRunner.go b/tools/eslintRunner.go index 35e075fa..3ae58b0b 100644 --- a/tools/eslintRunner.go +++ b/tools/eslintRunner.go @@ -1,6 +1,7 @@ package tools import ( + "codacy/cli-v2/config" "os" "os/exec" "path/filepath" @@ -20,7 +21,7 @@ func RunEslint(repositoryToAnalyseDirectory string, eslintInstallationDirectory cmd.Env = append(cmd.Env, "ESLINT_USE_FLAT_CONFIG=true") // Add config file from tools-configs directory - configFile := filepath.Join(".codacy", "tools-configs", "eslint.config.mjs") + configFile := filepath.Join(config.Config.ToolsConfigDirectory(), "eslint.config.mjs") cmd.Args = append(cmd.Args, "-c", configFile) if autoFix { @@ -48,9 +49,9 @@ func RunEslint(repositoryToAnalyseDirectory string, eslintInstallationDirectory nodePathEnv := "NODE_PATH=" + eslintInstallationNodeModules cmd.Env = append(cmd.Env, nodePathEnv) - //DEBUG - //fmt.Println(cmd.Env) - //fmt.Println(cmd) + // DEBUG + // fmt.Println(cmd.Env) + // fmt.Println(cmd) // TODO eslint returns 1 when it finds errors, so we're not propagating it cmd.Run() diff --git a/tools/pmdRunner.go b/tools/pmdRunner.go index 6c7c3081..173094d0 100644 --- a/tools/pmdRunner.go +++ b/tools/pmdRunner.go @@ -1,6 +1,7 @@ package tools import ( + "codacy/cli-v2/config" "os" "os/exec" "path/filepath" @@ -24,7 +25,7 @@ func RunPmd(repositoryToAnalyseDirectory string, pmdBinary string, pathsToCheck // Add config file from tools-configs directory if not specified if rulesetFile == "" { - configFile := filepath.Join(".codacy", "tools-configs", "pmd-ruleset.xml") + configFile := filepath.Join(config.Config.ToolsConfigDirectory(), "pmd-ruleset.xml") cmd.Args = append(cmd.Args, "-R", configFile) } else { cmd.Args = append(cmd.Args, "-R", rulesetFile) diff --git a/tools/trivyRunner.go b/tools/trivyRunner.go index 8cf6a78a..b3636087 100644 --- a/tools/trivyRunner.go +++ b/tools/trivyRunner.go @@ -1,6 +1,7 @@ package tools import ( + "codacy/cli-v2/config" "os" "os/exec" "path/filepath" @@ -11,7 +12,7 @@ func RunTrivy(repositoryToAnalyseDirectory string, trivyBinary string, pathsToCh cmd := exec.Command(trivyBinary, "fs") // Add config file from tools-configs directory - configFile := filepath.Join(".codacy", "tools-configs", "trivy.yaml") + configFile := filepath.Join(config.Config.ToolsConfigDirectory(), "trivy.yaml") cmd.Args = append(cmd.Args, "--config", configFile) // Add format options From e0b95d25a3dcf66a15c053a3e133dedd10be402c Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Tue, 8 Apr 2025 10:21:23 +0200 Subject: [PATCH 07/11] Refactor file permission settings in init.go - Updated file creation functions to use `utils.DefaultRW` for read/write permissions instead of hardcoded values. - Ensured consistency in permission settings across PMD and Trivy configuration file creation. --- cmd/init.go | 13 +++++++------ utils/files.go | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 utils/files.go diff --git a/cmd/init.go b/cmd/init.go index 0da5b22e..0c085506 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -3,6 +3,7 @@ package cmd import ( "codacy/cli-v2/config" "codacy/cli-v2/tools" + "codacy/cli-v2/utils" "encoding/json" "errors" "fmt" @@ -168,7 +169,7 @@ func buildRepositoryConfigurationFiles(token string) error { toolsConfigDir := config.Config.ToolsConfigDirectory() // Create tools-configs directory if it doesn't exist - if err := os.MkdirAll(toolsConfigDir, 0777); err != nil { + if err := os.MkdirAll(toolsConfigDir, utils.DefaultDirPerms); err != nil { return fmt.Errorf("failed to create tools-configs directory: %w", err) } @@ -351,13 +352,13 @@ func extractPMDConfiguration(toolConfigurations []CodacyToolConfiguration) *Coda func createPMDConfigFile(config CodacyToolConfiguration, toolsConfigDir string) error { pmdDomainConfiguration := convertAPIToolConfigurationToDomain(config) pmdConfigurationString := tools.CreatePmdConfig(pmdDomainConfiguration) - return os.WriteFile(filepath.Join(toolsConfigDir, "pmd-ruleset.xml"), []byte(pmdConfigurationString), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "pmd-ruleset.xml"), []byte(pmdConfigurationString), utils.DefaultRW) } func createDefaultPMDConfigFile(toolsConfigDir string) error { emptyConfig := tools.ToolConfiguration{} content := tools.CreatePmdConfig(emptyConfig) - return os.WriteFile(filepath.Join(toolsConfigDir, "pmd-ruleset.xml"), []byte(content), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "pmd-ruleset.xml"), []byte(content), utils.DefaultRW) } type CodacyToolConfiguration struct { @@ -385,7 +386,7 @@ func createTrivyConfigFile(config CodacyToolConfiguration, toolsConfigDir string trivyConfigurationString := tools.CreateTrivyConfig(trivyDomainConfiguration) // Write to file - return os.WriteFile(filepath.Join(toolsConfigDir, "trivy.yaml"), []byte(trivyConfigurationString), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "trivy.yaml"), []byte(trivyConfigurationString), utils.DefaultRW) } // convertAPIToolConfigurationForTrivy converts API tool configuration to domain model for Trivy @@ -435,7 +436,7 @@ func createDefaultTrivyConfigFile(toolsConfigDir string) error { content := tools.CreateTrivyConfig(emptyConfig) // Write to file - return os.WriteFile(filepath.Join(toolsConfigDir, "trivy.yaml"), []byte(content), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "trivy.yaml"), []byte(content), utils.DefaultRW) } // createDefaultEslintConfigFile creates a default eslint.config.mjs configuration file @@ -445,5 +446,5 @@ func createDefaultEslintConfigFile(toolsConfigDir string) error { content := tools.CreateEslintConfig(emptyConfig) // Write to file - return os.WriteFile(filepath.Join(toolsConfigDir, "eslint.config.mjs"), []byte(content), 0644) + return os.WriteFile(filepath.Join(toolsConfigDir, "eslint.config.mjs"), []byte(content), utils.DefaultRW) } diff --git a/utils/files.go b/utils/files.go new file mode 100644 index 00000000..a44b9965 --- /dev/null +++ b/utils/files.go @@ -0,0 +1,26 @@ +package utils + +const ( + + // FilePermission represents the default file permission (rw-r--r--) + // This permission gives: + // - read/write (rw-) permissions to the owner + // - read-only (r--) permissions to the group + // - read-only (r--) permissions to others + DefaultRW = 0644 + + // DefaultDirPerms represents the default directory permission (rwxr-xr-x) + // This permission gives: + // - read/write/execute (rwx) permissions to the owner + // - read/execute (r-x) permissions to the group + // - read/execute (r-x) permissions to others + // + // Execute permission on directories is required to: + // - List directory contents (ls) + // - Access files within the directory (cd) + // - Create/delete files in the directory + // Without execute permission, users cannot traverse into or use the directory, + // even if they have read/write permissions on files inside it + + DefaultDirPerms = 0755 // For directories +) From 6a1ed05b63ecba535f7d0e1d5673933501782c79 Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Tue, 8 Apr 2025 10:28:38 +0200 Subject: [PATCH 08/11] Downgrade ESLint version in codacy.yaml from 9.3.0 to 8.57.0 --- .codacy/codacy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.codacy/codacy.yaml b/.codacy/codacy.yaml index 820f105f..cc5bd6b6 100644 --- a/.codacy/codacy.yaml +++ b/.codacy/codacy.yaml @@ -2,7 +2,7 @@ runtimes: - node@22.2.0 - python@3.11.11 tools: - - eslint@9.3.0 + - eslint@8.57.0 - trivy@0.59.1 - pylint@3.3.6 - pmd@6.55.0 From 508e33348a8f0c3c53a235e3ea5f53062c4065d2 Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Tue, 8 Apr 2025 10:30:17 +0200 Subject: [PATCH 09/11] Upgrade ESLint version in codacy.yaml from 8.57.0 to 9.3.0 --- .codacy/codacy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.codacy/codacy.yaml b/.codacy/codacy.yaml index cc5bd6b6..820f105f 100644 --- a/.codacy/codacy.yaml +++ b/.codacy/codacy.yaml @@ -2,7 +2,7 @@ runtimes: - node@22.2.0 - python@3.11.11 tools: - - eslint@8.57.0 + - eslint@9.3.0 - trivy@0.59.1 - pylint@3.3.6 - pmd@6.55.0 From e0a09c4c0714fc23d293e85e91574045efacd82d Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Tue, 8 Apr 2025 11:14:26 +0200 Subject: [PATCH 10/11] fix tests --- tools/testdata/repositories/test1/expected.sarif | 2 +- .../test1/src/{.codacy/tools-configs => }/eslint.config.mjs | 0 .../trivy/src/{.codacy/tools-configs => }/trivy.yaml | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename tools/testdata/repositories/test1/src/{.codacy/tools-configs => }/eslint.config.mjs (100%) rename tools/testdata/repositories/trivy/src/{.codacy/tools-configs => }/trivy.yaml (100%) diff --git a/tools/testdata/repositories/test1/expected.sarif b/tools/testdata/repositories/test1/expected.sarif index baadde16..742893c1 100644 --- a/tools/testdata/repositories/test1/expected.sarif +++ b/tools/testdata/repositories/test1/expected.sarif @@ -14,7 +14,7 @@ "artifacts": [ { "location": { - "uri": "testdata/repositories/test1/src/.codacy/tools-configs/eslint.config.mjs" + "uri": "testdata/repositories/test1/src/eslint.config.mjs" } }, { diff --git a/tools/testdata/repositories/test1/src/.codacy/tools-configs/eslint.config.mjs b/tools/testdata/repositories/test1/src/eslint.config.mjs similarity index 100% rename from tools/testdata/repositories/test1/src/.codacy/tools-configs/eslint.config.mjs rename to tools/testdata/repositories/test1/src/eslint.config.mjs diff --git a/tools/testdata/repositories/trivy/src/.codacy/tools-configs/trivy.yaml b/tools/testdata/repositories/trivy/src/trivy.yaml similarity index 100% rename from tools/testdata/repositories/trivy/src/.codacy/tools-configs/trivy.yaml rename to tools/testdata/repositories/trivy/src/trivy.yaml From ed8f3b70dd02a1e492b9be5ca984cc471ab7f478 Mon Sep 17 00:00:00 2001 From: "andrzej.janczak" Date: Tue, 8 Apr 2025 11:25:56 +0200 Subject: [PATCH 11/11] Update .gitignore entry for tools-configs directory --- cmd/init.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/init.go b/cmd/init.go index 0c085506..c76c8bb7 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -78,8 +78,7 @@ func createGitIgnoreFile() error { defer gitIgnoreFile.Close() content := `# Codacy CLI -tools-configs -tools-configs/* +tools-configs/ .gitignore cli-config.yaml `