mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 18:13:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package commands
 | 
						|
 | 
						|
import (
 | 
						|
	"bufio"
 | 
						|
	"context"
 | 
						|
	"fmt"
 | 
						|
	"io"
 | 
						|
	"os"
 | 
						|
	"runtime"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/docker/cli/cli/streams"
 | 
						|
)
 | 
						|
 | 
						|
func prompt(ctx context.Context, ins io.Reader, out io.Writer, msg string) (bool, error) {
 | 
						|
	done := make(chan struct{})
 | 
						|
	var ok bool
 | 
						|
	go func() {
 | 
						|
		ok = promptForConfirmation(ins, out, msg)
 | 
						|
		close(done)
 | 
						|
	}()
 | 
						|
	select {
 | 
						|
	case <-ctx.Done():
 | 
						|
		return false, context.Cause(ctx)
 | 
						|
	case <-done:
 | 
						|
		return ok, nil
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// promptForConfirmation requests and checks confirmation from user.
 | 
						|
// This will display the provided message followed by ' [y/N] '. If
 | 
						|
// the user input 'y' or 'Y' it returns true other false.  If no
 | 
						|
// message is provided "Are you sure you want to proceed? [y/N] "
 | 
						|
// will be used instead.
 | 
						|
//
 | 
						|
// Copied from github.com/docker/cli since the upstream version changed
 | 
						|
// recently with an incompatible change.
 | 
						|
//
 | 
						|
// See https://github.com/docker/buildx/pull/2359#discussion_r1544736494
 | 
						|
// for discussion on the issue.
 | 
						|
func promptForConfirmation(ins io.Reader, outs io.Writer, message string) bool {
 | 
						|
	if message == "" {
 | 
						|
		message = "Are you sure you want to proceed?"
 | 
						|
	}
 | 
						|
	message += " [y/N] "
 | 
						|
 | 
						|
	_, _ = fmt.Fprint(outs, message)
 | 
						|
 | 
						|
	// On Windows, force the use of the regular OS stdin stream.
 | 
						|
	if runtime.GOOS == "windows" {
 | 
						|
		ins = streams.NewIn(os.Stdin)
 | 
						|
	}
 | 
						|
 | 
						|
	reader := bufio.NewReader(ins)
 | 
						|
	answer, _, _ := reader.ReadLine()
 | 
						|
	return strings.ToLower(string(answer)) == "y"
 | 
						|
}
 |