@@ -134,129 +134,125 @@ func (a *ArduinoPlatformUpdater) ListUpgradablePackages(ctx context.Context, _ f
134134}
135135
136136// UpgradePackages implements ServiceUpdater.
137- func (a * ArduinoPlatformUpdater ) UpgradePackages (ctx context.Context , names []string ) ( <- chan update.Event , error ) {
137+ func (a * ArduinoPlatformUpdater ) UpgradePackages (ctx context.Context , names []string , eventCB func ( update.Event )) error {
138138 if ! a .lock .TryLock () {
139- return nil , update .ErrOperationAlreadyInProgress
139+ return update .ErrOperationAlreadyInProgress
140140 }
141- eventsCh := make (chan update.Event , 100 )
142141
143142 downloadProgressCB := func (curr * rpc.DownloadProgress ) {
144143 data := helpers .ArduinoCLIDownloadProgressToString (curr )
145144 slog .Debug ("Download progress" , slog .String ("download_progress" , data ))
146- eventsCh <- update .NewDataEvent (update .UpgradeLineEvent , data )
145+ eventCB ( update .NewDataEvent (update .UpgradeLineEvent , data ) )
147146 }
148147 taskProgressCB := func (msg * rpc.TaskProgress ) {
149148 data := helpers .ArduinoCLITaskProgressToString (msg )
150149 slog .Debug ("Task progress" , slog .String ("task_progress" , data ))
151- eventsCh <- update .NewDataEvent (update .UpgradeLineEvent , data )
150+ eventCB ( update .NewDataEvent (update .UpgradeLineEvent , data ) )
152151 }
153152
154- go func () {
155- defer a .lock .Unlock ()
156- defer close (eventsCh )
153+ defer a .lock .Unlock ()
157154
158- eventsCh <- update .NewDataEvent (update .StartEvent , "Upgrade is starting" )
155+ eventCB ( update .NewDataEvent (update .StartEvent , "Upgrade is starting" ) )
159156
160- logrus .SetLevel (logrus .ErrorLevel ) // Reduce the log level of arduino-cli
161- srv := commands .NewArduinoCoreServer ()
157+ logrus .SetLevel (logrus .ErrorLevel ) // Reduce the log level of arduino-cli
158+ srv := commands .NewArduinoCoreServer ()
162159
163- if err := setConfig (ctx , srv ); err != nil {
164- eventsCh <- update .NewErrorEvent (fmt .Errorf ("error setting config: %w" , err ))
165- return
160+ if err := setConfig (ctx , srv ); err != nil {
161+ eventCB (update .NewErrorEvent (fmt .Errorf ("error setting config: %w" , err )))
162+ return nil
163+ }
164+
165+ var inst * rpc.Instance
166+ if resp , err := srv .Create (ctx , & rpc.CreateRequest {}); err != nil {
167+ eventCB (update .NewErrorEvent (fmt .Errorf ("error creating arduino-cli instance: %w" , err )))
168+ return nil
169+ } else {
170+ inst = resp .GetInstance ()
171+ }
172+ defer func () {
173+ _ , err := srv .CleanDownloadCacheDirectory (ctx , & rpc.CleanDownloadCacheDirectoryRequest {})
174+ if err != nil {
175+ slog .Error ("Error cleaning cache directory" , slog .Any ("error" , err ))
166176 }
177+ _ , _ = srv .Destroy (ctx , & rpc.DestroyRequest {Instance : inst })
178+ }()
167179
168- var inst * rpc.Instance
169- if resp , err := srv .Create (ctx , & rpc.CreateRequest {}); err != nil {
170- eventsCh <- update .NewErrorEvent (fmt .Errorf ("error creating arduino-cli instance: %w" , err ))
171- return
172- } else {
173- inst = resp .GetInstance ()
180+ {
181+ stream , _ := commands .UpdateIndexStreamResponseToCallbackFunction (ctx , downloadProgressCB )
182+ if err := srv .UpdateIndex (& rpc.UpdateIndexRequest {Instance : inst }, stream ); err != nil {
183+ eventCB (update .NewErrorEvent (fmt .Errorf ("error updating index: %w" , err )))
184+ return nil
174185 }
175- defer func () {
176- _ , err := srv .CleanDownloadCacheDirectory (ctx , & rpc.CleanDownloadCacheDirectoryRequest {})
177- if err != nil {
178- slog .Error ("Error cleaning cache directory" , slog .Any ("error" , err ))
179- }
180- _ , _ = srv .Destroy (ctx , & rpc.DestroyRequest {Instance : inst })
181- }()
182-
183- {
184- stream , _ := commands .UpdateIndexStreamResponseToCallbackFunction (ctx , downloadProgressCB )
185- if err := srv .UpdateIndex (& rpc.UpdateIndexRequest {Instance : inst }, stream ); err != nil {
186- eventsCh <- update .NewErrorEvent (fmt .Errorf ("error updating index: %w" , err ))
187- return
188- }
189- if err := srv .Init (& rpc.InitRequest {Instance : inst }, commands .InitStreamResponseToCallbackFunction (ctx , nil )); err != nil {
190- eventsCh <- update .NewErrorEvent (fmt .Errorf ("error initializing instance: %w" , err ))
191- return
192- }
186+ if err := srv .Init (& rpc.InitRequest {Instance : inst }, commands .InitStreamResponseToCallbackFunction (ctx , nil )); err != nil {
187+ eventCB (update .NewErrorEvent (fmt .Errorf ("error initializing instance: %w" , err )))
188+ return nil
193189 }
190+ }
194191
195- stream , respCB := commands .PlatformUpgradeStreamResponseToCallbackFunction (
196- ctx ,
197- downloadProgressCB ,
198- taskProgressCB ,
199- )
200- if err := srv .PlatformUpgrade (
201- & rpc.PlatformUpgradeRequest {
202- Instance : inst ,
203- PlatformPackage : "arduino" ,
204- Architecture : "zephyr" ,
205- SkipPostInstall : false ,
206- SkipPreUninstall : false ,
207- },
208- stream ,
209- ); err != nil {
210- var alreadyPresent * cmderrors.PlatformAlreadyAtTheLatestVersionError
211- if errors .As (err , & alreadyPresent ) {
212- eventsCh <- update .NewDataEvent (update .UpgradeLineEvent , alreadyPresent .Error ())
213- return
214- }
215-
216- var notFound * cmderrors.PlatformNotFoundError
217- if ! errors .As (err , & notFound ) {
218- eventsCh <- update .NewErrorEvent (fmt .Errorf ("error upgrading platform: %w" , err ))
219- return
220- }
221- // If the platform is not found, we will try to install it
222- err := srv .PlatformInstall (
223- & rpc.PlatformInstallRequest {
224- Instance : inst ,
225- PlatformPackage : "arduino" ,
226- Architecture : "zephyr" ,
227- },
228- commands .PlatformInstallStreamResponseToCallbackFunction (
229- ctx ,
230- downloadProgressCB ,
231- taskProgressCB ,
232- ),
233- )
234- if err != nil {
235- eventsCh <- update .NewErrorEvent (fmt .Errorf ("error installing platform: %w" , err ))
236- return
237- }
238- } else if respCB ().GetPlatform () == nil {
239- eventsCh <- update .NewErrorEvent (fmt .Errorf ("platform upgrade failed" ))
240- return
192+ stream , respCB := commands .PlatformUpgradeStreamResponseToCallbackFunction (
193+ ctx ,
194+ downloadProgressCB ,
195+ taskProgressCB ,
196+ )
197+ if err := srv .PlatformUpgrade (
198+ & rpc.PlatformUpgradeRequest {
199+ Instance : inst ,
200+ PlatformPackage : "arduino" ,
201+ Architecture : "zephyr" ,
202+ SkipPostInstall : false ,
203+ SkipPreUninstall : false ,
204+ },
205+ stream ,
206+ ); err != nil {
207+ var alreadyPresent * cmderrors.PlatformAlreadyAtTheLatestVersionError
208+ if errors .As (err , & alreadyPresent ) {
209+ eventCB (update .NewDataEvent (update .UpgradeLineEvent , alreadyPresent .Error ()))
210+ return nil
241211 }
242212
243- cbw := orchestrator .NewCallbackWriter (func (line string ) {
244- eventsCh <- update .NewDataEvent (update .UpgradeLineEvent , line )
245- })
246-
247- err := srv .BurnBootloader (
248- & rpc.BurnBootloaderRequest {
249- Instance : inst ,
250- Fqbn : "arduino:zephyr:unoq" ,
251- Programmer : "jlink" ,
213+ var notFound * cmderrors.PlatformNotFoundError
214+ if ! errors .As (err , & notFound ) {
215+ eventCB (update .NewErrorEvent (fmt .Errorf ("error upgrading platform: %w" , err )))
216+ return nil
217+ }
218+ // If the platform is not found, we will try to install it
219+ err := srv .PlatformInstall (
220+ & rpc.PlatformInstallRequest {
221+ Instance : inst ,
222+ PlatformPackage : "arduino" ,
223+ Architecture : "zephyr" ,
252224 },
253- commands .BurnBootloaderToServerStreams (ctx , cbw , cbw ),
225+ commands .PlatformInstallStreamResponseToCallbackFunction (
226+ ctx ,
227+ downloadProgressCB ,
228+ taskProgressCB ,
229+ ),
254230 )
255231 if err != nil {
256- eventsCh <- update .NewErrorEvent (fmt .Errorf ("error burning bootloader : %w" , err ))
257- return
232+ eventCB ( update .NewErrorEvent (fmt .Errorf ("error installing platform : %w" , err ) ))
233+ return nil
258234 }
259- }()
235+ } else if respCB ().GetPlatform () == nil {
236+ eventCB (update .NewErrorEvent (fmt .Errorf ("platform upgrade failed" )))
237+ return nil
238+ }
239+
240+ cbw := orchestrator .NewCallbackWriter (func (line string ) {
241+ eventCB (update .NewDataEvent (update .UpgradeLineEvent , line ))
242+ })
260243
261- return eventsCh , nil
244+ err := srv .BurnBootloader (
245+ & rpc.BurnBootloaderRequest {
246+ Instance : inst ,
247+ Fqbn : "arduino:zephyr:unoq" ,
248+ Programmer : "jlink" ,
249+ },
250+ commands .BurnBootloaderToServerStreams (ctx , cbw , cbw ),
251+ )
252+ if err != nil {
253+ eventCB (update .NewErrorEvent (fmt .Errorf ("error burning bootloader: %w" , err )))
254+ return nil
255+ }
256+
257+ return nil
262258}
0 commit comments