Skip to content

Commit 4a4d1fd

Browse files
cmaglieper1234
andauthored
[breaking] Remove auto detection of Arduino IDE built-in libraries and tools / Allow gRPC install of built-in libraries (#1817)
* Removed IDE-bundle autodetection * Do not return bundled tools folder with HardwarePaths * Created configuration functions to obtain data dir and downloads dir * Bundled libraries configuration is now considere a single directory * Allow library installation on bundled libs dir via gRPC * Added integration test for library install in bundled directory * Fixed nil pointer exception in build options extraction * Updated docs * Removed useless custom env bindings * Applied code review changes Co-authored-by: per1234 <[email protected]> * Set builtin libraries dir by default when running as a daemon * Added test for regression See #1817 (review) * Fixed regression: 'lib uninstall' must operate only on user dir Co-authored-by: per1234 <[email protected]>
1 parent 5036697 commit 4a4d1fd

37 files changed

+963
-624
lines changed

Diff for: arduino/cores/packagemanager/loader.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func (pm *Builder) LoadHardware() []error {
3838
hardwareDirs := configuration.HardwareDirectories(configuration.Settings)
3939
merr := pm.LoadHardwareFromDirectories(hardwareDirs)
4040

41-
bundleToolDirs := configuration.BundleToolsDirectories(configuration.Settings)
41+
bundleToolDirs := configuration.BuiltinToolsDirectories(configuration.Settings)
4242
merr = append(merr, pm.LoadToolsFromBundleDirectories(bundleToolDirs)...)
4343

4444
return merr

Diff for: arduino/cores/packagemanager/package_manager_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ func TestFindToolsRequiredForBoard(t *testing.T) {
224224
pmb := packagemanager.NewBuilder(
225225
dataDir1,
226226
configuration.PackagesDir(configuration.Settings),
227-
paths.New(configuration.Settings.GetString("directories.Downloads")),
227+
configuration.DownloadsDir(configuration.Settings),
228228
dataDir1,
229229
"test",
230230
)

Diff for: arduino/libraries/libraries_location.go

+14-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func (d *LibraryLocation) UnmarshalJSON(b []byte) error {
9393
func (d *LibraryLocation) ToRPCLibraryLocation() rpc.LibraryLocation {
9494
switch *d {
9595
case IDEBuiltIn:
96-
return rpc.LibraryLocation_LIBRARY_LOCATION_IDE_BUILTIN
96+
return rpc.LibraryLocation_LIBRARY_LOCATION_BUILTIN
9797
case PlatformBuiltIn:
9898
return rpc.LibraryLocation_LIBRARY_LOCATION_PLATFORM_BUILTIN
9999
case ReferencedPlatformBuiltIn:
@@ -110,7 +110,7 @@ func (d *LibraryLocation) ToRPCLibraryLocation() rpc.LibraryLocation {
110110
// FromRPCLibraryLocation converts a rpc.LibraryLocation to a LibraryLocation
111111
func FromRPCLibraryLocation(l rpc.LibraryLocation) LibraryLocation {
112112
switch l {
113-
case rpc.LibraryLocation_LIBRARY_LOCATION_IDE_BUILTIN:
113+
case rpc.LibraryLocation_LIBRARY_LOCATION_BUILTIN:
114114
return IDEBuiltIn
115115
case rpc.LibraryLocation_LIBRARY_LOCATION_PLATFORM_BUILTIN:
116116
return PlatformBuiltIn
@@ -124,3 +124,15 @@ func FromRPCLibraryLocation(l rpc.LibraryLocation) LibraryLocation {
124124
panic(fmt.Sprintf("invalid rpc.LibraryLocation value %d", l))
125125
}
126126
}
127+
128+
// FromRPCLibraryInstallLocation converts a rpc.LibraryInstallLocation to a LibraryLocation
129+
func FromRPCLibraryInstallLocation(l rpc.LibraryInstallLocation) LibraryLocation {
130+
switch l {
131+
case rpc.LibraryInstallLocation_LIBRARY_INSTALL_LOCATION_BUILTIN:
132+
return IDEBuiltIn
133+
case rpc.LibraryInstallLocation_LIBRARY_INSTALL_LOCATION_USER:
134+
return User
135+
default:
136+
panic(fmt.Sprintf("invalid rpc.LibraryInstallLocation value %d", l))
137+
}
138+
}

Diff for: arduino/libraries/librariesmanager/install.go

+13-10
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ var (
4848
// InstallPrerequisiteCheck performs prequisite checks to install a library. It returns the
4949
// install path, where the library should be installed and the possible library that is already
5050
// installed on the same folder and it's going to be replaced by the new one.
51-
func (lm *LibrariesManager) InstallPrerequisiteCheck(indexLibrary *librariesindex.Release) (*paths.Path, *libraries.Library, error) {
51+
func (lm *LibrariesManager) InstallPrerequisiteCheck(indexLibrary *librariesindex.Release, installLocation libraries.LibraryLocation) (*paths.Path, *libraries.Library, error) {
5252
saneName := utils.SanitizeName(indexLibrary.Library.Name)
5353

5454
var replaced *libraries.Library
5555
if installedLibs, have := lm.Libraries[saneName]; have {
5656
for _, installedLib := range installedLibs.Alternatives {
57-
if installedLib.Location != libraries.User {
57+
if installedLib.Location != installLocation {
5858
continue
5959
}
6060
if installedLib.Version != nil && installedLib.Version.Equal(indexLibrary.Version) {
@@ -64,9 +64,12 @@ func (lm *LibrariesManager) InstallPrerequisiteCheck(indexLibrary *librariesinde
6464
}
6565
}
6666

67-
libsDir := lm.getUserLibrariesDir()
67+
libsDir := lm.getLibrariesDir(installLocation)
6868
if libsDir == nil {
69-
return nil, nil, fmt.Errorf(tr("User directory not set"))
69+
if installLocation == libraries.User {
70+
return nil, nil, fmt.Errorf(tr("User directory not set"))
71+
}
72+
return nil, nil, fmt.Errorf(tr("Builtin libraries directory not set"))
7073
}
7174

7275
libPath := libsDir.Join(saneName)
@@ -79,8 +82,8 @@ func (lm *LibrariesManager) InstallPrerequisiteCheck(indexLibrary *librariesinde
7982
}
8083

8184
// Install installs a library on the specified path.
82-
func (lm *LibrariesManager) Install(indexLibrary *librariesindex.Release, libPath *paths.Path) error {
83-
libsDir := lm.getUserLibrariesDir()
85+
func (lm *LibrariesManager) Install(indexLibrary *librariesindex.Release, libPath *paths.Path, installLocation libraries.LibraryLocation) error {
86+
libsDir := lm.getLibrariesDir(installLocation)
8487
if libsDir == nil {
8588
return fmt.Errorf(tr("User directory not set"))
8689
}
@@ -100,9 +103,9 @@ func (lm *LibrariesManager) Uninstall(lib *libraries.Library) error {
100103
return nil
101104
}
102105

103-
//InstallZipLib installs a Zip library on the specified path.
106+
// InstallZipLib installs a Zip library on the specified path.
104107
func (lm *LibrariesManager) InstallZipLib(ctx context.Context, archivePath string, overwrite bool) error {
105-
libsDir := lm.getUserLibrariesDir()
108+
libsDir := lm.getLibrariesDir(libraries.User)
106109
if libsDir == nil {
107110
return fmt.Errorf(tr("User directory not set"))
108111
}
@@ -184,9 +187,9 @@ func (lm *LibrariesManager) InstallZipLib(ctx context.Context, archivePath strin
184187
return nil
185188
}
186189

187-
//InstallGitLib installs a library hosted on a git repository on the specified path.
190+
// InstallGitLib installs a library hosted on a git repository on the specified path.
188191
func (lm *LibrariesManager) InstallGitLib(gitURL string, overwrite bool) error {
189-
libsDir := lm.getUserLibrariesDir()
192+
libsDir := lm.getLibrariesDir(libraries.User)
190193
if libsDir == nil {
191194
return fmt.Errorf(tr("User directory not set"))
192195
}

Diff for: arduino/libraries/librariesmanager/librariesmanager.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ func (alts *LibraryAlternatives) Remove(library *libraries.Library) {
7878
}
7979

8080
// FindVersion returns the library mathching the provided version or nil if not found
81-
func (alts *LibraryAlternatives) FindVersion(version *semver.Version) *libraries.Library {
81+
func (alts *LibraryAlternatives) FindVersion(version *semver.Version, installLocation libraries.LibraryLocation) *libraries.Library {
8282
for _, lib := range alts.Alternatives {
83-
if lib.Version.Equal(version) {
83+
if lib.Version.Equal(version) && lib.Location == installLocation {
8484
return lib
8585
}
8686
}
@@ -118,6 +118,7 @@ func NewLibraryManager(indexDir *paths.Path, downloadsDir *paths.Path) *Librarie
118118
// LoadIndex reads a library_index.json from a file and returns
119119
// the corresponding Index structure.
120120
func (lm *LibrariesManager) LoadIndex() error {
121+
logrus.WithField("index", lm.IndexFile).Info("Loading libraries index file")
121122
index, err := librariesindex.LoadIndex(lm.IndexFile)
122123
if err != nil {
123124
lm.Index = librariesindex.EmptyIndex
@@ -175,9 +176,9 @@ func (lm *LibrariesManager) RescanLibraries() []*status.Status {
175176
return statuses
176177
}
177178

178-
func (lm *LibrariesManager) getUserLibrariesDir() *paths.Path {
179+
func (lm *LibrariesManager) getLibrariesDir(installLocation libraries.LibraryLocation) *paths.Path {
179180
for _, dir := range lm.LibrariesDir {
180-
if dir.Location == libraries.User {
181+
if dir.Location == installLocation {
181182
return dir.Path
182183
}
183184
}
@@ -244,7 +245,7 @@ func (lm *LibrariesManager) LoadLibraryFromDir(libRootDir *paths.Path, location
244245
// FindByReference return the installed library matching the Reference
245246
// name and version or, if the version is nil, the library installed
246247
// in the User folder.
247-
func (lm *LibrariesManager) FindByReference(libRef *librariesindex.Reference) *libraries.Library {
248+
func (lm *LibrariesManager) FindByReference(libRef *librariesindex.Reference, installLocation libraries.LibraryLocation) *libraries.Library {
248249
saneName := utils.SanitizeName(libRef.Name)
249250
alternatives, have := lm.Libraries[saneName]
250251
if !have {
@@ -253,11 +254,11 @@ func (lm *LibrariesManager) FindByReference(libRef *librariesindex.Reference) *l
253254
// TODO: Move "search into user" into another method...
254255
if libRef.Version == nil {
255256
for _, candidate := range alternatives.Alternatives {
256-
if candidate.Location == libraries.User {
257+
if candidate.Location == installLocation {
257258
return candidate
258259
}
259260
}
260261
return nil
261262
}
262-
return alternatives.FindVersion(libRef.Version)
263+
return alternatives.FindVersion(libRef.Version, installLocation)
263264
}

Diff for: cli/cache/clean.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ func initCleanCommand() *cobra.Command {
4040
func runCleanCommand(cmd *cobra.Command, args []string) {
4141
logrus.Info("Executing `arduino-cli cache clean`")
4242

43-
cachePath := configuration.Settings.GetString("directories.Downloads")
44-
err := os.RemoveAll(cachePath)
43+
cachePath := configuration.DownloadsDir(configuration.Settings)
44+
err := cachePath.RemoveAll()
4545
if err != nil {
4646
feedback.Errorf(tr("Error cleaning caches: %v"), err)
4747
os.Exit(errorcodes.ErrGeneric)

Diff for: cli/cli.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func preRun(cmd *cobra.Command, args []string) {
158158
configFile := configuration.Settings.ConfigFileUsed()
159159

160160
// initialize inventory
161-
err := inventory.Init(configuration.Settings.GetString("directories.Data"))
161+
err := inventory.Init(configuration.DataDir(configuration.Settings).String())
162162
if err != nil {
163163
feedback.Errorf("Error: %v", err)
164164
os.Exit(errorcodes.ErrBadArgument)

Diff for: cli/config/validate.go

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ var validMap = map[string]reflect.Kind{
3030
"directories.data": reflect.String,
3131
"directories.downloads": reflect.String,
3232
"directories.user": reflect.String,
33+
"directories.builtin.tools": reflect.String,
34+
"directories.builtin.libraries": reflect.String,
3335
"library.enable_unsafe_install": reflect.Bool,
3436
"logging.file": reflect.String,
3537
"logging.format": reflect.String,

Diff for: cli/core/search.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"github.com/arduino/arduino-cli/configuration"
3535
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
3636
"github.com/arduino/arduino-cli/table"
37-
"github.com/arduino/go-paths-helper"
3837
"github.com/sirupsen/logrus"
3938
"github.com/spf13/cobra"
4039
)
@@ -130,7 +129,7 @@ func (sr searchResults) String() string {
130129
// of 24 hours is used.
131130
// Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
132131
func indexesNeedUpdating(duration string) bool {
133-
indexpath := paths.New(configuration.Settings.GetString("directories.Data"))
132+
indexpath := configuration.DataDir(configuration.Settings)
134133

135134
now := time.Now()
136135
modTimeThreshold, err := time.ParseDuration(duration)

Diff for: cli/daemon/daemon.go

+3
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ func NewCommand() *cobra.Command {
7272
func runDaemonCommand(cmd *cobra.Command, args []string) {
7373
logrus.Info("Executing `arduino-cli daemon`")
7474

75+
// Bundled libraries support is enabled by default when running as a daemon
76+
configuration.Settings.SetDefault("directories.builtin.Libraries", configuration.GetDefaultBuiltinLibrariesDir())
77+
7578
port := configuration.Settings.GetString("daemon.port")
7679
gRPCOptions := []grpc.ServerOption{}
7780
if debugFile != "" {

Diff for: cli/instance/instance.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ func InitWithProfile(instance *rpc.Instance, profileName string, sketchPath *pat
125125
// This ideally is only executed the first time the CLI is run.
126126
func FirstUpdate(instance *rpc.Instance) error {
127127
// Gets the data directory to verify if library_index.json and package_index.json exist
128-
dataDir := paths.New(configuration.Settings.GetString("directories.data"))
128+
dataDir := configuration.DataDir(configuration.Settings)
129129

130130
libraryIndex := dataDir.Join("library_index.json")
131131
packageIndex := dataDir.Join("package_index.json")

Diff for: commands/compile/compile.go

+3-24
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ import (
1919
"context"
2020
"fmt"
2121
"io"
22-
"path/filepath"
23-
"sort"
2422
"strings"
2523

2624
"github.com/arduino/arduino-cli/arduino"
@@ -35,7 +33,6 @@ import (
3533
"github.com/arduino/arduino-cli/legacy/builder/types"
3634
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
3735
paths "github.com/arduino/go-paths-helper"
38-
properties "github.com/arduino/go-properties-orderedmap"
3936
"github.com/sirupsen/logrus"
4037
)
4138

@@ -123,7 +120,7 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
123120

124121
// FIXME: This will be redundant when arduino-builder will be part of the cli
125122
builderCtx.HardwareDirs = configuration.HardwareDirectories(configuration.Settings)
126-
builderCtx.BuiltInToolsDirs = configuration.BundleToolsDirectories(configuration.Settings)
123+
builderCtx.BuiltInToolsDirs = configuration.BuiltinToolsDirectories(configuration.Settings)
127124

128125
// FIXME: This will be redundant when arduino-builder will be part of the cli
129126
builderCtx.OtherLibrariesDirs = paths.NewPathList(req.GetLibraries()...)
@@ -164,29 +161,11 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
164161
}
165162
}
166163

164+
builderCtx.BuiltInLibrariesDirs = configuration.IDEBuiltinLibrariesDir(configuration.Settings)
165+
167166
// Will be deprecated.
168167
builderCtx.ArduinoAPIVersion = "10607"
169168

170-
// Check if Arduino IDE is installed and get it's libraries location.
171-
// TODO: Remove?
172-
dataDir := paths.New(configuration.Settings.GetString("directories.Data"))
173-
preferencesTxt := dataDir.Join("preferences.txt")
174-
ideProperties, err := properties.LoadFromPath(preferencesTxt)
175-
if err == nil {
176-
lastIdeSubProperties := ideProperties.SubTree("last").SubTree("ide")
177-
// Preferences can contain records from previous IDE versions. Find the latest one.
178-
var pathVariants []string
179-
for k := range lastIdeSubProperties.AsMap() {
180-
if strings.HasSuffix(k, ".hardwarepath") {
181-
pathVariants = append(pathVariants, k)
182-
}
183-
}
184-
sort.Strings(pathVariants)
185-
ideHardwarePath := lastIdeSubProperties.Get(pathVariants[len(pathVariants)-1])
186-
ideLibrariesPath := filepath.Join(filepath.Dir(ideHardwarePath), "libraries")
187-
builderCtx.BuiltInLibrariesDirs = paths.NewPathList(ideLibrariesPath)
188-
}
189-
190169
builderCtx.Stdout = outStream
191170
builderCtx.Stderr = errStream
192171
builderCtx.Clean = req.GetClean()

Diff for: commands/instances.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ func Create(req *rpc.CreateRequest, extraUserAgent ...string) (*rpc.CreateRespon
149149
instance := &CoreInstance{}
150150

151151
// Setup downloads directory
152-
downloadsDir := paths.New(configuration.Settings.GetString("directories.Downloads"))
152+
downloadsDir := configuration.DownloadsDir(configuration.Settings)
153153
if downloadsDir.NotExist() {
154154
err := downloadsDir.MkdirAll()
155155
if err != nil {
@@ -158,7 +158,7 @@ func Create(req *rpc.CreateRequest, extraUserAgent ...string) (*rpc.CreateRespon
158158
}
159159

160160
// Setup data directory
161-
dataDir := paths.New(configuration.Settings.GetString("directories.Data"))
161+
dataDir := configuration.DataDir(configuration.Settings)
162162
packagesDir := configuration.PackagesDir(configuration.Settings)
163163
if packagesDir.NotExist() {
164164
err := packagesDir.MkdirAll()
@@ -389,7 +389,7 @@ func Init(req *rpc.InitRequest, responseCallback func(r *rpc.InitResponse)) erro
389389

390390
if profile == nil {
391391
// Add directories of libraries bundled with IDE
392-
if bundledLibsDir := configuration.IDEBundledLibrariesDir(configuration.Settings); bundledLibsDir != nil {
392+
if bundledLibsDir := configuration.IDEBuiltinLibrariesDir(configuration.Settings); bundledLibsDir != nil {
393393
lm.AddLibrariesDir(bundledLibsDir, libraries.IDEBuiltIn)
394394
}
395395

@@ -495,7 +495,7 @@ func UpdateIndex(ctx context.Context, req *rpc.UpdateIndexRequest, downloadCB rp
495495
return nil, &arduino.InvalidInstanceError{}
496496
}
497497

498-
indexpath := paths.New(configuration.Settings.GetString("directories.Data"))
498+
indexpath := configuration.DataDir(configuration.Settings)
499499

500500
urls := []string{globals.DefaultIndexURL}
501501
urls = append(urls, configuration.Settings.GetStringSlice("board_manager.additional_urls")...)

Diff for: commands/lib/install.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222

2323
"github.com/arduino/arduino-cli/arduino"
24+
"github.com/arduino/arduino-cli/arduino/libraries"
2425
"github.com/arduino/arduino-cli/arduino/libraries/librariesindex"
2526
"github.com/arduino/arduino-cli/arduino/libraries/librariesmanager"
2627
"github.com/arduino/arduino-cli/commands"
@@ -30,13 +31,13 @@ import (
3031

3132
// LibraryInstall FIXMEDOC
3233
func LibraryInstall(ctx context.Context, req *rpc.LibraryInstallRequest, downloadCB rpc.DownloadProgressCB, taskCB rpc.TaskProgressCB) error {
33-
3434
lm := commands.GetLibraryManager(req)
3535
if lm == nil {
3636
return &arduino.InvalidInstanceError{}
3737
}
3838

3939
toInstall := map[string]*rpc.LibraryDependencyStatus{}
40+
installLocation := libraries.FromRPCLibraryInstallLocation(req.GetInstallLocation())
4041
if req.NoDeps {
4142
toInstall[req.Name] = &rpc.LibraryDependencyStatus{
4243
Name: req.Name,
@@ -81,7 +82,7 @@ func LibraryInstall(ctx context.Context, req *rpc.LibraryInstallRequest, downloa
8182
// Check if any of the libraries to install is already installed and remove it from the list
8283
j := 0
8384
for i, libRelease := range libReleasesToInstall {
84-
_, libReplaced, err := lm.InstallPrerequisiteCheck(libRelease)
85+
_, libReplaced, err := lm.InstallPrerequisiteCheck(libRelease, installLocation)
8586
if errors.Is(err, librariesmanager.ErrAlreadyInstalled) {
8687
taskCB(&rpc.TaskProgress{Message: tr("Already installed %s", libRelease), Completed: true})
8788
} else if err != nil {
@@ -104,7 +105,7 @@ func LibraryInstall(ctx context.Context, req *rpc.LibraryInstallRequest, downloa
104105
return err
105106
}
106107

107-
if err := installLibrary(lm, libRelease, taskCB); err != nil {
108+
if err := installLibrary(lm, libRelease, installLocation, taskCB); err != nil {
108109
if errors.Is(err, librariesmanager.ErrAlreadyInstalled) {
109110
continue
110111
} else {
@@ -123,10 +124,10 @@ func LibraryInstall(ctx context.Context, req *rpc.LibraryInstallRequest, downloa
123124
return nil
124125
}
125126

126-
func installLibrary(lm *librariesmanager.LibrariesManager, libRelease *librariesindex.Release, taskCB rpc.TaskProgressCB) error {
127+
func installLibrary(lm *librariesmanager.LibrariesManager, libRelease *librariesindex.Release, installLocation libraries.LibraryLocation, taskCB rpc.TaskProgressCB) error {
127128
taskCB(&rpc.TaskProgress{Name: tr("Installing %s", libRelease)})
128129
logrus.WithField("library", libRelease).Info("Installing library")
129-
libPath, libReplaced, err := lm.InstallPrerequisiteCheck(libRelease)
130+
libPath, libReplaced, err := lm.InstallPrerequisiteCheck(libRelease, installLocation)
130131
if errors.Is(err, librariesmanager.ErrAlreadyInstalled) {
131132
taskCB(&rpc.TaskProgress{Message: tr("Already installed %s", libRelease), Completed: true})
132133
return err
@@ -140,7 +141,7 @@ func installLibrary(lm *librariesmanager.LibrariesManager, libRelease *libraries
140141
taskCB(&rpc.TaskProgress{Message: tr("Replacing %[1]s with %[2]s", libReplaced, libRelease)})
141142
}
142143

143-
if err := lm.Install(libRelease, libPath); err != nil {
144+
if err := lm.Install(libRelease, libPath, installLocation); err != nil {
144145
return &arduino.FailedLibraryInstallError{Cause: err}
145146
}
146147

0 commit comments

Comments
 (0)