mirror of https://github.com/docker/buildx.git
				
				
				
			
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
| package commands
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 
 | |
| 	controllererrors "github.com/docker/buildx/controller/errdefs"
 | |
| 	controllerapi "github.com/docker/buildx/controller/pb"
 | |
| 	"github.com/docker/buildx/monitor/types"
 | |
| 	"github.com/docker/buildx/util/progress"
 | |
| 	"github.com/pkg/errors"
 | |
| )
 | |
| 
 | |
| type ReloadCmd struct {
 | |
| 	m types.Monitor
 | |
| 
 | |
| 	stdout   io.WriteCloser
 | |
| 	progress *progress.Printer
 | |
| 
 | |
| 	options      *controllerapi.BuildOptions
 | |
| 	invokeConfig controllerapi.InvokeConfig
 | |
| }
 | |
| 
 | |
| func NewReloadCmd(m types.Monitor, stdout io.WriteCloser, progress *progress.Printer, options *controllerapi.BuildOptions, invokeConfig controllerapi.InvokeConfig) types.Command {
 | |
| 	return &ReloadCmd{m, stdout, progress, options, invokeConfig}
 | |
| }
 | |
| 
 | |
| func (cm *ReloadCmd) Info() types.CommandInfo {
 | |
| 	return types.CommandInfo{HelpMessage: "reloads the context and build it"}
 | |
| }
 | |
| 
 | |
| func (cm *ReloadCmd) Exec(ctx context.Context, args []string) error {
 | |
| 	var bo *controllerapi.BuildOptions
 | |
| 	if ref := cm.m.AttachedSessionID(); ref != "" {
 | |
| 		// Rebuilding an existing session; Restore the build option used for building this session.
 | |
| 		res, err := cm.m.Inspect(ctx, ref)
 | |
| 		if err != nil {
 | |
| 			fmt.Printf("failed to inspect the current build session: %v\n", err)
 | |
| 		} else {
 | |
| 			bo = res.Options
 | |
| 		}
 | |
| 	} else {
 | |
| 		bo = cm.options
 | |
| 	}
 | |
| 	if bo == nil {
 | |
| 		return errors.Errorf("no build option is provided")
 | |
| 	}
 | |
| 	if ref := cm.m.AttachedSessionID(); ref != "" {
 | |
| 		if err := cm.m.Disconnect(ctx, ref); err != nil {
 | |
| 			fmt.Println("disconnect error", err)
 | |
| 		}
 | |
| 	}
 | |
| 	var resultUpdated bool
 | |
| 	cm.progress.Unpause()
 | |
| 	ref, _, err := cm.m.Build(ctx, *bo, nil, cm.progress) // TODO: support stdin, hold build ref
 | |
| 	cm.progress.Pause()
 | |
| 	if err != nil {
 | |
| 		var be *controllererrors.BuildError
 | |
| 		if errors.As(err, &be) {
 | |
| 			ref = be.Ref
 | |
| 			resultUpdated = true
 | |
| 		} else {
 | |
| 			fmt.Printf("failed to reload: %v\n", err)
 | |
| 		}
 | |
| 	} else {
 | |
| 		resultUpdated = true
 | |
| 	}
 | |
| 	cm.m.AttachSession(ref)
 | |
| 	if resultUpdated {
 | |
| 		// rollback the running container with the new result
 | |
| 		id := cm.m.Rollback(ctx, cm.invokeConfig)
 | |
| 		fmt.Fprintf(cm.stdout, "Interactive container was restarted with process %q. Press Ctrl-a-c to switch to the new container\n", id)
 | |
| 	}
 | |
| 	return nil
 | |
| }
 |