Skip to content

Commit

Permalink
Removed libraries index from library manager
Browse files Browse the repository at this point in the history
The presence of the index inside LibraryManager didn't give any
functional benefit.
  • Loading branch information
cmaglie committed Dec 27, 2023
1 parent 8252c6b commit 34f02ac
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 58 deletions.
22 changes: 17 additions & 5 deletions commands/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,6 @@ func Init(req *rpc.InitRequest, responseCallback func(r *rpc.InitResponse)) erro

// Create library manager and add libraries directories
lm := librariesmanager.NewLibraryManager(
pme.IndexDir,
pme.DownloadDir,
)
_ = instances.SetLibraryManager(instance, lm) // should never fail
Expand All @@ -320,10 +319,21 @@ func Init(req *rpc.InitRequest, responseCallback func(r *rpc.InitResponse)) erro
}
}

if err := lm.LoadIndex(); err != nil {
indexFileName, err := globals.LibrariesIndexResource.IndexFileName()
if err != nil {
// should never happen
panic("failed getting libraries index file name: " + err.Error())
}
indexFile := pme.IndexDir.Join(indexFileName)

logrus.WithField("index", indexFile).Info("Loading libraries index file")
li, err := librariesindex.LoadIndex(indexFile)
if err != nil {
s := status.Newf(codes.FailedPrecondition, tr("Loading index file: %v"), err)
responseError(s)
li = librariesindex.EmptyIndex
}
instances.SetLibrariesIndex(instance, li)

if profile == nil {
// Add directories of libraries bundled with IDE
Expand Down Expand Up @@ -409,12 +419,14 @@ func Destroy(ctx context.Context, req *rpc.DestroyRequest) (*rpc.DestroyResponse
// UpdateLibrariesIndex updates the library_index.json
func UpdateLibrariesIndex(ctx context.Context, req *rpc.UpdateLibrariesIndexRequest, downloadCB rpc.DownloadProgressCB) error {
logrus.Info("Updating libraries index")
lm, err := instances.GetLibraryManager(req.GetInstance())
pme, release, err := instances.GetPackageManagerExplorer(req.GetInstance())
if err != nil {
return err
}
indexDir := pme.IndexDir
release()

if err := lm.IndexFile.Parent().MkdirAll(); err != nil {
if err := indexDir.MkdirAll(); err != nil {
return &cmderrors.PermissionDeniedError{Message: tr("Could not create index directory"), Cause: err}
}

Expand All @@ -425,7 +437,7 @@ func UpdateLibrariesIndex(ctx context.Context, req *rpc.UpdateLibrariesIndexRequ
}
defer tmp.RemoveAll()

if err := globals.LibrariesIndexResource.Download(lm.IndexFile.Parent(), downloadCB); err != nil {
if err := globals.LibrariesIndexResource.Download(indexDir, downloadCB); err != nil {
return err
}

Expand Down
27 changes: 26 additions & 1 deletion commands/internal/instances/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/arduino/arduino-cli/commands/cmderrors"
"github.com/arduino/arduino-cli/internal/arduino/cores/packagemanager"
"github.com/arduino/arduino-cli/internal/arduino/libraries/librariesindex"
"github.com/arduino/arduino-cli/internal/arduino/libraries/librariesmanager"
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
"github.com/arduino/arduino-cli/version"
Expand All @@ -17,6 +18,7 @@ import (
type coreInstance struct {
pm *packagemanager.PackageManager
lm *librariesmanager.LibrariesManager
li *librariesindex.Index
}

// instances contains all the running Arduino Core Services instances
Expand Down Expand Up @@ -60,6 +62,29 @@ func GetLibraryManager(inst *rpc.Instance) (*librariesmanager.LibrariesManager,
return i.lm, nil
}

// GetLibrariesIndex returns the library index for the given instance.
func GetLibrariesIndex(inst *rpc.Instance) (*librariesindex.Index, error) {
instancesMux.Lock()
defer instancesMux.Unlock()
i := instances[inst.GetId()]
if i == nil {
return nil, &cmderrors.InvalidInstanceError{}
}
return i.li, nil
}

// SetLibrariesIndex sets the library index for the given instance.
func SetLibrariesIndex(inst *rpc.Instance, li *librariesindex.Index) error {
instancesMux.Lock()
defer instancesMux.Unlock()
i := instances[inst.GetId()]
if i == nil {
return &cmderrors.InvalidInstanceError{}
}
i.li = li
return nil
}

// SetLibraryManager sets the library manager for the given instance.
func SetLibraryManager(inst *rpc.Instance, lm *librariesmanager.LibrariesManager) bool {
instancesMux.Lock()
Expand All @@ -83,7 +108,7 @@ func Create(dataDir, packagesDir, downloadsDir *paths.Path, extraUserAgent ...st
}
tempDir := dataDir.Join("tmp")
instance.pm = packagemanager.NewBuilder(dataDir, packagesDir, downloadsDir, tempDir, userAgent).Build()
instance.lm = librariesmanager.NewLibraryManager(dataDir, downloadsDir)
instance.lm = librariesmanager.NewLibraryManager(downloadsDir)

// Save instance
instancesMux.Lock()
Expand Down
9 changes: 4 additions & 5 deletions commands/lib/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,25 @@ import (

"github.com/arduino/arduino-cli/commands/internal/instances"
"github.com/arduino/arduino-cli/internal/arduino/libraries/librariesindex"
"github.com/arduino/arduino-cli/internal/arduino/libraries/librariesmanager"
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
semver "go.bug.st/relaxed-semver"
)

// LibrarySearch FIXMEDOC
func LibrarySearch(ctx context.Context, req *rpc.LibrarySearchRequest) (*rpc.LibrarySearchResponse, error) {
lm, err := instances.GetLibraryManager(req.GetInstance())
li, err := instances.GetLibrariesIndex(req.GetInstance())
if err != nil {
return nil, err
}
return searchLibrary(req, lm), nil
return searchLibrary(req, li), nil
}

func searchLibrary(req *rpc.LibrarySearchRequest, lm *librariesmanager.LibrariesManager) *rpc.LibrarySearchResponse {
func searchLibrary(req *rpc.LibrarySearchRequest, li *librariesindex.Index) *rpc.LibrarySearchResponse {
res := []*rpc.SearchedLibrary{}
query := req.GetSearchArgs()
matcher := MatcherFromQueryString(query)

for _, lib := range lm.Index.Libraries {
for _, lib := range li.Libraries {
if matcher(lib) {
res = append(res, indexLibraryToRPCSearchLibrary(lib, req.GetOmitReleasesDetails()))
}
Expand Down
34 changes: 18 additions & 16 deletions commands/lib/search_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,24 @@ import (
"strings"
"testing"

"github.com/arduino/arduino-cli/internal/arduino/libraries/librariesmanager"
"github.com/arduino/arduino-cli/internal/arduino/globals"
"github.com/arduino/arduino-cli/internal/arduino/libraries/librariesindex"
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
paths "github.com/arduino/go-paths-helper"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

var customIndexPath = paths.New("testdata", "test1")
var fullIndexPath = paths.New("testdata", "full")
var qualifiedSearchIndexPath = paths.New("testdata", "qualified_search")
var indexFilename, _ = globals.LibrariesIndexResource.IndexFileName()
var customIndexPath = paths.New("testdata", "test1", indexFilename)
var fullIndexPath = paths.New("testdata", "full", indexFilename)
var qualifiedSearchIndexPath = paths.New("testdata", "qualified_search", indexFilename)

func TestSearchLibrary(t *testing.T) {
lm := librariesmanager.NewLibraryManager(customIndexPath, nil)
lm.LoadIndex()
li, err := librariesindex.LoadIndex(customIndexPath)
require.NoError(t, err)

resp := searchLibrary(&rpc.LibrarySearchRequest{SearchArgs: "test"}, lm)
resp := searchLibrary(&rpc.LibrarySearchRequest{SearchArgs: "test"}, li)
assert := assert.New(t)
assert.Equal(resp.GetStatus(), rpc.LibrarySearchStatus_LIBRARY_SEARCH_STATUS_SUCCESS)
assert.Equal(len(resp.GetLibraries()), 2)
Expand All @@ -43,10 +45,10 @@ func TestSearchLibrary(t *testing.T) {
}

func TestSearchLibrarySimilar(t *testing.T) {
lm := librariesmanager.NewLibraryManager(customIndexPath, nil)
lm.LoadIndex()
li, err := librariesindex.LoadIndex(customIndexPath)
require.NoError(t, err)

resp := searchLibrary(&rpc.LibrarySearchRequest{SearchArgs: "arduino"}, lm)
resp := searchLibrary(&rpc.LibrarySearchRequest{SearchArgs: "arduino"}, li)
assert := assert.New(t)
assert.Equal(resp.GetStatus(), rpc.LibrarySearchStatus_LIBRARY_SEARCH_STATUS_SUCCESS)
assert.Equal(len(resp.GetLibraries()), 2)
Expand All @@ -59,12 +61,12 @@ func TestSearchLibrarySimilar(t *testing.T) {
}

func TestSearchLibraryFields(t *testing.T) {
lm := librariesmanager.NewLibraryManager(fullIndexPath, nil)
lm.LoadIndex()
li, err := librariesindex.LoadIndex(fullIndexPath)
require.NoError(t, err)

query := func(q string) []string {
libs := []string{}
for _, lib := range searchLibrary(&rpc.LibrarySearchRequest{SearchArgs: q}, lm).GetLibraries() {
for _, lib := range searchLibrary(&rpc.LibrarySearchRequest{SearchArgs: q}, li).GetLibraries() {
libs = append(libs, lib.GetName())
}
return libs
Expand Down Expand Up @@ -97,12 +99,12 @@ func TestSearchLibraryFields(t *testing.T) {
}

func TestSearchLibraryWithQualifiers(t *testing.T) {
lm := librariesmanager.NewLibraryManager(qualifiedSearchIndexPath, nil)
lm.LoadIndex()
li, err := librariesindex.LoadIndex(qualifiedSearchIndexPath)
require.NoError(t, err)

query := func(q string) []string {
libs := []string{}
for _, lib := range searchLibrary(&rpc.LibrarySearchRequest{SearchArgs: q}, lm).GetLibraries() {
for _, lib := range searchLibrary(&rpc.LibrarySearchRequest{SearchArgs: q}, li).GetLibraries() {
libs = append(libs, lib.GetName())
}
return libs
Expand Down
4 changes: 2 additions & 2 deletions internal/arduino/builder/internal/detector/detector.go
Original file line number Diff line number Diff line change
Expand Up @@ -598,10 +598,10 @@ func LibrariesLoader(
if useCachedLibrariesResolution {
// Since we are using the cached libraries resolution
// the library manager is not needed.
lm = librariesmanager.NewLibraryManager(nil, nil)
lm = librariesmanager.NewLibraryManager(nil)
}
if librariesManager == nil {
lm = librariesmanager.NewLibraryManager(nil, nil)
lm = librariesmanager.NewLibraryManager(nil)

builtInLibrariesFolders := builtInLibrariesDirs
if builtInLibrariesFolders != nil {
Expand Down
34 changes: 6 additions & 28 deletions internal/arduino/libraries/librariesmanager/librariesmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,8 @@ type LibrariesManager struct {
LibrariesDir []*LibrariesDir
Libraries map[string]libraries.List `json:"libraries"`

Index *librariesindex.Index
IndexFile *paths.Path
IndexFileSignature *paths.Path
DownloadsDir *paths.Path
Index *librariesindex.Index
DownloadsDir *paths.Path
}

// LibrariesDir is a directory containing libraries
Expand Down Expand Up @@ -72,32 +70,12 @@ func (lm LibrariesManager) Names() []string {
}

// NewLibraryManager creates a new library manager
func NewLibraryManager(indexDir *paths.Path, downloadsDir *paths.Path) *LibrariesManager {
var indexFile, indexFileSignature *paths.Path
if indexDir != nil {
indexFile = indexDir.Join("library_index.json")
indexFileSignature = indexDir.Join("library_index.json.sig")
}
func NewLibraryManager(downloadsDir *paths.Path) *LibrariesManager {
return &LibrariesManager{
Libraries: map[string]libraries.List{},
IndexFile: indexFile,
IndexFileSignature: indexFileSignature,
DownloadsDir: downloadsDir,
Index: librariesindex.EmptyIndex,
}
}

// LoadIndex reads a library_index.json from a file and returns
// the corresponding Index structure.
func (lm *LibrariesManager) LoadIndex() error {
logrus.WithField("index", lm.IndexFile).Info("Loading libraries index file")
index, err := librariesindex.LoadIndex(lm.IndexFile)
if err != nil {
lm.Index = librariesindex.EmptyIndex
return err
Libraries: map[string]libraries.List{},
DownloadsDir: downloadsDir,
Index: librariesindex.EmptyIndex,
}
lm.Index = index
return nil
}

// AddLibrariesDir adds path to the list of directories
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (

func Test_RescanLibrariesCallClear(t *testing.T) {
baseDir := paths.New(t.TempDir())
lm := NewLibraryManager(baseDir.Join("index_dir"), baseDir.Join("downloads_dir"))
lm := NewLibraryManager(baseDir.Join("downloads_dir"))
lm.Libraries["testLibA"] = libraries.List{}
lm.Libraries["testLibB"] = libraries.List{}
lm.RescanLibraries()
Expand Down

0 comments on commit 34f02ac

Please sign in to comment.