Skip to content

Commit 93219d2

Browse files
authored
Merge pull request #59 from codacy/PLUTO-1382-change-tool-configs-location
Pluto 1382 change tools configs location
2 parents 6ed461d + ed8f3b7 commit 93219d2

File tree

10 files changed

+130
-37
lines changed

10 files changed

+130
-37
lines changed

.codacy/cli-config.yaml

Lines changed: 0 additions & 1 deletion
This file was deleted.

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ go.work.sum
2424
.idea/
2525
.vscode/
2626

27-
cli-v2
27+
# Codacy CLI
28+
cli-v2

cmd/analyze.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ var outputFormat string
2020
var sarifPath string
2121
var commitUuid string
2222
var projectToken string
23-
var pmdRulesetFile string
2423

2524
type Sarif struct {
2625
Runs []struct {
@@ -96,7 +95,6 @@ func init() {
9695
analyzeCmd.Flags().StringVarP(&toolToAnalyze, "tool", "t", "", "Which tool to run analysis with")
9796
analyzeCmd.Flags().StringVar(&outputFormat, "format", "", "Output format (use 'sarif' for SARIF format)")
9897
analyzeCmd.Flags().BoolVar(&autoFix, "fix", false, "Apply auto fix to your issues when available")
99-
analyzeCmd.Flags().StringVar(&pmdRulesetFile, "rulesets", "", "Path to PMD ruleset file")
10098
rootCmd.AddCommand(analyzeCmd)
10199
}
102100

@@ -209,7 +207,7 @@ func runPmdAnalysis(workDirectory string, pathsToCheck []string, outputFile stri
209207
pmd := config.Config.Tools()["pmd"]
210208
pmdBinary := pmd.Binaries["pmd"]
211209

212-
err := tools.RunPmd(workDirectory, pmdBinary, pathsToCheck, outputFile, outputFormat, pmdRulesetFile)
210+
err := tools.RunPmd(workDirectory, pmdBinary, pathsToCheck, outputFile, outputFormat, "")
213211
if err != nil {
214212
log.Fatalf("Error running PMD: %v", err)
215213
}

cmd/init.go

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package cmd
33
import (
44
"codacy/cli-v2/config"
55
"codacy/cli-v2/tools"
6+
"codacy/cli-v2/utils"
67
"encoding/json"
78
"errors"
89
"fmt"
910
"io"
1011
"log"
1112
"net/http"
1213
"os"
14+
"path/filepath"
1315
"time"
1416

1517
"github.com/spf13/cobra"
@@ -55,6 +57,7 @@ var initCmd = &cobra.Command{
5557
if err != nil {
5658
log.Fatal(err)
5759
}
60+
createGitIgnoreFile()
5861
}
5962
fmt.Println()
6063
fmt.Println("✅ Successfully initialized Codacy configuration!")
@@ -66,6 +69,26 @@ var initCmd = &cobra.Command{
6669
},
6770
}
6871

72+
func createGitIgnoreFile() error {
73+
gitIgnorePath := filepath.Join(config.Config.LocalCodacyDirectory(), ".gitignore")
74+
gitIgnoreFile, err := os.Create(gitIgnorePath)
75+
if err != nil {
76+
return fmt.Errorf("failed to create .gitignore file: %w", err)
77+
}
78+
defer gitIgnoreFile.Close()
79+
80+
content := `# Codacy CLI
81+
tools-configs/
82+
.gitignore
83+
cli-config.yaml
84+
`
85+
if _, err := gitIgnoreFile.WriteString(content); err != nil {
86+
return fmt.Errorf("failed to write to .gitignore file: %w", err)
87+
}
88+
89+
return nil
90+
}
91+
6992
func createConfigurationFiles(tools []tools.Tool, cliLocalMode bool) error {
7093
configFile, err := os.Create(config.Config.ProjectConfigFile())
7194
defer configFile.Close()
@@ -142,6 +165,13 @@ func buildRepositoryConfigurationFiles(token string) error {
142165
fmt.Println("Building repository configuration files ...")
143166
fmt.Println("Fetching repository configuration from codacy ...")
144167

168+
toolsConfigDir := config.Config.ToolsConfigDirectory()
169+
170+
// Create tools-configs directory if it doesn't exist
171+
if err := os.MkdirAll(toolsConfigDir, utils.DefaultDirPerms); err != nil {
172+
return fmt.Errorf("failed to create tools-configs directory: %w", err)
173+
}
174+
145175
// API call to fetch settings
146176
url := CodacyApiBase + "/2.0/project/analysis/configuration"
147177

@@ -198,7 +228,7 @@ func buildRepositoryConfigurationFiles(token string) error {
198228
eslintDomainConfiguration := convertAPIToolConfigurationToDomain(*eslintApiConfiguration)
199229
eslintConfigurationString := tools.CreateEslintConfig(eslintDomainConfiguration)
200230

201-
eslintConfigFile, err := os.Create("eslint.config.mjs")
231+
eslintConfigFile, err := os.Create(filepath.Join(toolsConfigDir, "eslint.config.mjs"))
202232
if err != nil {
203233
return fmt.Errorf("failed to create eslint config file: %v", err)
204234
}
@@ -210,7 +240,7 @@ func buildRepositoryConfigurationFiles(token string) error {
210240
}
211241
fmt.Println("ESLint configuration created based on Codacy settings")
212242
} else {
213-
err = createDefaultEslintConfigFile()
243+
err = createDefaultEslintConfigFile(toolsConfigDir)
214244
if err != nil {
215245
return fmt.Errorf("failed to create default ESLint config: %v", err)
216246
}
@@ -220,13 +250,13 @@ func buildRepositoryConfigurationFiles(token string) error {
220250
// Trivy configuration
221251
trivyApiConfiguration := extractTrivyConfiguration(apiToolConfigurations)
222252
if trivyApiConfiguration != nil {
223-
err = createTrivyConfigFile(*trivyApiConfiguration)
253+
err = createTrivyConfigFile(*trivyApiConfiguration, toolsConfigDir)
224254
if err != nil {
225255
return fmt.Errorf("failed to create Trivy config: %v", err)
226256
}
227257
fmt.Println("Trivy configuration created based on Codacy settings")
228258
} else {
229-
err = createDefaultTrivyConfigFile()
259+
err = createDefaultTrivyConfigFile(toolsConfigDir)
230260
if err != nil {
231261
return fmt.Errorf("failed to create default Trivy config: %v", err)
232262
}
@@ -236,13 +266,13 @@ func buildRepositoryConfigurationFiles(token string) error {
236266
// PMD configuration
237267
pmdApiConfiguration := extractPMDConfiguration(apiToolConfigurations)
238268
if pmdApiConfiguration != nil {
239-
err = createPMDConfigFile(*pmdApiConfiguration)
269+
err = createPMDConfigFile(*pmdApiConfiguration, toolsConfigDir)
240270
if err != nil {
241271
return fmt.Errorf("failed to create PMD config: %v", err)
242272
}
243273
fmt.Println("PMD configuration created based on Codacy settings")
244274
} else {
245-
err = createDefaultPMDConfigFile()
275+
err = createDefaultPMDConfigFile(toolsConfigDir)
246276
if err != nil {
247277
return fmt.Errorf("failed to create default PMD config: %v", err)
248278
}
@@ -318,16 +348,16 @@ func extractPMDConfiguration(toolConfigurations []CodacyToolConfiguration) *Coda
318348
return nil
319349
}
320350

321-
func createPMDConfigFile(config CodacyToolConfiguration) error {
351+
func createPMDConfigFile(config CodacyToolConfiguration, toolsConfigDir string) error {
322352
pmdDomainConfiguration := convertAPIToolConfigurationToDomain(config)
323353
pmdConfigurationString := tools.CreatePmdConfig(pmdDomainConfiguration)
324-
return os.WriteFile("pmd-ruleset.xml", []byte(pmdConfigurationString), 0644)
354+
return os.WriteFile(filepath.Join(toolsConfigDir, "pmd-ruleset.xml"), []byte(pmdConfigurationString), utils.DefaultRW)
325355
}
326356

327-
func createDefaultPMDConfigFile() error {
357+
func createDefaultPMDConfigFile(toolsConfigDir string) error {
328358
emptyConfig := tools.ToolConfiguration{}
329359
content := tools.CreatePmdConfig(emptyConfig)
330-
return os.WriteFile("pmd-ruleset.xml", []byte(content), 0644)
360+
return os.WriteFile(filepath.Join(toolsConfigDir, "pmd-ruleset.xml"), []byte(content), utils.DefaultRW)
331361
}
332362

333363
type CodacyToolConfiguration struct {
@@ -347,15 +377,15 @@ type ParameterConfiguration struct {
347377
}
348378

349379
// createTrivyConfigFile creates a trivy.yaml configuration file based on the API configuration
350-
func createTrivyConfigFile(config CodacyToolConfiguration) error {
380+
func createTrivyConfigFile(config CodacyToolConfiguration, toolsConfigDir string) error {
351381
// Convert CodacyToolConfiguration to tools.ToolConfiguration
352382
trivyDomainConfiguration := convertAPIToolConfigurationForTrivy(config)
353383

354384
// Use the shared CreateTrivyConfig function to generate the config content
355385
trivyConfigurationString := tools.CreateTrivyConfig(trivyDomainConfiguration)
356386

357387
// Write to file
358-
return os.WriteFile("trivy.yaml", []byte(trivyConfigurationString), 0644)
388+
return os.WriteFile(filepath.Join(toolsConfigDir, "trivy.yaml"), []byte(trivyConfigurationString), utils.DefaultRW)
359389
}
360390

361391
// convertAPIToolConfigurationForTrivy converts API tool configuration to domain model for Trivy
@@ -399,21 +429,21 @@ func convertAPIToolConfigurationForTrivy(config CodacyToolConfiguration) tools.T
399429
}
400430

401431
// createDefaultTrivyConfigFile creates a default trivy.yaml configuration file
402-
func createDefaultTrivyConfigFile() error {
432+
func createDefaultTrivyConfigFile(toolsConfigDir string) error {
403433
// Use empty tool configuration to get default settings
404434
emptyConfig := tools.ToolConfiguration{}
405435
content := tools.CreateTrivyConfig(emptyConfig)
406436

407437
// Write to file
408-
return os.WriteFile("trivy.yaml", []byte(content), 0644)
438+
return os.WriteFile(filepath.Join(toolsConfigDir, "trivy.yaml"), []byte(content), utils.DefaultRW)
409439
}
410440

411441
// createDefaultEslintConfigFile creates a default eslint.config.mjs configuration file
412-
func createDefaultEslintConfigFile() error {
442+
func createDefaultEslintConfigFile(toolsConfigDir string) error {
413443
// Use empty tool configuration to get default settings
414444
emptyConfig := tools.ToolConfiguration{}
415445
content := tools.CreateEslintConfig(emptyConfig)
416446

417447
// Write to file
418-
return os.WriteFile("eslint.config.mjs", []byte(content), 0644)
448+
return os.WriteFile(filepath.Join(toolsConfigDir, "eslint.config.mjs"), []byte(content), utils.DefaultRW)
419449
}

config/config.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type ConfigType struct {
1515
runtimesDirectory string
1616
toolsDirectory string
1717
localCodacyDirectory string
18+
toolsConfigDirectory string
1819
projectConfigFile string
1920
cliConfigFile string
2021

@@ -42,6 +43,10 @@ func (c *ConfigType) LocalCodacyDirectory() string {
4243
return c.localCodacyDirectory
4344
}
4445

46+
func (c *ConfigType) ToolsConfigsDirectory() string {
47+
return c.toolsConfigDirectory
48+
}
49+
4550
func (c *ConfigType) ProjectConfigFile() string {
4651
return c.projectConfigFile
4752
}
@@ -88,11 +93,16 @@ func (c *ConfigType) AddTools(configs []plugins.ToolConfig) error {
8893
return nil
8994
}
9095

96+
func (c *ConfigType) ToolsConfigDirectory() string {
97+
return c.toolsConfigDirectory
98+
}
99+
91100
func (c *ConfigType) setupCodacyPaths() {
92101
c.globalCacheDirectory = filepath.Join(c.homePath, ".cache", "codacy")
93102
c.runtimesDirectory = filepath.Join(c.globalCacheDirectory, "runtimes")
94103
c.toolsDirectory = filepath.Join(c.globalCacheDirectory, "tools")
95104
c.localCodacyDirectory = ".codacy"
105+
c.toolsConfigDirectory = filepath.Join(c.localCodacyDirectory, "tools-configs")
96106

97107
c.projectConfigFile = filepath.Join(c.localCodacyDirectory, "codacy.yaml")
98108
c.cliConfigFile = filepath.Join(c.localCodacyDirectory, "cli-config.yaml")

tools/eslintConfigCreator.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ func CreateEslintConfig(configuration ToolConfiguration) string {
2626

2727
for _, patternConfiguration := range configuration.PatternsConfiguration {
2828
rule := strings.TrimPrefix(patternConfiguration.PatternId, "ESLint8_")
29-
fmt.Println("Rule:", rule)
3029

3130
const tempstring = "TEMPORARYSTRING"
3231
rule = strings.ReplaceAll(rule, "__", tempstring)

tools/eslintRunner.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package tools
22

33
import (
4+
"codacy/cli-v2/config"
45
"os"
56
"os/exec"
67
"path/filepath"
@@ -14,6 +15,15 @@ func RunEslint(repositoryToAnalyseDirectory string, eslintInstallationDirectory
1415
eslintJsPath := filepath.Join(eslintInstallationNodeModules, ".bin", "eslint")
1516

1617
cmd := exec.Command(nodeBinary, eslintJsPath)
18+
19+
// For Eslint compatibility with version 8.
20+
// https://eslint.org/docs/v8.x/use/configure/configuration-files-new
21+
cmd.Env = append(cmd.Env, "ESLINT_USE_FLAT_CONFIG=true")
22+
23+
// Add config file from tools-configs directory
24+
configFile := filepath.Join(config.Config.ToolsConfigDirectory(), "eslint.config.mjs")
25+
cmd.Args = append(cmd.Args, "-c", configFile)
26+
1727
if autoFix {
1828
cmd.Args = append(cmd.Args, "--fix")
1929
}
@@ -39,9 +49,9 @@ func RunEslint(repositoryToAnalyseDirectory string, eslintInstallationDirectory
3949
nodePathEnv := "NODE_PATH=" + eslintInstallationNodeModules
4050
cmd.Env = append(cmd.Env, nodePathEnv)
4151

42-
//DEBUG
43-
//fmt.Println(cmd.Env)
44-
//fmt.Println(cmd)
52+
// DEBUG
53+
// fmt.Println(cmd.Env)
54+
// fmt.Println(cmd)
4555

4656
// TODO eslint returns 1 when it finds errors, so we're not propagating it
4757
cmd.Run()

tools/pmdRunner.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,55 @@
11
package tools
22

33
import (
4+
"codacy/cli-v2/config"
45
"os"
56
"os/exec"
7+
"path/filepath"
68
"strings"
79
)
810

911
// RunPmd executes PMD static code analyzer with the specified options
12+
//
13+
// Parameters:
14+
// - repositoryToAnalyseDirectory: The root directory of the repository to analyze
15+
// - pmdBinary: Path to the PMD executable
16+
// - pathsToCheck: List of specific paths to analyze, if empty analyzes whole repository
17+
// - outputFile: Path where analysis results should be written
18+
// - outputFormat: Format for the output (e.g. "sarif")
19+
// - rulesetFile: Path to custom ruleset XML file, if empty uses default ruleset
20+
//
21+
// Returns:
22+
// - error: nil if analysis succeeds or violations found, error otherwise
1023
func RunPmd(repositoryToAnalyseDirectory string, pmdBinary string, pathsToCheck []string, outputFile string, outputFormat string, rulesetFile string) error {
11-
cmdArgs := []string{"pmd"}
24+
cmd := exec.Command(pmdBinary, "pmd")
25+
26+
// Add config file from tools-configs directory if not specified
27+
if rulesetFile == "" {
28+
configFile := filepath.Join(config.Config.ToolsConfigDirectory(), "pmd-ruleset.xml")
29+
cmd.Args = append(cmd.Args, "-R", configFile)
30+
} else {
31+
cmd.Args = append(cmd.Args, "-R", rulesetFile)
32+
}
1233

1334
// Add source directories (comma-separated list for PMD)
1435
if len(pathsToCheck) > 0 {
1536
dirArg := strings.Join(pathsToCheck, ",")
16-
cmdArgs = append(cmdArgs, "-d", dirArg)
37+
cmd.Args = append(cmd.Args, "-d", dirArg)
1738
} else {
1839
// Fall back to whole repo if no specific paths given
19-
cmdArgs = append(cmdArgs, "-d", repositoryToAnalyseDirectory)
20-
}
21-
22-
// Add ruleset
23-
if rulesetFile != "" {
24-
cmdArgs = append(cmdArgs, "-R", rulesetFile)
40+
cmd.Args = append(cmd.Args, "-d", repositoryToAnalyseDirectory)
2541
}
2642

2743
// Format
2844
if outputFormat != "" {
29-
cmdArgs = append(cmdArgs, "-f", outputFormat)
45+
cmd.Args = append(cmd.Args, "-f", outputFormat)
3046
}
3147

3248
// Output file
3349
if outputFile != "" {
34-
cmdArgs = append(cmdArgs, "-r", outputFile)
50+
cmd.Args = append(cmd.Args, "-r", outputFile)
3551
}
3652

37-
cmd := exec.Command(pmdBinary, cmdArgs...)
38-
3953
cmd.Dir = repositoryToAnalyseDirectory
4054
cmd.Stderr = os.Stderr
4155
cmd.Stdout = os.Stdout

tools/trivyRunner.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package tools
22

33
import (
4+
"codacy/cli-v2/config"
45
"os"
56
"os/exec"
7+
"path/filepath"
68
)
79

810
// RunTrivy executes Trivy vulnerability scanner with the specified options
911
func RunTrivy(repositoryToAnalyseDirectory string, trivyBinary string, pathsToCheck []string, outputFile string, outputFormat string) error {
1012
cmd := exec.Command(trivyBinary, "fs")
1113

14+
// Add config file from tools-configs directory
15+
configFile := filepath.Join(config.Config.ToolsConfigDirectory(), "trivy.yaml")
16+
cmd.Args = append(cmd.Args, "--config", configFile)
17+
1218
// Add format options
1319
if outputFile != "" {
1420
cmd.Args = append(cmd.Args, "--output", outputFile)

0 commit comments

Comments
 (0)