Skip to content

Commit d473179

Browse files
committed
instance Init now handle missing indexes
1 parent 518a332 commit d473179

File tree

5 files changed

+155
-101
lines changed

5 files changed

+155
-101
lines changed

cli/cli.go

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package cli
2020
import (
2121
"context"
2222
"encoding/json"
23+
"errors"
2324
"fmt"
2425
"os"
2526
"path/filepath"
@@ -84,17 +85,6 @@ var AppName = filepath.Base(os.Args[0])
8485

8586
var Config *configs.Configuration
8687

87-
// InitPackageAndLibraryManagerWithoutBundles initializes the PackageManager
88-
// and the LibraryManager but ignores bundles and user installed cores
89-
func InitPackageAndLibraryManagerWithoutBundles() (*packagemanager.PackageManager, *librariesmanager.LibrariesManager) {
90-
logrus.Info("Package manager will scan only managed hardware folder")
91-
92-
fakeResult := false
93-
Config.IDEBundledCheckResult = &fakeResult
94-
Config.SketchbookDir = nil
95-
return InitPackageAndLibraryManager()
96-
}
97-
9888
func packageManagerInitReq() *rpc.InitReq {
9989
urls := []string{}
10090
for _, URL := range Config.BoardManagerAdditionalUrls {
@@ -112,41 +102,61 @@ func packageManagerInitReq() *rpc.InitReq {
112102
return &rpc.InitReq{Configuration: conf}
113103
}
114104

105+
func InitInstance(libManagerOnly bool) *rpc.InitResp {
106+
if libManagerOnly {
107+
logrus.Info("Initializing library manager")
108+
} else {
109+
logrus.Info("Initializing package manager")
110+
}
111+
req := packageManagerInitReq()
112+
req.LibraryManagerOnly = libManagerOnly
113+
resp, err := commands.Init(context.Background(), req)
114+
if err != nil {
115+
if libManagerOnly {
116+
formatter.PrintError(err, "Error initializing library manager")
117+
} else {
118+
formatter.PrintError(err, "Error initializing package manager")
119+
}
120+
os.Exit(ErrGeneric)
121+
}
122+
return resp
123+
}
124+
115125
// CreateInstance creates and return an instance of the Arduino Core engine
116126
func CreateInstance() *rpc.Instance {
117-
logrus.Info("Initializing package manager")
118-
resp, err := commands.Init(context.Background(), packageManagerInitReq())
119-
if err != nil {
120-
formatter.PrintError(err, "Error initializing package manager")
121-
os.Exit(rpc.ErrGeneric)
127+
resp := InitInstance(false)
128+
if resp.GetPlatformsIndexErrors() != nil {
129+
for _, err := range resp.GetPlatformsIndexErrors() {
130+
formatter.PrintError(errors.New(err), "Error loading index")
131+
}
132+
formatter.PrintErrorMessage("Launch '" + AppName + " core update-index' to fix or download indexes.")
133+
os.Exit(ErrGeneric)
122134
}
123135
return resp.GetInstance()
124136
}
125137

126138
// InitPackageAndLibraryManager initializes the PackageManager and the LibaryManager
127139
// TODO: for the daemon mode, this might be called at startup, but for now only commands needing the PM will call it
128140
func InitPackageAndLibraryManager() (*packagemanager.PackageManager, *librariesmanager.LibrariesManager) {
129-
logrus.Info("Initializing package manager")
130-
resp, err := commands.Init(context.Background(), packageManagerInitReq())
131-
if err != nil {
132-
formatter.PrintError(err, "Error initializing package manager")
133-
os.Exit(rpc.ErrGeneric)
134-
}
141+
resp := InitInstance(false)
135142
return commands.GetPackageManager(resp), commands.GetLibraryManager(resp)
136143
}
137144

145+
// InitPackageAndLibraryManagerWithoutBundles initializes the PackageManager
146+
// and the LibraryManager but ignores bundles and user installed cores
147+
func InitPackageAndLibraryManagerWithoutBundles() (*packagemanager.PackageManager, *librariesmanager.LibrariesManager) {
148+
logrus.Info("Package manager will scan only managed hardware folder")
149+
150+
fakeResult := false
151+
Config.IDEBundledCheckResult = &fakeResult
152+
Config.SketchbookDir = nil
153+
return InitPackageAndLibraryManager()
154+
}
155+
138156
// InitLibraryManager initializes the LibraryManager. If pm is nil, the library manager will not handle core-libraries.
139157
// TODO: for the daemon mode, this might be called at startup, but for now only commands needing the PM will call it
140158
func InitLibraryManager(cfg *configs.Configuration) *librariesmanager.LibrariesManager {
141-
req := packageManagerInitReq()
142-
req.LibraryManagerOnly = true
143-
144-
logrus.Info("Initializing library manager")
145-
resp, err := commands.Init(context.Background(), req)
146-
if err != nil {
147-
formatter.PrintError(err, "Error initializing library manager")
148-
os.Exit(rpc.ErrGeneric)
149-
}
159+
resp := InitInstance(true)
150160
return commands.GetLibraryManager(resp)
151161
}
152162

cli/core/update_index.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func initUpdateIndexCommand() *cobra.Command {
4343
}
4444

4545
func runUpdateIndexCommand(cmd *cobra.Command, args []string) {
46-
instance := cli.CreateInstance()
46+
instance := cli.InitInstance(false).GetInstance()
4747
logrus.Info("Executing `arduino core update-index`")
4848

4949
_, err := commands.UpdateIndex(context.Background(), &rpc.UpdateIndexReq{

commands/instances.go

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func Init(ctx context.Context, req *rpc.InitReq) (*rpc.InitResp, error) {
9595
return nil, fmt.Errorf("parsing url %s: %s", rawurl, err)
9696
}
9797
}
98-
pm, lm, err := createInstance(ctx, config, req.GetLibraryManagerOnly())
98+
pm, lm, reqPltIndex, reqLibIndex, err := createInstance(ctx, config, req.GetLibraryManagerOnly())
9999
if err != nil {
100100
return nil, fmt.Errorf("cannot initialize package manager: %s", err)
101101
}
@@ -109,7 +109,9 @@ func Init(ctx context.Context, req *rpc.InitReq) (*rpc.InitResp, error) {
109109
instances[handle] = instance
110110

111111
return &rpc.InitResp{
112-
Instance: &rpc.Instance{Id: handle},
112+
Instance: &rpc.Instance{Id: handle},
113+
PlatformsIndexErrors: reqPltIndex,
114+
LibrariesIndexError: reqLibIndex,
113115
}, nil
114116
}
115117

@@ -202,17 +204,21 @@ func Rescan(ctx context.Context, req *rpc.RescanReq) (*rpc.RescanResp, error) {
202204
return nil, fmt.Errorf("invalid handle")
203205
}
204206

205-
pm, lm, err := createInstance(ctx, coreInstance.config, coreInstance.getLibOnly)
207+
pm, lm, reqPltIndex, reqLibIndex, err := createInstance(ctx, coreInstance.config, coreInstance.getLibOnly)
206208
if err != nil {
207209
return nil, fmt.Errorf("rescanning filesystem: %s", err)
208210
}
209211
coreInstance.pm = pm
210212
coreInstance.lm = lm
211-
return &rpc.RescanResp{}, nil
213+
return &rpc.RescanResp{
214+
PlatformsIndexErrors: reqPltIndex,
215+
LibrariesIndexError: reqLibIndex,
216+
}, nil
212217
}
213218

214-
func createInstance(ctx context.Context, config *configs.Configuration, getLibOnly bool) (*packagemanager.PackageManager, *librariesmanager.LibrariesManager, error) {
219+
func createInstance(ctx context.Context, config *configs.Configuration, getLibOnly bool) (*packagemanager.PackageManager, *librariesmanager.LibrariesManager, []string, string, error) {
215220
var pm *packagemanager.PackageManager
221+
platformIndexErrors := []string{}
216222
if !getLibOnly {
217223
pm = packagemanager.NewPackageManager(
218224
config.IndexesDir(),
@@ -222,14 +228,17 @@ func createInstance(ctx context.Context, config *configs.Configuration, getLibOn
222228

223229
for _, URL := range config.BoardManagerAdditionalUrls {
224230
if err := pm.LoadPackageIndex(URL); err != nil {
225-
return nil, nil, fmt.Errorf("loading "+URL.String()+" package index: %s", err)
231+
platformIndexErrors = append(platformIndexErrors, err.Error())
226232
}
227233
}
228234

229235
if err := pm.LoadHardware(config); err != nil {
230-
return nil, nil, fmt.Errorf("loading hardware packages: %s", err)
236+
return nil, nil, nil, "", fmt.Errorf("loading hardware packages: %s", err)
231237
}
232238
}
239+
if len(platformIndexErrors) == 0 {
240+
platformIndexErrors = nil
241+
}
233242

234243
// Initialize library manager
235244
// --------------------------
@@ -257,20 +266,16 @@ func createInstance(ctx context.Context, config *configs.Configuration, getLibOn
257266
}
258267

259268
// Load index and auto-update it if needed
269+
librariesIndexError := ""
260270
if err := lm.LoadIndex(); err != nil {
261-
UpdateLibrariesIndex(ctx, lm, func(curr *rpc.DownloadProgress) {
262-
fmt.Printf(">> %+v\n", curr)
263-
})
264-
if err := lm.LoadIndex(); err != nil {
265-
return nil, nil, fmt.Errorf("loading libraries index: %s", err)
266-
}
271+
librariesIndexError = err.Error()
267272
}
268273

269274
// Scan for libraries
270275
if err := lm.RescanLibraries(); err != nil {
271-
return nil, nil, fmt.Errorf("libraries rescan: %s", err)
276+
return nil, nil, nil, "", fmt.Errorf("libraries rescan: %s", err)
272277
}
273-
return pm, lm, nil
278+
return pm, lm, platformIndexErrors, librariesIndexError, nil
274279
}
275280

276281
func Download(d *downloader.Downloader, label string, downloadCB DownloadProgressCB) error {

0 commit comments

Comments
 (0)