|  | @@ -29,35 +29,64 @@ package context
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  |  	"context"
 | 
	
		
			
				|  |  | +	"errors"
 | 
	
		
			
				|  |  |  	"fmt"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	"github.com/spf13/cobra"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +	apicontext "github.com/docker/api/context"
 | 
	
		
			
				|  |  |  	"github.com/docker/api/context/store"
 | 
	
		
			
				|  |  |  	"github.com/docker/api/multierror"
 | 
	
		
			
				|  |  | +	"github.com/spf13/cobra"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +type removeOpts struct {
 | 
	
		
			
				|  |  | +	force bool
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func removeCommand() *cobra.Command {
 | 
	
		
			
				|  |  | -	return &cobra.Command{
 | 
	
		
			
				|  |  | +	var opts removeOpts
 | 
	
		
			
				|  |  | +	cmd := &cobra.Command{
 | 
	
		
			
				|  |  |  		Use:     "rm CONTEXT [CONTEXT...]",
 | 
	
		
			
				|  |  |  		Short:   "Remove one or more contexts",
 | 
	
		
			
				|  |  |  		Aliases: []string{"remove"},
 | 
	
		
			
				|  |  |  		Args:    cobra.MinimumNArgs(1),
 | 
	
		
			
				|  |  |  		RunE: func(cmd *cobra.Command, args []string) error {
 | 
	
		
			
				|  |  | -			return runRemove(cmd.Context(), args)
 | 
	
		
			
				|  |  | +			return runRemove(cmd.Context(), args, opts.force)
 | 
	
		
			
				|  |  |  		},
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	cmd.Flags().BoolVarP(&opts.force, "force", "f", false, "force removing current context")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return cmd
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func runRemove(ctx context.Context, args []string) error {
 | 
	
		
			
				|  |  | +func runRemove(ctx context.Context, args []string, force bool) error {
 | 
	
		
			
				|  |  | +	currentContext := apicontext.CurrentContext(ctx)
 | 
	
		
			
				|  |  |  	s := store.ContextStore(ctx)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	var errs *multierror.Error
 | 
	
		
			
				|  |  | -	for _, n := range args {
 | 
	
		
			
				|  |  | -		if err := s.Remove(n); err != nil {
 | 
	
		
			
				|  |  | -			errs = multierror.Append(errs, err)
 | 
	
		
			
				|  |  | +	for _, contextName := range args {
 | 
	
		
			
				|  |  | +		if currentContext == contextName {
 | 
	
		
			
				|  |  | +			if force {
 | 
	
		
			
				|  |  | +				err := runUse(ctx, "default")
 | 
	
		
			
				|  |  | +				if err != nil {
 | 
	
		
			
				|  |  | +					errs = multierror.Append(errs, errors.New("cannot delete current context"))
 | 
	
		
			
				|  |  | +				} else {
 | 
	
		
			
				|  |  | +					errs = removeContext(s, contextName, errs)
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				errs = multierror.Append(errs, errors.New("cannot delete current context"))
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  |  		} else {
 | 
	
		
			
				|  |  | -			fmt.Println(n)
 | 
	
		
			
				|  |  | +			errs = removeContext(s, contextName, errs)
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	return errs.ErrorOrNil()
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func removeContext(s store.Store, n string, errs *multierror.Error) *multierror.Error {
 | 
	
		
			
				|  |  | +	if err := s.Remove(n); err != nil {
 | 
	
		
			
				|  |  | +		errs = multierror.Append(errs, err)
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		fmt.Println(n)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return errs
 | 
	
		
			
				|  |  | +}
 |