diff --git a/internal/arduino/libraries/librariesmanager/librariesmanager.go b/internal/arduino/libraries/librariesmanager/librariesmanager.go index df0dc874376..9f0bd168ec6 100644 --- a/internal/arduino/libraries/librariesmanager/librariesmanager.go +++ b/internal/arduino/libraries/librariesmanager/librariesmanager.go @@ -49,6 +49,7 @@ type LibrariesDir struct { Path *paths.Path Location libraries.LibraryLocation PlatformRelease *cores.PlatformRelease + IsSingleLibrary bool // true if Path points directly to a library instad of a dir of libraries } var tr = i18n.Tr @@ -113,6 +114,7 @@ func (lm *LibrariesManager) AddLibrariesDir(libDir *LibrariesDir) { } logrus.WithField("dir", libDir.Path). WithField("location", libDir.Location.String()). + WithField("isSingleLibrary", libDir.IsSingleLibrary). Info("Adding libraries dir") lm.LibrariesDir = append(lm.LibrariesDir, libDir) } @@ -122,7 +124,7 @@ func (lm *LibrariesManager) RescanLibraries() []*status.Status { lm.clearLibraries() statuses := []*status.Status{} for _, dir := range lm.LibrariesDir { - if errs := lm.LoadLibrariesFromDir(dir); len(errs) > 0 { + if errs := lm.loadLibrariesFromDir(dir); len(errs) > 0 { statuses = append(statuses, errs...) } } @@ -145,22 +147,29 @@ func (lm *LibrariesManager) getLibrariesDir(installLocation libraries.LibraryLoc } } -// LoadLibrariesFromDir loads all libraries in the given directory. Returns +// loadLibrariesFromDir loads all libraries in the given directory. Returns // nil if the directory doesn't exists. -func (lm *LibrariesManager) LoadLibrariesFromDir(librariesDir *LibrariesDir) []*status.Status { +func (lm *LibrariesManager) loadLibrariesFromDir(librariesDir *LibrariesDir) []*status.Status { statuses := []*status.Status{} - subDirs, err := librariesDir.Path.ReadDir() - if os.IsNotExist(err) { - return statuses - } - if err != nil { - s := status.Newf(codes.FailedPrecondition, tr("reading dir %[1]s: %[2]s"), librariesDir.Path, err) - return append(statuses, s) + + var libDirs paths.PathList + if librariesDir.IsSingleLibrary { + libDirs.Add(librariesDir.Path) + } else { + d, err := librariesDir.Path.ReadDir() + if os.IsNotExist(err) { + return statuses + } + if err != nil { + s := status.Newf(codes.FailedPrecondition, tr("reading dir %[1]s: %[2]s"), librariesDir.Path, err) + return append(statuses, s) + } + d.FilterDirs() + d.FilterOutHiddenFiles() + libDirs = d } - subDirs.FilterDirs() - subDirs.FilterOutHiddenFiles() - for _, subDir := range subDirs { + for _, subDir := range libDirs { library, err := libraries.Load(subDir, librariesDir.Location) if err != nil { s := status.Newf(codes.Internal, tr("loading library from %[1]s: %[2]s"), subDir, err)