@@ -431,57 +431,75 @@ func runControllerBuild(ctx context.Context, dockerCli command.Cli, opts *cbuild
431431 return nil , nil , errors .Errorf ("Dockerfile or context from stdin is not supported with invoke" )
432432 }
433433
434- c := local . NewController ( ctx , dockerCli )
435- defer c . Close ()
436-
437- var in io. ReadCloser
434+ var (
435+ in io. ReadCloser
436+ f * ioset. SingleForwarder
437+ )
438438 if options .invokeConfig == nil {
439439 in = dockerCli .In ()
440+ } else {
441+ f = ioset .NewSingleForwarder ()
442+ f .SetReader (dockerCli .In ())
440443 }
441444
442- resp , inputs , err := c .Build (ctx , opts , in , printer )
443- if err != nil {
444- var be * controllererrors.BuildError
445- if errors .As (err , & be ) {
446- retErr = err
447- // We can proceed to monitor
448- } else {
449- return nil , nil , errors .Wrapf (err , "failed to build" )
445+ for {
446+ c := local .NewController (ctx , dockerCli )
447+
448+ resp , inputs , err := c .Build (ctx , opts , in , printer )
449+ if err != nil {
450+ var be * controllererrors.BuildError
451+ if errors .As (err , & be ) {
452+ retErr = err
453+ // We can proceed to monitor
454+ } else {
455+ c .Close ()
456+ return nil , nil , errors .Wrapf (err , "failed to build" )
457+ }
450458 }
451- }
452459
453- if options .invokeConfig != nil && options .invokeConfig .needsDebug (retErr ) {
454- // Print errors before launching monitor
455- if err := printError (retErr , printer ); err != nil {
456- logrus .Warnf ("failed to print error information: %v" , err )
460+ if options .invokeConfig != nil {
461+ if err := runMonitorIfNeeded (ctx , options .invokeConfig , retErr , c , f , os .Stdout , os .Stderr , printer ); err != nil {
462+ c .Close ()
463+ if errors .Is (err , monitor .ErrReload ) {
464+ retErr = nil
465+ continue
466+ }
467+ logrus .Warnf ("failed to run monitor: %v" , err )
468+ }
457469 }
458470
459- pr , pw := io .Pipe ()
471+ c .Close ()
472+ return resp , inputs , err
473+ }
474+ }
460475
461- f := ioset .NewSingleForwarder ()
462- f .SetReader (dockerCli .In ())
463- f .SetWriter (pw , func () io.WriteCloser {
464- pw .Close () // propagate EOF
465- return nil
466- })
467-
468- // TODO: ref was never set to a value in the original code. Removed the variable to
469- // reduce confusion but it also probably means this call is wrong in some way.
470- // This area should be removed during the refactor anyway so it doesn't matter that much.
471- monitorBuildResult , err := options .invokeConfig .runDebug (ctx , "" , opts , c , pr , os .Stdout , os .Stderr , printer )
472- if err := pw .Close (); err != nil {
473- logrus .Debug ("failed to close monitor stdin pipe reader" )
474- }
475- if err != nil {
476- logrus .Warnf ("failed to run monitor: %v" , err )
477- }
478- if monitorBuildResult != nil {
479- // Update return values with the last build result from monitor
480- resp , retErr = monitorBuildResult .Resp , monitorBuildResult .Err
481- }
476+ func runMonitorIfNeeded (ctx context.Context , cfg * invokeConfig , retErr error , c * local.Controller , stdin * ioset.SingleForwarder , stdout io.WriteCloser , stderr console.File , printer * progress.Printer ) error {
477+ if ! cfg .needsDebug (retErr ) {
478+ return nil
479+ }
480+
481+ // Print errors before launching monitor
482+ if err := printError (retErr , printer ); err != nil {
483+ logrus .Warnf ("failed to print error information: %v" , err )
484+ }
485+
486+ pr , pw := io .Pipe ()
487+ stdin .SetWriter (pw , func () io.WriteCloser {
488+ pw .Close () // propagate EOF
489+ return nil
490+ })
491+
492+ con := console .Current ()
493+ if err := con .SetRaw (); err != nil {
494+ return errors .Errorf ("failed to configure terminal: %v" , err )
482495 }
496+ defer con .Reset ()
483497
484- return resp , inputs , retErr
498+ monitorErr := monitor .RunMonitor (ctx , & cfg .InvokeConfig , c , pr , stdout , stderr , printer )
499+ if err := pw .Close (); err != nil {
500+ logrus .Debug ("failed to close monitor stdin pipe reader" )
501+ }
502+ return monitorErr
485503}
486504
487505func printError (err error , printer * progress.Printer ) error {
@@ -970,15 +988,6 @@ func (cfg *invokeConfig) needsDebug(retErr error) bool {
970988 }
971989}
972990
973- func (cfg * invokeConfig ) runDebug (ctx context.Context , ref string , options * cbuild.Options , c * local.Controller , stdin io.ReadCloser , stdout io.WriteCloser , stderr console.File , progress * progress.Printer ) (* monitor.MonitorBuildResult , error ) {
974- con := console .Current ()
975- if err := con .SetRaw (); err != nil {
976- return nil , errors .Errorf ("failed to configure terminal: %v" , err )
977- }
978- defer con .Reset ()
979- return monitor .RunMonitor (ctx , ref , options , & cfg .InvokeConfig , c , stdin , stdout , stderr , progress )
980- }
981-
982991func (cfg * invokeConfig ) parseInvokeConfig (invoke , on string ) error {
983992 cfg .onFlag = on
984993 cfg .invokeFlag = invoke
0 commit comments