@@ -313,7 +313,7 @@ func (a *Storage) writeFile(fileName, fileData string) error {
313313 return os .WriteFile (
314314 fullPath ,
315315 []byte (fileData ),
316- 0664 ,
316+ 0o664 ,
317317 )
318318}
319319
@@ -411,43 +411,67 @@ func (a *Storage) runRawCommand(args ...string) (io.Reader, io.Reader, error) {
411411 return a .cw .Run (ctx , opts )
412412}
413413
414+ // safeReadFrom safely reads from an io.Reader into a buffer using defer/recover to handle panics
415+ // Returns the number of bytes read and any error that occurred during reading
416+ func safeReadFrom (dst * bytes.Buffer , src io.Reader ) (n int64 , err error ) {
417+ // Use defer/recover to catch any panics that might occur during ReadFrom
418+ defer func () {
419+ if r := recover (); r != nil {
420+ err = xerrors .Errorf ("panic during read: %v" , r )
421+ }
422+ }()
423+
424+ // Only attempt to read if source is not nil
425+ if src == nil {
426+ return 0 , nil
427+ }
428+
429+ return dst .ReadFrom (src )
430+ }
431+
414432func (a * Storage ) runCommand (args ... string ) ([]byte , error ) {
415- outReader , errReader , err := a .runRawCommand (args ... )
433+ outReader , errReader , cmdErr := a .runRawCommand (args ... )
416434
417435 outBuf := new (bytes.Buffer )
418436 errBuf := new (bytes.Buffer )
419437
420- if outReader != nil {
421- if _ , err := outBuf .ReadFrom (outReader ); err != nil {
422- return nil , xerrors .Errorf ("failed to read stdout: %w" , err )
423- }
424- }
438+ // Safely read from stdout
439+ _ , outReadErr := safeReadFrom (outBuf , outReader )
425440
426- if errReader != nil {
427- if _ , err := errBuf .ReadFrom (outReader ); err != nil {
428- return nil , xerrors .Errorf ("failed to read stdout: %w" , err )
429- }
430- }
441+ // Safely read from stderr
442+ _ , errReadErr := safeReadFrom (errBuf , errReader )
431443
432- if err != nil {
433- // TODO: duplicated code
444+ // Log command details if there was an error with the command execution
445+ if cmdErr != nil {
434446 opts := a .baseOpts ()
435447 opts .Command = args
436448
437449 a .logger .Errorf ("command: %s stdout:\n %s" , opts .String (), outBuf .String ())
438450 a .logger .Errorf ("command: %s stderr:\n %s" , opts .String (), errBuf .String ())
439451
440- return nil , xerrors .Errorf ("failed: %w" , err )
452+ return nil , xerrors .Errorf ("command failed: %w" , cmdErr )
453+ }
454+
455+ if outReadErr != nil {
456+ return nil , xerrors .Errorf ("failed to read stdout: %w" , outReadErr )
441457 }
442458
443- scr := bufio .NewScanner (errReader )
444- var errs util.Errors
445- for scr .Scan () {
446- errs = append (errs , xerrors .New (scr .Text ()))
459+ if errReadErr != nil {
460+ return nil , xerrors .Errorf ("failed to read stderr: %w" , errReadErr )
447461 }
448- if len (errs ) > 0 {
449- a .logger .Warnf ("stderr: %v" , log .Error (errs ))
462+
463+ // Scan the captured errBuf for stderr messages
464+ if errBuf .Len () > 0 {
465+ scanner := bufio .NewScanner (bytes .NewReader (errBuf .Bytes ()))
466+ var errs util.Errors
467+ for scanner .Scan () {
468+ errs = append (errs , xerrors .New (scanner .Text ()))
469+ }
470+ if len (errs ) > 0 {
471+ a .logger .Warnf ("stderr: %v" , log .Error (errs ))
472+ }
450473 }
474+
451475 return outBuf .Bytes (), nil
452476}
453477
0 commit comments