@@ -209,6 +209,7 @@ var configDiscoverCmd = &cobra.Command{
209209 }
210210
211211 codacyYAMLPath := config .Config .ProjectConfigFile ()
212+
212213 if err := updateCodacyYAML (detectedLanguages , codacyYAMLPath , defaultToolLangMap , configResetInitFlags , currentCliMode ); err != nil {
213214 if strings .Contains (err .Error (), "❌ Fatal:" ) {
214215 fmt .Println (err )
@@ -245,81 +246,46 @@ var configDiscoverCmd = &cobra.Command{
245246// updateLanguagesConfig updates the .codacy/tools-configs/languages-config.yaml file.
246247func updateLanguagesConfig (detectedLanguages map [string ]struct {}, toolsConfigDir string , defaultToolLangMap map [string ]domain.ToolLanguageInfo ) error {
247248 langConfigPath := filepath .Join (toolsConfigDir , "languages-config.yaml" )
248- var langConf domain.LanguagesConfig
249-
250- if _ , err := os .Stat (langConfigPath ); err == nil {
251- data , err := os .ReadFile (langConfigPath )
252- if err != nil {
253- return fmt .Errorf ("failed to read existing languages-config.yaml: %w" , err )
254- }
255- if err := yaml .Unmarshal (data , & langConf ); err != nil {
256- return fmt .Errorf ("failed to parse existing languages-config.yaml: %w" , err )
257- }
258- } else if ! os .IsNotExist (err ) {
259- return fmt .Errorf ("failed to stat languages-config.yaml: %w" , err )
260- }
261249
262- // Create a map of existing tools for easier update
263- existingToolsMap := make (map [string ]* domain.ToolLanguageInfo )
264- for i := range langConf .Tools {
265- existingToolsMap [langConf .Tools [i ].Name ] = & langConf .Tools [i ]
266- }
250+ // Create a fresh languages config based only on detected languages
251+ // This ensures we only include tools relevant to the currently detected languages
252+ var langConf domain.LanguagesConfig
267253
268254 for toolName , toolInfoFromDefaults := range defaultToolLangMap {
269255 isRelevantTool := false
270256 relevantLangsForThisTool := []string {}
271257 relevantExtsForThisToolMap := make (map [string ]struct {})
272258
259+ // Only include languages that are both supported by the tool AND actually detected
273260 for _ , langDefault := range toolInfoFromDefaults .Languages {
274261 if _ , isDetected := detectedLanguages [langDefault ]; isDetected {
275262 isRelevantTool = true
276263 if ! slices .Contains (relevantLangsForThisTool , langDefault ) {
277264 relevantLangsForThisTool = append (relevantLangsForThisTool , langDefault )
278265 }
279- // Add extensions associated with this detected language for this tool
280- for _ , defaultExt := range toolInfoFromDefaults .Extensions {
281- // A simple heuristic: if a tool supports a language, and that language is detected,
282- // all default extensions of that tool for that language group are considered relevant.
283- // This assumes toolInfoFromDefaults.Extensions are relevant for all toolInfoFromDefaults.Languages.
284- // A more precise mapping might be needed if a tool's extensions vary significantly per language it supports.
285- relevantExtsForThisToolMap [defaultExt ] = struct {}{}
286- }
266+ }
267+ }
268+
269+ // Only add extensions for the languages that were actually detected
270+ if isRelevantTool {
271+ // Add only extensions that correspond to detected languages
272+ // For now, we'll include all extensions of a relevant tool, but this could be refined
273+ for _ , defaultExt := range toolInfoFromDefaults .Extensions {
274+ relevantExtsForThisToolMap [defaultExt ] = struct {}{}
287275 }
288276 }
289277
290278 if isRelevantTool {
291279 relevantExtsForThisTool := config .GetSortedKeys (relevantExtsForThisToolMap )
292280 sort .Strings (relevantLangsForThisTool )
293281
294- if existingEntry , ok := existingToolsMap [toolName ]; ok {
295- // Merge languages and extensions, keeping them unique and sorted
296- existingLangsSet := make (map [string ]struct {})
297- for _ , lang := range existingEntry .Languages {
298- existingLangsSet [lang ] = struct {}{}
299- }
300- for _ , lang := range relevantLangsForThisTool {
301- existingLangsSet [lang ] = struct {}{}
302- }
303- existingEntry .Languages = config .GetSortedKeys (existingLangsSet )
304-
305- existingExtsSet := make (map [string ]struct {})
306- for _ , ext := range existingEntry .Extensions {
307- existingExtsSet [ext ] = struct {}{}
308- }
309- for _ , ext := range relevantExtsForThisTool {
310- existingExtsSet [ext ] = struct {}{}
311- }
312- existingEntry .Extensions = config .GetSortedKeys (existingExtsSet )
313-
314- } else {
315- newEntry := domain.ToolLanguageInfo {
316- Name : toolName ,
317- Languages : relevantLangsForThisTool ,
318- Extensions : relevantExtsForThisTool ,
319- }
320- langConf .Tools = append (langConf .Tools , newEntry )
321- existingToolsMap [toolName ] = & langConf .Tools [len (langConf .Tools )- 1 ] // update map with pointer to new entry
282+ // Create a new entry for each relevant tool
283+ newEntry := domain.ToolLanguageInfo {
284+ Name : toolName ,
285+ Languages : relevantLangsForThisTool ,
286+ Extensions : relevantExtsForThisTool ,
322287 }
288+ langConf .Tools = append (langConf .Tools , newEntry )
323289 }
324290 }
325291
@@ -340,6 +306,7 @@ func updateLanguagesConfig(detectedLanguages map[string]struct{}, toolsConfigDir
340306
341307// updateCodacyYAML updates the codacy.yaml file with newly relevant tools.
342308func updateCodacyYAML (detectedLanguages map [string ]struct {}, codacyYAMLPath string , defaultToolLangMap map [string ]domain.ToolLanguageInfo , initFlags domain.InitFlags , cliMode string ) error {
309+
343310 var configData map [string ]interface {}
344311
345312 // Read and parse codacy.yaml (validation is done globally in PersistentPreRun)
@@ -411,9 +378,12 @@ func updateCodacyYAML(detectedLanguages map[string]struct{}, codacyYAMLPath stri
411378 }
412379
413380 defaultToolVersions := plugins .GetToolVersions ()
414- finalToolsList := currentToolsList // Start with existing tools
415381
382+ // Discover mode: preserve existing tools and add only new discovered ones
383+ finalToolsList := currentToolsList // Start with existing tools
416384 addedNewTool := false
385+
386+ // Add only newly discovered tools that aren't already configured
417387 for toolNameToAdd := range candidateToolsToAdd {
418388 if _ , alreadyConfigured := currentToolSetByName [toolNameToAdd ]; ! alreadyConfigured {
419389 version , ok := defaultToolVersions [toolNameToAdd ]
@@ -502,6 +472,7 @@ func updateCodacyYAML(detectedLanguages map[string]struct{}, codacyYAMLPath stri
502472 if err := os .MkdirAll (filepath .Dir (codacyYAMLPath ), utils .DefaultDirPerms ); err != nil {
503473 return fmt .Errorf ("error creating .codacy directory: %w" , err )
504474 }
475+
505476 return os .WriteFile (codacyYAMLPath , yamlData , utils .DefaultFilePerms )
506477}
507478
0 commit comments