From 6e9e305443cf7d4afcbb600322de685beb34c2cf Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Wed, 24 Jan 2024 17:17:14 +0100 Subject: [PATCH] Added vendored libraries to the Sketch object --- internal/arduino/sketch/sketch.go | 48 ++++++++++++++++--- internal/arduino/sketch/sketch_test.go | 8 ++++ .../SketchWithLibraries.ino | 6 +++ .../libraries/MyLib/MyLib.h | 3 ++ .../libraries/MyLib/library.properties | 1 + 5 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 internal/arduino/sketch/testdata/SketchWithLibraries/SketchWithLibraries.ino create mode 100644 internal/arduino/sketch/testdata/SketchWithLibraries/libraries/MyLib/MyLib.h create mode 100644 internal/arduino/sketch/testdata/SketchWithLibraries/libraries/MyLib/library.properties diff --git a/internal/arduino/sketch/sketch.go b/internal/arduino/sketch/sketch.go index 7833823b424..ece159a1bbd 100644 --- a/internal/arduino/sketch/sketch.go +++ b/internal/arduino/sketch/sketch.go @@ -26,6 +26,7 @@ import ( "github.com/arduino/arduino-cli/commands/cmderrors" f "github.com/arduino/arduino-cli/internal/algorithms" "github.com/arduino/arduino-cli/internal/arduino/globals" + "github.com/arduino/arduino-cli/internal/arduino/libraries" "github.com/arduino/arduino-cli/internal/i18n" rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1" "github.com/arduino/go-paths-helper" @@ -33,13 +34,14 @@ import ( // Sketch holds all the files composing a sketch type Sketch struct { - Name string - MainFile *paths.Path - FullPath *paths.Path // FullPath is the path to the Sketch folder - OtherSketchFiles paths.PathList // Sketch files that end in .ino other than main file - AdditionalFiles paths.PathList - RootFolderFiles paths.PathList // All files that are in the Sketch root - Project *Project + Name string + MainFile *paths.Path + FullPath *paths.Path // FullPath is the path to the Sketch folder + OtherSketchFiles paths.PathList // Sketch files that end in .ino other than main file + AdditionalFiles paths.PathList + RootFolderFiles paths.PathList // All files that are in the Sketch root + vendoredLibraries []*libraries.Library // All libraries in the 'libraries' directory in the sketch + Project *Project } var tr = i18n.Tr @@ -148,9 +150,41 @@ func New(path *paths.Path) (*Sketch, error) { sort.Sort(&sketch.OtherSketchFiles) sort.Sort(&sketch.RootFolderFiles) + // Collect vedndored libraries + if librariesPath, ok := sketch.GetVendoredLibrariesDir(); ok { + libDirs, err := librariesPath.ReadDir() + if err != nil { + return nil, fmt.Errorf("%s: %w", tr("reading sketch libraries"), err) + } + libDirs.FilterDirs() + for _, libDir := range libDirs { + lib, err := libraries.Load(libDir, libraries.Unmanaged) + if err != nil { + return nil, fmt.Errorf("%s: %w", tr("reading sketch libraries"), err) + } + sketch.vendoredLibraries = append(sketch.vendoredLibraries, lib) + } + } + return sketch, nil } +// GetVendoredLibrariesDir returns the 'libraries' directory path. +// The result is in the res,ok format ok is true if the 'libraries' directory +// is present in the sketch, false otherwise. +func (s *Sketch) GetVendoredLibrariesDir() (res *paths.Path, ok bool) { + libsDir := s.FullPath.Join("libraries") + if libsDir.IsDir() { + return libsDir, true + } + return nil, false +} + +// VendoredLibraries returns the libraries bundled in the sketch' 'libraries' directory. +func (s *Sketch) VendoredLibraries() []*libraries.Library { + return s.vendoredLibraries +} + // supportedFiles reads all files recursively contained in Sketch and // filter out unneded or unsupported ones and returns them func (s *Sketch) supportedFiles() (paths.PathList, error) { diff --git a/internal/arduino/sketch/sketch_test.go b/internal/arduino/sketch/sketch_test.go index 9f18e45c591..f586e0f911f 100644 --- a/internal/arduino/sketch/sketch_test.go +++ b/internal/arduino/sketch/sketch_test.go @@ -387,3 +387,11 @@ func TestSketchWithMultipleSymlinkLoops(t *testing.T) { require.Error(t, err) require.Nil(t, sketch) } + +func TestSketchWithVendoredLibraries(t *testing.T) { + sketchPath := paths.New("testdata", "SketchWithLibraries") + sk, err := New(sketchPath) + require.NoError(t, err) + require.Len(t, sk.vendoredLibraries, 1) + require.Equal(t, "MyLib", sk.vendoredLibraries[0].Name) +} diff --git a/internal/arduino/sketch/testdata/SketchWithLibraries/SketchWithLibraries.ino b/internal/arduino/sketch/testdata/SketchWithLibraries/SketchWithLibraries.ino new file mode 100644 index 00000000000..b66e280362f --- /dev/null +++ b/internal/arduino/sketch/testdata/SketchWithLibraries/SketchWithLibraries.ino @@ -0,0 +1,6 @@ +#include + +void setup() {} +void loop() { + myFunction(); +} diff --git a/internal/arduino/sketch/testdata/SketchWithLibraries/libraries/MyLib/MyLib.h b/internal/arduino/sketch/testdata/SketchWithLibraries/libraries/MyLib/MyLib.h new file mode 100644 index 00000000000..5ed3d655e94 --- /dev/null +++ b/internal/arduino/sketch/testdata/SketchWithLibraries/libraries/MyLib/MyLib.h @@ -0,0 +1,3 @@ + +void myFunction() { +} diff --git a/internal/arduino/sketch/testdata/SketchWithLibraries/libraries/MyLib/library.properties b/internal/arduino/sketch/testdata/SketchWithLibraries/libraries/MyLib/library.properties new file mode 100644 index 00000000000..6c3124235ce --- /dev/null +++ b/internal/arduino/sketch/testdata/SketchWithLibraries/libraries/MyLib/library.properties @@ -0,0 +1 @@ +name=MyLib