@@ -25,6 +25,7 @@ import (
25
25
"path"
26
26
"time"
27
27
28
+ "github.com/arduino/arduino-cli/arduino/cores"
28
29
"github.com/arduino/arduino-cli/arduino/cores/packageindex"
29
30
"github.com/arduino/arduino-cli/arduino/cores/packagemanager"
30
31
"github.com/arduino/arduino-cli/arduino/discovery"
@@ -81,26 +82,45 @@ func GetDiscoveries(req InstanceContainer) []*discovery.Discovery {
81
82
return i .discoveries
82
83
}
83
84
84
- func (instance * CoreInstance ) startDiscoveries (downloadCB DownloadProgressCB , taskCB TaskProgressCB ) error {
85
+ func (instance * CoreInstance ) installToolIfMissing (tool * cores.ToolRelease , downloadCB DownloadProgressCB , taskCB TaskProgressCB ) (bool , error ) {
86
+ if tool .IsInstalled () {
87
+ return false , nil
88
+ }
89
+ taskCB (& rpc.TaskProgress {Name : "Downloading missing tool " + tool .String ()})
90
+ if err := DownloadToolRelease (instance .pm , tool , downloadCB ); err != nil {
91
+ return false , fmt .Errorf ("downloading %s tool: %s" , tool , err )
92
+ }
93
+ taskCB (& rpc.TaskProgress {Completed : true })
94
+ if err := InstallToolRelease (instance .pm , tool , taskCB ); err != nil {
95
+ return false , fmt .Errorf ("installing %s tool: %s" , tool , err )
96
+ }
97
+ return true , nil
98
+ }
99
+
100
+ func (instance * CoreInstance ) checkForBuiltinTools (downloadCB DownloadProgressCB , taskCB TaskProgressCB ) error {
101
+ // Check for ctags tool
102
+ ctags , _ := getBuiltinCtagsTool (instance .pm )
103
+ ctagsInstalled , err := instance .installToolIfMissing (ctags , downloadCB , taskCB )
104
+ if err != nil {
105
+ return err
106
+ }
107
+
85
108
// Check for bultin serial-discovery tool
86
- loadBuiltinSerialDiscoveryMetadata (instance .pm )
87
-
88
- if downloadCB != nil {
89
- serialDiscoveryTool , _ := getBuiltinSerialDiscoveryTool (instance .pm )
90
- if ! serialDiscoveryTool .IsInstalled () {
91
- //formatter.Print("Downloading and installing missing tool: " + serialDiscoveryTool.String())
92
- if err := DownloadToolRelease (instance .pm , serialDiscoveryTool , downloadCB ); err != nil {
93
- return fmt .Errorf (("could not download serial-discovery tool" ))
94
- }
95
- if err := InstallToolRelease (instance .pm , serialDiscoveryTool , taskCB ); err != nil {
96
- return fmt .Errorf (("could not install serial-discovery tool" ))
97
- }
98
- if err := instance .pm .LoadHardware (instance .config ); err != nil {
99
- return fmt .Errorf ("could not load hardware packages: %s" , err )
100
- }
109
+ serialDiscoveryTool , _ := getBuiltinSerialDiscoveryTool (instance .pm )
110
+ serialDiscoveryInstalled , err := instance .installToolIfMissing (serialDiscoveryTool , downloadCB , taskCB )
111
+ if err != nil {
112
+ return err
113
+ }
114
+
115
+ if ctagsInstalled || serialDiscoveryInstalled {
116
+ if err := instance .pm .LoadHardware (instance .config ); err != nil {
117
+ return fmt .Errorf ("could not load hardware packages: %s" , err )
101
118
}
102
119
}
120
+ return nil
121
+ }
103
122
123
+ func (instance * CoreInstance ) startDiscoveries () error {
104
124
serialDiscovery , err := newBuiltinSerialDiscovery (instance .pm )
105
125
if err != nil {
106
126
return fmt .Errorf ("starting serial discovery: %s" , err )
@@ -162,10 +182,16 @@ func Init(ctx context.Context, req *rpc.InitReq, downloadCB DownloadProgressCB,
162
182
instancesCount ++
163
183
instances [handle ] = instance
164
184
165
- if err := instance .startDiscoveries (downloadCB , taskCB ); err != nil {
185
+ if err := instance .checkForBuiltinTools (downloadCB , taskCB ); err != nil {
186
+ fmt .Println (err )
187
+ return nil , err
188
+ }
189
+
190
+ if err := instance .startDiscoveries (); err != nil {
166
191
// TODO: handle discovery errors
167
192
fmt .Println (err )
168
193
}
194
+
169
195
return & rpc.InitResp {
170
196
Instance : & rpc.Instance {Id : handle },
171
197
PlatformsIndexErrors : reqPltIndex ,
@@ -271,7 +297,7 @@ func Rescan(ctx context.Context, req *rpc.RescanReq) (*rpc.RescanResp, error) {
271
297
coreInstance .pm = pm
272
298
coreInstance .lm = lm
273
299
274
- coreInstance .startDiscoveries (nil , nil )
300
+ coreInstance .startDiscoveries ()
275
301
276
302
return & rpc.RescanResp {
277
303
PlatformsIndexErrors : reqPltIndex ,
0 commit comments