Skip to content

Commit 0509013

Browse files
authored
fix(update): skip the dpkg step in case of error (#13)
* fix(update): skip the dpkg step in case of error * fix some iterator issues
1 parent b1e0e12 commit 0509013

File tree

1 file changed

+37
-38
lines changed

1 file changed

+37
-38
lines changed

internal/update/apt/service.go

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
168169
func 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

180180
func 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

228228
func 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

319318
func listUpgradablePackages(ctx context.Context, matcher func(update.UpgradablePackage) bool) ([]update.UpgradablePackage, error) {

0 commit comments

Comments
 (0)