@@ -132,27 +132,51 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st
132132 }
133133 eventsCh := make (chan eventstream.Event , 100 )
134134
135- downloadProgressCB := func (curr * rpc.DownloadProgress ) {
136- data := helpers .ArduinoCLIDownloadProgressToString (curr )
137- slog .Debug ("Download progress" , slog .String ("download_progress" , data ))
138- eventsCh <- eventstream.Event {Type : eventstream .UpgradeLineEvent , Data : data }
139- }
140- taskProgressCB := func (msg * rpc.TaskProgress ) {
141- data := helpers .ArduinoCLITaskProgressToString (msg )
142- slog .Debug ("Task progress" , slog .String ("task_progress" , data ))
143- eventsCh <- eventstream.Event {Type : eventstream .UpgradeLineEvent , Data : data }
144- }
145-
146135 go func () {
147136 defer a .lock .Unlock ()
148137 defer close (eventsCh )
149-
138+ const indexWeight float32 = 30.0
139+ const indexBase float32 = 0.0
140+ const upgradeBase float32 = 30.0
141+ const upgradeWeight float32 = 60.0
142+
143+ makeDownloadProgressCallback := func (basePercentage , phaseWeight float32 ) func (* rpc.DownloadProgress ) {
144+ return func (curr * rpc.DownloadProgress ) {
145+ data := helpers .ArduinoCLIDownloadProgressToString (curr )
146+ eventsCh <- eventstream.Event {Type : eventstream .UpgradeLineEvent , Data : data }
147+ if updateInfo := curr .GetUpdate (); updateInfo != nil {
148+ if updateInfo .GetTotalSize () <= 0 {
149+ return
150+ }
151+ localProgress := (float32 (updateInfo .GetDownloaded ()) / float32 (updateInfo .GetTotalSize ())) * 100.0
152+ totalArduinoProgress := basePercentage + (localProgress / 100.0 )* phaseWeight
153+ eventsCh <- eventstream.Event {
154+ Type : eventstream .ProgressEvent ,
155+ Progress : totalArduinoProgress ,
156+ }
157+ }
158+ }
159+ }
160+ makeTaskProgressCallback := func (basePercentage , phaseWeight float32 ) func (* rpc.TaskProgress ) {
161+ return func (msg * rpc.TaskProgress ) {
162+ data := helpers .ArduinoCLITaskProgressToString (msg )
163+ eventsCh <- eventstream.Event {Type : eventstream .UpgradeLineEvent , Data : data }
164+ if ! msg .GetCompleted () {
165+ localProgress := msg .GetPercent ()
166+ totalArduinoProgress := basePercentage + (localProgress / 100.0 )* phaseWeight
167+ eventsCh <- eventstream.Event {
168+ Type : eventstream .ProgressEvent ,
169+ Progress : totalArduinoProgress ,
170+ }
171+ }
172+ }
173+ }
150174 ctx , cancel := context .WithTimeout (ctx , 10 * time .Minute )
151175 defer cancel ()
152176
153177 eventsCh <- eventstream.Event {Type : eventstream .StartEvent , Data : "Upgrade is starting" }
154178
155- logrus .SetLevel (logrus .ErrorLevel ) // Reduce the log level of arduino-cli
179+ logrus .SetLevel (logrus .ErrorLevel )
156180 srv := commands .NewArduinoCoreServer ()
157181
158182 if err := setConfig (ctx , srv ); err != nil {
@@ -184,7 +208,8 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st
184208 }()
185209
186210 {
187- stream , _ := commands .UpdateIndexStreamResponseToCallbackFunction (ctx , downloadProgressCB )
211+ updateIndexProgressCB := makeDownloadProgressCallback (indexBase , indexWeight )
212+ stream , _ := commands .UpdateIndexStreamResponseToCallbackFunction (ctx , updateIndexProgressCB )
188213 if err := srv .UpdateIndex (& rpc.UpdateIndexRequest {Instance : inst }, stream ); err != nil {
189214 eventsCh <- eventstream.Event {
190215 Type : eventstream .ErrorEvent ,
@@ -193,6 +218,8 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st
193218 }
194219 return
195220 }
221+ eventsCh <- eventstream.Event {Type : eventstream .ProgressEvent , Progress : indexBase + indexWeight }
222+
196223 if err := srv .Init (& rpc.InitRequest {Instance : inst }, commands .InitStreamResponseToCallbackFunction (ctx , nil )); err != nil {
197224 eventsCh <- eventstream.Event {
198225 Type : eventstream .ErrorEvent ,
@@ -203,10 +230,13 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st
203230 }
204231 }
205232
233+ platformDownloadCB := makeDownloadProgressCallback (upgradeBase , upgradeWeight )
234+ platformTaskCB := makeTaskProgressCallback (upgradeBase , upgradeWeight )
235+
206236 stream , respCB := commands .PlatformUpgradeStreamResponseToCallbackFunction (
207237 ctx ,
208- downloadProgressCB ,
209- taskProgressCB ,
238+ platformDownloadCB ,
239+ platformTaskCB ,
210240 )
211241 if err := srv .PlatformUpgrade (
212242 & rpc.PlatformUpgradeRequest {
@@ -242,8 +272,8 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st
242272 },
243273 commands .PlatformInstallStreamResponseToCallbackFunction (
244274 ctx ,
245- downloadProgressCB ,
246- taskProgressCB ,
275+ platformDownloadCB ,
276+ platformTaskCB ,
247277 ),
248278 )
249279 if err != nil {
@@ -282,6 +312,7 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st
282312 }
283313 return
284314 }
315+ eventsCh <- eventstream.Event {Type : eventstream .ProgressEvent , Progress : 100.0 }
285316 }()
286317
287318 return eventsCh , nil
0 commit comments