@@ -526,13 +526,13 @@ func (s *registeredPlugins) Add(baseMod BasePlugin, cliMod CommandLineMod, drMod
526526func (s * registeredPlugins ) add (baseMod BasePlugin , cliMod CommandLineMod , drMod DependencyResolverMod , yamlMod CommandLineMod ) error {
527527 var info * PluginInfoResponse
528528 var err error
529- if baseMod != nil {
530- info , err = baseMod .PluginInfo ()
529+ if yamlMod != nil {
530+ info , err = yamlMod .PluginInfo ()
531531 if err != nil {
532532 return err
533533 }
534534 } else {
535- info , err = yamlMod .PluginInfo ()
535+ info , err = baseMod .PluginInfo ()
536536 if err != nil {
537537 return err
538538 }
@@ -542,11 +542,6 @@ func (s *registeredPlugins) add(baseMod BasePlugin, cliMod CommandLineMod, drMod
542542 return errors .New ("plugin name cannot be empty" )
543543 }
544544
545- // check if name is already used
546- if _ , ok := s .data [info .Name ]; ok {
547- return fmt .Errorf ("plugin name already in use %s" , info .Name )
548- }
549-
550545 // image is a required field
551546 if info .Image == "" {
552547 return errors .New ("plugin image cannot be empty" )
@@ -564,6 +559,19 @@ func (s *registeredPlugins) add(baseMod BasePlugin, cliMod CommandLineMod, drMod
564559 return ErrUnsupportedPlugin
565560 }
566561
562+ isCandidatePluginYaml := yamlMod != nil
563+ existingPlugin , alreadyPresent := s .data [info .Name ]
564+ if alreadyPresent {
565+ if existingPlugin .IsYamlPlugin () == isCandidatePluginYaml {
566+ return fmt .Errorf ("plugin name already in use %s" , info .Name )
567+ }
568+ // merge plugin case : existing plugin is binary and candidate is yaml
569+ // (as binaries are loaded first)
570+ s .data [info .Name ].YamlMod = yamlMod
571+ return nil
572+ }
573+
574+ // creating new plugin
567575 s .data [info .Name ] = & Plugin {
568576 Base : baseMod ,
569577 CLIMod : cliMod ,
0 commit comments