@@ -54,13 +54,14 @@ func (s *Service) ListUpgradablePackages(ctx context.Context, matcher func(updat
5454 }
5555 defer s .lock .Unlock ()
5656
57+ // Attempt to fix dpkg database in case an upgrade was interrupted in the middle.
5758 if err := runDpkgConfigureCommand (ctx ); err != nil {
58- return nil , fmt . Errorf ("error running dpkg configure command: %w " , err )
59+ slog . Warn ("error running dpkg configure command, skipped" , "error " , err )
5960 }
6061
6162 err := runUpdateCommand (ctx )
6263 if err != nil {
63- return nil , fmt . Errorf ( "error running apt-get update command: %w" , err )
64+ return nil , err
6465 }
6566
6667 pkgs , err := listUpgradablePackages (ctx , matcher )
@@ -166,25 +167,23 @@ func (s *Service) UpgradePackages(ctx context.Context, names []string) (<-chan u
166167// runDpkgConfigureCommand is need in case an upgrade was interrupted in the middle
167168// and the dpkg database is in an inconsistent state.
168169func runDpkgConfigureCommand (ctx context.Context ) error {
169- dpkgCmd , err := paths .NewProcess (nil , "sudo" , "dpkg" , "--configure" , "-a" )
170+ cmd , err := paths .NewProcess (nil , "sudo" , "dpkg" , "--configure" , "-a" )
170171 if err != nil {
171172 return err
172173 }
173- err = dpkgCmd .RunWithinContext (ctx )
174- if err != nil {
175- return fmt .Errorf ("error running dpkg configure command: %w" , err )
174+ if out , err := cmd .RunAndCaptureCombinedOutput (ctx ); err != nil {
175+ return fmt .Errorf ("error running dpkg configure command: %w: %s" , err , out )
176176 }
177177 return nil
178178}
179179
180180func runUpdateCommand (ctx context.Context ) error {
181- updateCmd , err := paths .NewProcess (nil , "sudo" , "apt-get" , "update" )
181+ cmd , err := paths .NewProcess (nil , "sudo" , "apt-get" , "update" )
182182 if err != nil {
183183 return err
184184 }
185- err = updateCmd .RunWithinContext (ctx )
186- if err != nil {
187- return err
185+ if out , err := cmd .RunAndCaptureCombinedOutput (ctx ); err != nil {
186+ return fmt .Errorf ("error running apt-get update command: %w: %s" , err , out )
188187 }
189188 return nil
190189}
@@ -202,23 +201,24 @@ func runUpgradeCommand(ctx context.Context, names []string) iter.Seq2[string, er
202201 args = append (args , names ... )
203202
204203 return func (yield func (string , error ) bool ) {
205- upgradeCmd , err := paths .NewProcess (env , args ... )
204+ cmd , err := paths .NewProcess (env , args ... )
206205 if err != nil {
207206 _ = yield ("" , err )
208207 return
209208 }
209+
210210 stdout := orchestrator .NewCallbackWriter (func (line string ) {
211211 if ! yield (line , nil ) {
212- err := upgradeCmd .Kill ()
213- if err != nil {
212+ if err := cmd .Kill (); err != nil {
214213 slog .Error ("Failed to kill upgrade command" , slog .String ("error" , err .Error ()))
215214 }
216- return
217215 }
218216 })
219- upgradeCmd .RedirectStderrTo (stdout )
220- upgradeCmd .RedirectStdoutTo (stdout )
221- if err := upgradeCmd .RunWithinContext (ctx ); err != nil {
217+ cmd .RedirectStderrTo (stdout )
218+ cmd .RedirectStdoutTo (stdout )
219+
220+ if err := cmd .RunWithinContext (ctx ); err != nil {
221+ _ = yield ("" , err )
222222 return
223223 }
224224 }
@@ -227,18 +227,25 @@ func runUpgradeCommand(ctx context.Context, names []string) iter.Seq2[string, er
227227
228228func runAptCleanCommand (ctx context.Context ) iter.Seq2 [string , error ] {
229229 return func (yield func (string , error ) bool ) {
230- cleanCmd , err := paths .NewProcess (nil , "sudo" , "apt-get" , "clean" , "-y" )
230+ cmd , err := paths .NewProcess (nil , "sudo" , "apt-get" , "clean" , "-y" )
231231 if err != nil {
232232 _ = yield ("" , err )
233233 return
234234 }
235+
235236 stdout := orchestrator .NewCallbackWriter (func (line string ) {
236- _ = yield (line , nil )
237+ if ! yield (line , nil ) {
238+ if err := cmd .Kill (); err != nil {
239+ slog .Error ("Failed to kill apt clean command" , slog .String ("error" , err .Error ()))
240+ }
241+ }
237242 })
238- cleanCmd .RedirectStderrTo (stdout )
239- cleanCmd .RedirectStdoutTo (stdout )
240- if err := cleanCmd .RunWithinContext (ctx ); err != nil {
243+ cmd .RedirectStderrTo (stdout )
244+ cmd .RedirectStdoutTo (stdout )
245+
246+ if err := cmd .RunWithinContext (ctx ); err != nil {
241247 _ = yield ("" , err )
248+ return
242249 }
243250 }
244251}
@@ -250,19 +257,19 @@ func pullDockerImages(ctx context.Context) iter.Seq2[string, error] {
250257 _ = yield ("" , err )
251258 return
252259 }
260+
253261 stdout := orchestrator .NewCallbackWriter (func (line string ) {
254262 if ! yield (line , nil ) {
255- err := cmd .Kill ()
256- if err != nil {
263+ if err := cmd .Kill (); err != nil {
257264 slog .Error ("Failed to kill 'arduino-app-cli system init' command" , slog .String ("error" , err .Error ()))
258265 }
259- return
260266 }
261267 })
262268 cmd .RedirectStderrTo (stdout )
263269 cmd .RedirectStdoutTo (stdout )
264- err = cmd .RunWithinContext (ctx )
265- if err != nil {
270+
271+ if err = cmd .RunWithinContext (ctx ); err != nil {
272+ _ = yield ("" , err )
266273 return
267274 }
268275 }
@@ -279,19 +286,15 @@ func cleanupDockerContainers(ctx context.Context) iter.Seq2[string, error] {
279286
280287 stdout := orchestrator .NewCallbackWriter (func (line string ) {
281288 if ! yield (line , nil ) {
282- err := cmd .Kill ()
283- if err != nil {
289+ if err := cmd .Kill (); err != nil {
284290 slog .Error ("Failed to kill 'arduino-app-cli system cleanup' command" , slog .String ("error" , err .Error ()))
285291 }
286- return
287292 }
288293 })
289-
290294 cmd .RedirectStderrTo (stdout )
291295 cmd .RedirectStdoutTo (stdout )
292296
293- err = cmd .RunWithinContext (ctx )
294- if err != nil {
297+ if err = cmd .RunWithinContext (ctx ); err != nil {
295298 _ = yield ("" , err )
296299 return
297300 }
@@ -309,11 +312,7 @@ func restartServices(ctx context.Context) error {
309312 if err != nil {
310313 return err
311314 }
312- err = needRestartCmd .RunWithinContext (ctx )
313- if err != nil {
314- return err
315- }
316- return nil
315+ return needRestartCmd .RunWithinContext (ctx )
317316}
318317
319318func listUpgradablePackages (ctx context.Context , matcher func (update.UpgradablePackage ) bool ) ([]update.UpgradablePackage , error ) {
0 commit comments